diff --git a/.JuliaFormatter.toml b/.JuliaFormatter.toml
new file mode 100644
index 0000000..76c30b0
--- /dev/null
+++ b/.JuliaFormatter.toml
@@ -0,0 +1,3 @@
+always_for_in = true
+short_to_long_function_def = true
+always_use_return = true
diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index e3b752b..5cc6786 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -18,7 +18,6 @@ jobs:
fail-fast: false
matrix:
version:
- - '1.6'
- '1.8'
- 'nightly'
os:
diff --git a/.gitignore b/.gitignore
index 5bf4af9..b200bf8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
/Manifest.toml
-.vscode
\ No newline at end of file
+.vscode
+
+.DS_Store
\ No newline at end of file
diff --git a/Project.toml b/Project.toml
index 0338a13..62e01c5 100644
--- a/Project.toml
+++ b/Project.toml
@@ -4,19 +4,34 @@ authors = ["Philipp Gewessler
and constributors"]
version = "0.1.0"
[deps]
+Bootstrap = "e28b5b4c-05e8-5b66-bc03-6f0c0a0a06e0"
Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
-InvertedIndices = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
+PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
+Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
SCS = "c946c3f1-0d1f-5ce8-9dea-7daa1f7e2d13"
-Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+StatsAPI = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
+Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+Term = "22787eb5-b846-44ae-b979-8e399b8463ab"
[compat]
-julia = "1.6"
+Combinatorics = "1"
+Distributions = "0.25"
+JuMP = "1"
+PrecompileTools = "1"
+ProgressMeter = "1"
+SCS = "2"
+StatsBase = "0.34"
+Tables = "1"
+Term = "2"
+julia = "1.8"
[extras]
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
diff --git a/README.md b/README.md
index 1efafe0..1944c7f 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,50 @@
-# ClassicalTestTheory
+# ClassicalTestTheory.jl
[![Stable](https://img.shields.io/badge/docs-stable-blue.svg)](https://p-gw.github.io/ClassicalTestTheory.jl/stable)
[![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://p-gw.github.io/ClassicalTestTheory.jl/dev)
[![Build Status](https://github.com/p-gw/ClassicalTestTheory.jl/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/p-gw/ClassicalTestTheory.jl/actions/workflows/CI.yml?query=branch%3Amain)
[![Coverage](https://codecov.io/gh/p-gw/ClassicalTestTheory.jl/branch/main/graph/badge.svg)](https://codecov.io/gh/p-gw/ClassicalTestTheory.jl)
+ClassicalTestTheory.jl is a Julia package for data analysis using [Classical Test Theory](https://en.wikipedia.org/wiki/Classical_test_theory#:~:text=It%20is%20a%20theory%20of,the%20reliability%20of%20psychological%20tests.).
+
+## Installation
+```julia
+] add https://github.com/p-gw/ClassicalTestTheory.jl.git
+```
+
+## Getting started
+ClassicalTestTheory.jl provides two entry points to doing data analsis.
+The input data can either be a numeric `Matrix` or a [`PsychometricTest`](https://github.com/JuliaPsychometrics/PsychometricTests.jl).
+While `Matrix` methods provide full functionality, `PsychometricTest` methods provide some
+additional convenience such as scale analysis.
+For details on how to use ClassicalTestTheory.jl with `PsychometricTest` see [XXX](#).
+
+Consider some input data `x`,
+
+```julia-repl
+julia> n_persons = 100;
+julia> n_items = 8;
+
+julia> x = rand(0:100, n_persons, n_items);
+```
+
+we can get some descriptive analysis of the items,
+
+```julia
+itemanalysis(x)
+```
+
+or estimate the internal consistency (e.g. using Cronbach's alpha)
+
+```julia
+reliability(x, Alpha())
+```
+
+The package will automatically calculate the coefficient from the data and construct appropriate confidence intervals.
+
+To get multiple estimates of reliability just pass a vector of methods:
+
+```julia
+coefficients = [Alpha(), GLB(), Mu(2)]
+reliability(x, coefficients)
+```
diff --git a/benchmark/Manifest.toml b/benchmark/Manifest.toml
new file mode 100644
index 0000000..f607c19
--- /dev/null
+++ b/benchmark/Manifest.toml
@@ -0,0 +1,973 @@
+# This file is machine-generated - editing it directly is not advised
+
+julia_version = "1.9.2"
+manifest_format = "2.0"
+project_hash = "bad6e93102698bc7b3813aeca167b6ccbe3d4aa4"
+
+[[deps.AbstractTrees]]
+git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c"
+uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
+version = "0.4.4"
+
+[[deps.Adapt]]
+deps = ["LinearAlgebra", "Requires"]
+git-tree-sha1 = "76289dc51920fdc6e0013c872ba9551d54961c24"
+uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+version = "3.6.2"
+
+ [deps.Adapt.extensions]
+ AdaptStaticArraysExt = "StaticArrays"
+
+ [deps.Adapt.weakdeps]
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
+[[deps.ArgCheck]]
+git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4"
+uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197"
+version = "2.3.0"
+
+[[deps.ArgTools]]
+uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
+version = "1.1.1"
+
+[[deps.ArrayInterface]]
+deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"]
+git-tree-sha1 = "f83ec24f76d4c8f525099b2ac475fc098138ec31"
+uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
+version = "7.4.11"
+
+ [deps.ArrayInterface.extensions]
+ ArrayInterfaceBandedMatricesExt = "BandedMatrices"
+ ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices"
+ ArrayInterfaceCUDAExt = "CUDA"
+ ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore"
+ ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore"
+ ArrayInterfaceTrackerExt = "Tracker"
+
+ [deps.ArrayInterface.weakdeps]
+ BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
+ BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0"
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
+ StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+
+[[deps.Artifacts]]
+uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
+
+[[deps.BangBang]]
+deps = ["Compat", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires", "Setfield", "Tables"]
+git-tree-sha1 = "e28912ce94077686443433c2800104b061a827ed"
+uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66"
+version = "0.3.39"
+
+ [deps.BangBang.extensions]
+ BangBangChainRulesCoreExt = "ChainRulesCore"
+ BangBangDataFramesExt = "DataFrames"
+ BangBangStaticArraysExt = "StaticArrays"
+ BangBangStructArraysExt = "StructArrays"
+ BangBangTypedTablesExt = "TypedTables"
+
+ [deps.BangBang.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9"
+
+[[deps.Base64]]
+uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
+
+[[deps.Baselet]]
+git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e"
+uuid = "9718e550-a3fa-408a-8086-8db961cd8217"
+version = "0.1.1"
+
+[[deps.BenchmarkTools]]
+deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"]
+git-tree-sha1 = "d9a9701b899b30332bbcb3e1679c41cce81fb0e8"
+uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
+version = "1.3.2"
+
+[[deps.Bzip2_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2"
+uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
+version = "1.0.8+0"
+
+[[deps.CSV]]
+deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"]
+git-tree-sha1 = "44dbf560808d49041989b8a96cae4cffbeb7966a"
+uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
+version = "0.10.11"
+
+[[deps.Calculus]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad"
+uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9"
+version = "0.5.1"
+
+[[deps.CategoricalArrays]]
+deps = ["DataAPI", "Future", "Missings", "Printf", "Requires", "Statistics", "Unicode"]
+git-tree-sha1 = "1568b28f91293458345dabba6a5ea3f183250a61"
+uuid = "324d7699-5711-5eae-9e2f-1d82baa6b597"
+version = "0.10.8"
+
+ [deps.CategoricalArrays.extensions]
+ CategoricalArraysJSONExt = "JSON"
+ CategoricalArraysRecipesBaseExt = "RecipesBase"
+ CategoricalArraysSentinelArraysExt = "SentinelArrays"
+ CategoricalArraysStructTypesExt = "StructTypes"
+
+ [deps.CategoricalArrays.weakdeps]
+ JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
+ RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
+ SentinelArrays = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
+ StructTypes = "856f2bd8-1eba-4b0a-8007-ebc267875bd4"
+
+[[deps.ClassicalTestTheory]]
+deps = ["Combinatorics", "Distributions", "InvertedIndices", "JuMP", "LinearAlgebra", "Memoization", "ParallelUtilities", "Printf", "ProgressMeter", "PsychometricTests", "Random", "SCS", "SplittablesBase", "Statistics", "StatsBase", "Tables", "Term", "ThreadsX"]
+path = ".."
+uuid = "e40851f3-a233-49cf-835f-c29ce827671a"
+version = "0.1.0"
+
+[[deps.CodeTracking]]
+deps = ["InteractiveUtils", "UUIDs"]
+git-tree-sha1 = "8dd599a2fdbf3132d4c0be3a016f8f1518e28fa8"
+uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2"
+version = "1.3.2"
+
+[[deps.CodecBzip2]]
+deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"]
+git-tree-sha1 = "2e62a725210ce3c3c2e1a3080190e7ca491f18d7"
+uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd"
+version = "0.7.2"
+
+[[deps.CodecZlib]]
+deps = ["TranscodingStreams", "Zlib_jll"]
+git-tree-sha1 = "02aa26a4cf76381be7f66e020a3eddeb27b0a092"
+uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
+version = "0.7.2"
+
+[[deps.Combinatorics]]
+git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860"
+uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
+version = "1.0.2"
+
+[[deps.CommonSubexpressions]]
+deps = ["MacroTools", "Test"]
+git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7"
+uuid = "bbf7d656-a473-5ed7-a52c-81e309532950"
+version = "0.3.0"
+
+[[deps.Compat]]
+deps = ["UUIDs"]
+git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7"
+uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
+version = "4.9.0"
+weakdeps = ["Dates", "LinearAlgebra"]
+
+ [deps.Compat.extensions]
+ CompatLinearAlgebraExt = "LinearAlgebra"
+
+[[deps.CompilerSupportLibraries_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
+version = "1.0.5+0"
+
+[[deps.CompositionsBase]]
+git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
+uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
+version = "0.1.2"
+
+ [deps.CompositionsBase.extensions]
+ CompositionsBaseInverseFunctionsExt = "InverseFunctions"
+
+ [deps.CompositionsBase.weakdeps]
+ InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
+
+[[deps.Conda]]
+deps = ["Downloads", "JSON", "VersionParsing"]
+git-tree-sha1 = "8c86e48c0db1564a1d49548d3515ced5d604c408"
+uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d"
+version = "1.9.1"
+
+[[deps.ConstructionBase]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "fe2838a593b5f776e1597e086dcd47560d94e816"
+uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
+version = "1.5.3"
+
+ [deps.ConstructionBase.extensions]
+ ConstructionBaseIntervalSetsExt = "IntervalSets"
+ ConstructionBaseStaticArraysExt = "StaticArrays"
+
+ [deps.ConstructionBase.weakdeps]
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
+[[deps.Crayons]]
+git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15"
+uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
+version = "4.1.1"
+
+[[deps.DataAPI]]
+git-tree-sha1 = "8da84edb865b0b5b0100c0666a9bc9a0b71c553c"
+uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
+version = "1.15.0"
+
+[[deps.DataFrames]]
+deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
+git-tree-sha1 = "04c738083f29f86e62c8afc341f0967d8717bdb8"
+uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+version = "1.6.1"
+
+[[deps.DataStructures]]
+deps = ["Compat", "InteractiveUtils", "OrderedCollections"]
+git-tree-sha1 = "3dbd312d370723b6bb43ba9d02fc36abade4518d"
+uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
+version = "0.18.15"
+
+[[deps.DataValueInterfaces]]
+git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
+uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
+version = "1.0.0"
+
+[[deps.Dates]]
+deps = ["Printf"]
+uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
+
+[[deps.DefineSingletons]]
+git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c"
+uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52"
+version = "0.1.2"
+
+[[deps.DelimitedFiles]]
+deps = ["Mmap"]
+git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae"
+uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"
+version = "1.9.1"
+
+[[deps.DiffResults]]
+deps = ["StaticArraysCore"]
+git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621"
+uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5"
+version = "1.1.0"
+
+[[deps.DiffRules]]
+deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"]
+git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272"
+uuid = "b552c78f-8df3-52c6-915a-8e097449b14b"
+version = "1.15.1"
+
+[[deps.DimensionalData]]
+deps = ["Adapt", "ArrayInterface", "ConstructionBase", "Dates", "Extents", "IntervalSets", "IteratorInterfaceExtensions", "LinearAlgebra", "PrecompileTools", "Random", "RecipesBase", "SparseArrays", "Statistics", "TableTraits", "Tables"]
+git-tree-sha1 = "8a6e9c0ac3a861b983af862cefabc12519884a13"
+uuid = "0703355e-b756-11e9-17c0-8b28908087d0"
+version = "0.24.13"
+
+[[deps.Distributed]]
+deps = ["Random", "Serialization", "Sockets"]
+uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
+
+[[deps.Distributions]]
+deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns", "Test"]
+git-tree-sha1 = "27a18994a5991b1d2e2af7833c4f8ecf9af6b9ea"
+uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
+version = "0.25.99"
+
+ [deps.Distributions.extensions]
+ DistributionsChainRulesCoreExt = "ChainRulesCore"
+ DistributionsDensityInterfaceExt = "DensityInterface"
+
+ [deps.Distributions.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d"
+
+[[deps.DocStringExtensions]]
+deps = ["LibGit2"]
+git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d"
+uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
+version = "0.9.3"
+
+[[deps.Downloads]]
+deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
+uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
+version = "1.6.0"
+
+[[deps.DualNumbers]]
+deps = ["Calculus", "NaNMath", "SpecialFunctions"]
+git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566"
+uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74"
+version = "0.6.8"
+
+[[deps.Extents]]
+git-tree-sha1 = "5e1e4c53fa39afe63a7d356e30452249365fba99"
+uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910"
+version = "0.1.1"
+
+[[deps.FilePathsBase]]
+deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"]
+git-tree-sha1 = "e27c4ebe80e8699540f2d6c805cc12203b614f12"
+uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
+version = "0.9.20"
+
+[[deps.FileWatching]]
+uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
+
+[[deps.FillArrays]]
+deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"]
+git-tree-sha1 = "f372472e8672b1d993e93dada09e23139b509f9e"
+uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
+version = "1.5.0"
+
+[[deps.Format]]
+git-tree-sha1 = "03bcdf8ab1a5b9e6455ccb45c30910d282aa09f4"
+uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8"
+version = "1.3.2"
+
+[[deps.ForwardDiff]]
+deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"]
+git-tree-sha1 = "00e252f4d706b3d55a8863432e742bf5717b498d"
+uuid = "f6369f11-7733-5829-9624-2563aa707210"
+version = "0.10.35"
+
+ [deps.ForwardDiff.extensions]
+ ForwardDiffStaticArraysExt = "StaticArrays"
+
+ [deps.ForwardDiff.weakdeps]
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
+[[deps.Future]]
+deps = ["Random"]
+uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"
+
+[[deps.Highlights]]
+deps = ["DocStringExtensions", "InteractiveUtils", "REPL"]
+git-tree-sha1 = "0341077e8a6b9fc1c2ea5edc1e93a956d2aec0c7"
+uuid = "eafb193a-b7ab-5a9e-9068-77385905fa72"
+version = "0.5.2"
+
+[[deps.HypergeometricFunctions]]
+deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"]
+git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685"
+uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a"
+version = "0.3.23"
+
+[[deps.InitialValues]]
+git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3"
+uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c"
+version = "0.3.1"
+
+[[deps.InlineStrings]]
+deps = ["Parsers"]
+git-tree-sha1 = "9cc2baf75c6d09f9da536ddf58eb2f29dedaf461"
+uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48"
+version = "1.4.0"
+
+[[deps.IntelOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "0cb9352ef2e01574eeebdb102948a58740dcaf83"
+uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
+version = "2023.1.0+0"
+
+[[deps.InteractiveUtils]]
+deps = ["Markdown"]
+uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
+
+[[deps.IntervalSets]]
+deps = ["Dates", "Random"]
+git-tree-sha1 = "8e59ea773deee525c99a8018409f64f19fb719e6"
+uuid = "8197267c-284f-5f27-9208-e0e47529a953"
+version = "0.7.7"
+weakdeps = ["Statistics"]
+
+ [deps.IntervalSets.extensions]
+ IntervalSetsStatisticsExt = "Statistics"
+
+[[deps.InvertedIndices]]
+git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038"
+uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
+version = "1.3.0"
+
+[[deps.IrrationalConstants]]
+git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2"
+uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
+version = "0.2.2"
+
+[[deps.IteratorInterfaceExtensions]]
+git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
+uuid = "82899510-4779-5014-852e-03e436cf321d"
+version = "1.0.0"
+
+[[deps.JLLWrappers]]
+deps = ["Preferences"]
+git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1"
+uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
+version = "1.4.1"
+
+[[deps.JSON]]
+deps = ["Dates", "Mmap", "Parsers", "Unicode"]
+git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a"
+uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
+version = "0.21.4"
+
+[[deps.JuMP]]
+deps = ["LinearAlgebra", "MathOptInterface", "MutableArithmetics", "OrderedCollections", "Printf", "SnoopPrecompile", "SparseArrays"]
+git-tree-sha1 = "3cacc9aa90f3313e0375b1c4ac4641c8d57349ef"
+uuid = "4076af6c-e467-56ae-b986-b466b2749572"
+version = "1.13.0"
+
+[[deps.LaTeXStrings]]
+git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996"
+uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
+version = "1.3.0"
+
+[[deps.LazyArtifacts]]
+deps = ["Artifacts", "Pkg"]
+uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
+
+[[deps.LibCURL]]
+deps = ["LibCURL_jll", "MozillaCACerts_jll"]
+uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"
+version = "0.6.3"
+
+[[deps.LibCURL_jll]]
+deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"]
+uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"
+version = "7.84.0+0"
+
+[[deps.LibGit2]]
+deps = ["Base64", "NetworkOptions", "Printf", "SHA"]
+uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"
+
+[[deps.LibSSH2_jll]]
+deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
+uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"
+version = "1.10.2+0"
+
+[[deps.Libdl]]
+uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
+
+[[deps.LinearAlgebra]]
+deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
+uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+
+[[deps.LogExpFunctions]]
+deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"]
+git-tree-sha1 = "c3ce8e7420b3a6e071e0fe4745f5d4300e37b13f"
+uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
+version = "0.3.24"
+
+ [deps.LogExpFunctions.extensions]
+ LogExpFunctionsChainRulesCoreExt = "ChainRulesCore"
+ LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables"
+ LogExpFunctionsInverseFunctionsExt = "InverseFunctions"
+
+ [deps.LogExpFunctions.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0"
+ InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
+
+[[deps.Logging]]
+uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
+
+[[deps.MKL_jll]]
+deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"]
+git-tree-sha1 = "2ce8695e1e699b68702c03402672a69f54b8aca9"
+uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
+version = "2022.2.0+0"
+
+[[deps.MacroTools]]
+deps = ["Markdown", "Random"]
+git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2"
+uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
+version = "0.5.10"
+
+[[deps.Markdown]]
+deps = ["Base64"]
+uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
+
+[[deps.MathOptInterface]]
+deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"]
+git-tree-sha1 = "5c5cd501ae1d76d3ccd7c7e6b4325a15dde7f31c"
+uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"
+version = "1.18.0"
+
+[[deps.MbedTLS_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
+version = "2.28.2+0"
+
+[[deps.Memoization]]
+deps = ["MacroTools"]
+git-tree-sha1 = "073f080e733bc6697411901224ed4fd15fefaffa"
+uuid = "6fafb56a-5788-4b4e-91ca-c0cea6611c73"
+version = "0.2.1"
+
+[[deps.MicroCollections]]
+deps = ["BangBang", "InitialValues", "Setfield"]
+git-tree-sha1 = "629afd7d10dbc6935ec59b32daeb33bc4460a42e"
+uuid = "128add7d-3638-4c79-886c-908ea0c25c34"
+version = "0.1.4"
+
+[[deps.Missings]]
+deps = ["DataAPI"]
+git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272"
+uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
+version = "1.1.0"
+
+[[deps.Mmap]]
+uuid = "a63ad114-7e13-5084-954f-fe012c677804"
+
+[[deps.MozillaCACerts_jll]]
+uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
+version = "2022.10.11"
+
+[[deps.MutableArithmetics]]
+deps = ["LinearAlgebra", "SparseArrays", "Test"]
+git-tree-sha1 = "964cb1a7069723727025ae295408747a0b36a854"
+uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0"
+version = "1.3.0"
+
+[[deps.MyterialColors]]
+git-tree-sha1 = "01d8466fb449436348999d7c6ad740f8f853a579"
+uuid = "1c23619d-4212-4747-83aa-717207fae70f"
+version = "0.3.0"
+
+[[deps.NaNMath]]
+deps = ["OpenLibm_jll"]
+git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4"
+uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
+version = "1.0.2"
+
+[[deps.NetworkOptions]]
+uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
+version = "1.2.0"
+
+[[deps.OpenBLAS32_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "2fb9ee2dc14d555a6df2a714b86b7125178344c2"
+uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2"
+version = "0.3.21+0"
+
+[[deps.OpenBLAS_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
+uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
+version = "0.3.21+4"
+
+[[deps.OpenLibm_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
+version = "0.8.1+0"
+
+[[deps.OpenSpecFun_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1"
+uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
+version = "0.5.5+0"
+
+[[deps.OrderedCollections]]
+git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3"
+uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
+version = "1.6.2"
+
+[[deps.PDMats]]
+deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
+git-tree-sha1 = "67eae2738d63117a196f497d7db789821bce61d1"
+uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
+version = "0.11.17"
+
+[[deps.ParallelUtilities]]
+deps = ["DataStructures", "Distributed", "SplittablesBase"]
+git-tree-sha1 = "704ef2c93e301b6469ba63103a4e7bf935e6990c"
+uuid = "fad6cfc8-4f83-11e9-06cc-151124046ad0"
+version = "0.8.6"
+
+[[deps.Parameters]]
+deps = ["OrderedCollections", "UnPack"]
+git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe"
+uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a"
+version = "0.12.3"
+
+[[deps.Parsers]]
+deps = ["Dates", "PrecompileTools", "UUIDs"]
+git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851"
+uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
+version = "2.7.2"
+
+[[deps.Pkg]]
+deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
+uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
+version = "1.9.2"
+
+[[deps.PooledArrays]]
+deps = ["DataAPI", "Future"]
+git-tree-sha1 = "a6062fe4063cdafe78f4a0a81cfffb89721b30e7"
+uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720"
+version = "1.4.2"
+
+[[deps.PrecompileTools]]
+deps = ["Preferences"]
+git-tree-sha1 = "9673d39decc5feece56ef3940e5dafba15ba0f81"
+uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
+version = "1.1.2"
+
+[[deps.Preferences]]
+deps = ["TOML"]
+git-tree-sha1 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1"
+uuid = "21216c6a-2e73-6563-6e65-726566657250"
+version = "1.4.0"
+
+[[deps.PrettyTables]]
+deps = ["Crayons", "LaTeXStrings", "Markdown", "Printf", "Reexport", "StringManipulation", "Tables"]
+git-tree-sha1 = "ee094908d720185ddbdc58dbe0c1cbe35453ec7a"
+uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
+version = "2.2.7"
+
+[[deps.Printf]]
+deps = ["Unicode"]
+uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
+
+[[deps.Profile]]
+deps = ["Printf"]
+uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79"
+
+[[deps.ProgressLogging]]
+deps = ["Logging", "SHA", "UUIDs"]
+git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539"
+uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c"
+version = "0.1.4"
+
+[[deps.ProgressMeter]]
+deps = ["Distributed", "Printf"]
+git-tree-sha1 = "d7a7aef8f8f2d537104f170139553b14dfe39fe9"
+uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
+version = "1.7.2"
+
+[[deps.PsychometricTests]]
+deps = ["DimensionalData", "Format", "LinearAlgebra", "PrecompileTools", "StatsBase", "Tables", "Term"]
+git-tree-sha1 = "52b9832750bc1db614f84e0601e1418a4d191118"
+repo-rev = "main"
+repo-url = "https://github.com/JuliaPsychometrics/PsychometricTests.jl.git"
+uuid = "f849c049-6981-48c9-9be9-354155c91302"
+version = "0.1.0"
+
+[[deps.QuadGK]]
+deps = ["DataStructures", "LinearAlgebra"]
+git-tree-sha1 = "6ec7ac8412e83d57e313393220879ede1740f9ee"
+uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
+version = "2.8.2"
+
+[[deps.RCall]]
+deps = ["CategoricalArrays", "Conda", "DataFrames", "DataStructures", "Dates", "Libdl", "Missings", "REPL", "Random", "Requires", "StatsModels", "WinReg"]
+git-tree-sha1 = "d441bdeea943f8e8f293e0e3a78fe2d7c3aa24e6"
+uuid = "6f49c342-dc21-5d91-9882-a32aef131414"
+version = "0.13.15"
+
+[[deps.REPL]]
+deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
+uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
+
+[[deps.Random]]
+deps = ["SHA", "Serialization"]
+uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+
+[[deps.RecipesBase]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff"
+uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
+version = "1.3.4"
+
+[[deps.Reexport]]
+git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
+uuid = "189a3867-3050-52da-a836-e630ba90ab69"
+version = "1.2.2"
+
+[[deps.Referenceables]]
+deps = ["Adapt"]
+git-tree-sha1 = "e681d3bfa49cd46c3c161505caddf20f0e62aaa9"
+uuid = "42d2dcc6-99eb-4e98-b66c-637b7d73030e"
+version = "0.1.2"
+
+[[deps.Requires]]
+deps = ["UUIDs"]
+git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7"
+uuid = "ae029012-a4dd-5104-9daa-d747884805df"
+version = "1.3.0"
+
+[[deps.Rmath]]
+deps = ["Random", "Rmath_jll"]
+git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b"
+uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa"
+version = "0.7.1"
+
+[[deps.Rmath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da"
+uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
+version = "0.4.0+0"
+
+[[deps.SCS]]
+deps = ["MathOptInterface", "Requires", "SCS_GPU_jll", "SCS_MKL_jll", "SCS_jll", "SparseArrays"]
+git-tree-sha1 = "0d50e34ba04e847507f247c393deb82993951b59"
+uuid = "c946c3f1-0d1f-5ce8-9dea-7daa1f7e2d13"
+version = "1.2.1"
+
+[[deps.SCS_GPU_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenBLAS32_jll"]
+git-tree-sha1 = "6a61274837cfa050bd996910d347e876bef3a6b3"
+uuid = "af6e375f-46ec-5fa0-b791-491b0dfa44a4"
+version = "3.2.3+1"
+
+[[deps.SCS_MKL_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "MKL_jll"]
+git-tree-sha1 = "1ca6e41193c08fb345b58a05a6cfa8e309939313"
+uuid = "3f2553a9-4106-52be-b7dd-865123654657"
+version = "3.2.3+1"
+
+[[deps.SCS_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenBLAS32_jll"]
+git-tree-sha1 = "e4902566d6207206c27fe6f45e8c2d28c34889df"
+uuid = "f4f2fc5b-1d94-523c-97ea-2ab488bedf4b"
+version = "3.2.3+0"
+
+[[deps.SHA]]
+uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
+version = "0.7.0"
+
+[[deps.SentinelArrays]]
+deps = ["Dates", "Random"]
+git-tree-sha1 = "04bdff0b09c65ff3e06a05e3eb7b120223da3d39"
+uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
+version = "1.4.0"
+
+[[deps.Serialization]]
+uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
+
+[[deps.Setfield]]
+deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"]
+git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac"
+uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46"
+version = "1.1.1"
+
+[[deps.ShiftedArrays]]
+git-tree-sha1 = "503688b59397b3307443af35cd953a13e8005c16"
+uuid = "1277b4bf-5013-50f5-be3d-901d8477a67a"
+version = "2.0.0"
+
+[[deps.SnoopPrecompile]]
+deps = ["Preferences"]
+git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c"
+uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c"
+version = "1.0.3"
+
+[[deps.Sockets]]
+uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
+
+[[deps.SortingAlgorithms]]
+deps = ["DataStructures"]
+git-tree-sha1 = "c60ec5c62180f27efea3ba2908480f8055e17cee"
+uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
+version = "1.1.1"
+
+[[deps.SparseArrays]]
+deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"]
+uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+
+[[deps.SpecialFunctions]]
+deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
+git-tree-sha1 = "7beb031cf8145577fbccacd94b8a8f4ce78428d3"
+uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
+version = "2.3.0"
+
+ [deps.SpecialFunctions.extensions]
+ SpecialFunctionsChainRulesCoreExt = "ChainRulesCore"
+
+ [deps.SpecialFunctions.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+
+[[deps.SplittablesBase]]
+deps = ["Setfield", "Test"]
+git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5"
+uuid = "171d559e-b47b-412a-8079-5efa626c420e"
+version = "0.1.15"
+
+[[deps.StaticArraysCore]]
+git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d"
+uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+version = "1.4.2"
+
+[[deps.Statistics]]
+deps = ["LinearAlgebra", "SparseArrays"]
+uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+version = "1.9.0"
+
+[[deps.StatsAPI]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "45a7769a04a3cf80da1c1c7c60caf932e6f4c9f7"
+uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
+version = "1.6.0"
+
+[[deps.StatsBase]]
+deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
+git-tree-sha1 = "75ebe04c5bed70b91614d684259b661c9e6274a4"
+uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
+version = "0.34.0"
+
+[[deps.StatsFuns]]
+deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
+git-tree-sha1 = "f625d686d5a88bcd2b15cd81f18f98186fdc0c9a"
+uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
+version = "1.3.0"
+
+ [deps.StatsFuns.extensions]
+ StatsFunsChainRulesCoreExt = "ChainRulesCore"
+ StatsFunsInverseFunctionsExt = "InverseFunctions"
+
+ [deps.StatsFuns.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
+
+[[deps.StatsModels]]
+deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Printf", "REPL", "ShiftedArrays", "SparseArrays", "StatsBase", "StatsFuns", "Tables"]
+git-tree-sha1 = "8cc7a5385ecaa420f0b3426f9b0135d0df0638ed"
+uuid = "3eaba693-59b7-5ba5-a881-562e759f1c8d"
+version = "0.7.2"
+
+[[deps.StringManipulation]]
+git-tree-sha1 = "46da2434b41f41ac3594ee9816ce5541c6096123"
+uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e"
+version = "0.3.0"
+
+[[deps.SuiteSparse]]
+deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
+uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
+
+[[deps.SuiteSparse_jll]]
+deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"]
+uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c"
+version = "5.10.1+6"
+
+[[deps.TOML]]
+deps = ["Dates"]
+uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
+version = "1.0.3"
+
+[[deps.TableTraits]]
+deps = ["IteratorInterfaceExtensions"]
+git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
+uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
+version = "1.0.1"
+
+[[deps.Tables]]
+deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"]
+git-tree-sha1 = "1544b926975372da01227b382066ab70e574a3ec"
+uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+version = "1.10.1"
+
+[[deps.Tar]]
+deps = ["ArgTools", "SHA"]
+uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"
+version = "1.10.0"
+
+[[deps.Term]]
+deps = ["AbstractTrees", "CodeTracking", "Dates", "Highlights", "InteractiveUtils", "Logging", "Markdown", "MyterialColors", "OrderedCollections", "Parameters", "PrecompileTools", "ProgressLogging", "REPL", "Tables", "UUIDs", "Unicode", "UnicodeFun"]
+git-tree-sha1 = "ffac67f6fbcbb32027d924b93ba91b7633af9220"
+uuid = "22787eb5-b846-44ae-b979-8e399b8463ab"
+version = "2.0.5"
+
+[[deps.Test]]
+deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
+uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+
+[[deps.ThreadsX]]
+deps = ["ArgCheck", "BangBang", "ConstructionBase", "InitialValues", "MicroCollections", "Referenceables", "Setfield", "SplittablesBase", "Transducers"]
+git-tree-sha1 = "34e6bcf36b9ed5d56489600cf9f3c16843fa2aa2"
+uuid = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d"
+version = "0.1.11"
+
+[[deps.TranscodingStreams]]
+deps = ["Random", "Test"]
+git-tree-sha1 = "9a6ae7ed916312b41236fcef7e0af564ef934769"
+uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
+version = "0.9.13"
+
+[[deps.Transducers]]
+deps = ["Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "Setfield", "SplittablesBase", "Tables"]
+git-tree-sha1 = "53bd5978b182fa7c57577bdb452c35e5b4fb73a5"
+uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999"
+version = "0.4.78"
+
+ [deps.Transducers.extensions]
+ TransducersBlockArraysExt = "BlockArrays"
+ TransducersDataFramesExt = "DataFrames"
+ TransducersLazyArraysExt = "LazyArrays"
+ TransducersOnlineStatsBaseExt = "OnlineStatsBase"
+ TransducersReferenceablesExt = "Referenceables"
+
+ [deps.Transducers.weakdeps]
+ BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02"
+ OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338"
+ Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e"
+
+[[deps.UUIDs]]
+deps = ["Random", "SHA"]
+uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
+
+[[deps.UnPack]]
+git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b"
+uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
+version = "1.0.2"
+
+[[deps.Unicode]]
+uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"
+
+[[deps.UnicodeFun]]
+deps = ["REPL"]
+git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf"
+uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1"
+version = "0.4.1"
+
+[[deps.VersionParsing]]
+git-tree-sha1 = "58d6e80b4ee071f5efd07fda82cb9fbe17200868"
+uuid = "81def892-9a0e-5fdd-b105-ffc91e053289"
+version = "1.3.0"
+
+[[deps.WeakRefStrings]]
+deps = ["DataAPI", "InlineStrings", "Parsers"]
+git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23"
+uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
+version = "1.4.2"
+
+[[deps.WinReg]]
+git-tree-sha1 = "cd910906b099402bcc50b3eafa9634244e5ec83b"
+uuid = "1b915085-20d7-51cf-bf83-8f477d6f5128"
+version = "1.0.0"
+
+[[deps.WorkerUtilities]]
+git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7"
+uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60"
+version = "1.6.1"
+
+[[deps.Zlib_jll]]
+deps = ["Libdl"]
+uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
+version = "1.2.13+0"
+
+[[deps.libblastrampoline_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "8e850b90-86db-534c-a0d3-1478176c7d93"
+version = "5.8.0+0"
+
+[[deps.nghttp2_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
+version = "1.48.0+0"
+
+[[deps.p7zip_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
+version = "17.4.0+0"
diff --git a/benchmark/Project.toml b/benchmark/Project.toml
new file mode 100644
index 0000000..866d178
--- /dev/null
+++ b/benchmark/Project.toml
@@ -0,0 +1,9 @@
+[deps]
+CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
+ClassicalTestTheory = "e40851f3-a233-49cf-835f-c29ce827671a"
+Conda = "8f4d0f93-b110-5947-807f-2305c1781a2d"
+DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab"
+PsychometricTests = "f849c049-6981-48c9-9be9-354155c91302"
+RCall = "6f49c342-dc21-5d91-9882-a32aef131414"
+StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
diff --git a/benchmark/attitude.csv b/benchmark/attitude.csv
new file mode 100644
index 0000000..3f3d3b0
--- /dev/null
+++ b/benchmark/attitude.csv
@@ -0,0 +1,31 @@
+"rating","complaints","privileges","learning","raises","critical","advance"
+43,51,30,39,61,92,45
+63,64,51,54,63,73,47
+71,70,68,69,76,86,48
+61,63,45,47,54,84,35
+81,78,56,66,71,83,47
+43,55,49,44,54,49,34
+58,67,42,56,66,68,35
+71,75,50,55,70,66,41
+72,82,72,67,71,83,31
+67,61,45,47,62,80,41
+64,53,53,58,58,67,34
+67,60,47,39,59,74,41
+69,62,57,42,55,63,25
+68,83,83,45,59,77,35
+77,77,54,72,79,77,46
+81,90,50,72,60,54,36
+74,85,64,69,79,79,63
+65,60,65,75,55,80,60
+65,70,46,57,75,85,46
+50,58,68,54,64,78,52
+50,40,33,34,43,64,33
+64,61,52,62,66,80,41
+53,66,52,50,63,80,37
+40,37,42,58,50,57,49
+63,54,42,48,66,75,33
+66,77,66,63,88,76,72
+78,75,58,74,80,78,49
+48,57,44,45,51,83,38
+85,85,71,71,77,74,55
+82,82,39,59,64,78,39
diff --git a/benchmark/data.csv b/benchmark/data.csv
new file mode 100644
index 0000000..4c22d9e
--- /dev/null
+++ b/benchmark/data.csv
@@ -0,0 +1,501 @@
+"V1","V2","V3","V4","V5","V6","V7","V8","V9"
+-0.111029890355496,-0.206774171327461,-0.78062163078687,0.798910811777381,0.365922576696257,0.244104489938768,-0.860707454128615,-1.68549021002726,-0.96816977592738
+0.965864454116626,-0.931971319340889,0.94468843935768,0.0628218239488244,-0.14796814231603,-0.29598548481481,0.930450596661614,-0.0140388681774198,1.46632494754109
+0.00425232608592285,1.17904349637683,1.16637801364878,0.592653154501033,0.214240257747005,0.975752859140071,1.71622683098068,-0.763416483218034,1.49424608343399
+-0.301608475236817,0.100517050481232,0.965680793271385,0.711691921461804,-0.930126703641859,-0.679841525990579,0.768553051168579,-0.813618900474385,-1.49110706642286
+-0.768443218013561,0.0916685593513006,0.113524892556075,-1.05804340665462,-0.430644947509362,-1.29895327579319,-2.18092551388417,-1.54219884227613,-1.419066901969
+-0.98366820619776,0.513249852074711,-0.493582760541644,-0.152110018946282,-0.0425900184020123,0.277035910291996,-0.764359372158658,-1.2206419812228,-1.11899996843231
+0.829405713998565,-1.00790752865058,0.160681110333197,-0.890298915848799,-0.280745862102815,-0.575561605856424,0.969330850077569,-0.82193913215895,-0.716659958850944
+0.87543151946139,0.733813395003666,0.452875368040506,-0.101044923727219,-0.241019912600956,0.674691254834692,-0.559024404240915,0.601477482107281,-1.38234371321305
+-0.570191261511068,-2.12928028291266,-1.34855630762208,0.794976706208553,-0.172825461051928,-0.291433231350234,0.460796691843778,-1.51790945528322,-0.408400996973365
+-0.749601676502341,0.20819504512748,-0.652543799073772,-1.43163611070238,0.704768792074209,0.395092480348978,0.843151211559854,-0.763032203523801,-1.60760819686996
+0.555135884257091,1.02135339996629,-0.354371306603432,0.493237856871395,0.76864600112025,1.40936306408472,-1.5447278698993,0.134874018146824,0.0653790288931647
+-0.302865446585585,-1.57933360332745,-0.818721211870032,-0.932117377302693,-1.467383188926,-0.0892401157027414,-0.564411087823607,0.334314313570948,-1.05710508247465
+0.987143808749663,0.53932750881537,1.70094340831383,0.445231972369775,1.15343997486912,1.1654638937435,1.40677178619842,2.32467955024842,0.282853368648754
+0.508783280694115,0.488108370484885,-0.637339339146419,0.550079989691934,0.62356457833512,0.965382234767394,1.65611105018712,-0.387071096164069,-0.772050982184443
+1.52260588328837,-0.463550752327308,-0.574485421927446,0.435673318843039,-0.536019311711564,1.10613062289204,-0.405577036500599,-0.0436328512536946,0.0172147286474563
+0.252028248426582,0.886140906864813,-0.410086793875883,-0.371588226132803,-1.15494262695402,-0.443412696752644,0.0990841205334893,1.21680178925537,-1.25875642880881
+0.15198577353218,-1.51463186730329,-0.821452364844412,0.0368653119590248,1.37245869500505,0.152637929321413,-1.25867905543128,0.336904175227183,1.33431021475226
+0.969687127745842,0.00909373632130023,-0.718674945069861,-0.426236551739247,-0.774076398881374,-1.4146472202992,0.356905598858776,-0.0210769576431493,-0.376655233583988
+-0.276526169942459,-0.0606122609278201,-1.74016819099028,-0.563820698865575,-0.643406265108497,-1.28796805381845,0.567950080304146,1.33195029051987,2.70114623460006
+-0.287014004594933,-0.437313937192907,0.0924853065969032,1.71380869380446,1.41907026924301,1.71996585775534,1.42932595980858,-0.2141999804264,1.70674045842982
+1.12138055589429,1.6468049181696,1.00528540650222,1.50510606389359,1.5877939103683,1.64034434777964,1.66893520100899,1.79605125449609,-0.161847048713009
+0.729619350223315,1.090208405601,1.53344591575158,0.280723563671806,-0.149452503512917,-0.561982737543926,0.557347889991604,-1.24314245831566,-0.761378979114899
+-1.1050498954744,-0.992535741942601,0.355944233560337,0.125452449524216,-0.696217657382495,1.05585557406324,-1.6958186710713,0.761840628365654,0.816354680470836
+-0.833698027742797,-2.25815479719949,0.416909313127923,-1.87159742015404,0.651885734476478,-0.629131065708433,0.691290140145517,-0.608514725259424,0.921962770784745
+-1.48465254140067,0.608777218145537,0.128629477946069,-1.57729798481609,-1.26110464834857,-1.06529598678036,-0.24109733713145,0.647292030943547,2.00678694401576
+0.17625708668731,-1.31414098428815,-1.27780958847616,0.487222237982858,-0.373754385154372,0.496794531939423,-0.653837847717103,0.871517806001823,1.71913474460545
+0.280397990429153,-0.507278840595316,-1.01969356783281,-0.127968138901892,-1.53426496529233,-0.36143986541007,-0.0612915040254038,-0.69994153098219,1.46993773100706
+-0.24866348612476,-0.430911615577592,0.866914675747281,-0.904991263296261,-0.773725219857158,-0.681750237182812,-0.0614741079173566,0.159905700965208,0.308570514370103
+1.02384696226732,-0.230163225618095,-0.300913175141833,2.15267543575636,-0.460120211292381,0.427886847091275,-0.961345744316498,0.513780820977749,0.308840101558693
+1.36720190145806,-0.0590604794349788,1.01509926721768,2.6252495492643,1.10004586189788,1.24418099245166,-0.522135231298583,0.891517197023817,0.784286905814897
+-0.871358404152697,0.360525789522999,-1.3204799678685,-0.827870679852371,-1.73743578969165,0.073238672910846,-0.509508138742464,-1.34709040043758,0.454770594401678
+-0.945640872639945,-0.383346330744664,1.58837539976171,0.15092362040665,-0.0056015172704299,0.100174518235347,-0.286171140931391,-1.52144599359065,0.29897579701326
+-0.0420451597546204,0.668455585335877,0.486599002323462,1.27129893862996,-1.81569392889255,1.10607130534001,1.17412150476992,-0.479172373532586,-0.216000628990387
+0.0698198200923982,-0.507853505381086,-0.478012570067946,0.00152050038786362,-0.760924113539774,0.217549329156501,-0.0137253174270909,-0.943818765700439,-0.511514723073098
+-1.73094057510134,-0.892375227798306,-0.898836913157129,-0.9712721066903,-0.418677722375896,0.320862796595459,-1.99161497848466,-1.05089904924074,-0.729060521366993
+0.367466626624,0.355094583808206,0.437649399330084,0.369653031366327,1.17258547977419,1.50802515256516,-0.558464841649483,-1.50643398354049,1.31033961402395
+-0.840703691583498,-0.240137474665448,-1.24507975671045,-1.29691825626442,-1.38327580977854,-1.65497787071224,-1.06758336573439,-2.12819818879325,-0.81645453317098
+1.29110224096385,0.893406418614096,1.71319025880954,-0.0764194726003392,0.36698798092749,-0.377953036163717,0.627189211732022,-0.96080528070212,1.32277694864965
+0.405165456803097,0.479398030411015,0.497651262174997,-0.0740678194464042,0.791778075825387,-0.00690875035479055,2.00739684385256,0.628114439720611,0.82847810857744
+1.03246255063595,0.333029123854058,0.250482867076374,1.40394735756531,0.673602710690085,-1.26097018426879,-0.29817122070583,-1.10660087413812,1.06774607953368
+-0.175938545569208,-1.04110813177026,-1.05673033127773,-1.01140404598557,0.76917534244519,-1.41161676634522,-1.01670393067091,-1.66985968783848,0.519046672912943
+0.430051169341154,1.77047954005467,0.082758512096482,1.22401437618748,0.666713906748332,0.341147548254378,0.596804512393,1.25291588065151,0.461623942931509
+2.22511824552562,0.00679539942423069,2.33708818559128,-0.757289076003813,1.27431683293938,0.408227832757505,0.391281085225461,0.0329039868437259,1.24081808350179
+1.31935360678513,1.71368112817576,0.68174144885266,1.47883204104855,3.57174496118119,1.85774390663237,1.06428494052208,1.03153217229861,0.563063497537421
+0.435963886027092,-0.763381524992416,-0.525777097083884,0.385963867718016,-1.22463241870628,-1.6026460239901,0.343293031994882,-0.983313812531755,-1.00102115411093
+0.339152631558075,-0.10075675380307,-0.619427887768678,-1.38555308165319,-0.292325360513158,0.94805989726266,2.03202267165607,-0.504915285133105,0.726444954946928
+2.12895952939706,1.63860452006981,1.25951381311456,1.97529320588719,-0.0104207403818624,2.431567625723,-0.616099263336177,-0.792974152073996,-0.0991223934622818
+-1.45192701009847,-0.208962502594465,-1.22219476038976,-0.846603852614351,0.855996481297175,-0.420317571886189,-0.650795424329268,-0.351606076098788,-1.09596099027925
+-1.17513705085362,-0.806734297235486,-0.789997148256803,0.165399078740261,-1.3932070873216,-1.787941742985,-0.591145877796277,-0.922875097275722,1.08315290095651
+0.486855306063305,-0.658967836190521,1.42486875706643,-0.469217695048175,2.04084151653324,0.760682941879232,1.07007271496238,1.1693501594922,1.31227455501727
+1.72257464530244,1.93602746517652,0.910223352720614,1.65458323706426,0.609800729164146,-0.292505177404766,0.930558315187997,1.91783431922756,1.30453863404637
+2.32167364958368,1.63601293746802,1.27203164731898,-0.489366962347482,0.68309692169051,0.970645270000942,-0.757609708833869,-0.101259535747065,-0.51174797778852
+-2.60615602802213,-1.25764511292464,-2.57895117845955,-1.62918840760166,0.195630414701922,-0.153515946055451,-0.856531610579071,0.979668760634081,-0.256766827370121
+0.0950595814632783,-0.620425727985721,-0.661610129188949,-1.4908833075777,-0.985835663794357,-0.180861486356974,0.853912251501069,-0.224926611195117,-0.234577991881042
+-1.11828243964066,-0.959052648169185,-0.834359260360428,-1.67442866908021,-0.858993448583073,-2.32272778660963,-1.52771488124643,-0.803022331355511,0.28989690748731
+0.595004089962213,0.532592352431619,0.254202727389535,0.125339270379555,-1.47990573102872,1.14545363116525,-0.5419955359763,0.569601164715781,-0.695449227875588
+-2.51745763589172,-3.19758927679727,-2.64293571251503,0.0482328831953895,-0.986636438584176,-1.44588102262069,-1.09043489663486,-1.5594784852649,-2.07818423426832
+1.19945606939388,2.30526411026572,1.28215681470053,1.56701113292168,0.14503191894094,-0.325773936371252,0.0774645406810839,-0.123792073218608,-0.424802449028498
+1.00449652486361,0.94943130488211,1.50667979979274,0.145503607251268,1.0307910279856,1.00215419908403,0.518361692220257,-1.20508911806413,-2.1111128359413
+-0.248632607063926,-0.294342668617589,0.295292592120898,-1.27015002751935,-0.978880623719214,0.591140866040308,0.0952844336105726,0.251547649325157,0.591090447790795
+-2.71425851637975,-1.19126643629103,-0.387040295288878,-0.998580443614651,-1.37045286900846,0.186881257784264,-0.827365564197006,-2.0823075551645,-1.72490046913281
+0.887576565126159,-0.860917785813332,1.53532149640288,-0.449688008476579,0.396141457446359,-1.41824859009087,0.396343018139695,1.58283069368779,1.25667205580506
+-0.362148406118918,-0.826925242384277,0.659217800028593,0.199749058761238,-0.0329491585249607,1.77609214565545,-0.249024190991912,-0.699817636732636,-1.53856298877615
+-1.20647181061503,-0.401012067320146,-0.76360483245423,-0.162803577700972,-0.278837436550059,-0.988795197583263,-0.388508037208915,-0.484226218444929,-0.327272840658128
+-0.249151246349262,0.32981673215112,0.818622336728169,0.933894126122012,1.37488753197603,-0.417100638746344,0.409697533909299,-0.0135525941012792,0.0303960878090345
+1.74903466804532,1.29872077516234,-0.0892631191100606,0.184809395471744,-0.398622355811072,0.466289967498365,1.67954703469101,1.48198415590028,2.14506159601985
+-1.5503590211971,-0.957984990781352,0.210680531302416,-0.919981156643445,-0.725697369401672,-0.830848070077039,1.36467998797707,-1.46896202444784,0.433484978859665
+-0.549307366542413,-0.275049047990005,-0.918016262426693,0.271310081905069,2.28655870217912,-0.0508940259784705,-0.262180757820859,-0.722769636841297,0.548404050427127
+-1.6964689879597,-0.023444087094239,0.0103879727734387,-0.347495838713008,0.0836784153759508,-0.122347195052136,-1.44012478529661,0.262269141487249,-0.525988235769346
+0.91694741200769,-0.581577387141238,-0.213103777043857,-0.0670478287418474,0.874305009087368,0.595204235598231,-0.785887866467129,-1.06301245480884,-0.654594183584146
+-0.0903980127362444,0.756209391821574,0.230453304454162,-1.69185723012114,-1.09424430035785,0.227934834820413,-0.32819956737491,-1.39435747079964,0.0706217808319812
+-0.396832508488312,-0.503833246274239,-0.995820340396535,1.4246226489756,0.958426742422306,1.11119355408856,0.246859783507688,0.13568156021464,-0.259454631463921
+-0.587749434339869,0.240832729850084,-0.699980833295563,-0.795785331970814,0.302645097766812,-0.846034479452298,1.43894414778772,0.51505889034122,-1.38116516160834
+0.655032006245088,1.03639037291812,0.682477379138039,1.26077812126528,-1.02606232633033,0.0508858163491998,-0.660636154571647,-0.231822214945248,0.177463130076396
+0.363410473686682,0.25839197270022,0.359781574849754,0.302272467145077,0.587955637779022,0.0771051384101673,-0.0387019063776086,0.562459558025394,-1.06825742123354
+1.62742137643321,0.348112143651259,-0.14770595603089,-0.190297618193629,-0.5272384199494,0.39243432552714,-0.148664518728341,-0.71166772200026,-0.593921569642074
+0.841771868452189,0.525671828258042,0.918047595231868,0.130761593320132,1.25669687733151,-1.44202264695653,0.412158888913707,1.21096602555646,3.37526460065756
+-1.42888091752279,-0.533421878110302,0.541157433457146,-1.03742401221453,-0.301554535586692,-0.0182986879092162,0.837298847326666,2.23295571373669,-0.3894864453198
+-0.75600506551315,-1.49212653098216,-0.690864096892814,1.57350882376961,0.167079040104814,-0.267360464801708,0.293625381093685,0.0384283566959424,0.47351187163996
+-0.51504121362398,0.203229882195359,0.954597832831776,0.274705053576983,-0.484526258540521,1.29809385026685,-0.311703256018728,0.924776801156959,0.2071154210497
+0.173083300904474,2.10453606665151,0.540108880920421,1.95384499122893,2.91881143595241,1.33919448562539,1.43073385862631,1.98864954951791,0.250166187741377
+-1.03760366024486,-0.709795454990996,-1.56179076932321,-1.18279480222015,-1.027394564048,-0.373181504784248,-0.0183459895473095,-0.786167999503353,0.182430737762748
+0.804390000478002,1.07283220575558,0.876774864008598,0.101728447468402,0.19492523575378,-1.26946410565604,-0.794970631858651,-1.37027787353124,0.151621393841688
+-1.97356537088429,-1.8791485455476,-1.82074815172005,-0.399064371952114,-0.126280418622195,-0.518909433116332,-0.424247205754606,-0.454887700143838,0.349013060044028
+1.12864621153422,-0.00845772027084901,0.53764809649585,-0.559823882697528,-0.974917636277858,-1.270283865158,0.364675540164308,-1.53510801333979,0.290337272680119
+-0.788745234920752,-1.5068140188647,-0.421291071023375,0.494964063832052,-0.694142613551725,-1.49124357876795,-0.849118756539784,0.657708098672867,0.898338481760926
+1.29596787871817,0.701037745412647,-0.398236047044985,-0.118582576981064,0.673373599543227,-0.714765048833251,-0.842338774022566,0.679606686824333,0.53907510422523
+1.80404944493886,1.50905162152085,1.37378854796665,2.34967484390567,1.01262876354198,0.590664962515498,1.81782424590346,2.37594264674105,-0.058013512258177
+1.86750588540649,0.775919841501858,-0.435510912693198,0.605409431117479,1.56376655744581,0.328384706273708,-0.173674154066519,-0.431427093909032,2.13265514721177
+1.07857373348316,2.61870054327544,0.760466764242382,1.1485492201151,0.619092956622316,0.84478524454757,0.567532453655922,0.263656530006458,0.0767917842393354
+-0.423631739108593,-0.81405881264059,0.913042331143434,0.513078633245519,-0.318598889500247,-1.22461401129071,-0.254753846985732,-0.558854295021816,-2.27796655633088
+-1.84932507613669,-0.715870604514026,0.239275856338545,-0.581666818548903,0.881417401632253,-0.438106144701117,-0.309000485423442,-1.47164489989421,0.343848262356673
+0.292646019801971,1.18593858421354,1.91776796432426,1.01330572556767,1.50736904646422,-0.854803104794247,-0.205196589465414,0.733488371922638,-0.477988081814839
+0.0389684888954394,1.2792476152225,-0.451181727588193,-1.6629160772128,-2.30608308508701,-1.80090324398092,0.270883514203747,0.188080901916055,0.300382914838531
+2.21065020182906,-0.676623586559728,1.1697909503098,-0.0222154243769174,1.41630241101021,1.28532707630343,0.272839927645024,0.774429078672768,1.0688691438463
+0.619981361866216,2.3805549845055,0.246863936576082,-0.778550563670103,-0.447811636085204,0.189422353730611,0.66341322195298,1.21063285262691,0.729312328366826
+-0.180154749257074,0.708324572332818,0.421572127162526,-0.567500144993927,-1.17562301197902,-2.1328234780008,0.116048620435585,0.0136756851515859,0.769364777754319
+1.37870627705626,-0.30717588232955,1.3768300191605,1.06917407337619,0.571618242149889,0.950658924283525,-0.226375551581145,0.104229603862974,-0.510651127877006
+-0.146115820226927,0.745220326402945,-1.32905480668146,-0.200666815831596,-0.412327481709063,-0.0179585525523266,-0.0545317164788836,0.823743769760623,0.317093327888087
+-0.561205446603496,0.56366819064521,-1.77407113423957,-1.57011600288671,0.348149376690892,-0.986032399380085,-0.424977949040934,-0.285219897994803,-1.57188273637113
+0.565384390124616,-0.276135510077145,-0.48706197754369,0.0465691874991613,-0.0576573552986393,0.364937908114917,0.373396862391679,1.39939629879582,2.13344032934696
+-1.95952187690184,-1.10528857963176,-3.28253249926689,-0.525764265680508,-0.507359783278117,-0.508790969046275,-1.80333892145181,-0.249241422410008,-0.296081036008442
+-1.69235373703627,-2.57637917147624,1.46956598015227,-0.270991824132955,0.16385502099242,0.79762493353718,-1.113456398006,-0.81735624157926,-0.631000339550175
+0.333734644975978,0.204763759851567,-0.941965976287811,1.63399384107814,-0.206991770352941,-0.518247945500363,0.265598758102466,0.384603043341752,0.43716522235692
+-0.335682675351102,-1.1437949326997,-0.754634538502689,0.324888989670213,-0.944721680800034,0.535601088829795,0.249835020955194,-1.92687394160764,-0.111067894909201
+-0.679233640613446,0.964032656331769,0.971651380162898,-1.79267172482901,-0.637693751254316,-1.32429025831123,0.202001452443314,1.67150559932795,-0.20148462975988
+0.0438778884286075,-1.55936443420506,1.21580767414777,-1.78454113266818,0.129438574406653,-1.1035956497976,0.244941465728607,-1.19772316020627,-0.158697798761678
+-0.13328685303304,-1.83718762134996,-1.38138818138283,-1.96380690799183,-0.542050494403104,-1.82146021995318,0.429385049251624,-0.490196707787203,-1.82128438451987
+-0.241261913565519,-2.0060985579226,0.169262671380323,0.362912878376233,0.373977751992978,-0.699958967279736,-0.470444383259843,1.14523583584716,-0.196759548024386
+-1.83562050418607,0.289705782213033,-1.39104124654408,0.0345925473717372,-0.495349617186768,-0.0198788213894789,-0.772836440961178,-0.910331761944381,-1.1243370014953
+1.45130717447385,-0.431813502750283,0.666067284954825,0.647513380443125,3.04394625886342e-05,-0.155090987167087,0.494189611379658,1.26253681232866,1.20084592872876
+-0.0981190437718014,0.140466554087503,-1.35554332142195,-0.121836084994535,-1.60688556954414,-1.25019075954655,1.1249903134991,0.587940702309984,-0.433971755160572
+-1.65264086773846,-0.507524894057345,0.55736346494264,-0.612805252358196,-0.465522543529789,0.879196821612213,-0.266366761479953,-1.17308163240665,1.15562106885451
+0.631068028162258,0.0415634224472436,2.03417023387334,0.51516639462816,-0.0506618025315659,1.59688100035246,0.50975418620934,-0.390033976361101,-0.672328850249179
+-0.265731016785793,-0.739321284280489,1.54275518616394,-0.519775972613546,0.329451241381572,0.663623183921369,-0.255246897928089,-0.145650540826907,0.39063071472818
+0.111545287804767,0.606760525932841,0.902101362266981,2.0968248996557,0.867671743411333,1.97693872684128,-0.161842316858509,0.143381909007511,-0.562457379388143
+-0.3258284694746,-0.728767474646199,-0.881572522979807,-1.09946601876204,-0.672336081726541,1.38989918406934,-1.72163513498275,-0.522388528292738,-1.63603559514688
+-1.31491362297784,-0.381550023542374,-1.0926402320623,0.146272774649631,0.910934520323952,-1.11795392771002,0.392291405031828,0.704483331013702,-0.436710492318295
+1.65415321600159,1.51952551401919,1.00268420015209,2.39859829588542,0.869001500003946,-0.366102053394943,1.02415709052415,0.816462212776562,1.2675306652762
+0.838084696625224,2.21947057279523,1.24852488334322,2.88644062960069,1.77685006454949,0.764059352161798,1.25458225128189,1.93337936565345,-0.00458978941603572
+0.646933589557523,0.236048284490397,-0.449648542318989,-2.59703418625049,-0.474526347597497,-0.0209075987858505,0.686870379104151,-0.455136486556351,0.0935388988524579
+0.0876641778814493,0.540918032129985,0.268340534477058,0.119218261324724,-1.3011958996073,-0.948994544262196,-0.53057733948161,1.2229377754402,-0.931478848670529
+-0.397852200132722,-1.02964812695755,-0.461951759086367,-0.824627035405463,-1.31483528206157,-0.273052282185013,-0.414879489956004,-1.50668433372358,2.13782826319217
+2.44803793154239,1.59789568071764,1.14814704091679,0.20411548592,0.97037419164587,1.22086586680704,0.902418007071436,1.58818916604249,-0.170138665527798
+0.113764743107334,0.759147379196701,-0.557973324715694,-0.472121907446114,-0.900191754711258,-0.17037791477005,0.12475655142526,0.0679795195519387,-0.866042294942266
+-1.45389439282197,-1.7487850761607,-0.65317240686649,-1.59133896867105,-0.636028456731149,-0.629930120562319,-1.58501474258564,0.37355953134174,-0.127363122836179
+1.73261965614451,-0.793853021933768,1.15496292191566,0.422723901339094,0.487835030291526,-0.60233317778434,-0.905964844007575,1.21394406636281,1.69130734212033
+-1.39312959190611,-0.0470023223867929,-0.683130588283805,-0.27461987935795,-1.49352349671741,2.24510935482317,0.446457544668631,-0.0507528804240418,-1.55695103772451
+-0.90952979399418,-1.44116318063627,-0.51764766227577,-0.25103564241917,1.26152019393955,-0.00377455154777251,-1.48013968403912,-0.435240445412979,-0.508088665932537
+1.30190878267131,-0.109927709216187,0.256539967217039,-0.435521473505875,-0.0592846899472156,-0.514282067879705,0.822451114564444,0.306210008744485,1.12767927657809
+0.647322227226007,1.38684439937396,1.19171244244244,-1.61615046145607,0.909011146416043,0.4423124103387,-0.545023216418051,-1.38550504138469,-2.04034422095751
+0.371177647992934,0.0478270027070011,-1.61337069107432,-0.133684012943997,0.453613550743985,-1.0819928551204,-1.0956857921996,1.90419362455673,0.1633525136606
+0.651823751501226,1.82111439761966,0.39623937426144,-0.203847596029737,0.882625772123846,0.0742648735597029,0.485458764318047,-1.16412906868446,1.6971211674336
+1.72946003995109,-0.0377014644868755,-0.696073905159265,-1.08977049325056,1.67880401204599,0.296989983494837,-0.657544066827215,0.266525925825817,1.51936925229466
+-0.936858902957,-0.909756801461432,-1.29248156187012,-1.04402239338413,-1.7113722120252,-0.415575220592636,-1.26836017051668,-0.762739063959882,-0.897545796558401
+-0.470986818618441,-0.242324418032934,-0.785479252158703,0.159114244269543,0.4257779215017,-0.642745295562052,0.20763872916773,-0.267441845045241,-0.88224259273617
+-1.08688962439571,-0.735402889211343,-1.572746763203,-0.415475195108218,0.316522995517461,-1.15900549328213,-1.46179139342212,-0.0556276005035514,-0.329843669410207
+-0.494598284841288,1.21910404837591,0.145337593517326,0.628249723463363,0.770764904351933,-1.02379082111216,0.721298219459305,0.131903835904275,1.60658932326867
+-0.623223301810086,-0.45010184200205,1.31137079922658,-0.56878568810964,-0.496695976429427,-0.191850909140935,-0.23788586963795,0.698709462493321,1.91173609379972
+-0.886600995561711,-2.29766743794033,-1.26845474951428,-0.081912830715861,-0.342750485222157,0.332194977108938,-0.193195083183807,1.54056593236687,0.137684492231109
+1.17413380422837,0.712490837110664,1.44557138933984,-0.0221121292575706,1.62448196930147,0.797086211631966,1.14715791100087,0.974351508998585,0.389468404099005
+1.00817770699956,0.0881514328040414,-1.05229660329923,0.151462215235259,0.355321176563345,-0.956017662476582,1.32261726144025,-1.48272320880718,-0.341346029638495
+1.82818133862469,1.41467877847349,1.08159037883245,0.772886864092736,1.35760628212028,0.741613845318989,1.71122952887119,1.27129838388164,1.05575567937789
+0.307063025767855,1.01852297428809,-1.28735131941817,1.9739560651891,-1.11665867363422,0.306040103412618,0.946990831582173,-0.390576219111094,0.963410064917459
+-0.0309397858652909,-0.283897278530716,2.15327806436482,0.359769354673788,0.341785227441549,0.8837641544272,0.466288057348094,-0.0906650817973082,-0.249765292958333
+0.286051042010956,-0.143657323508223,-0.257002806493269,0.455522419628713,0.8253526202189,0.0259272334100504,-0.744443588479485,1.08455663415462,-2.10444739572148
+-0.73476311920851,0.715643907464546,1.51020904357734,-1.6207195970885,-1.56605283626161,-1.34992169197607,0.306817437753111,-0.23303604650146,-1.3793233131868
+-0.106261202220487,-0.115615265890917,0.0800390331911626,-0.851038039055619,0.865178422339192,0.0579919349794614,2.04872017080587,3.25829029917992,1.41087822741435
+0.872011983854706,1.07267474991038,0.725115310889376,0.740690894176758,0.40774870079321,0.887546149763471,0.245733068895736,0.0355534412631671,-0.32230492058055
+-0.838793718711422,-0.047103496719044,0.709625803830259,-1.55628119853812,-0.576429561804642,-2.22445875470078,-0.825634369938935,-1.54148750226455,1.02749276538536
+-1.88840292713095,-1.22931439302863,-1.75287790131091,-2.19413544605633,-1.71330003586599,-2.28287125088643,-0.319055741600011,-0.985579129935488,-0.355080483352946
+-0.584657143838503,-1.08464058887631,-0.274201586879806,-0.057096277075992,-0.714415315597955,0.344237415523434,-0.377528017480533,1.30710243684866,-0.538211166917376
+1.18504933236119,0.0269587778667858,0.603262114501047,0.767822283495498,0.125158810297264,-0.455957524881943,-1.25879768529016,-0.601551890407,0.403927081193521
+-1.57047970069828,-0.999787193609296,-1.72994226918135,-2.01323084586802,-2.06147244989251,-0.791062632877821,-0.242691724213431,0.914060290427019,0.466142683376374
+0.0701380156284017,-0.57446424064305,-1.81874316163433,0.807489308920535,0.18281826413688,-1.51242300968153,-0.259825837322282,-0.137977507814243,0.206020622784174
+-1.23229238111973,-0.972291044414439,-0.648978416183834,-0.475375008301614,-0.395158731477014,1.04635745849275,0.00293443930435441,-1.0689701194674,-2.11487287215983
+-0.406088634081712,-0.655382334728999,0.934137595608279,-0.643907051771004,-0.388716588007481,-1.52089728382226,0.193655394534485,1.0036132844396,0.620410000605271
+-0.122698061816152,-0.424810161210483,1.06379347659517,-0.984993576761963,-0.273573433487522,-1.55720745232724,0.369672632803677,-0.120305669530682,-0.0122212276414243
+1.69611068344765,1.86751004858587,0.726334093244576,-0.0759114165236782,-0.391921855980957,-1.20964083605047,0.0325268751399672,-0.411296264844183,0.923112904130175
+-1.49742456539152,-0.853120086441721,-1.17094208769506,0.347340314702131,0.709789129258954,-0.360696717914424,0.460499479526004,0.706808048521495,-2.37397748881585
+0.0717180522504882,-0.304056826069745,-0.0146086268318555,-0.344020338492481,-0.472698732246695,-1.28606945181799,0.0574280295430907,-0.797770496923834,-0.494049874744489
+-0.470078228421577,-0.968014059622048,1.18064996246465,-1.08941667000376,-0.0578079388223255,-1.9543989050229,-1.25733807251856,0.228952336056428,-0.587046300879868
+-1.3064214777532,-0.0609699762672542,-0.68567614855099,-0.795001517360902,-2.49818105041352,-0.279398422259243,-0.831635006612435,0.468644606760834,0.574102478132994
+0.000653149110871443,0.246927334556939,0.2780984727258,-0.0701442935694357,-0.32109514799384,-0.561047706946067,-0.6122751656032,0.944034871246435,0.108386413937867
+-0.225577394159533,-1.43419197417632,-1.48526877176046,-0.00222915911482646,-1.60515521497553,-0.237245496015412,-0.60655849258171,-0.356531338583592,1.91368155855548
+2.3649569937895,1.27475489993641,2.4590921020502,3.07954493634714,1.28178313230891,1.97442675000959,0.412454748914339,1.842580798243,1.41430569441938
+1.26264242960659,0.628460379948521,1.34885137886467,-1.06439416609558,0.639738192571143,-0.0161127228553807,0.603726662913236,0.0137335044678213,-0.0533103229088543
+0.600248044910406,0.689919347016899,-0.592543169129447,-0.48333132587075,-0.302190093185115,-1.93906350916664,-2.13640290504794,-0.389232226830271,1.11141498674536
+-0.489422783743214,0.293607620199307,-1.06534466455358,-1.86199106511361,-0.687698306165695,-0.773779236717453,-1.07849966195419,0.0501725816286803,0.0709061135171816
+-1.98379717110685,-2.11142670035523,-2.71745046848918,-2.34200392164915,-0.462868553670168,-0.829754520725108,-0.722076625364356,-0.8907648460066,-0.499534325682925
+0.43371425309756,0.503453046290726,1.18247540823713,0.744172094221885,1.36309435500695,0.245480781496577,1.49021363782168,1.21525479120505,-0.604656852310608
+-0.151622165059211,-0.510581394504111,-0.0954185530593175,-0.148003044602093,0.342224683486713,1.25269915371861,-0.30630047358564,-1.30937645288732,-0.0174747486076019
+2.25794815672633,3.18043525219788,1.33461804241526,0.231335910653211,1.31459767242975,1.83084646403186,1.13122237084289,-0.108722852538487,0.436669856108059
+0.403605897071747,-0.724348805169245,0.0728836415505381,1.12550036506547,1.03967418671374,-0.33041220260489,-0.564738227286479,0.402001862407591,-0.263098872578946
+-0.856228588152808,0.592777937599275,-1.24731859062628,1.20557830617048,-0.207643628067311,0.884520498124413,0.0121698548351731,0.228219956292661,-0.299320338979607
+2.27282458179317,0.521897893502298,1.57920784482435,2.04020321558439,0.234443426800782,1.89617267069,1.18308741925964,0.185582263178856,0.682862903551283
+0.564527164238347,1.22689212568765,0.288021267566172,0.769654127043735,0.955677868227038,0.418130816763863,0.352249027229036,-1.26440922205866,1.77130077626037
+0.281902515091857,1.81882033787241,0.647593048452737,0.493936520746388,0.660004637665056,1.31736860449968,-0.708350115168475,1.13561765202489,0.37359678577609
+-0.925705992945463,0.529586114130138,-0.208884180684217,-0.927686879120343,0.284516019317872,-0.609247215139677,0.260891048919814,0.831161126034425,0.125302028581814
+0.776954524821253,1.69757040560635,0.597687586025835,0.582447042069146,0.732372737793533,0.123987110048412,-1.59560752294639,0.065510674119193,-0.1127592042303
+-0.428770062728115,-0.38249290118964,-0.311889003062423,-0.576384375107384,-0.873924970432755,-1.15412120850523,-1.11357564930105,0.287646323410484,-0.460285718579159
+-0.872353669700639,-1.3426559114759,-2.06767466326501,-0.2634917226944,0.136852477464832,-0.732366991613468,0.402429945027155,-0.476843742736094,0.60879424503927
+0.480569110515984,-0.496859590656718,0.297883667815781,0.640156609754826,0.951081942497114,-0.64920298626235,0.569454498536499,1.47202613815339,1.11751162006607
+0.108335904646258,-0.543007092357577,-0.846785871464441,-0.646044755671297,0.548957123080484,0.481745394882584,-1.04130258317695,-1.54886298970437,-0.261583269257619
+-0.153348453698678,-0.835367288725226,-0.210125497194518,-0.630717750084226,-1.42884474781758,-0.167580970931553,-1.32217027582035,1.91819416726706,-0.325351270754898
+0.905958107615516,-0.65967519126116,-0.734413159807504,-0.943289943882009,-0.842399077446326,-0.307450811397329,0.464618989951127,0.630238284682026,-0.224216393837585
+-0.745073267120601,-0.711724445877066,0.925500115603322,1.17205943813739,1.78159808672657,1.21012657111535,-0.13218738384984,-1.75028580169125,0.111889155873167
+-0.129781626392458,-0.23025960238108,1.45941658397872,-1.28130333672001,-1.18561362439693,-0.153586479468183,-0.655489756630387,-1.34137117622279,-0.752617687889045
+0.123872513526715,0.741969956373163,-0.438812632556804,1.13464088755807,1.05040641240423,-2.17991609420489,-0.970796138743172,-0.961909090796274,-1.08336205047473
+1.38587359121884,2.01794610801655,0.132349584894218,0.971599992358564,0.389137132357429,2.07376420842015,1.06358254477102,0.15180079742276,-0.455380884897575
+-0.49605628213436,-0.142254504690752,-0.280722582218791,-0.290621789410461,0.688932693702711,-0.901707452602085,0.234746101122956,-1.12939257244426,-0.0441241607705459
+2.26936370243984,1.94928247888297,0.986914859513979,1.9968141488636,1.00024775456635,1.8208439826836,1.35132526318347,0.901602071626022,0.837650256975475
+-3.24785498112791,-2.37663972527152,-0.905891403622161,-1.06849969951393,-0.720563280302153,-0.591100422766223,-0.855017750994618,-2.2482188272857,-0.185555130321621
+-1.49506937436683,-1.36989776454141,-0.10548095400438,-1.26922041184017,0.526747948976231,-0.675113605069651,-1.20923937407168,0.251376124556368,-1.44510587489097
+0.461403783532488,-1.33408214311969,-0.264280774227298,0.233140054447501,0.740226129692933,0.244269706431444,0.378738337378242,1.15659220775595,1.56349827261275
+-0.176727937848842,-0.638964358222129,-0.436167548926332,-0.999340279114517,0.740799224230987,-0.316777380310768,0.86969232471154,-0.39386628243303,-0.694097240855348
+-0.510206387084226,0.170066522799879,-0.811158736907796,-0.796417574862442,0.254485663011732,1.52662043453779,0.0829837523423987,0.813230806585934,-1.3215934475001
+-0.878260802199795,-1.18132252107757,-0.657154151379277,-0.935425767833724,0.227351532364832,0.518419848524655,-0.328219907557392,2.17687331114596,-0.634840085129407
+-0.807116707669032,-0.0855131801102137,-1.114563203409,0.228388587344237,0.529012398983332,-1.30255517287218,-0.0119734005435324,-1.63244885002934,-1.31511533749998
+1.81903971436817,2.23452256893066,2.39112990127813,0.339983103634082,0.89872547885355,1.76349574396587,1.61844052707165,0.33772543143527,0.775738720545407
+-0.184616018405377,-0.293202652214468,-1.09997789242511,-0.255627831661015,-0.108523180751931,-0.516030127305634,0.416930765880032,0.610042780686017,1.17272980120277
+-0.0355820253534778,1.22880536599779,2.24737800132158,-1.55223768493734,-0.681445001823633,-1.08604776501582,-1.17429968760345,-0.51679093349263,-0.44015927036804
+1.4363135777787,0.611935613656437,0.108108900014558,1.85660592564074,0.541383747984203,2.11603033797224,0.279531008162169,0.283575882165983,0.406396530542015
+0.0211734422303941,-0.924656599778478,0.0677357224087112,0.731859085588601,1.15204632571392,-0.690767525981564,1.31600033827725,-0.738440374721066,-0.0622036574021253
+0.0533792979179594,1.71114683164066,1.03623567046276,0.203971717113318,0.0790991473444158,-1.30457887886912,0.925239608715413,-0.179922516970874,0.287715566491399
+1.09133666856141,0.562670000228722,0.309803389852727,0.104273288567165,-0.439876200332944,-0.812983255678684,-0.417964236125259,-1.740361674444,0.553635149377331
+0.823661827410111,0.999957274102372,1.25379890455381,0.369449869399327,-0.92530047562369,0.287078875033779,1.41780185553825,0.558796588267678,-1.77548360373118
+0.223257441157731,-0.131329499064543,-0.784122973129191,-0.937663051494407,0.800457445093917,-0.667177791252065,1.09249925710284,1.56368117669246,-0.0300251035540052
+1.15806393831271,-0.480107435988313,1.03750899702996,1.82963557947563,2.11347043677646,1.42383870423059,-0.542705967813272,0.488763578850837,0.870429875117026
+0.960274659218265,1.59069149271288,0.120838387860572,1.29918534882066,-0.196284632142004,0.805944104800467,-0.475452039443338,-1.41849528160103,0.404460551859971
+-0.0908114845622182,1.24650301222303,1.57538616065188,0.0254684770645683,0.811796617277875,-0.867440794243151,0.20657571889435,0.729979143687068,0.72069444284819
+1.02979520369018,0.956372384476101,1.15301374277029,-1.3742487982962,-1.67642680636719,0.40697179293273,-0.206323577721695,-1.04688645080568,1.05665115499932
+0.0851182975383487,-0.139338569523905,-1.41023595783983,0.922796532524537,-1.3071144543804,0.715585217377341,1.2571714160182,1.67275192614061,1.03172407890627
+0.883218363177115,-0.886104127573589,0.0424454977909331,1.55732637641127,0.425727326868228,-0.471993355164725,0.0961492168551903,-0.988117852987712,-1.20152619425264
+0.0156636041117824,-1.28261362671931,-0.999114184409542,-0.580337740919315,0.456274030905177,0.390587018587493,-1.43266905403851,-2.80234473426179,-0.0887543117718969
+1.33091885899289,0.53489432019517,0.448221667429924,0.27833520980302,0.672127426551295,-0.314665518337044,0.0156135873055241,0.345856086060383,-0.807239827768866
+2.65548044861804,1.34736479309763,2.39300170222888,0.697146598563156,0.598558441905183,0.428898868427912,1.68995445368435,1.62275632578838,-0.284872038393339
+-0.131350134535533,0.324148413601096,-0.387092244496118,0.00384639261525069,0.828536576500278,-0.568753685397215,-0.926396350630655,0.387233130332333,0.549946376971751
+0.216239386505919,0.290500413656987,-1.74474535193339,0.185998663437217,0.63564698744465,-1.18314682634601,0.700781041631204,1.77437774889735,0.660677940540066
+0.939252087468252,-1.40536975374162,-0.373947875259105,1.26525989866359,-1.00552586177985,-0.0944252323228215,-0.507689106950443,0.148975936206611,-0.283196574427914
+-1.87527266842212,-1.71207703198527,-1.80349446267921,-0.775507918490327,-1.05628179203674,-1.26497801836911,-0.265440123807129,-1.27289840264802,0.312363264201168
+0.00689779705287014,-0.326719552021792,1.02747708663413,1.84015153473828,0.0448923201411943,-0.58459730215173,1.08505853384772,1.92947185308627,0.8358389356931
+-1.28524845339445,-2.41904583266231,-0.519172568110112,-1.25442432486157,-2.28603155406481,-1.49878835315433,-0.606455347818283,-0.766905130353634,-2.64094435750066
+0.403508635103419,-0.108278917287874,0.346736043730968,-0.557911517687769,0.442553087021381,0.129141159041473,0.172380483035033,-0.903276874662596,0.136729620570568
+-0.0321959133799357,0.356286490691364,0.9624599862717,1.12504726799254,0.123517720697601,-0.768912654017833,1.88641191491646,1.00149682971369,0.598130735503542
+-0.0808490541402762,-0.146622834166005,0.00675912312765975,-0.911567654726733,-0.85623254286575,-1.18986678032296,-3.04123945036311,-1.52167089330019,-1.71975459616214
+-0.256509660961344,0.405646957923069,1.69968486620926,1.02729539890199,-0.580722452910848,0.513341255251551,0.465889196638658,-0.548782338825971,-0.100857688500626
+1.57787201632855,-0.460669800069507,-0.420536533772999,1.01865169767434,-1.18765306694629,0.744705402550039,0.54527304098583,-0.0446529636184335,0.702582267476193
+-0.696042474497142,-0.941075748725152,-0.809502987621826,-0.615707387779454,-0.180612404854881,-0.713040769930362,-0.326453159263484,0.101168314975423,-0.210206345665886
+-0.436989849463017,0.0482139947813219,-0.909195434992008,-0.119579285240873,-0.0129271063337281,-0.00811578554435011,0.386075456045056,-0.546191001233406,0.322843072579447
+-2.06795061100449,-0.215721632614677,-0.916958237588315,-0.229353949347893,0.463961090844817,-0.848100951988994,0.768368546790706,-0.239679922823284,-0.218178725011651
+1.6757604692805,0.960494141853521,0.130410598207297,1.71519308638742,0.492633877119065,0.83182396716502,2.70879761647187,2.99060066542535,1.40372408029682
+0.48730802998921,1.65549928188253,0.530329642140059,-0.0683241691458223,0.208294947568176,1.83356130029711,2.00302307648766,-0.303371656972036,-0.643065233454869
+-0.226898414030876,-0.532518602241601,-0.159222834980883,-1.58488729344799,-0.26075105938778,0.315247902144317,0.119420745945256,0.477485891257619,0.710201646770404
+-1.57942675191632,-1.68050621507333,0.0137092264292238,-0.916719394936901,-0.740827403837844,0.422253705729207,-0.70263925808622,-0.911157786372922,-0.0766772630626993
+0.769514336390583,1.46663332938207,-0.148259384325135,0.96742572891999,1.04871596171753,0.112170844629485,0.831535423337911,-0.0118093092822663,0.851313061928842
+0.230060356349597,-0.680330932648664,-1.46279308513207,0.978220012224579,-1.1488907359468,0.0526986937268617,-0.155122963394348,-2.21572749890354,-1.11477313885292
+2.64611648881638,-1.02801520234212,0.794405564238916,0.260771337208931,1.87213791286599,2.18347340871549,-0.0132525248113209,0.702326243536981,0.0477498455613886
+0.417369251600346,0.122706413406224,0.334000859452875,0.858145581412753,-0.3410834942153,0.825687947936743,0.317908913058137,0.562646375086027,0.11792356795385
+-0.0287047332240902,-0.2347333785469,-1.17405971191895,-0.349040592788047,-0.225772290161114,0.211835885414632,0.707461742756742,0.271690634356522,-2.28078316404773
+-1.37548673534465,-1.69340793307034,-1.25446727513757,-1.1467065673406,-1.41787589340922,0.537650039053218,-0.834550993078351,-0.561960617520734,0.163414365185843
+-0.279889422787639,-0.151117566040261,-0.270489105751237,0.329988842360095,0.455137609788077,0.165257011865054,0.994826303404711,0.887784237514403,0.518319663259285
+0.0534526078066793,0.876555823378117,0.0409178979387197,0.042856387594726,0.0776361085896483,-0.028078805294334,0.0683184708855045,0.868455636082072,0.165946484140158
+-0.931829437317825,-1.2889606348467,0.0511813718607032,-0.333205912208326,0.927952364726375,-0.208136553686258,0.159207798852597,-1.22619840711194,-0.0185887004721071
+0.12220613972666,-0.273189464913316,-0.40653338320487,0.230996631262042,0.0503975634815153,0.664295528639641,-1.38055623083231,-0.465864242366939,-0.3994357637058
+0.950706944280949,0.729391362440084,0.346571648285985,0.125939493343444,1.33752744179734,-0.852797994470719,0.821374435674916,2.06495851226989,-0.315177699145412
+-0.821814192686438,-0.575625947972465,-3.0112107037433,-0.0334971104595332,-0.966945266326286,-0.118845359473678,-0.864265452076683,-0.282827454453956,-0.400190582623138
+0.979887099532015,1.73974819815258,0.566436550090644,1.05214722855808,-0.257053970832505,1.149447584841,0.924896457419743,1.73884167045953,1.08464669191175
+0.118514762122911,0.226939309422559,-0.438602854162222,-0.416248093715253,-0.442533822539006,0.139704413792141,-1.5791209183018,-0.604269377089391,0.393257046175055
+1.16328394810825,0.859010841074518,-0.208026076991245,1.02817946338373,0.864046012561436,-0.681623305492815,-0.524802461750327,-0.276508491941085,1.07989460217011
+0.340234255347329,-0.674818674388258,0.253406618589744,1.98134545658644,1.33351381712771,1.39143191052307,0.125189829047231,-0.0476841113418101,-0.0146448702993291
+-0.40245889264943,0.841235162955051,-0.774230934223989,1.95551521453504,0.78250258249738,2.18122094180862,-0.484222452883142,1.61472843442433,-0.483010403431631
+0.509988425335795,1.88654496337745,0.0462926623171318,-0.67458780731582,-0.740891160990206,2.90270433136778,2.00477568747508,0.391486221029286,0.414002243712176
+-0.0597673035948025,0.164833051846546,0.0576891019326538,-0.350768131237078,-0.421335690419613,-0.958307181247478,0.612981041159182,0.200306872613179,-0.256592256898644
+0.394488190424305,-2.42315621766741,-0.773835140332408,-0.202216027119803,0.234436907367806,1.15376112841125,0.595238790412452,-0.431184295788817,0.262592863539452
+-1.46351522836189,0.245166743040674,0.375835863987105,-0.295692936540945,0.223293016399493,0.752925184661617,2.21230308184035,-0.247530745177361,-0.815011090820499
+-0.144920720109165,-0.339781866716101,0.529979073029534,-0.157430388745424,-0.573172123871824,-0.626517991375788,0.43774813446968,-0.656627024783026,-0.0274273932475653
+0.973928650610304,1.98142074755578,0.823986537515958,-0.356675082024979,0.2844296141364,-0.766470845338607,0.128542033364926,-0.124818357837732,-0.134547213148209
+0.837752998039214,0.425272299162191,-1.19820574414268,-1.23131399274095,-0.0113831816400976,-0.346573930967236,-0.973493589404688,0.119392438368493,-0.878788985181927
+-0.509804267005058,-1.51304176600444,-0.51613015077728,0.317268532827683,-0.378011703697307,0.135982766892968,-0.764280816609862,0.846131323697402,1.21171628243176
+0.179661899348467,-0.926564741528075,0.152907979879501,-0.81483095650654,0.150371499933562,1.18262641837564,0.106232231860468,-0.468271434280389,-1.03363377791346
+0.797175657177714,0.920569467499024,0.393818969326257,-0.707848151985178,0.79513341399166,1.60992712228458,-1.59964495129531,2.59750697131463,0.387013272235565
+-0.663630647100048,-1.73750834068789,-0.172200473150844,-1.14760291891087,0.464229383515596,-0.857031649103178,0.147820102349273,-0.112725883849963,-1.05978006717849
+1.38644454040343,1.11131203929576,0.0879263784270314,0.504632173158207,1.10559058042936,-0.883935169367603,1.38768901398153,1.36433734175938,0.888985398781667
+0.976279980383745,0.322071832615844,0.489506200777226,0.376114165846927,1.71347585959132,1.27015682024892,0.364926228069685,0.55216101732279,-0.0692581755414985
+0.066658127198094,-0.675973190428292,0.174685582239267,-0.0704787970224487,0.0884158364356173,0.351479539445911,-1.65481374067222,0.134537242976991,-0.858021766072068
+0.183303140550692,2.37955869993811,0.652964737922365,0.27308910465259,-0.118203278768564,0.155336066247688,0.496872780742647,1.16126359632757,0.487560887131973
+-1.61769067251358,0.369146954467092,-0.218478088231727,-1.38558502854024,-0.1720729765588,-0.394576795191819,0.217974115077225,-0.192431882040974,-0.333516994648928
+-0.470182986731244,-0.672764235127327,-0.240058319545816,-0.420533633229516,0.181386643122979,-0.500954541839902,-1.12321259017641,-1.10766408354611,0.820842181665122
+-0.834831443841054,-0.121781624936814,0.0326076637081326,0.983813741478726,1.15893565163555,-0.42025971559667,-2.13996667264316,1.99882767900671,-0.63139739566001
+-0.49582269330515,-1.13599428425097,-1.86952396625115,-0.00283151145284916,-1.09947789756268,0.306618926869074,1.35445310208295,0.366446776481073,0.709194375059233
+0.766094219353702,-0.0872941253347714,-0.477187619881252,0.1429297224361,0.620232450904158,1.22466086611516,-0.471138751658157,-0.604262726292721,-1.0095609770193
+-0.790538482401785,-0.816788022308018,0.39813842953905,-0.811646980037977,0.855048764580253,0.132417493646052,0.849286230016562,-0.727947295345589,0.498195709403039
+0.6361243250898,1.23790225184111,-0.425488029786079,1.9566285693194,0.585593830894188,0.612692266949502,-0.255907763546284,0.457917076673353,0.349780676793898
+0.299224127340392,-1.18722429602258,-0.289369914703324,-0.0553954002311163,1.97430794415469,0.923594093067743,0.960627622412651,0.441219114145674,0.536492671655731
+0.0401833955614253,-0.387184844774691,0.244575122658585,-2.13345556985785,0.446920751678631,0.138936661808732,0.872085430617582,-0.526220585480895,-0.587898295411639
+1.27940489178887,-0.52155464546767,0.920224030246193,3.26753224540331,0.896941962508697,0.470095912354768,0.124566384551124,1.53660648779938,0.362824970004069
+0.777804911195523,1.57361074978788,-0.109941841919693,1.62108152646506,1.97698387903419,0.532054213010531,1.31077825596333,0.85990638003235,1.19471428865171
+0.989949057369159,0.840362684217604,0.834651610322578,2.44400325439144,0.535550306220294,1.05143615543413,0.414780819204295,0.676228830882797,1.29862709414375
+0.223636221982946,0.545519860679877,0.123555502499911,0.564885375526963,0.0307778171028779,-0.138963311090736,0.805937932684896,0.916601836272067,0.487057473335749
+0.580392848206604,2.22991334592105,-0.520442111019052,0.54066607972911,1.07285512163461,-1.22641395870222,0.776830899180365,0.529716033499376,2.66116453000059
+0.0468740959917467,0.450143005772537,0.540879409124221,-0.593325443620658,0.120993008942523,1.21740962570178,1.1848222344539,-0.364023348500688,-1.16052989267795
+0.100396803408981,0.334391288572453,0.627376959736194,0.366665438979419,0.280078667979747,0.320352266643192,1.86758900493168,0.513718923972742,0.354020397776156
+-1.47979300997854,-0.182961376713259,-1.00520606129361,-0.941754785233228,-1.43670188900829,-0.522865946653919,0.809992446558202,-1.40350634724948,-0.185841937236087
+-0.30133968678056,0.0345067521742149,-0.489633891470398,0.863029279270271,0.31937821791865,-0.0652739601731318,0.273571329091708,-0.652749917063796,0.216830531369758
+0.300009948020744,0.200660599542487,0.741480911062119,-0.74425144401834,0.653379840596065,-0.280008134746825,-0.53588899464954,-0.647526646527385,-0.058642295424004
+0.710109165208851,-0.504898157145021,0.692188915026253,0.41301166333517,-1.5582104438547,1.51614334121902,-0.948153136915673,-1.63961075245274,-0.665605152033011
+-0.717184320475834,-0.702027845748029,0.506704420944059,-0.779888789804184,-0.510653236822779,1.09162751535738,-0.739684206398515,1.97261080497543,-0.140520764347959
+-1.07179095031054,-2.61831512708309,-2.28176546846123,-1.48392840313977,-2.71981086464007,-0.818236723777438,-0.701556827690969,-1.1290377107747,0.276964704901743
+-0.49886626445744,-0.312432954073767,0.56158563182821,0.116307340802194,-0.717143091173238,0.099469574348058,1.82918047662571,1.00372386095202,-0.459373433292143
+-0.347623826064684,1.03823474643335,1.06474901639361,-0.304534157989892,-0.107327983264152,-0.310020662915064,1.1056740543678,0.387663401341695,0.415325706556482
+-0.122225289657656,-0.0214285517920918,-1.19003535755572,0.336530436137282,0.702812370148093,0.245593544005893,0.0584459767206854,-0.122707585103447,-0.227037628790026
+0.0263070629571648,0.729977721569306,1.09708532094314,1.38027820322183,1.70679638767784,0.300933840619669,-0.264000750768062,-0.430294212634578,-0.391348338165893
+-1.10258854412766,-0.285509272815328,0.385885830682272,-1.28427830823585,-0.96171454360958,0.461564708551175,1.14175181450249,0.296368532386136,-1.72155441976818
+1.61627864937471,-0.767244644473385,0.765063098711496,1.70672545012139,-0.0379295379319815,1.35923603157659,1.66893256515894,-0.882221895580124,-0.383134311231036
+-2.18564792592829,-0.72192432223008,-0.826468482121094,-0.236047344995047,-2.62111651519974,0.318096063255635,-0.601463623260646,-1.20770809212855,0.20698557857622
+0.069724304872167,-1.05810637223894,0.876923247795415,0.794380377916685,-1.66067339210595,-0.849420158784595,0.877642150840369,0.205640008515287,-0.378148080687351
+-0.560120690651923,-0.393366943723924,0.812706759959107,0.386895186315093,-0.156616948550963,2.02845626104433,-0.988261021209569,1.27683619642885,-0.516784214112936
+1.22050417345976,0.0549455415531365,-1.38727364880197,-0.184939586303034,-0.833128740067737,-1.16954676220558,1.06339399941125,-0.573797423257104,1.28308579757099
+1.23656990040217,0.347239262329443,0.128529154014408,0.532239114828588,0.0945448571195671,1.35914080603182,0.314963769850765,0.918713084569119,0.255328515076814
+-1.20152522774429,-1.92269427448557,0.0428613318466475,-0.597709170905438,0.4943459516633,-1.1286429630476,-0.777083674898336,0.244939795532249,0.674096399426818
+-1.35501408198622,-0.607683749766537,-2.48180206579687,0.425158317712364,0.401122943702338,-1.49004401537656,0.472386829212308,0.0570375963036987,0.607670427884542
+-0.256783516516714,-0.524900289994156,0.355758250375829,-1.81711819735698,0.226585740776714,-1.28545755997283,0.502910150086693,0.689865716294518,0.0721716746164555
+0.24155367388511,0.15139982055263,1.7956690191194,-0.727224335237979,0.638457226001035,0.113950432283771,1.25008183189828,-0.946998684879518,-0.803550878003975
+-0.256362940909676,0.0757209825032333,-0.00795777017866055,1.128013542658,-1.06826410711021,0.692943856642061,-1.46909868527938,-0.0304711250452793,0.199020861788034
+-0.480987423365294,-0.0255274420434311,-0.86783339682008,-0.404574424716481,-0.301838045622678,-1.11212235616782,-1.03115013812006,-0.886724730713035,1.12663214665558
+0.189789898746268,1.03771585516514,-1.18737241777796,1.82868063365396,0.075098951616436,0.510993747307159,1.72713845629584,-0.579414729453304,0.821574394731111
+-0.0882706968548767,-0.0499299710612478,-1.23908981287604,0.174720564502712,-0.780102569671619,0.696808891152395,0.437694543447329,0.167925355620825,1.41168450477694
+0.12819500245555,1.30345788793983,1.52267157945216,1.54275282734455,1.09011949432437,2.045843454978,2.45769746379279,1.04560938840653,0.492241679946443
+-0.137533001287445,-0.491913453243248,-1.25454116320505,-0.866676797550337,-1.01269255158307,0.846971256741334,1.55759856517154,-1.35737716336659,-1.36420606142378
+-0.31642526738884,0.159024410236195,0.127216318599995,-1.05651807574576,-0.936727708798348,-0.832728277625183,-0.581387114482645,-1.20170030791685,-0.62159456750269
+-2.81249489828657,-1.98663112323294,-1.18766803469136,-2.23626915252246,-2.07848090942384,-0.345019138169747,-0.500230590091506,-2.20833445343462,-1.88926956172678
+-0.265268195338634,-0.63193303553319,-0.35380577147722,-0.425632658794947,-0.238012564019603,0.420312919302339,-0.100425920320404,-0.205092612433211,-0.788164780632036
+-0.905913392596149,-0.162787956311066,0.825807647102359,-1.3634607670432,-1.43751278557042,-0.674638520519881,-0.107034671948492,-1.34093327412398,-0.637135257831561
+0.430662305560145,0.684596382995734,0.348850075524869,0.232458653590683,0.130179800751206,2.02273542267554,-0.370833624123033,-0.524998876184656,-0.431559016619852
+-0.345558502845444,-1.0040665443486,-0.28333996889212,0.205224386568086,0.0274000562164336,0.213049693458793,1.09427291292874,-0.601157586725343,-0.0921980882511382
+1.41142749554284,0.357078058882489,0.0281681602568962,-1.32507936456397,-0.420197462664909,0.909191086021194,-0.0178344819278268,-0.0698077221633755,-0.196792879505805
+-0.488392536766324,-0.176554733255387,-0.484887883627417,-0.185385457342625,-0.590268442009375,0.266336437251384,0.0139865236904641,-0.829910184514345,-0.00643948248817645
+-1.21125485894791,-1.02494777497128,-1.85761673784921,-0.890494671469829,0.842159020796198,0.596738703199903,0.143138796037635,0.220418317146918,-0.158495254454754
+0.504053727329427,0.014623981092394,-0.0126602070738149,-0.112860665115846,0.691972371892966,-0.306659919282233,-1.03629429579558,-0.0170579669402827,-1.20549041827723
+1.23026236722944,0.658711711036965,1.7471046939354,0.603444993199479,0.0596638526284599,0.594864807411071,1.93144880203418,-0.195725032287482,-1.37098732212909
+0.669526764262547,1.0180807342454,0.526412112630016,-0.873824961141699,-0.63491097615307,0.187935177275799,-0.73594486636479,0.638349078406673,-0.890451839186244
+0.894869416623905,0.242896516070083,0.407470022657859,-0.363051311848941,1.47593512166504,0.201337906775795,-0.257940590027309,-0.195865541335172,1.17284121925858
+-0.959663391259779,-1.46704647199581,-0.860789740954662,-0.273701743916407,-1.18280928774286,-0.970343307358046,-1.66511547761836,-2.14058828116076,-1.21164873602307
+1.27634036254413,0.430220238365635,1.6116928722372,0.41570598454718,1.57372604045226,0.917124985295522,1.35848609332513,0.223100220583228,1.10722556111981
+-1.49073665460649,-0.590599967066028,-0.578797800942072,0.794848848087656,-1.59018386600443,0.772024776084067,-1.19649061800739,-0.373145886789311,0.696210005491243
+0.741880082024206,0.99717267964167,0.94492477680474,1.9845985254578,1.39351222177531,0.732462409539186,1.18986909992989,0.479651035619762,-0.437582205765785
+2.90416994553376,-0.522353611737757,1.28739560864098,0.134036040628383,0.485341560792365,1.21168799535817,0.924979053487474,-0.503061199421123,0.293213128970105
+-0.295903586897711,-0.77563607942294,-0.903977564191226,0.632598695673302,0.774154462066867,-0.702422941998752,-0.689198581431051,-0.264496839477838,-0.175530696275526
+-0.324145914115235,-0.422675777306296,-0.447123285917416,1.28011833038,0.20522647526334,1.14753595286782,0.868469075718081,0.110124663503101,0.65156576497141
+1.67660192088392,2.76659433240258,1.31660595957126,0.510760145274442,0.575385189938399,-1.27228747088884,-0.66753656259919,0.372958065540686,0.360091874129221
+0.858595524891275,0.386994532219092,-0.0415678926311291,0.87972803575887,-0.300528282406474,-0.361220774272773,1.17971450420461,0.443450033628585,0.68010178501486
+0.585020085126686,1.41934366803353,-0.565722107291122,-1.25395505139264,-0.596881925738489,-0.35997117365225,1.46037810978903,-0.51818582007652,0.020946065207275
+1.01414453045958,0.802760152227362,0.412197689800943,1.12347133368771,0.885090945430681,0.691741973179572,0.100276229006227,-0.191360575429398,0.825827597485916
+-0.924184848018887,1.12486329505566,0.986170685218898,-0.436078115418204,0.458168847849722,-0.857000682958579,-0.0691537992363577,-0.122704196447629,-0.659454932862106
+-0.932888886249535,-1.27796923376792,-0.969840827997724,-1.18683596586413,0.0584705726220373,0.829702219612578,-0.410609612537185,-0.638001902828397,-0.0615116574254683
+0.425688602654656,-0.667417862041326,-0.478700390515335,-1.26908732654473,0.51994274759388,0.789723925043661,-0.0520996752119292,-0.226477702822655,-0.0970475732282351
+-1.95750336902481,-1.12954178016659,0.840567840651709,0.736658851352612,-0.662790635966929,0.557603358389425,0.70463920779735,0.709920877393191,0.480964173489905
+0.912657466440378,-0.322341764267431,0.198212374635528,-0.138040881285201,1.22996135816776,1.83869954745779,1.26684694083512,1.44467723871552,0.314372059597613
+1.0921301266614,1.76595227798144,1.13803935544798,1.25642407629472,0.482936108259764,0.629276675358146,1.13389511997325,0.676591453068583,2.21295849290567
+0.830497488683094,1.18219162009311,-1.69630468359652,0.463508875582601,0.87143047825682,0.125368306344716,0.0378062225373548,-0.122002953852059,0.641123844325317
+0.21635777085107,0.296727499125791,0.454760240295286,-0.065240548956648,0.152394826809578,0.501790259060789,-0.34276331353388,2.19450707677309,1.05313622345082
+1.23894068027148,1.36382655804092,0.742661029770427,0.870642632828081,0.0729239337835984,0.17022551205999,-0.419748068288129,-1.35946884201548,0.490523792636412
+-0.0663969720419533,0.260478331302656,-0.231630781760473,-0.0359700474973992,0.821945483049244,1.54416940822976,1.41712863625262,0.3396116556638,0.252117985956162
+1.70493838189158,1.43590325673567,-0.287809893831371,-1.47690412913648,-1.0432572057671,-2.18527907178763,-0.991921751252759,-1.19029909530127,-0.313905494169431
+0.26192350100038,-0.340328724428388,-2.1659745763348,0.740690953824022,1.50331963732694,1.70122514439401,-1.18617248605933,-0.411072503822329,1.85740211016565
+0.403673304549432,-0.356861033016138,0.173759768256464,-1.13350996014609,-0.121633162632978,0.18262440420844,1.27509486240952,-0.411537739724934,0.491562826605948
+-0.748239048011321,-0.753750486105897,-0.289267910634903,0.357694712961298,-0.713331837434846,-0.0622199076988079,0.0349834941171861,-0.509064300063865,1.39928022268859
+-0.529623861357042,-0.511056392389742,0.710181095738085,-0.532074141381273,1.22175386305372,1.28296877553332,0.137589555729638,2.02469436450461,0.251769748127914
+-0.033584501186908,0.304364078622187,1.25672946947974,0.258408704223544,-0.384690245124371,0.224254085617411,0.962253578663809,1.71576392156527,-0.457235577391228
+-0.548428415669067,-0.898387261489475,-0.578128809108692,-0.436961377885178,0.443087386172196,0.406633900926303,-0.0930095582128132,-0.577610654416997,-1.48706754579669
+-2.3379982276978,-0.766004982891516,-1.79579153074168,-1.84243326227519,-1.49293152255427,-1.37996978604717,0.567029381102813,-0.398928615917219,-1.34649952785468
+-1.54952868566114,-0.653801888307826,0.361313204843151,-0.0192166158562931,1.18562901411503,-0.240876072711197,-0.0169730594623477,-1.79502092865587,-1.5377014308594
+0.649664380400136,1.60657653939133,-0.375030441817016,0.839894015603558,1.65722844166664,0.876226827484159,0.434101439238269,-1.03358194081933,0.473281637102254
+-1.73580953762912,0.842242522918885,-0.327805632115469,0.871871662346426,0.539192315519684,-0.313037877702524,0.349438816052722,-0.163517821017278,0.000419320282081664
+-0.392614805327934,-0.966517185785942,-0.430980741170202,0.558638829643789,-0.659420204371094,-1.21661283690287,-0.144003840449223,-0.459375686545692,-0.732809118735448
+0.331850158291977,1.33954234596896,-0.944216623442675,0.0440218601343133,1.09721343394521,-0.52062507703486,-0.211196333558042,-1.09080625851578,0.322265620768935
+0.486747632531436,-0.153706548845531,0.834541657983718,-0.860339073222353,-0.208867350699266,1.40305077551594,-1.47156612339519,-0.479890602380867,-2.28592839716529
+0.275853818973558,1.13961164647499,-0.594246094901284,0.31743396628925,1.63451678769546,-0.69734496701179,0.80614591155032,-1.17636005211361,1.79355594740408
+-0.264844904265769,-1.51433132656048,-1.06614146019707,-1.55971156260664,-0.329169410588441,0.502371864185065,-1.67738615908545,-1.32665154291432,-0.0213223282097696
+-0.297877461950638,0.23471457890677,-0.219757987390509,-0.273549565887017,-1.65418457376998,0.42251559462886,0.890638135069492,-0.306258278407263,-1.16103505500647
+-0.343417749282735,0.494077240339583,0.708214415383271,0.0347393898248039,0.028510755928583,-0.0545748332806737,0.239242645787084,-1.18632309433973,-0.442913866291801
+0.921528732536924,-0.308077546521137,1.96494526316873,1.73428317823449,0.176146105331044,0.308675866242561,-0.255933089499717,-1.02002045691714,0.411911142290357
+-0.237748140894234,0.316488629668423,1.37931017424835,0.0680765195064053,-0.407893029159988,0.905541051585692,-0.414316881438742,-1.44536701312526,-1.11030253165473
+1.22614453277986,0.463275388923509,0.228914792659438,-0.363571602667846,0.259305223686061,0.774937167771865,0.497807153336168,2.29206913990062,1.23264947120185
+0.545713696915175,-0.746228795173603,-0.720118483216619,0.0916471472085644,-1.06222653151939,0.513396219669483,-0.877381443367026,-0.482973443441454,-0.912621204268905
+0.89619276778777,0.643185604315478,1.22279142640877,0.983295231101835,-0.407826996330459,0.797780228462288,1.76959893878175,0.505847439017995,0.411155656505774
+0.167928240234859,0.155171482185354,-0.860602437062035,0.144919718442671,1.15881470588345,0.156807346295932,0.00896547632533101,-2.10212800164998,0.511766839101138
+-0.601177113065057,0.101207110467656,-0.0586235445837926,0.052053576158265,-0.684561326631821,-0.862833800642236,0.979096785201097,0.757268241601312,-0.907090046222224
+1.68064924408469,1.8183921845578,1.04849613142161,0.965620161456201,1.21357946876511,0.168827771679212,1.10069681797378,-0.48822901392048,0.822338842795857
+-0.278889622744602,-0.401320880644159,-1.41357750635225,0.783889891958417,0.0416728287490312,0.171167826213456,-0.827355581303875,0.388333008713483,-2.24687066678854
+-1.43756778735441,-1.33047651057539,-0.681774786554376,-0.0670785220244454,0.699485729548625,-0.1660366323078,-0.0702605927616796,-0.0418676000578795,0.824732485654545
+-1.38806111256863,-1.94005664684813,-0.983896695012411,-1.1441332419167,0.150562177293166,-0.0864383876146245,0.218499590780566,0.474535351910393,0.244512551308731
+1.76388178075388,0.315750661209534,0.580661596958321,0.508208606861483,0.995345750037447,0.317151738074987,1.86993231716544,-0.0489932714031187,1.31169063734517
+-0.387794393342837,-0.170751455820437,-0.117223045713758,0.0395274548873979,-0.408157813753434,0.705011759776022,-0.114227287039933,1.43705082867278,-1.4357715330906
+1.40200914301295,1.8552211954437,-0.26688548455771,1.23945795895326,0.77547569763172,0.708622524544307,1.23441741246621,0.111088605906365,0.795992333738971
+1.39916510444291,-0.326126026523944,1.38474360881847,0.455616298834361,1.16692135812335,-0.998414718988164,0.600820753560662,0.909230008196162,0.142741249577751
+-1.79691984721876,-1.39358371107976,-1.36478395615302,-1.11105927003783,-1.30229141238518,0.124969167728663,0.796953278596549,0.332890787457409,0.810285374183508
+-0.411063333683614,-0.0408087486999335,-0.284019132496586,-0.561926044803269,1.08135867305498,0.905345433980677,1.28110417692571,1.2328245714321,-0.434829990901058
+-0.967858703865201,-1.30400307986155,-1.2453987926325,-0.809218696227026,-0.912334070175014,0.281922430323553,0.278171192845645,-0.0848926118491104,1.6944961613254
+-0.421742081737315,-0.274024735942999,-0.800325336210189,1.4672187086652,-1.22186917695362,0.469505280961929,-0.722374233844536,-0.464474985963793,1.50730642993519
+-0.762479033872186,-0.280685418989667,-0.325664324361142,0.226197776444444,1.876786889436,0.17674287689517,-1.16906942915918,0.116611621685194,-0.279581922575636
+-0.702065423840685,-1.2663331760555,-0.8400414905191,0.183480165522693,-1.18739722926047,0.859720911823678,-1.08068684195874,0.680225321843442,-0.1167832488909
+0.149992596949673,0.137488631882713,-0.363961903850046,0.646560492729967,0.108909530683554,0.572246810236667,1.73187388987921,-0.310081568443542,0.0156276847683538
+0.497311482878103,-0.870702730053491,-1.55944896186101,1.25427570782829,-0.9558093603244,-0.0605547033847006,-0.189464595443345,-0.741424044182912,-0.871262076141341
+0.97167466200714,0.0382924990994042,-0.211295695198918,-0.271099313820831,0.445843342659317,0.486807127779195,2.22244887809227,1.10985981290297,1.59091106074685
+-1.21060023814004,-0.403139053364157,-0.792485617900335,-0.284024378738307,-2.95192143735122,0.313918085346894,0.803204601894137,0.781099165754087,1.28567990954108
+-0.592474161253503,0.140653807013317,-0.0163050057888814,-1.38257488219077,-1.44652369819594,-1.64072876847543,-0.430612119777531,0.45171340397022,0.836135682626962
+-1.65409923765743,-0.0906085950475873,-0.375042291909975,-1.01012388004087,-0.133624696786899,0.212650603025601,-0.335029976529388,-0.443248480155265,-0.625514156172776
+0.829058067309399,0.918531441046065,1.38531605354269,1.25192880278758,-0.0895438620757017,0.102513718808483,-0.102702712040291,0.245413500273568,-0.579044399911129
+-0.714887540105628,-0.00714539578140802,0.131635099149682,-0.00127927293149566,1.32433968241838,0.837208263922436,0.443264426395141,-0.351670272166869,-0.401255734625454
+1.03752925462298,0.100337064656756,1.13509031429378,0.112903704241891,-0.0859728649038787,0.0277189693147167,0.515612294937993,-0.629222486586913,0.315597204883881
+-0.324855743528332,1.46589152974732,-0.487566015483499,0.392941696492286,-0.788123643151977,0.091687049501235,1.02078881080963,0.117801606966864,-0.419508824922097
+0.416491197376492,-0.903601686509438,0.712259021536107,-0.560919709701271,0.330405842878484,0.832587820569563,-2.20552979905802,-0.899269883942522,-0.31835048041349
+-0.344855261813402,-0.394415027670741,-0.301447320725246,0.632517183882409,0.671790235699948,0.662402333463095,0.815851122276449,-0.338940193230717,0.077036586056116
+0.0550637335868062,-1.12488449396114,-0.121092660815407,1.55584817635849,1.16802422948914,0.715384340551873,0.749374181992083,0.722056242330976,0.201252538052975
+1.06983973192471,0.337728044863637,0.820387563163258,-0.898820921056152,1.21662216466452,-1.26578443509187,0.784031707745762,0.51466482259799,0.12280906383008
+0.872649872822473,0.604960020965423,0.022094931954653,1.35159519471749,0.457557840768176,1.43611330682591,-0.580071896964511,0.290377077695135,-1.25029716191363
+0.103241247366601,-1.11561973288419,0.0928350987555501,-1.36838265384463,-0.913689591056154,-0.898483783905313,-1.09622533435186,-0.624582705750118,-1.08984625827132
+1.23595326028876,1.07403401787642,1.02955697071547,0.580581995447518,1.58260769007262,1.27883173447993,0.842663392481283,-0.0424314699799908,1.21802674304441
+-1.15397865532412,-2.08465219279555,0.304228399417016,-0.483888362466503,0.145913734575831,-0.756654694161253,1.26093144755879,-1.0460107873782,-2.40975619957513
+0.587634775596735,1.06911738555437,-0.522832479460029,2.21318507002211,0.858053147768521,1.45126802550815,0.571825229335984,0.980638892002269,-0.622774677766614
+1.63710964685886,1.51790148123118,0.399576252123992,-0.348106469264387,0.148444185967452,1.26041187641152,2.2295001711939,-1.45701757853793,1.08823202723391
+0.0453384885484498,-2.32202126091186,-1.10085492039832,-0.690428345240828,-1.60327819464088,-0.828741679684012,-1.54319076181794,-0.173070214615244,-0.6840826202906
+1.02488771715805,0.0724848130829028,1.81570358618644,1.01836899002053,-0.794003541407916,-0.88299307380166,0.963637908392073,0.92890819275927,1.66987059874521
+-0.252218985202283,-0.653336603888272,-0.851701746935356,-2.43033654558988,-2.16389712319875,-0.904357760700434,-1.46876261969813,-0.387345514399304,-1.96674685554742
+-1.17003764845974,1.15638585387232,-0.428015547600939,-1.51165360198464,0.173994191466234,-0.791389210349874,0.109640310626937,-0.587985101489757,0.451449534857253
+-0.936898251737768,-0.69604512892375,-1.15170863310365,-0.96632948552178,-2.23539960518214,-2.20421232602596,-0.312019633743862,1.04526592103055,0.092540098103775
+-0.770403695027791,-0.324048305926437,-0.812177238247991,-0.107194969051988,0.438250312971894,0.0708517178811954,-1.51214019350526,0.49598246489712,-0.408618851402832
+-0.0423792097688233,-0.490080250201464,0.556999197853427,-0.411788972357762,-1.01683615568384,-1.28536099450312,-1.44401836579981,-1.44822361060589,-0.600146607089063
+0.594299629692266,-0.140906677300196,-0.108101957201467,1.10639158661996,0.124839359356856,-0.468940401570736,-0.113987835465241,1.76951195938899,-0.208114669728385
+-0.75406599674893,-1.61979851333527,0.324286954077276,-0.677117747363357,-1.93056949823667,-0.243791183588439,1.72098036355541,0.281728512717863,1.75312512692437
+0.290775771626993,1.96444238168429,0.450079702131391,1.96836369807081,0.490746278674525,-0.16329918612613,0.975626098162201,0.481414278958531,1.38797493771798
+-0.169783564281841,-0.115589356003125,-0.955842194317219,0.685669603682658,0.560119943932721,0.595687044360019,-1.6358114241239,0.522338389357249,-0.994260219399509
+-1.81427539489294,-0.690541650726788,-0.275808431574534,-0.406927299183381,-1.29632099848102,-0.380178935315181,-1.19730235148618,0.171466784298674,-0.0624160869756474
+-1.31028732155808,-0.885518899197102,-1.17152219576641,-0.518232642229629,-1.57569441814436,-1.59867360385078,-1.4984383572028,-2.0317410643945,0.603234241337162
+-0.512574930837672,0.0820533894160344,-0.977719517890997,-1.14820334236257,-0.294817868642396,0.268228660582469,0.969622605724761,1.04362445630182,2.27419843763729
+-0.959453017860248,-1.11841099662896,0.050619245761591,-0.443078164729706,-0.388320119706022,-1.85406636783109,-0.940345564975712,-0.400121168327436,-0.494504750596479
+-0.356132061995382,-0.700727070758039,0.41209607720472,0.534616117046717,0.123438478580199,-0.609750661160318,0.615910730604535,-0.250158062462294,-0.178415342764023
+0.714149133551573,0.111855039023061,0.496694389417551,0.110671423534544,0.384278026599701,-1.32113358860855,-0.369038568573429,-0.00211432537757483,0.906540803268757
+-0.874900256104576,-0.397693287734205,0.354018194850067,-2.44388285236145,-0.11966849293813,-0.762938939658774,-0.177559944626053,-1.46383147853325,-1.44784771829861
+-2.36711171913511,-1.96807791514693,-0.779646223399254,-0.868827195912648,-2.06984554018711,-1.23054191540638,-1.17873469411251,-1.48200499456982,0.186843996940456
+-0.331462185278158,-0.224465337141639,-0.305714159458461,-0.280759175479019,0.387451323700863,0.737202329476812,0.488636722488431,-0.258509438072054,-0.396167179482898
+0.815729175875208,0.226212679081337,0.277498105153335,0.768321959403977,-0.0290772120361241,0.394989672193582,-0.73703243542858,1.14900441155063,-0.67632875498001
+-0.676051768162176,-1.2608364272013,-0.217232854288091,-0.0134165679671566,0.861013049354063,-0.416274034690141,-1.42379876193097,0.44989907877574,-0.40927424785552
+-0.833290761418215,0.120870180789201,-0.623286947909028,1.16972285749137,1.41993639055183,-0.364013086445927,0.829413331975624,-0.0374823059146824,0.509481538760598
+1.72779352497407,0.891413713932554,0.932817552993402,0.504958141851425,0.399427552677351,0.420821486068405,0.400341563171713,1.51624239931591,-0.238148551517922
+0.702393570143472,-0.808447352497411,0.245223480319675,0.00932551735509483,-0.404378396829741,1.34591940850852,-0.186272003771799,-0.394107757662144,0.0467454225882261
+-0.759550801660698,0.0343213983320109,-2.26482788535992,-0.612865151432414,-0.878102731017824,-0.328960716880649,-0.485344737619826,-0.163803083695781,-0.248054820017629
+0.260828132913792,0.723211817509334,-0.173774640168725,-1.91011131490452,0.19023473679558,-1.22449521618011,-0.49353090619202,0.827319022685767,1.21128028606958
+0.79094769971563,1.13512323232796,0.864711271533644,0.504191273111053,0.849279252865926,0.20113637028623,-0.545276548413213,-0.329079012831147,0.297998283951791
+-0.354801265477632,0.616594743254969,0.792500270676753,0.0445502252982614,-0.192648170823547,0.634713994200178,-1.73471380851247,-0.604437286604438,-0.291710087379521
+-0.986110763655615,0.77542288124515,-0.815287924039143,-0.822579296604596,-0.903541769301814,-0.992454422382313,-0.9988932179256,-0.80163915878552,-0.0213899708315798
+0.249267485463803,0.900114482797006,0.712032553183695,-0.661737960247274,2.28155288095781,0.363615678330072,-0.885479335812278,0.770860071224771,0.407459668394103
+0.0656036285378686,-0.32761283047728,0.114026740674198,0.849178325273831,-0.738103854212583,1.09892351736736,0.824711405103388,-0.357496063575116,-0.716976824256056
+-0.385337613710514,-0.133172537156823,-0.0671765313762064,-0.130884869626083,-1.32960733142122,0.68296450316644,0.0500403787929382,1.01327641675908,0.515670089876548
+-0.578012688567024,0.150351652561554,0.591238779798969,0.2510951504602,0.223481448935513,-0.361974059189703,-0.352068792476749,0.159943963878182,0.436571949680992
+3.10729897401654,2.2199058501113,2.14646105040703,0.484236037514438,1.81478195978589,1.61785045415808,0.0329876618320496,0.241649313844067,1.74622744962094
+0.740254916964364,1.01989603126913,0.949841701842115,-0.174750918803954,0.701423202135606,-0.217182580544305,-0.704202854958466,0.409574590554772,-0.036213958084883
+-0.593813946679038,0.624337577645944,-1.03121223764933,-0.654774571378641,-1.0482127964088,-3.16005481453899,1.07913442153674,-0.801540477292715,-0.296446495746214
+-1.97654131148265,-0.0246172367241229,-1.62321757758329,-0.300504165575377,-0.610479744743658,-1.95067922934721,-0.0273003564953014,-2.25891403103119,0.592899076054865
+-0.265675076863215,-0.0655958042838892,0.443115863361718,-0.404239801100383,-0.699051451676848,-0.776061724164466,-0.278936052206807,-0.0398982489794093,-0.228150979346522
+0.643369896396861,0.116426615665445,1.46986526942722,-0.385674191236003,1.02256918563997,0.930297643874379,-0.137569292655377,0.6418303853131,-1.00196288109568
+-0.321351143540899,-1.48223663433386,-0.0269463886121436,0.0839576506772104,-0.943072535332822,-0.326257416044327,0.208659395860667,0.214383648754069,-1.93280735476865
+-0.438151783268317,-0.931670580749033,-0.126609279948407,-2.95417604442509,-2.44862562061646,-0.264480756391507,-1.49720749306728,-0.13155702224272,-0.0836212531108426
+0.814376302708418,1.08260885895811,-0.518236372213638,1.44056561673317,-0.381392770100172,-0.278951696069285,-0.510258310907941,1.6511275333633,-0.43304098319701
+-0.478107173257391,0.271840605860073,0.393643011670306,-0.262850897439097,-1.38450057674538,-0.599618583751476,-1.14574295125743,0.986997087759595,-0.417708728514852
+-0.936103041724464,-0.25864531702225,0.638419399680192,0.0808552072083271,0.151947520087218,0.0385844987061899,0.791580619745494,-0.617206707242678,-1.81192146932867
+-0.411569707984762,0.248658970613153,-0.549802711846596,0.897647932151652,-0.170793214455025,-1.06884149433975,-0.925774545268623,1.36537165535184,0.176168538272621
+-0.474873640621746,-1.37724344188309,-1.06516426901006,0.822700065900627,-1.07790344613573,1.84989083968958,-0.336244498705126,-0.0257418398093265,-0.853007479368077
+-0.453331796727791,-0.831612404941553,-0.0573094476804534,-0.240389011732678,0.436191908310093,1.41562499841805,-1.13489510407795,1.03985794164752,-1.23252092096524
+-0.463955469243233,-0.0304837371483583,2.0897694476569,-0.0108621329169964,0.222963503064354,0.336547398786141,-0.507748399842308,0.762911008802207,1.3656593915121
+0.670553553785726,0.508459329041629,0.476884387613096,1.1329884413175,-1.08353400484517,0.798524648006295,0.53734873433806,0.0208321931940496,0.878841104426437
+1.13588709752865,0.427686081339181,0.514485588038881,-0.328107298314126,0.0819238564898606,0.301803970799609,-1.03289228246961,-0.559056241688639,1.34143277215925
+1.16780538644555,0.451185127154324,0.348228355857748,0.598134406762037,2.28114901846728,1.77354008823691,0.0411072174167109,1.01459188792562,0.00811980498782261
+-0.0135483225207536,-1.68741023097245,0.798579236668005,-0.888794277591845,-1.10373913624268,0.45175748831378,-0.58945958737345,0.477719281695806,-0.541576298089464
+-0.268289621711842,1.4858259056652,-1.17367191087193,-0.359867259185062,1.08439318669693,0.785412380587551,1.69698909819963,-0.672918035900423,0.100208134598953
+-0.678291511265529,-0.163947116423478,0.673231641965572,-1.41329513039806,0.0489494865482372,-1.52978802010621,-0.310659463226546,-1.93568328209416,-0.0488440564721557
+-0.55135068427616,-0.66620974430993,-0.708674357410211,0.0304278883327402,-0.978691847689823,0.0365283310228222,0.235249553767603,-0.277100233071681,0.05111514068047
+1.05560068604996,1.27503647271375,0.566864924614948,1.08903920386604,0.469279046986341,1.25012645118249,0.540892953063235,0.31919334964215,-0.957504118852053
+-0.980906672117612,-0.0189911684523433,0.120197527123687,-0.680731772230277,-0.168270942276938,-0.289394824146834,-1.65259865323018,-0.373669048199263,0.294329380209814
+0.499294490612981,-0.592136688682187,-0.17981022587741,0.550899037029202,-0.314378763046838,-1.46514082601652,-1.79281997544221,-1.3493861769483,-1.17851814845092
+-0.0679425849730613,-0.794371997450158,-2.58151681295441,-1.94350144053799,0.195320596918969,-0.389685917118352,1.17050516313715,0.909109570126359,0.497946626519229
+-1.15062045245418,-1.18597012648725,-0.88775753158736,-1.22251051389502,0.246808039503041,1.49160945597948,0.57648967415191,0.411157420523344,1.12642798467258
+0.100158495675873,-1.32399104822148,-0.514186951690171,0.344260020939475,1.27529372901644,2.61408602396403,-0.050241138163728,-1.2605859633705,0.263619749352747
+1.42465467107631,1.36197177762154,0.60628257114713,-0.0156479933320413,-0.0363174310011355,1.40474900532185,0.396493521316173,0.891510091991401,0.823150765143422
+1.74603673210211,1.35244155991512,2.42440063222136,1.03297694793185,-0.462040139908601,1.4118125925405,2.00116047408919,0.652774994319787,2.3983135386906
+1.08099092960524,0.421051816423678,1.73754593714848,1.14700249187399,1.09040880553643,0.695195891012241,0.750064970044761,0.456890304601581,0.796133672235179
+0.302694160281263,-1.6403242454966,-0.188911299318824,-1.51900443666529,-0.552961623425218,-0.52626642543935,-1.04146010002155,2.69738174584375,0.287605694862825
+-0.282727171628041,-0.947687561500049,-1.31427248537361,-0.381417048042835,-0.804647956470914,-0.634925168458779,1.48749362710817,0.637764708652252,-0.0142770014200894
+1.18406800313113,1.26008594061534,1.46948829874829,-0.19734726721162,-0.419162245281191,1.33414857948028,-0.199990441197516,-0.772377860903891,0.0413250188207407
+-2.17760074992327,-1.9529555889374,-0.0495628840164648,-0.43418891065169,-0.714927754571589,-0.806608495722986,-0.813639036950261,0.242980058353971,-0.467359361755964
+0.180112412196713,0.600540375507427,1.42604641116429,0.385795259121452,0.196806943557884,1.14702481663295,-0.646696820006319,-0.0659183044783601,-0.779599641495563
+-1.31083035142046,-0.752288330372449,-0.641748826067841,0.994757115197672,-0.896246794147945,0.891383361576063,0.532726485670141,-0.324651796751015,1.04614720114469
+0.0814321247258127,-1.40983108458511,0.0762093619673255,-0.604714445511917,1.0536756020607,-0.665023171413789,0.294757661794959,0.59507621689268,0.0656169681883922
+-0.613719789666516,1.14290657453755,0.706769988493003,1.26573383287453,1.1457260654182,-0.0746539305678811,-0.48746726379207,-0.343962304133609,-0.761994744750747
+0.329551658891719,-1.05168585816116,-0.508051609244275,-0.604756729697464,-1.1501813120188,-0.127437898386637,1.36645329113616,0.738177591533215,-0.0680926425505856
+-0.0973158818102723,-0.24947778110296,1.34482164733374,0.807920239588021,-0.913459005265644,0.252457948744299,0.755214558427282,0.139935574927102,2.21282130087005
+0.313653530525133,0.139851826782461,1.42237576418286,1.66729052522724,0.977152773435745,0.963465238690054,0.251622133618539,-0.287477509858987,-0.0760727812594268
+-0.806280572863527,-0.49498682716141,1.66954320008279,0.00424605787860827,0.906082446435571,-0.206334743167738,0.978349165437514,1.85816836987851,-1.08111285342209
+0.37536452971954,0.938724456158228,-1.84994329361888,-0.1541321905511,-0.0320746672601909,-1.33829421526298,0.729983281126853,1.039392794796,-0.252854776143269
+0.43248957457022,-0.263823586963075,0.88248994684767,1.60143530279822,0.121134828302221,1.14941604560676,-0.166820889150136,-1.02569747183713,-0.178492897192431
+-0.117738295295305,-1.33371031488207,1.4558465761787,0.161282798261349,-0.274308520619722,0.567570531786502,1.10404257821374,0.0298159811986174,1.29888733271517
+-0.565882448656881,-0.948204854327638,-1.6334806930247,-0.646759462922658,1.15371635297221,0.150784005645955,-2.0619950968543,0.506743998398101,-0.284142168301545
+0.742625676096226,-0.101203986343898,-0.550867300370664,-0.920897972369527,-0.0489705882995633,-1.99774584949215,0.907818072943296,0.25072577982182,0.0434841307868322
+0.397331319037422,0.506109093990959,1.01390572286878,0.755778678355154,-0.271640150288756,-0.0351377420032418,1.41505944485466,-1.76170892131104,0.0658514976638509
+0.421360692402301,0.868848034398283,-0.172181900811362,0.903550664625544,1.24303572547453,0.010874550390972,1.26551550277794,-0.413803218116875,-0.955896261523428
+-0.581493289194656,0.162706840074634,0.182697261995097,-1.37966971696544,0.804236827986091,-0.812634962422841,0.503537865010168,0.551059096360738,1.37457471621413
+1.24323277978058,0.347506876915918,0.786940035571037,0.210226363375497,1.65623776253527,0.199358330426587,1.22828002970217,-0.118959639074242,-0.778813203600177
+-0.425832759949346,0.586149781895376,-0.12437279702939,1.16508114885243,-0.0177578745905035,-0.455777137843835,0.858518077012621,-0.779536726555712,1.34407395572587
+0.818159859825595,0.94297443868215,1.02765434288543,-0.114870948892137,-0.880731528412955,1.21210795480808,1.12029151131496,0.563055752986072,-1.44467306971166
+-0.221018784361375,0.679177635055535,1.71330500169045,-0.394698955488924,0.531728753540514,-0.0766784360172516,0.0939199705472353,-0.0525990027904756,-1.8549164193987
+1.09161661292813,0.543255686803918,1.13853187918176,-0.47033147033576,0.750740326102787,-0.68917228152721,0.720063822401139,1.56205350389795,0.863416058908774
+-2.27252324509917,-0.611102463557751,-2.12736026273442,0.0289670044065369,0.902126662707763,-1.12188451430704,1.16373822481537,1.53020535201818,0.955739661183979
+1.43060420567113,0.351158158395045,0.786702845873969,-0.516871625340592,-0.815327220541612,0.765541970039008,-0.34573791344404,0.645107519494302,-0.531925746956219
+1.6470326319593,-0.807953710452946,-0.133673298199115,1.19056072895996,0.69125576154533,2.31339714675051,0.169078985317852,-0.421234862926833,0.122234469340997
+0.81929155953062,-1.59335451987479,0.729818540668258,-0.619262710325813,-1.67756698009275,-1.91123491607817,0.0701859193401157,-0.732179967290949,0.115996690420657
+0.659972424348312,1.80682104442721,0.190412811528472,-0.52069215539332,-1.74505438998053,2.05331889383091,-0.41857289050989,-0.661258458037549,0.659764233234164
+-0.033799573962061,0.716034335455321,-0.662445712592922,0.0699972111184404,-0.455879124926307,-0.641756688893425,1.29260468853547,0.413677042503884,0.149557947199321
+0.127795277910253,-0.0411735008281099,-0.375721638158422,1.28298769573228,-0.154494253799041,0.0405515579329776,1.80729854660408,0.328737480213126,-0.377471414159971
diff --git a/benchmark/reliability.jl b/benchmark/reliability.jl
new file mode 100644
index 0000000..79d0b40
--- /dev/null
+++ b/benchmark/reliability.jl
@@ -0,0 +1,50 @@
+using ClassicalTestTheory
+using PsychometricTests
+using DelimitedFiles
+using CSV
+using DataFrames
+
+data = CSV.read("benchmark/attitude.csv", DataFrame)
+m = Matrix(data)
+test = PsychometricTest(data)
+
+ia = ClassicalTestTheory.itemanalysis(test)
+
+ClassicalTestTheory.reliability(m, ClassicalTestTheory.PSYCH_METHODS)
+
+# lambda1
+lambda1(m)
+lambda1(test)
+lambda1(test_scales)
+lambda1(test_scales, nothing)
+
+@benchmark lambda1($m)
+@benchmark lambda1($test)
+@benchmark lambda1($test_scales)
+@benchmark lambda1($test_scales, $:a)
+@benchmark lambda1($test_scales, $nothing)
+
+@profview [lambda1(m) for _ in 1:10_000]
+@profview [lambda1(test) for _ in 1:10_000]
+@profview [lambda1(test_scales) for _ in 1:10_000]
+
+@profview_allocs lambda1(test_scales, :a) sample_rate = 1
+
+@code_warntype lambda1(test)
+@code_warntype lambda1(test_scales)
+@code_warntype lambda1(test_scales, :a)
+
+# maxlambda4
+
+# find
+find(test, 6)
+
+@benchmark find($test, $6)
+
+@code_warntype find(test, 6)
+
+@profview_allocs find(test, 6, criterion = alpha) sample_rate = 1
+
+# test bootstrapping
+using Bootstrap
+
diff --git a/src/ClassicalTestTheory.jl b/src/ClassicalTestTheory.jl
index 53e8720..efec878 100644
--- a/src/ClassicalTestTheory.jl
+++ b/src/ClassicalTestTheory.jl
@@ -1,36 +1,53 @@
module ClassicalTestTheory
-using Base: split
+using Base: @kwdef
+using Bootstrap
using Combinatorics
-using SCS
using Distributions
-using InvertedIndices
using JuMP
using LinearAlgebra
+using OrderedCollections
+using Printf
using ProgressMeter
using Random
+using Reexport
+using SCS
+using StatsAPI
using StatsBase
-using Statistics
-
-export Test, SubTest
-export eachitem, eachperson
-export scores, responses, nitems, npersons
+using Tables
+using Term
-export split, splithalf
+@reexport import StatsAPI: confint, stderror
+import Base: split
-export difficulty, facility, itc
+# reliability measures
+export lambda1, lambda2, lambda3, lambda4, maxlambda4, lambda5, lambda6, alpha
+export L1, L2, L3, L4, L5, L6, Alpha
+export GUTTMAN_METHODS, PSYCH_METHODS, mu_up_to
-export λ1, λ2, λ3, λ4, maxλ4, λ5, λ6
-export α
export kr20, kr21
-export glb
+export KR20, KR21
+
+export glb, mu
+export GLB, Mu
+
+export reliability
+
+export estimate, bootstrap_sample
+
+# item statistics
+export itc, itemanalysis
+
+# find
export find
+include("references.jl")
include("utils.jl")
-include("types.jl")
include("split.jl")
+include("reliability/reliability.jl")
include("item_statistics.jl")
-include("reliability.jl")
include("find.jl")
+include("precompile.jl")
+
end
diff --git a/src/find.jl b/src/find.jl
index a80cf3d..87e8f37 100644
--- a/src/find.jl
+++ b/src/find.jl
@@ -1,23 +1,58 @@
"""
- find(t::AbstractTest, n; criterion=glb)
-
-Perform an exhaustive search to find the optimal subtest of `t` with `n` items.
+ find(m::AbstractMatrix, n::Int; criterion = glb, progress = true)
+Perform an exhaustive search to find the subset of `n` items with maximum reliability.
"""
-function find(t, n; criterion=glb)
- is = vcat(trues(n), falses(nitems(t) - n))
- perms = multiset_permutations(is, length(is))
- n_perms_iter = Int(length(perms) / 2)
+function find(m::AbstractMatrix, args...; kwargs...)
+ is = _find(m, args...; kwargs...)
+ return m[:, is]
+end
+
+function _find(
+ m::AbstractMatrix,
+ n::Int;
+ criterion::F = glb,
+ progress = true,
+ kwargs...,
+) where {F}
+ if n >= size(m, 2)
+ throw(
+ ArgumentError(
+ "The subset size must be smaller than the size of the orginial test.",
+ ),
+ )
+ end
+
+ is = axes(m, 2)
+ combs = combinations(is, n)
- optimal_subtest = is
+ optimal_is = zeros(Int, n)
max_crit = -Inf
- @showprogress for perm in Iterators.take(perms, n_perms_iter)
- subtest, _ = split(t, perm)
- crit = criterion(subtest)
+
+ prog = Progress(
+ length(combs),
+ dt = 0.5,
+ barglyphs = BarGlyphs("[=> ]"),
+ enabled = progress,
+ )
+
+ for (i, c) in enumerate(combs)
+ subtest = view(m, :, c)
+ crit = criterion(subtest; kwargs...)
+
if crit > max_crit
max_crit = crit
- optimal_subtest = subtest
+ optimal_is = c
end
+
+ ProgressMeter.update!(
+ prog,
+ i,
+ showvalues = [(:items, optimal_is), (:reliability, max_crit)],
+ )
end
- return optimal_subtest
+
+ ProgressMeter.finish!(prog)
+
+ return optimal_is
end
diff --git a/src/item_statistics.jl b/src/item_statistics.jl
index f0f44ec..9e29735 100644
--- a/src/item_statistics.jl
+++ b/src/item_statistics.jl
@@ -47,44 +47,102 @@ Henrysson, S. (1963). Correction of item-total correlations in item analysis. *P
Zubin, J. The method of internal consistency for selecting test items. *J. educ. Psychol,
1934, 25*, 345-356.
"""
-function itc(x, i::Int; correction=true)
- if correction in (true, :henrysson)
- return _itc_henrysson(x, i)
- elseif correction == false
- return _itc_uncorrected(x, i)
- elseif correction == :zubin
- return _itc_zubin(x, i)
- elseif correction == :guilford
- return _itc_guilford(x, i)
+function itc(x, i; corrected = true, standardize = false)
+ if corrected in (true, :henrysson)
+ return _itc_henrysson(x, i; standardize)
+ elseif corrected == false
+ return _itc_uncorrected(x, i; standardize)
+ elseif corrected == :zubin
+ return _itc_zubin(x, i; standardize)
+ elseif corrected == :guilford
+ return _itc_guilford(x, i; standardize)
else
- error("Unknown correction type: $(correction)")
+ error("Unknown correction type: $(corrected)")
end
end
-function _itc_uncorrected(x, i)
- return cor(responses(x, i), scores(x))
+function _itc_uncorrected(m::AbstractMatrix, i; standardize)
+ responses = vec(m[:, i])
+ total_scores = vec(sum(m, dims = 2))
+ return cor(responses, total_scores)
end
-function _itc_henrysson(x, i)
- # here the second value returns the test with all items except i
- _, corrected_test = split(x, i)
- return cor(responses(x, i), scores(corrected_test))
+function _itc_henrysson(m::AbstractMatrix, i; standardize)
+ is = filter(x -> x != i, axes(m, 2))
+ corrected_m = view(m, :, is)
+ responses = vec(m[:, i])
+ total_scores = vec(sum(corrected_m, dims = 2))
+ return cor(responses, total_scores)
end
-function _itc_zubin(x, i)
- itc = _itc_uncorrected(x, i)
- st = std(scores(x))
- fv = facility(x, i)
- y = cdf(Normal(), fv)
- pqy = fv * (1 - fv) / y
- return (itc * st - pqy) / sqrt(st^2 + 1 - 2 * itc * st)
+struct ItemStatistics{Ti,T<:Real}
+ item::Ti
+ n::Int
+ missings::Int
+ itc::T
+ itc_std::T
+ itc_corrected::T
+ mean::T
+ std::T
end
-function _itc_guilford(x, i)
- itc = _itc_uncorrected(x, i)
- st = std(scores(x))
- fv = facility(x, i)
- y = cdf(Normal(), fv)
- pqy = fv * (1 - fv) / y
- return (itc * st - pqy) / sqrt(st^2 + pqy^2 - 2 * itc * st * pqy)
+function ItemStatistics(name, test_data, item_data, item_index)
+ return ItemStatistics(
+ string(name),
+ sum(!ismissing, item_data),
+ sum(ismissing, item_data),
+ itc(test_data, item_index, corrected = false),
+ itc(test_data, item_index, corrected = false, standardize = true),
+ itc(test_data, item_index, corrected = :henrysson),
+ mean(item_data),
+ std(item_data),
+ )
+end
+
+function ItemStatistics(m::AbstractMatrix, j; name = "Item " * string(j))
+ item_responses = vec(m[:, j])
+ return ItemStatistics(name, m, item_responses, j)
+end
+
+struct ItemAnalysis
+ statistics::Vector{ItemStatistics}
+end
+
+function Base.show(io::IO, items::ItemAnalysis)
+ tbl = Tables.columns(items.statistics)
+
+ rounded_cols = [:itc, :itc_std, :itc_corrected, :mean, :std]
+
+ for col in rounded_cols
+ coldata = Tables.getcolumn(tbl, col)
+ coldata .= round.(coldata, digits = 2) # TODO: keep trailing digits
+ end
+
+ header = ["item", "N", "missings", "itc", "itc (std)", "itc (cor)", "mean", "std"]
+ print(
+ io,
+ Term.Panel(
+ Term.Table(
+ tbl;
+ header,
+ header_style = "green bold",
+ columns_style = ["bold yellow", "", "", "", "", "", "", ""],
+ style = "dim",
+ box = :SIMPLE,
+ compact = false,
+ ),
+ title = "{dim}Item Analysis",
+ style = "dim",
+ subtitle = "{dim}ClassicalTestTheory.jl",
+ subtitle_justify = :right,
+ fit = true,
+ ),
+ )
+
+ return nothing
+end
+
+function itemanalysis(m::AbstractMatrix)
+ item_statistics = [ItemStatistics(m, j) for j in axes(m, 2)]
+ return ItemAnalysis(item_statistics)
end
diff --git a/src/precompile.jl b/src/precompile.jl
new file mode 100644
index 0000000..281bfa9
--- /dev/null
+++ b/src/precompile.jl
@@ -0,0 +1,32 @@
+using PrecompileTools
+
+@setup_workload begin
+ m = rand(0:100, 20, 4)
+
+ @compile_workload begin
+ # reliability measures
+ methods = [GLB(), GUTTMAN_METHODS..., KR20(), KR21(), mu_up_to(1)...]
+ reliability(m, methods)
+
+ result = reliability(m, Alpha())
+
+ data(result)
+ sampling_method(result)
+ ci_method(result)
+ estimate(result)
+ estimate(result, "Alpha")
+ confint(result)
+ confint(result, "Alpha")
+ bias(result)
+ bias(result, "Alpha")
+ stderror(result)
+ stderror(result, "Alpha")
+ samples(result, "Alpha")
+
+ # item statistics
+ ia = itemanalysis(m)
+
+ # find
+ find(m, 2, criterion = alpha)
+ end
+end
diff --git a/src/references.jl b/src/references.jl
new file mode 100644
index 0000000..85acf68
--- /dev/null
+++ b/src/references.jl
@@ -0,0 +1,4 @@
+const GUTTMAN1945 = "Guttman, L. (1945). A basis for analyzing test-retest reliability. *Psychometrika, 10*(4), 255-282."
+const WOODHOUSE1977 = "Woodhouse, B., & Jackson, P. H. (1977). Lower bounds for the reliability of the total score on a test composed of non-homogeneous items: II: A search procedure to locate the greatest lower bound. *Psychometrika, 42*(4), 579-591."
+const TENBERGE1978 = "Ten Berge, J. M., & Zegers, F. E. (1978). A series of lower bounds to the reliability of a test. *Psychometrika, 43*, 575-579."
+const KUDERRICHARDSON1937 = "Kuder, G. F., & Richardson, M. W. (1937). The theory of the estimation of test reliability. *Psychometrika, 2*(3), 151–160."
diff --git a/src/reliability.jl b/src/reliability.jl
deleted file mode 100644
index a0477c5..0000000
--- a/src/reliability.jl
+++ /dev/null
@@ -1,232 +0,0 @@
-const GUTTMAN1945 = "Guttman, L. (1945). A basis for analyzing test-retest reliability. *Psychometrika, 10*(4), 255-282."
-
-"""
- λ1(m::Matrix)
- λ1(t::Test)
-
-Return the lower bound estimate of the reliability L₁ described in $GUTTMAN1945
-
-``\\lambda_1 = 1 - \\frac{\\sum_{j=1}^{n} s_j^2}{s_t^2}``
-"""
-function λ1(m::Matrix)
- sum_sj = sum(x -> var(x), eachitem(m))
- st = var(scores(m))
- return 1 - (sum_sj / st)
-end
-
-function λ1(t::AbstractTest)
- sum_sj = tr(t.itemcov)
- st = var(scores(t))
- return 1 - (sum_sj / st)
-end
-
-"""
- λ2(m::Matrix)
- λ2(t::Test)
-
-Return the lower bound estimate of the reliability λ₂ described in $GUTTMAN1945
-
-``\\lambda_2 = \\lambda_1 + \\frac{\\sqrt{\\frac{n}{n-1}C_2}}{s_t^2}``
-"""
-function λ2(x)
- n = nitems(x)
- C2 = cov(x) .^ 2
- zerodiag!(C2)
- st = var(scores(x))
- return λ1(x) + sqrt(n / (n - 1) * sum(C2)) / st
-end
-
-"""
- λ3(m::Matrix)
- λ3(t::Test)
-
-Return the lower bound estimate of the reliability λ₃ described in $GUTTMAN1945
-
-``\\lambda_3 = \\frac{n}{n-1}\\lambda_1``
-"""
-function λ3(x)
- n = nitems(x)
- return n / (n - 1) * λ1(x)
-end
-
-"""
- α(x)
-
-Estimate Cronbach's α. `α` is an alias for [`λ3`](@ref).
-"""
-const α = λ3
-
-"""
- λ4(m::Matrix)
- λ4(t::Test)
-
-Return the lower bound estimate of the reliability λ₄ described in $GUTTMAN1945
-
-``\\lambda_4 = 2\\( 1 - \\frac{s_a^2 + s_b^2}{s_t^2} \\)``
-
-The calculation of λ₄ is based on splitting `t` in half.
-It is a lower bound of the reliability no matter how the test is split.
-
-The split of the test can be controlled by the `type` keyword argument (see also [`splithalf`](@ref)).
-
-To get the maximum lower bound see [`maxλ4`](@ref).
-"""
-function λ4(x; kwargs...)
- subtests = splithalf(x; kwargs...)
- st = var(scores(x))
- vars = var.(scores.(subtests))
- return 2 * (1 - sum(vars) / st)
-end
-
-function λ4(x, is)
- subtests = split(x, is)
- st = var(scores(x))
- vars = var.(scores.(subtests))
- return 2 * (1 - sum(vars) / st)
-end
-
-"""
- maxλ4(x; method=:auto, n_samples=1_000)
-
-Return the maximum lower bound estimate of the reliability λ₄ described in $GUTTMAN1945
-
-By default (if `n_samples=nothing`) the maximum value is found by brute force iteration over
-the split-half permutations of `x`.
-As the number of permutations grows, this method becomes infeasible.
-For large numbers of items a (local) maximum of λ₄ can be found by sampling random split-half
-permutations.
-To use sampling, specify `n_samples::Int`.
-
-See also [`λ4`](@ref).
-"""
-function maxλ4(x; method=:auto, n_samples=10_000)::Float64
- if method == :auto
- if nitems(x) <= 25
- maxλ = _maxλ4_brute_force(x)
- else
- maxλ = _maxλ4_random(x, n_samples)
- end
- elseif method == :bruteforce
- maxλ = _maxλ4_brute_force(x)
- elseif method == :sample
- maxλ = _maxλ4_random(x, n_samples)
- else
- error("Unknown method")
- end
-
- return maxλ
-end
-
-function _maxλ4_brute_force(x)
- n = nitems(x)
- n_include = ceil(Int, n / 2)
- is = vcat(trues(n_include), falses(n - n_include))
-
- perms = multiset_permutations(is, length(is))
- n_perms_iter = Int(length(perms) / 2)
-
- if n_perms_iter > 1e6
- @info "Brute forcing $(n_perms_iter) permutations. Adjust your expectations accordingly..."
- end
-
- # we only need to iterate over the first half of the permutations, because
- # multiset_permutations(...) returns a sorted vector and λ4 is symmetric with regards
- # to the splits, e.g. [0, 1] and [1, 0] yield identical values of λ4.
- maxλ = maximum(λ4(x, perm) for perm in Iterators.take(perms, n_perms_iter))
- return maxλ
-end
-
-function _maxλ4_random(x, n_samples::Int)
- n = nitems(x)
- n_include = ceil(Int, n / 2)
- is = vcat(trues(n_include), falses(n - n_include))
- maxλ = maximum(λ4(x, shuffle!(is)) for _ in 1:n_samples)
- return maxλ
-end
-
-"""
- λ5(x)
-
-Return the lower bound estimate of the reliability λ₅ described in $GUTTMAN1945
-
-``\\lambda_5 = \\lambda_1 + \\frac{2\\sqrt{\\bar{C}_2}}{s_t^2}``
-"""
-function λ5(x)
- covmat = LowerTriangular(copy(cov(x)))
- zerodiag!(covmat)
- C2 = sum(covmat .^ 2, dims=1)
- C2_max = maximum(C2)
- st = var(scores(x))
- return λ1(x) + 2 * sqrt(C2_max) / st
-end
-
-"""
- λ6(x)
-
-Return the lower bound estimate of the reliability λ₆ described in $GUTTMAN1945
-
-``\\lambda_6 = 1 - \\frac{\\sum_{j=1}^n e_j^2}{s_t^2}``
-"""
-function λ6(x)
- covmat = cov(x)
- inv_covmat = inv(covmat)
- smc = 1 .- 1 ./ diag(inv_covmat)
- return 1 - sum(1 .- smc) / sum(covmat)
-end
-
-"""
- kr20
-"""
-function kr20(x)
- n = nitems(x)
- item_facilities = facility.(eachitem(x))
- item_difficulties = 1 .- item_facilities
- st = var(scores(x))
- return (n / (n - 1)) * ((st - sum(item_facilities .* item_difficulties)) / st)
-end
-
-"""
- kr21
-"""
-function kr21(x)
- n = nitems(x)
- avg_facility = mean(facility.(eachitem(x)))
- avg_difficulty = 1 - avg_facility
- st = var(scores(x))
- return (n / (n - 1)) * ((st - n * avg_difficulty * avg_facility) / st)
-end
-
-"""
- glb(x)
-
-Return the greatest lower bound estimate (glb) of the reliability as described in
-Woodhouse, B., & Jackson, P. H. (1977). Lower bounds for the reliability of the total score on a test composed of non-homogeneous items: II: A search procedure to locate the greatest lower bound. *Psychometrika, 42*(4), 579-591.
-"""
-function glb(x)
- n = nitems(x)
-
- C = cov(x)
- C̃ = zerodiag(C)
- upr = diag(C)
- lwr = zeros(n)
-
- model = Model(SCS.Optimizer)
- set_silent(model)
- set_string_names_on_creation(model, false)
-
- @variable(model, y[1:n])
- @expression(model, A, Symmetric(C̃ + diagm(y)))
-
- @objective(model, Min, sum(y))
- @constraint(model, lwr .<= y .<= upr)
- @constraint(model, A in PSDCone())
-
- optimize!(model)
-
- if termination_status(model) == OPTIMAL
- sum_y = sum(value.(y))
- return (sum(C̃) + sum_y) / sum(C)
- else
- error("something went wrong")
- end
-end
diff --git a/src/reliability/glb.jl b/src/reliability/glb.jl
new file mode 100644
index 0000000..d902b2b
--- /dev/null
+++ b/src/reliability/glb.jl
@@ -0,0 +1,36 @@
+"""
+ glb(m::AbstractMatrix)
+
+Return the greatest lower bound estimate (glb) of the reliability as described in
+$WOODHOUSE1977
+"""
+function glb(m::AbstractMatrix)
+ n = size(m, 2)
+
+ C = cov(m)
+ C̃ = zerodiag(C)
+ upr = diag(C)
+ lwr = zeros(n)
+
+ model = JuMP.Model(SCS.Optimizer)
+
+ set_silent(model)
+ set_string_names_on_creation(model, false)
+
+ @variable(model, y[1:n])
+ @expression(model, A, Symmetric(C̃ + diagm(y)))
+
+ @objective(model, Min, sum(y))
+ @constraint(model, lwr .<= y .<= upr)
+ @constraint(model, A >= 0, PSDCone())
+
+ optimize!(model)
+
+ termination_status(model) == OPTIMAL || error("Failed to optimize GLB of reliability")
+
+ sum_y = sum(value.(y))
+ return (sum(C̃) + sum_y) / sum(C)
+end
+
+struct GLB <: ReliabilityMeasure end
+(method::GLB)(data) = glb(data)
diff --git a/src/reliability/guttman.jl b/src/reliability/guttman.jl
new file mode 100644
index 0000000..12569c8
--- /dev/null
+++ b/src/reliability/guttman.jl
@@ -0,0 +1,221 @@
+"""
+ lambda1(m::AbstractMatrix)
+
+Calculate the lower bound estimate of the reliability L₁ described in $GUTTMAN1945
+"""
+function lambda1(m::AbstractMatrix)
+ sum_sj = sum(var, eachcol(m))
+ st = var(sum(m, dims = 2))
+ λ = 1 - (sum_sj / st)
+ return λ
+end
+
+struct L1 <: ReliabilityMeasure end
+(method::L1)(data) = lambda1(data)
+
+"""
+ lambda2(scale::AbstractScale)
+
+Calculate the lower bound estimate of the reliability lambda₂ described in $GUTTMAN1945
+"""
+function lambda2(m::AbstractMatrix)
+ n = size(m, 2)
+ C = cov(m)
+ zerodiag!(C)
+ st = var(sum(m, dims = 2))
+ λ = lambda1(m) + sqrt(n / (n - 1) * sum(abs2, C)) / st
+ return λ
+end
+
+struct L2 <: ReliabilityMeasure end
+(method::L2)(data) = lambda2(data)
+
+"""
+ lambda3(m::AbstractMatrix)
+
+Calculate the lower bound estimate of the reliability lambda₃ described in $GUTTMAN1945
+"""
+function lambda3(m::AbstractMatrix)
+ n = size(m, 2)
+ λ = n / (n - 1) * lambda1(m)
+ return λ
+end
+
+struct L3 <: ReliabilityMeasure end
+(method::L3)(data) = lambda3(data)
+
+"""
+ alpha(m::AbstractMatrix)
+
+Estimate Cronbach's alpha. `alpha` is an alias for [`lambda3`](@ref).
+"""
+const alpha = lambda3
+
+struct Alpha <: ReliabilityMeasure end
+(method::Alpha)(data) = alpha(data)
+
+"""
+ lambda4(m::AbstractMatrix; type::Symbol = :firstlast)
+
+Return the lower bound estimate of the reliability lambda₄ described in $GUTTMAN1945
+
+The calculation of lambda₄ is based on splitting the test in half.
+It is a lower bound of the reliability no matter how the scale is split.
+
+The split of the scale can be controlled by the `type` keyword argument.
+The following options are available for `type`:
+- `:firstlast`: Split the test by first and last half
+- `:oddeven`: Split the test by odd and even indices
+- `:random`: Split the test by random indices
+
+To get the maximum lower bound see [`maxlambda4`](@ref).
+"""
+function lambda4(m::AbstractMatrix; type::Symbol = :firstlast)
+ splits = splithalf(m; type)
+ st = var(sum(m, dims = 2))
+
+ s1 = var(sum(splits[1], dims = 2))
+ s2 = var(sum(splits[2], dims = 2))
+
+ λ = 2 * (1 - (s1 + s2) / st)
+ return λ
+end
+
+function lambda4(m::AbstractMatrix, is)
+ splits = split(m, is)
+ st = var(sum(m, dims = 2))
+
+ s1 = var(sum(splits[1], dims = 2))
+ s2 = var(sum(splits[2], dims = 2))
+
+ λ = 2 * (1 - (s1 + s2) / st)
+ return λ
+end
+
+"""
+ maxlambda4(m::AbstractMatrix; method = :auto, n_samples = 10_000)
+
+Calculate the maximum lower bound estimate of the reliability lambda₄ described in $GUTTMAN1945
+
+The `method` keyword argument determines the way the bound is estimated. Available options
+are:
+- `:bruteforce`: Calculate lambda₄ for each split-half combination.
+- `:sample`: Calculate lambda₄ for `n_samples` samples of split-half combinations.
+- `:auto` (the default): if the number of items is below 25, `:bruteforce` is applied,
+ `:sample` otherwise.
+
+See also [`lambda4`](@ref).
+"""
+struct Lambda4{F,E,S}
+ statistic::F
+ estimate::E
+ samples::S
+end
+
+Base.show(io::IO, lambda4::Lambda4) = print(io, lambda4.estimate)
+
+function lambda4(
+ statistic::F,
+ m::AbstractMatrix;
+ method = :auto,
+ n_samples = 10_000,
+) where {F}
+ method = method == :auto && size(m, 2) <= 25 ? :bruteforce : :sample
+ samples = lambda4_samples(m; method, n_samples)
+
+ λ = statistic(samples)
+ return Lambda4(statistic, λ, samples)
+end
+
+function lambda4_samples(m::AbstractMatrix; method = :bruteforce, n_samples = 10_000)
+ if method == :bruteforce
+ λ = _lambda4_brute_force(m)
+ elseif method == :sample
+ λ = _lambda4_random(m, n_samples)
+ else
+ error("Unknown method")
+ end
+ return λ
+end
+
+function _lambda4_brute_force(m::AbstractMatrix)
+ n = size(m, 2)
+ n_include = ceil(Int, n / 2)
+ is = axes(m, 2)
+
+ combs = combinations(is, n_include)
+ ncombs = length(combs)
+
+ if ncombs > 1e6
+ @info "Brute forcing $(ncombs) combinatinos. Adjust your expectations accordingly..."
+ end
+
+ λ = [lambda4(m, c) for c in combs]
+
+ return λ
+end
+
+function _lambda4_random(m::AbstractMatrix, n_samples::Int)
+ n = size(m, 2)
+ n_include = ceil(Int, n / 2)
+ is = axes(m, 2)
+ λ = [lambda4(m, sample(is, n_include, replace = false)) for _ in 1:n_samples]
+ return λ
+end
+
+@kwdef struct L4{F} <: ReliabilityMeasure
+ statistic::F = maximum
+ method::Symbol = :auto
+ n_samples::Int = 10_000
+end
+
+function (method::L4)(data)
+ λ = lambda4(
+ method.statistic,
+ data,
+ method = method.method,
+ n_samples = method.n_samples,
+ )
+ return λ.estimate
+end
+
+name(r::L4) = "L4($(r.statistic), :$(r.method), $(r.n_samples))"
+
+"""
+ lambda5(m::AbstractMatrix)
+
+Return the lower bound estimate of the reliability lambda₅ described in $GUTTMAN1945
+"""
+function lambda5(m::AbstractMatrix)
+ C = LowerTriangular(cov(m))
+ zerodiag!(C)
+ sj = sum(abs2, C, dims = 1)
+ Cmax = maximum(sj)
+ st = var(sum(m, dims = 2))
+ return lambda1(m) + 2 * sqrt(Cmax) / st
+end
+
+struct L5 <: ReliabilityMeasure end
+(method::L5)(data) = lambda5(data)
+
+"""
+ lambda6(m::AbstractMatrix)
+
+Return the lower bound estimate of the reliability lambda₆ described in $GUTTMAN1945
+"""
+function lambda6(m::AbstractMatrix)
+ C = cov(m)
+ Cinv = inv(C)
+ smc = 1 .- 1 ./ diag(Cinv)
+ return 1 - sum(1 .- smc) / sum(C)
+end
+
+struct L6 <: ReliabilityMeasure end
+(method::L6)(data) = lambda6(data)
+
+"""
+ GUTTMAN_METHODS
+
+A collection of reliability measures described in $GUTTMAN1945
+"""
+const GUTTMAN_METHODS = [L1(), L2(), L3(), L4(), L5(), L6()]
diff --git a/src/reliability/kuder_richardson.jl b/src/reliability/kuder_richardson.jl
new file mode 100644
index 0000000..586332f
--- /dev/null
+++ b/src/reliability/kuder_richardson.jl
@@ -0,0 +1,28 @@
+"""
+ kr20(m::AbstractMatrix)
+"""
+function kr20(m::AbstractMatrix)
+ n = size(m, 2)
+ item_facilities = mean(m, dims = 1)
+ item_difficulties = 1 .- item_facilities
+ st = var(sum(m, dims = 2))
+ return (n / (n - 1)) * ((st - sum(item_facilities .* item_difficulties)) / st)
+end
+
+struct KR20 <: ReliabilityMeasure end
+(method::KR20)(data) = kr20(data)
+
+"""
+ kr21(m::AbstractMatrix)
+"""
+function kr21(m::AbstractMatrix)
+ n = size(m, 2)
+ item_facilities = mean(m, dims = 1)
+ avg_facility = mean(item_facilities)
+ avg_difficulty = 1 - avg_facility
+ st = var(sum(m, dims = 2))
+ return (n / (n - 1)) * ((st - n * avg_difficulty * avg_facility) / st)
+end
+
+struct KR21 <: ReliabilityMeasure end
+(method::KR21)(data) = kr21(data)
diff --git a/src/reliability/reliability.jl b/src/reliability/reliability.jl
new file mode 100644
index 0000000..13da634
--- /dev/null
+++ b/src/reliability/reliability.jl
@@ -0,0 +1,232 @@
+const DEFAULT_BOOSTRAP_CI = BCaConfInt(0.95)
+const DEFAULT_BOOSTRAP_SAMPLING = BasicSampling(1000)
+
+"""
+ ReliabilityMeasure
+
+A reliability measure is the reliability interface for end users.
+All low-level reliability estimates should define a callable struct `T <: ReliabilityMeasure`
+that takes a single argument, the data, and return the reliability estimate.
+
+## Methods
+- `(method::T)(data)`: The reliability algorithm
+- `name(method::T)`: The name of the reliability algorithm for pretty printing
+"""
+abstract type ReliabilityMeasure <: Function end
+
+name(r::ReliabilityMeasure) = string(nameof(r))
+
+include("guttman.jl")
+include("glb.jl")
+include("kuder_richardson.jl")
+include("ten_berge.jl")
+
+"""
+ PSYCH_METHODS
+
+A collection of reliability measures used by the `psych` R package.
+"""
+const PSYCH_METHODS = [L4(), L6(), L3(), L2()]
+
+"""
+ ReliabilityResult
+
+A data structure that holds results from reliability analysis.
+
+## Methods
+- `bias`
+- `ci_method`
+- `confint`
+- `data`
+- `estimate`
+- `samples`
+- `sampling_method`
+- `stderror`
+"""
+struct ReliabilityResult{D,B,S,C}
+ data::D
+ bootstrap_samples::B
+ sampling_method::S
+ ci_method::C
+end
+
+"""
+ data(result::ReliabilityResult)
+
+Get the data used to calculate `result`.
+"""
+data(result::ReliabilityResult) = result.data
+
+"""
+ sampling_method(result::ReliabilityResult)
+
+Get the sampling method used to calculate the bootstrap samples in `result`.
+"""
+sampling_method(result::ReliabilityResult) = result.sampling_method
+
+"""
+ ci_method(result::ReliabilityResult)
+
+Get the method used to calculate the bootstrap confidence interval in `result`.
+"""
+ci_method(result::ReliabilityResult) = result.ci_method
+
+"""
+ estimate(result::ReliabilityResult)::OrderedDict{String, Float64}
+ estimate(result::ReliabilityResult, method::String)::Float64
+
+Get the point estimate of the reliability.
+"""
+function estimate(result::ReliabilityResult, method::String)
+ samples = result.bootstrap_samples[method]
+ return first(original(samples))
+end
+
+function estimate(result::ReliabilityResult)
+ samples = result.bootstrap_samples
+ return OrderedDict(key => estimate(result, key) for key in keys(samples))
+end
+
+"""
+ confint(result::ReliabilityResult)::OrderedDict{String, Tuple{Float64, Float64}}
+ confint(result::ReliabilityResult, method::String)::Float64
+
+Get the bootstrap confidence intervals for the reliability estimates of `result`.
+"""
+function StatsAPI.confint(result::ReliabilityResult, method::String)
+ samples = result.bootstrap_samples
+ ci = confint(samples[method], result.ci_method)
+ _, lwr, upr = first(ci)
+ return lwr, upr
+end
+
+function StatsAPI.confint(result::ReliabilityResult)
+ samples = result.bootstrap_samples
+ return OrderedDict(key => confint(result, key) for key in keys(samples))
+end
+
+"""
+ bias
+"""
+function Bootstrap.bias(r::ReliabilityResult, method::String)
+ b = Bootstrap.bias(r.bootstrap_samples[method])
+ return first(b)
+end
+
+function Bootstrap.bias(r::ReliabilityResult)
+ return OrderedDict(key => bias(r, key) for key in keys(r.bootstrap_samples))
+end
+
+"""
+ stderror
+"""
+function Bootstrap.stderror(r::ReliabilityResult, method::String)
+ b = Bootstrap.stderror(r.bootstrap_samples[method])
+ return first(b)
+end
+
+function Bootstrap.stderror(r::ReliabilityResult)
+ return OrderedDict(key => stderror(r, key) for key in keys(r.bootstrap_samples))
+end
+
+"""
+ samples
+"""
+function samples(r::ReliabilityResult, method::String)
+ b = straps(r.bootstrap_samples[method])
+ return first(b)
+end
+
+function samples(r::ReliabilityResult)
+ return OrderedDict(key => samples(r, key) for key in keys(r.bootstrap_samples))
+end
+
+"""
+ reliability(m::AbstractMatrix, method::ReliabilityMeasure; kwargs...)
+ reliability(m::AbstractMatrix, methods::Vector{<:ReliabilityMeasure}; kwargs...)
+
+Estimate the reliability of `m` for a given `method` or multiple `methods`.
+
+## Arguments
+- `m`: The input data
+- `method`: A `ReliabilityMeasure` to estimate
+
+## Keyword arguments
+- `ci_method`: The method used to calculate the bootstrap confidence intervals. Defaults to `$(DEFAULT_BOOSTRAP_CI)`
+- `sampling_method`: The method used to draw boostrap samples from `m`. Defaults to `$(DEFAULT_BOOSTRAP_SAMPLING)`
+"""
+function reliability(
+ m::AbstractMatrix,
+ methods::Vector{<:ReliabilityMeasure};
+ ci_method = DEFAULT_BOOSTRAP_CI,
+ sampling_method = DEFAULT_BOOSTRAP_SAMPLING,
+)
+ bootstrap_samples = OrderedDict(
+ name(method) => bootstrap(method, m, sampling_method) for method in methods
+ )
+
+ return ReliabilityResult(m, bootstrap_samples, sampling_method, ci_method)
+end
+
+function reliability(m::AbstractMatrix, method::ReliabilityMeasure; kwargs...)
+ return reliability(m, [method]; kwargs...)
+end
+
+function Base.show(io::IO, mime::MIME"text/plain", result::ReliabilityResult)
+ ci = confint(result)
+
+ fmt = x -> @sprintf "%.2f" x
+
+ ci_method_name = methodname(ci_method(result))
+ ci_level = level(ci_method(result))
+ quant_lwr, quant_upr = quantilesfromlevel(ci_level)
+
+ sampling_method_name = methodname(sampling_method(result))
+ n_samples = nrun(sampling_method(result))
+
+ partable = OrderedDict(
+ "method" => collect(keys(result.bootstrap_samples)),
+ "estimate" => fmt.(values(estimate(result))),
+ "stderror" => fmt.(values(stderror(result))),
+ prettyquantile(quant_lwr) => fmt.(first.(values(ci))),
+ prettyquantile(quant_upr) => fmt.(last.(values(ci))),
+ )
+
+ header = OrderedDict(
+ "1" => [
+ "confidence interval method:",
+ "confidence level:",
+ "bootstrap sampling method:",
+ "bootstrap iterations",
+ ],
+ "2" => [
+ "{cyan}$(ci_method_name){/cyan}",
+ "{magenta}$(ci_level){/magenta}",
+ "{cyan}$(sampling_method_name){/cyan}",
+ "{magenta}$(n_samples){/magenta}",
+ ],
+ )
+
+ print(
+ io,
+ CTTPanel(
+ "",
+ Term.Table(
+ header,
+ box = :NONE,
+ compact = true,
+ show_header = false,
+ columns_justify = :left,
+ ),
+ Term.Table(
+ partable,
+ header_style = "green bold",
+ columns_style = ["bold red", "", "", "", ""],
+ style = "dim",
+ box = :SIMPLE,
+ ),
+ title = "Reliability Analysis",
+ ),
+ )
+ return nothing
+end
diff --git a/src/reliability/ten_berge.jl b/src/reliability/ten_berge.jl
new file mode 100644
index 0000000..eca0a80
--- /dev/null
+++ b/src/reliability/ten_berge.jl
@@ -0,0 +1,72 @@
+"""
+ mu(m::AbstractMatrix, r::Int)
+
+Calculate the lower bound of the reliability mu derived in $TENBERGE1978
+
+## Notes
+- If `r = 0` then mu is equivalent to Cronbach's alpha.
+- If `r = 1` then mu is equivalent to Guttman's lambda₂.
+"""
+function mu(m::AbstractMatrix, r::Int)
+ n = size(m, 2)
+ C = cov(m)
+ zerodiag!(C)
+
+ st = var(sum(m, dims = 2))
+ μ = _mu(C, st, n, r)
+ return μ
+end
+
+function mu(::Type{T}, m::AbstractMatrix, r::Int) where {T}
+ n = size(m, 2)
+ C = T.(cov(m))
+ zerodiag!(C)
+
+ st = var(sum(m, dims = 2))
+ μ = _mu(C, st, n, r)
+ return μ
+end
+
+function _mu(C, st, n, r::Int)
+ r >= 0 || throw(ArgumentError("r must be non-negative."))
+
+ p_sum = zero(eltype(C))
+
+ for h in Iterators.reverse(0:r)
+ p_h = sum(c -> c^(2.0^h), C)
+
+ if h == r
+ p_h *= n / (n - 1)
+ end
+
+ if h == 0
+ p_sum += p_h
+ else
+ p_sum = sqrt(p_sum + p_h)
+ end
+ end
+
+ return p_sum / st
+end
+
+@kwdef struct Mu <: ReliabilityMeasure
+ r::Int
+end
+
+(method::Mu)(data) = mu(data, method.r)
+name(r::Mu) = "Mu($(r.r))"
+
+"""
+ mu_up_to(r::Int)
+
+Generate a vector of reliability measures `Mu` from 0 to `r`.
+
+```jldoctest
+julia> mu_up_to(2)
+3-element Vector{Mu}:
+ (::Mu) (generic function with 1 method)
+ (::Mu) (generic function with 1 method)
+ (::Mu) (generic function with 1 method)
+```
+"""
+mu_up_to(r::Int) = [Mu(i) for i in 0:r]
diff --git a/src/split.jl b/src/split.jl
index b84eb9d..72e6fbc 100644
--- a/src/split.jl
+++ b/src/split.jl
@@ -6,22 +6,12 @@ Split a matrix by arbitrary indices `is`.
Returns a `Tuple` of matrices `m1`, `m2` with `size(m1, dims=1) == length(is)` and `size(m2, dims=1) == size(m, dims=1) - length(is)`.
"""
function Base.split(m::AbstractMatrix, is)
+ not_is = setdiff(axes(m, 2), is)
m1 = view(m, :, is)
- m2 = view(m, :, Not(is))
+ m2 = view(m, :, not_is)
return m1, m2
end
-"""
- split(t::Test, is)
-
-Split a test by arbitrary indices `is`.
-"""
-function Base.split(t::AbstractTest, is)
- t1 = SubTest(t, is)
- t2 = SubTest(t, Not(is))
- return t1, t2
-end
-
"""
splithalf(m::AbstractMatrix; type::Symbol)
@@ -33,13 +23,13 @@ The type of split is determined by `type`
- `:firstlast`: Split the matrix by first and last half
- `:random`: Split the matrix by random indices
"""
-function splithalf(x; kwargs...)
- n = nitems(x)
+function splithalf(m::AbstractMatrix; kwargs...)
+ n = size(m, 2)
is = getsplitindices(1:n; kwargs...)
- return split(x, is)
+ return split(m, is)
end
-function getsplitindices(x; type::Symbol=:firstlast)
+function getsplitindices(x; type::Symbol)
if type == :oddeven
is = _oddeven_is(x)
elseif type == :firstlast
@@ -52,10 +42,10 @@ function getsplitindices(x; type::Symbol=:firstlast)
return is
end
-_oddeven_is(is) = iseven.(is)
-_firstlast_is(is) = is .<= ceil(length(is) / 2)
+_oddeven_is(is) = filter(iseven, is)
+_firstlast_is(is) = filter(i -> i <= ceil(length(is) / 2), is)
function _random_is(is)
- s = sample(is, ceil(Int, length(is) / 2), replace=false)
- return [i in s for i in is]
+ s = sample(is, ceil(Int, length(is) / 2), replace = false, ordered = true)
+ return is[s]
end
diff --git a/src/types.jl b/src/types.jl
deleted file mode 100644
index 0b2e9a3..0000000
--- a/src/types.jl
+++ /dev/null
@@ -1,49 +0,0 @@
-abstract type AbstractTest end
-
-struct Test{T<:Real} <: AbstractTest
- data::Matrix{T}
- itemcov::Matrix{Float64}
- scores::Vector{T}
-end
-
-struct SubTest <: AbstractTest
- is
- data
- itemcov
- scores
-end
-
-Test(m::AbstractMatrix) = Test{eltype(m)}(m, cov(m), scores(m))
-Test(st::SubTest) = Test{eltype(st.data)}(st.data, st.itemcov, st.scores)
-
-function SubTest(t::Test, is)
- dview = view(t.data, :, is)
- return SubTest(
- is,
- dview,
- view(t.itemcov, is, is),
- scores(dview)
- )
-end
-
-eachitem(m::AbstractMatrix) = eachcol(m)
-eachitem(t::AbstractTest) = eachcol(t.data)
-
-eachperson(m::AbstractMatrix) = eachrow(m)
-eachperson(t::AbstractTest) = eachrow(t.data)
-
-scores(v::AbstractVector) = v
-scores(m::AbstractMatrix) = vec(sum(m, dims=2))
-scores(t::AbstractTest) = t.scores
-
-responses(m::AbstractMatrix) = m
-responses(t::AbstractTest) = t.data
-responses(x, i::Int) = responses(x)[:, i]
-
-nitems(m::AbstractMatrix) = size(m, 2)
-nitems(t::AbstractTest) = nitems(t.data)
-
-npersons(m::AbstractMatrix) = size(m, 1)
-npersons(t::AbstractTest) = npersons(t.data)
-
-Statistics.cov(t::AbstractTest) = t.itemcov
diff --git a/src/utils.jl b/src/utils.jl
index b4420b6..7a6e218 100644
--- a/src/utils.jl
+++ b/src/utils.jl
@@ -1,7 +1,36 @@
function zerodiag!(m)
dims = size(m)
foreach(i -> m[i, i] = zero(eltype(m)), 1:dims[2])
- return nothing
+ return m
end
zerodiag(m) = m - diagm(diag(m))
+
+function CTTPanel(args...; title = nothing)
+ return Term.Panel(
+ args...;
+ title = isnothing(title) ? nothing : "{dim}" * title * "{/dim}",
+ style = "dim",
+ subtitle = "{dim}ClassicalTestTheory.jl{/dim}",
+ subtitle_justify = :right,
+ fit = true,
+ )
+end
+
+const pretty_names = Dict(
+ :lambda1 => "Guttman L₁",
+ :lambda2 => "Guttman L₂",
+ :lambda3 => "Guttman L₃ / Cronbachs α",
+ :lambda4 => "Guttman L₄",
+ :lambda5 => "Guttman L₅",
+ :lambda6 => "Guttman L₆",
+ :glb => "GLB",
+)
+
+prettify(s::Symbol) = pretty_names[s]
+
+
+methodname(x) = typeof(x).name.name
+
+quantilesfromlevel(l::Real) = ((1 - l) / 2, (1 + l) / 2)
+prettyquantile(q::Real) = @sprintf("%.1f", q * 100) * "%-quantile"
diff --git a/test/reliability.jl b/test/reliability.jl
index 279e0af..1ca5305 100644
--- a/test/reliability.jl
+++ b/test/reliability.jl
@@ -1,7 +1,5 @@
@testset "Reliability" begin
# set up some irt style test data with correlated responses
- Random.seed!(859345)
-
difficulties = randn(10)
abilities = randn(100)
@@ -15,32 +13,33 @@
end
end
- t = ClassicalTestTheory.Test(m)
-
- @testset "equality of Matrix and Test methods" begin
- @test λ1(m) ≈ λ1(t)
- @test λ2(m) ≈ λ2(t)
- @test λ3(m) ≈ λ3(t)
- @test λ4(m) ≈ λ4(t)
- @test maxλ4(m, method=:bruteforce) ≈ maxλ4(t, method=:bruteforce)
- @test λ5(m) ≈ λ5(t)
- @test λ6(m) ≈ λ6(t)
-
- @test kr20(m) ≈ kr20(t)
- @test kr21(m) ≈ kr21(t)
-
- @test glb(m) ≈ glb(t)
-
+ @testset "lambda" begin
+ # theoretical guarantees
+ @test lambda1(m) > 0
+ @test lambda1(m) <
+ lambda3(m) <=
+ lambda2(m) <=
+ lambda4(maximum, m, method = :bruteforce).estimate
+ @test alpha(m) == lambda3(m)
+ @test lambda4(maximum, m, method = :sample, n_samples = 100).estimate <=
+ lambda4(maximum, m, method = :bruteforce).estimate
end
- @testset "theoretical guarantees of λ" begin
- @test λ1(t) > 0
- @test λ1(t) < λ3(t) <= λ2(t) <= maxλ4(t, method=:bruteforce)
- @test α(t) == λ3(t)
+ @testset "glb" begin
+ # theoretical guarantees
+ @test lambda4(maximum, m, method = :bruteforce).estimate <= glb(m)
end
- # theoretical guarantees of glb
- @testset "theoretical guarantees of glb" begin
- @test maxλ4(t, method=:bruteforce) <= glb(t)
+ @testset "mu" begin
+ @test_throws ArgumentError mu(m, -1)
+ @test mu(m, 1) ≈ mu(BigFloat, m, 1)
+
+ # theoretical guarantees
+ for r in 1:10
+ @test mu(BigFloat, m, r - 1) <= mu(BigFloat, m, r)
+ end
+
+ @test mu(m, 0) ≈ alpha(m)
+ @test mu(m, 1) ≈ lambda2(m)
end
end
diff --git a/test/runtests.jl b/test/runtests.jl
index 6d4ee33..ad90437 100644
--- a/test/runtests.jl
+++ b/test/runtests.jl
@@ -1,12 +1,8 @@
using ClassicalTestTheory
using Distributions
-using Random
-using StatsBase
-using Statistics
using Test
@testset "ClassicalTestTheory.jl" begin
- include("types.jl")
include("reliability.jl")
include("split.jl")
end
diff --git a/test/split.jl b/test/split.jl
index 3cc25c1..366220f 100644
--- a/test/split.jl
+++ b/test/split.jl
@@ -1,36 +1,22 @@
@testset "Test splitting" begin
m = zeros(4, 4)
- t = ClassicalTestTheory.Test(m)
@testset "by UnitRange" begin
- msplit = split(m, 1:2)
- @test length(msplit) == 2
- @test size(first(msplit)) == (4, 2)
- @test size(last(msplit)) == (4, 2)
-
- tsplit = split(t, 1:2)
- @test length(tsplit) == 2
- @test size(first(tsplit).data) == (4, 2)
- @test size(last(tsplit).data) == (4, 2)
+ s = split(m, 1:2)
+ @test length(s) == 2
+ @test size(first(s)) == (4, 2)
+ @test size(last(s)) == (4, 2)
end
@testset "by Int" begin
- msplit = split(m, 3)
- @test size(first(msplit)) == (4,)
- @test size(last(msplit)) == (4, 3)
-
- tsplit = split(t, 3)
- @test size(first(tsplit).data) == (4,)
- @test size(last(tsplit).data) == (4, 3)
+ s = split(m, 3)
+ @test size(first(s)) == (4,)
+ @test size(last(s)) == (4, 3)
end
@testset "by Array" begin
- msplit = split(m, [1, 3])
- @test size(first(msplit)) == (4, 2)
- @test size(last(msplit)) == (4, 2)
-
- tsplit = split(t, [1, 3])
- @test size(first(tsplit).data) == (4, 2)
- @test size(last(tsplit).data) == (4, 2)
+ s = split(m, [1, 3])
+ @test size(first(s)) == (4, 2)
+ @test size(last(s)) == (4, 2)
end
end
diff --git a/test/types.jl b/test/types.jl
deleted file mode 100644
index f352ee1..0000000
--- a/test/types.jl
+++ /dev/null
@@ -1,56 +0,0 @@
-@testset "Types" begin
- @testset "Matrix methods" begin
- m = [1 0; 0 1; 1 1]
-
- @test scores(m) == [1, 1, 2]
-
- @test responses(m) == m
- @test responses(m, 1) == [1, 0, 1]
- @test responses(m, 2) == [0, 1, 1]
- @test_throws BoundsError responses(m, 3)
-
- @test nitems(m) == 2
- @test npersons(m) == 3
- end
-
- @testset "Test" begin
- m = [1 0; 0 1; 1 1]
- t = ClassicalTestTheory.Test(m)
-
- @test scores(t) == [1, 1, 2]
- @test responses(t) == m
- @test responses(t, 1) == [1, 0, 1]
- @test_throws BoundsError responses(t, 5)
-
- @test cov(t) == t.itemcov == cov(m)
- end
-
- @testset "SubTest" begin
- m = [1 0; 0 1; 1 1]
- t = ClassicalTestTheory.Test(m)
-
- @testset "is::Int" begin
- st = SubTest(t, 1)
- @test scores(st) == [1, 0, 1]
- @test responses(st) == [1, 0, 1]
- @test responses(st, 1) == [1, 0, 1]
- @test_throws BoundsError responses(st, 2)
- end
-
- @testset "is::UnitRange" begin
- st = SubTest(t, 1:2)
- @test scores(st) == [1, 1, 2]
- @test responses(st) == m
- @test responses(st, 1) == [1, 0, 1]
- @test_throws BoundsError responses(st, 3)
- end
-
- @testset "is::Vector" begin
- st = SubTest(t, [1, 2])
- @test scores(st) == [1, 1, 2]
- @test responses(st) == m
- @test responses(st, 1) == [1, 0, 1]
- @test_throws BoundsError responses(st, 3)
- end
- end
-end