diff --git a/.github/workflows/documenter.yml b/.github/workflows/documenter.yml new file mode 100644 index 0000000..a087acc --- /dev/null +++ b/.github/workflows/documenter.yml @@ -0,0 +1,36 @@ +name: Documentation + +on: + push: + branches: + - dev + - main + tags: '*' + pull_request: + +concurrency: + # Skip intermediate builds: always. + # Cancel intermediate builds: only if it is a pull request build. + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }} + +jobs: + build: + permissions: + contents: write + pull-requests: read + statuses: write + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: julia-actions/setup-julia@v2 + with: + version: '1.10' + - uses: julia-actions/cache@v1 + - name: Install dependencies + run: julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' + - name: Build and deploy + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If authenticating with GitHub Actions token + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # If authenticating with SSH deploy key + run: julia --project=docs/ docs/make.jl \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8d91ae8..5189df2 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,8 @@ meh/*.ipynb /*.jl scratchpad/ examples/test.jl +catboost_info/** +/catboost_info +/catboost_info +/docs/src/tutorials/adult_example/.CondaPkg +/docs/src/tutorials/adult_example/catboost_info diff --git a/Project.toml b/Project.toml index 2a4079d..1c21395 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,7 @@ name = "MLJTransforms" uuid = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" authors = ["Essam and contributors"] + version = "0.1.1" [deps] diff --git a/README.md b/README.md index 3d1d110..4db818b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,40 @@ +# MLJTransforms.jl + ![logg](https://github.com/JuliaAI/MLJTransforms/assets/49572294/8d119672-e641-4971-884d-dcb793ba0c05) -Preprocessing, transformation and encoding techniques for MLJ. + +A Julia package providing a wide range of categorical encoders and data transformers to be used with the [MLJ](https://juliaai.github.io/MLJ.jl/dev/) package. + +[![Build Status](https://github.com/JuliaAI/Imbalance.jl/workflows/CI/badge.svg)](https://github.com/JuliaAI/Imbalance.jl/actions) +[![Docs](https://img.shields.io/badge/docs-dev-blue.svg)](https://juliaai.github.io/MLJTransforms.jl/dev/) + +## Quick Start + +For the following demo, you will need to additionally run `Pkg.add("RDatasets")`. + +```julia +using MLJ, MLJTransforms +import RDatasets + +# 1. Load Data +X = RDatasets.dataset("HSAUR", "Forbes2000"); + +# 2. Load the model +FrequencyEncoder = @load FrequencyEncoder pkg="MLJTransforms" +encoder = FrequencyEncoder( + features=[:Country, :Category], # The categorical columns to select + ignore=false, # Whether to exclude or include selected columns + ordered_factor = false, # Whether to also encode columns of ordered factor elements + normalize=true # Whether to normalize the frequencies used for encoding + ) + + +# 3. Wrap it in a machine and fit +mach = fit!(machine(encoder, X)) +Xnew = transform(mach, X) +``` + +See the full [documentation](https://juliaai.github.io/MLJTransforms.jl/dev/) for more information and a [full list](https://juliaai.github.io/MLJTransforms.jl/dev/all_transformers) of transformers in this package. + +## πŸ‘₯ Credits +This package was created by [Essam Wisam](https://github.com/JuliaAI) as a Google Summer of Code project on categorical encoding, under the mentorship of [Anthony Blaom](https://ablaom.github.io). Subsequently, the package was expanded to include data transformation methods beyond categorical encoders that previously existed in other packages. diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..a303fff --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +build/ +site/ diff --git a/docs/Manifest.toml b/docs/Manifest.toml new file mode 100644 index 0000000..353ebf2 --- /dev/null +++ b/docs/Manifest.toml @@ -0,0 +1,1611 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.5" +manifest_format = "2.0" +project_hash = "91a8930050a9a2f910f601fc2e1181dc6037b32b" + +[[deps.ANSIColoredPrinters]] +git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" +uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9" +version = "0.0.1" + +[[deps.ARFFFiles]] +deps = ["CategoricalArrays", "Dates", "Parsers", "Tables"] +git-tree-sha1 = "678eb18590a8bc6674363da4d5faa4ac09c40a18" +uuid = "da404889-ca92-49ff-9e8b-0aa6b4d38dc8" +version = "1.5.0" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgCheck]] +git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.5.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "b5bb4dc6248fde467be2a863eb8452993e74d402" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.1" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.BSON]] +git-tree-sha1 = "4c3e506685c527ac6a54ccc0c8c76fd6f91b42fb" +uuid = "fbb218c0-5317-5bc6-957e-2ee96dd4b1f0" +version = "0.3.9" + +[[deps.BangBang]] +deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"] +git-tree-sha1 = "26f41e1df02c330c4fa1e98d4aa2168fdafc9b1f" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.4.4" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTablesExt = "Tables" + 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" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.BitBasis]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "89dc08420d4f593ff30f02611d136b475a5eb43d" +uuid = "50ba71b6-fa0f-514d-ae9a-0916efc90dcf" +version = "0.9.10" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "6c834533dc1fabd820c1db03c839bf97e45a3fab" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.14" + +[[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.CategoricalDistributions]] +deps = ["CategoricalArrays", "Distributions", "Missings", "OrderedCollections", "Random", "ScientificTypes"] +git-tree-sha1 = "926862f549a82d6c3a7145bc7f1adff2a91a39f0" +uuid = "af321ab8-2d2e-40a6-b165-3d674595d28e" +version = "0.1.15" + + [deps.CategoricalDistributions.extensions] + UnivariateFiniteDisplayExt = "UnicodePlots" + + [deps.CategoricalDistributions.weakdeps] + UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" + +[[deps.ChainRules]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] +git-tree-sha1 = "224f9dc510986549c8139def08e06f78c562514d" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.72.5" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.Combinatorics]] +git-tree-sha1 = "8010b6bb3388abe68d95743dcbea77650bb2eddf" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.3" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.5.0" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ContextVariablesX]] +deps = ["Compat", "Logging", "UUIDs"] +git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" +uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" +version = "0.1.3" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.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 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[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" +version = "1.11.0" + +[[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.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "3e6d038b77f22791b8e3472b7c633acea1ecac06" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.120" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Documenter]] +deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "CodecZlib", "Dates", "DocStringExtensions", "Downloads", "Git", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "TOML", "Test", "Unicode"] +git-tree-sha1 = "5a1ee886566f2fa9318df1273d8b778b9d42712d" +uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +version = "1.7.0" + +[[deps.DocumenterTools]] +deps = ["AbstractTrees", "Base64", "DocStringExtensions", "Documenter", "FileWatching", "Gumbo", "LibGit2", "OpenSSH_jll", "Sass"] +git-tree-sha1 = "7605a88f75625836ce47102b8915041fae231ff5" +uuid = "35a29f4d-8980-5a13-9543-d66fff28ecb8" +version = "0.1.19" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarlyStopping]] +deps = ["Dates", "Statistics"] +git-tree-sha1 = "98fdf08b707aaf69f524a6cd0a67858cefe0cfb6" +uuid = "792122b4-ca99-40de-a6bc-6742525f08b6" +version = "0.3.0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.5+0" + +[[deps.FLoops]] +deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] +git-tree-sha1 = "0a2e5873e9a5f54abb06418d57a8df689336a660" +uuid = "cc61a311-1640-44b5-9fba-1b764f453329" +version = "0.2.2" + +[[deps.FLoopsBase]] +deps = ["ContextVariablesX"] +git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" +uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" +version = "0.1.1" + +[[deps.FeatureSelection]] +deps = ["MLJModelInterface", "ScientificTypesBase", "Tables"] +git-tree-sha1 = "d78c565b6296e161193eb0f053bbcb3f1a82091d" +uuid = "33837fe5-dbff-4c9e-8c2f-c5612fe2b8b6" +version = "0.2.2" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.17.0" +weakdeps = ["HTTP"] + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Flux]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLDataDevices", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "Setfield", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"] +git-tree-sha1 = "df520a0727f843576801a0294f5be1a94be28e23" +uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c" +version = "0.14.25" + + [deps.Flux.extensions] + FluxAMDGPUExt = "AMDGPU" + FluxCUDAExt = "CUDA" + FluxCUDAcuDNNExt = ["CUDA", "cuDNN"] + FluxEnzymeExt = "Enzyme" + FluxMPIExt = "MPI" + FluxMPINCCLExt = ["CUDA", "MPI", "NCCL"] + + [deps.Flux.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + NCCL = "3fe64909-d7a1-4096-9b7d-7a0f12cf0f6b" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.0.1" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.Functors]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "64d8e93700c7a3f28f717d265382d52fac9fa1c1" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.4.12" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "ScopedValues", "Serialization", "Statistics"] +git-tree-sha1 = "eea7b3a1964b4de269bb380462a9da604be7fcdb" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "11.2.2" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.Git]] +deps = ["Git_jll"] +git-tree-sha1 = "51764e6c2e84c37055e846c516e9015b4a291c7d" +uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" +version = "1.3.0" + +[[deps.Git_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "d8be4aab0f4e043cc40984e9097417307cce4c03" +uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" +version = "2.36.1+2" + +[[deps.Gumbo]] +deps = ["AbstractTrees", "Gumbo_jll", "Libdl"] +git-tree-sha1 = "eab9e02310eb2c3e618343c859a12b51e7577f5e" +uuid = "708ec375-b3d6-5a57-a7ce-8257bf98657a" +version = "0.8.3" + +[[deps.Gumbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "29070dee9df18d9565276d68a596854b1764aa38" +uuid = "528830af-5a63-567c-a44a-034ed33b8444" +version = "0.10.2+0" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "ed5e9c58612c4e081aecdb6e1a479e18462e041e" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.17" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.28" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.5" + +[[deps.IRTools]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "57e9ce6cf68d0abf5cb6b3b4abf9bedf05c939c0" +uuid = "7869d1d1-7146-5819-86e3-90919afe41df" +version = "0.4.15" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InlineStrings]] +git-tree-sha1 = "8594fac023c5ce1ef78260f24d1ad18b4327b420" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.4" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.IterationControl]] +deps = ["EarlyStopping", "InteractiveUtils"] +git-tree-sha1 = "e663925ebc3d93c1150a7570d114f9ea2f664726" +uuid = "b3c1a2ee-3fec-4384-bf48-272ea71de57c" +version = "0.5.4" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "TranscodingStreams"] +git-tree-sha1 = "8e071648610caa2d3a5351aba03a936a0c37ec61" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.5.13" +weakdeps = ["UnPack"] + + [deps.JLD2.extensions] + UnPackExt = "UnPack" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JuliaVariables]] +deps = ["MLStyle", "NameResolution"] +git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" +uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" +version = "0.2.4" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "602c0e9efadafb8abfe8281c3fbf9cf6f406fc03" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.35" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "cfedf80c59000507cc8115a0281931253f4a33cd" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.4.1" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "2ea068aac1e7f0337d381b0eae3110581e3f3216" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.37+2" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.LatinHypercubeSampling]] +deps = ["Random", "StableRNGs", "StatsBase", "Test"] +git-tree-sha1 = "825289d43c753c7f1bf9bed334c253e9913997f8" +uuid = "a5e1c1ea-c99a-51d3-a14d-a9a37257b02d" +version = "1.9.0" + +[[deps.LazilyInitializedFields]] +git-tree-sha1 = "0f2da712350b020bc3957f269c9caad516383ee0" +uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" +version = "1.3.0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LearnAPI]] +deps = ["InteractiveUtils", "Statistics"] +git-tree-sha1 = "ec695822c1faaaa64cee32d0b21505e1977b4809" +uuid = "92ad9a40-7767-427a-9ee6-6e577f1266cb" +version = "0.1.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [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" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.MLCore]] +deps = ["DataAPI", "SimpleTraits", "Tables"] +git-tree-sha1 = "73907695f35bc7ffd9f11f6c4f2ee8c1302084be" +uuid = "c2834f40-e789-41da-a90e-33b280584a8c" +version = "1.0.0" + +[[deps.MLDataDevices]] +deps = ["Adapt", "Compat", "Functors", "Preferences", "Random"] +git-tree-sha1 = "85b47bc5a8bf0c886286638585df3bec7c9f8269" +uuid = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40" +version = "1.5.3" + + [deps.MLDataDevices.extensions] + MLDataDevicesAMDGPUExt = "AMDGPU" + MLDataDevicesCUDAExt = "CUDA" + MLDataDevicesChainRulesCoreExt = "ChainRulesCore" + MLDataDevicesChainRulesExt = "ChainRules" + MLDataDevicesFillArraysExt = "FillArrays" + MLDataDevicesGPUArraysExt = "GPUArrays" + MLDataDevicesMLUtilsExt = "MLUtils" + MLDataDevicesMetalExt = ["GPUArrays", "Metal"] + MLDataDevicesOneHotArraysExt = "OneHotArrays" + MLDataDevicesReactantExt = "Reactant" + MLDataDevicesRecursiveArrayToolsExt = "RecursiveArrayTools" + MLDataDevicesReverseDiffExt = "ReverseDiff" + MLDataDevicesSparseArraysExt = "SparseArrays" + MLDataDevicesTrackerExt = "Tracker" + MLDataDevicesZygoteExt = "Zygote" + MLDataDevicescuDNNExt = ["CUDA", "cuDNN"] + MLDataDevicesoneAPIExt = ["GPUArrays", "oneAPI"] + + [deps.MLDataDevices.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" + GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" + MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OneHotArrays = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.MLFlowClient]] +deps = ["Dates", "FilePathsBase", "HTTP", "JSON", "ShowCases", "URIs", "UUIDs"] +git-tree-sha1 = "9abb12b62debc27261c008daa13627255bf79967" +uuid = "64a0f543-368b-4a9a-827a-e71edb2a0b83" +version = "0.5.1" + +[[deps.MLJ]] +deps = ["CategoricalArrays", "ComputationalResources", "Distributed", "Distributions", "FeatureSelection", "LinearAlgebra", "MLJBalancing", "MLJBase", "MLJEnsembles", "MLJFlow", "MLJIteration", "MLJModels", "MLJTuning", "OpenML", "Pkg", "ProgressMeter", "Random", "Reexport", "ScientificTypes", "StatisticalMeasures", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "521eec7a22417d54fdc66f5dc0b7dc9628931c54" +uuid = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +version = "0.20.7" + +[[deps.MLJBalancing]] +deps = ["MLJBase", "MLJModelInterface", "MLUtils", "OrderedCollections", "Random", "StatsBase"] +git-tree-sha1 = "f707a01a92d664479522313907c07afa5d81df19" +uuid = "45f359ea-796d-4f51-95a5-deb1a414c586" +version = "0.1.5" + +[[deps.MLJBase]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Dates", "DelimitedFiles", "Distributed", "Distributions", "InteractiveUtils", "InvertedIndices", "LearnAPI", "LinearAlgebra", "MLJModelInterface", "Missings", "OrderedCollections", "Parameters", "PrettyTables", "ProgressMeter", "Random", "RecipesBase", "Reexport", "ScientificTypes", "Serialization", "StatisticalMeasuresBase", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "6f45e12073bc2f2e73ed0473391db38c31e879c9" +uuid = "a7f614a8-145f-11e9-1d2a-a57a1082229d" +version = "1.7.0" +weakdeps = ["StatisticalMeasures"] + + [deps.MLJBase.extensions] + DefaultMeasuresExt = "StatisticalMeasures" + +[[deps.MLJEnsembles]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Distributed", "Distributions", "MLJModelInterface", "ProgressMeter", "Random", "ScientificTypesBase", "StatisticalMeasuresBase", "StatsBase"] +git-tree-sha1 = "84a5be55a364bb6b6dc7780bbd64317ebdd3ad1e" +uuid = "50ed68f4-41fd-4504-931a-ed422449fee0" +version = "0.4.3" + +[[deps.MLJFlow]] +deps = ["MLFlowClient", "MLJBase", "MLJModelInterface"] +git-tree-sha1 = "508bff8071d7d1902d6f1b9d1e868d58821f1cfe" +uuid = "7b7b8358-b45c-48ea-a8ef-7ca328ad328f" +version = "0.5.0" + +[[deps.MLJFlux]] +deps = ["CategoricalArrays", "ColorTypes", "ComputationalResources", "Flux", "MLJModelInterface", "Metalhead", "Optimisers", "ProgressMeter", "Random", "Statistics", "Tables"] +git-tree-sha1 = "cb65604a17525c341222e5379aad3dc6d322e719" +uuid = "094fc8d1-fd35-5302-93ea-dabda2abf845" +version = "0.6.6" + +[[deps.MLJIteration]] +deps = ["IterationControl", "MLJBase", "Random", "Serialization"] +git-tree-sha1 = "ad16cfd261e28204847f509d1221a581286448ae" +uuid = "614be32b-d00c-4edb-bd02-1eb411ab5e55" +version = "0.6.3" + +[[deps.MLJModelInterface]] +deps = ["REPL", "Random", "ScientificTypesBase", "StatisticalTraits"] +git-tree-sha1 = "66626f80d5807921045d539b4f7153b1d47c5f8a" +uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" +version = "1.11.1" + +[[deps.MLJModels]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Combinatorics", "Dates", "Distances", "Distributions", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "Markdown", "OrderedCollections", "Parameters", "Pkg", "PrettyPrinting", "REPL", "Random", "RelocatableFolders", "ScientificTypes", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "09381923be5ed34416ed77badbc26e1adf295492" +uuid = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +version = "0.17.9" + +[[deps.MLJTransforms]] +deps = ["BitBasis", "CategoricalArrays", "Combinatorics", "Dates", "Distributions", "LinearAlgebra", "MLJModelInterface", "OrderedCollections", "Parameters", "ScientificTypes", "ScientificTypesBase", "Statistics", "StatsBase", "TableOperations", "Tables"] +path = ".." +uuid = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" +version = "0.1.1" + +[[deps.MLJTuning]] +deps = ["ComputationalResources", "Distributed", "Distributions", "LatinHypercubeSampling", "MLJBase", "ProgressMeter", "Random", "RecipesBase", "StatisticalMeasuresBase"] +git-tree-sha1 = "38aab60b1274ce7d6da784808e3be69e585dbbf6" +uuid = "03970b2e-30c4-11ea-3135-d1576263f10f" +version = "0.8.8" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MLUtils]] +deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "MLCore", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"] +git-tree-sha1 = "a772d8d1987433538a5c226f79393324b55f7846" +uuid = "f1d291b0-491e-4a28-83b9-f70985020b54" +version = "0.4.8" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MarkdownAST]] +deps = ["AbstractTrees", "Markdown"] +git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899" +uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" +version = "0.1.2" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Metalhead]] +deps = ["Artifacts", "BSON", "ChainRulesCore", "Flux", "Functors", "JLD2", "LazyArtifacts", "MLUtils", "NNlib", "PartialFunctions", "Random", "Statistics"] +git-tree-sha1 = "7d3cdd8acb8ccdf82bb80d07f33f020b0976ddc5" +uuid = "dbeba491-748d-5e0e-a39e-b530a07fa0cc" +version = "0.9.5" + + [deps.Metalhead.extensions] + MetalheadCUDAExt = "CUDA" + + [deps.Metalhead.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.MicroCollections]] +deps = ["Accessors", "BangBang", "InitialValues"] +git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.2.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "ScopedValues", "Statistics"] +git-tree-sha1 = "4abc63cdd8dd9dd925d8e879cda280bedc8013ca" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.30" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + NNlibSpecialFunctionsExt = "SpecialFunctions" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NameResolution]] +deps = ["PrettyPrint"] +git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" +uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" +version = "0.1.5" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OneHotArrays]] +deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"] +git-tree-sha1 = "bfe8e84c71972f77e775f75e6d8048ad3fdbe8bc" +uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f" +version = "0.2.10" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenML]] +deps = ["ARFFFiles", "HTTP", "JSON", "Markdown", "Pkg", "Scratch"] +git-tree-sha1 = "63603b2b367107e87dbceda4e33c67aed17e50e0" +uuid = "8b6db2d4-7670-4922-a472-f9537c81ab66" +version = "0.3.2" + +[[deps.OpenSSH_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "1b2f042897343a9dfdcc9366e4ecbd3d00780c49" +uuid = "9bd350c2-7e96-507f-8002-3f2e150b4e1b" +version = "8.9.0+1" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "f1a7e086c677df53e064e0fdd2c9d0b0833e3f6e" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.5.0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ad31332567b189f508a3ea8957a2640b1147ab00" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.23+1" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Optimisers]] +deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "c9ff5c686240c31eb8570b662dd1f66f4b183116" +uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" +version = "0.3.4" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "f07c06228a1c670ae4c87d1276b92c7c597fdda0" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.35" + +[[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 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.3" + +[[deps.PartialFunctions]] +deps = ["MacroTools"] +git-tree-sha1 = "ba0ea009d9f1e38162d016ca54627314b6d8aac8" +uuid = "570af359-4316-4cb7-8c74-252c00c2016b" +version = "1.2.1" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyPrint]] +git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" +uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" +version = "0.2.0" + +[[deps.PrettyPrinting]] +git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e" +uuid = "54e16d92-306c-5ea0-a30b-337be88ac337" +version = "0.4.2" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[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 = "13c5103482a8ed1536a54c08d0e742ae3dca2d42" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.4" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[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.RegistryInstances]] +deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] +git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" +uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" +version = "0.1.0" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Sass]] +deps = ["libsass_jll"] +git-tree-sha1 = "aa841c3738cec78b5dbccd56dda332710f35f6a5" +uuid = "322a6be2-4ae8-5d68-aaf1-3e960788d1d9" +version = "0.2.0" + +[[deps.ScientificTypes]] +deps = ["CategoricalArrays", "ColorTypes", "Dates", "Distributions", "PrettyTables", "Reexport", "ScientificTypesBase", "StatisticalTraits", "Tables"] +git-tree-sha1 = "4d083ffec53dbd5097a6723b0699b175be2b61fb" +uuid = "321657f4-b219-11e9-178b-2701a2544e81" +version = "3.1.0" + +[[deps.ScientificTypesBase]] +git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b" +uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" +version = "3.0.0" + +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "1147f140b4c8ddab224c94efa9569fc23d63ab44" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.3.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.8" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.ShowCases]] +git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5" +uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" +version = "0.1.0" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SparseInverseSubset]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" +uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" +version = "0.1.2" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.15" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.3" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.13" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.StatisticalMeasures]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Distributions", "LearnAPI", "LinearAlgebra", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "StatisticalMeasuresBase", "Statistics", "StatsBase"] +git-tree-sha1 = "c1d4318fa41056b839dfbb3ee841f011fa6e8518" +uuid = "a19d573c-0a75-4610-95b3-7071388c7541" +version = "0.1.7" + + [deps.StatisticalMeasures.extensions] + LossFunctionsExt = "LossFunctions" + ScientificTypesExt = "ScientificTypes" + + [deps.StatisticalMeasures.weakdeps] + LossFunctions = "30fc2ffe-d236-52d8-8643-a9d8f7c094a7" + ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" + +[[deps.StatisticalMeasuresBase]] +deps = ["CategoricalArrays", "InteractiveUtils", "MLUtils", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "Statistics"] +git-tree-sha1 = "e4f508cf3b3253f3eb357274fe36fb3332ca9896" +uuid = "c062fc1d-0d66-479b-b6ac-8b44719de4cc" +version = "0.1.2" + +[[deps.StatisticalTraits]] +deps = ["ScientificTypesBase"] +git-tree-sha1 = "542d979f6e756f13f862aa00b224f04f9e445f11" +uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" +version = "3.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.1" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.5" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "8e45cecc66f3b42633b8ce14d431e8e57a3e242e" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "8ad2e38cbb812e29348719cc63580ec1dfeb9de4" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.7.1" +weakdeps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableOperations]] +deps = ["SentinelArrays", "Tables", "Test"] +git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" +uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" +version = "1.2.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Transducers]] +deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] +git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.84" + + [deps.Transducers.extensions] + TransducersAdaptExt = "Adapt" + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + TransducersReferenceablesExt = "Referenceables" + + [deps.Transducers.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + 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.URIs]] +git-tree-sha1 = "24c1c558881564e2217dcf7840a8b2e10caeb0f9" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.6.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" +weakdeps = ["LLVM"] + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[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+1" + +[[deps.Zygote]] +deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] +git-tree-sha1 = "8462a20f0fd85b4ef4a1b7310d33e7475d2bb14f" +uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" +version = "0.6.77" + + [deps.Zygote.extensions] + ZygoteColorsExt = "Colors" + ZygoteDistancesExt = "Distances" + ZygoteTrackerExt = "Tracker" + + [deps.Zygote.weakdeps] + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ZygoteRules]] +deps = ["ChainRulesCore", "MacroTools"] +git-tree-sha1 = "434b3de333c75fc446aa0d19fc394edafd07ab08" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.7" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libsass_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6044ffe7e7bf0602e2039dc747c3332a097ac74b" +uuid = "47bcb7c8-5119-555a-9eeb-0afcc36cd728" +version = "3.6.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" diff --git a/docs/Project.toml b/docs/Project.toml new file mode 100644 index 0000000..a9d6acf --- /dev/null +++ b/docs/Project.toml @@ -0,0 +1,11 @@ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +DocumenterTools = "35a29f4d-8980-5a13-9543-d66fff28ecb8" +MLJ = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +MLJFlux = "094fc8d1-fd35-5302-93ea-dabda2abf845" +MLJTransforms = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" + +[compat] +MLJFlux = "0.6.6" diff --git a/docs/make.jl b/docs/make.jl new file mode 100644 index 0000000..949c611 --- /dev/null +++ b/docs/make.jl @@ -0,0 +1,54 @@ +using Documenter +using MLJTransforms +using MLJFlux + +DocMeta.setdocmeta!(MLJTransforms, :DocTestSetup, :(using MLJTransforms); recursive = true) +DocMeta.setdocmeta!(MLJFlux, :DocTestSetup, :(using MLJFlux); recursive = true) +makedocs( + sitename = "MLJTransforms", + format = Documenter.HTML( + collapselevel = 1, + assets = [ + "assets/favicon.ico", + asset( + "https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap", + class = :css, + ), + asset( + "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css", + class = :css, + ), + ], + repolink = "https://github.com/JuliaAI/MLJTransforms.jl", + ), + modules = [MLJTransforms, MLJFlux], + warnonly = true, + pages = [ + "Introduction" => "index.md", + "Transformers" => Any[ + "All Transformers"=>"transformers/all_transformers.md", + "Encoders"=>Any[ + "Classical Encoders" => "transformers/classical.md", + "Neural-based Encoders" => "transformers/neural.md", + "Contrast Encoders" => "transformers/contrast.md", + "Utility Encoders" => "transformers/utility.md", + ], + ], + "Extended Examples" => Any[ + "Standardization Impact" => "tutorials/standardization/notebook.md", + "Milk Quality Classification" => "tutorials/classic_comparison/notebook.md", + "Adult Income Classification" => "tutorials/adult_example/notebook.md", + "Entity Embeddings Tutorial" => "tutorials/entity_embeddings/notebook.md", + ], + "Contributing" => "contributing.md", + "About" => "about.md", + ], + doctest = false, +) + + +deploydocs( + repo = "github.com/JuliaAI/MLJTransforms.jl.git", + devbranch = "dev", + push_preview = true, +) diff --git a/docs/src/about.md b/docs/src/about.md new file mode 100644 index 0000000..b83356e --- /dev/null +++ b/docs/src/about.md @@ -0,0 +1,2 @@ +## Credits +This package was created by Essam Wisam as a Google Summer of Code project on categorical encoding, under the mentorship of Anthony Blaom offering over eleven different categorical encoding methods. Subsequently, the package was expanded to include eight other data transformation methods beyond categorical encoders that were originally developed in MLJModels.jl, originally authored by Anthony Blaom, Thibaut Lienart , Samuel Okon, Yiannis Simillides, Dilum Aluthge, Sebastian Vollmer, Darren Christopher Lukas, Mateusz Baran, Shuhei Kadowaki, Olivier Labayle, and others. \ No newline at end of file diff --git a/docs/src/assets/favicon.ico b/docs/src/assets/favicon.ico new file mode 100644 index 0000000..bad50de Binary files /dev/null and b/docs/src/assets/favicon.ico differ diff --git a/docs/src/assets/light.scss b/docs/src/assets/light.scss new file mode 100644 index 0000000..c931529 --- /dev/null +++ b/docs/src/assets/light.scss @@ -0,0 +1,110 @@ +@charset "UTF-8"; + +$family-sans-serif: 'Lato', sans-serif; +$family-monospace: 'Source Code Pro', monospace; +$themename: "documenter-light"; // CSS file must be called `$(themename).css` + +@import "documenter-light"; + + +#documenter .content p { // Justify text in paragraphs + text-align: justify; +} + +.docstring { + border-radius: 15px !important; + header { + border-radius: 15px 15px 0 0 !important; + } + pre { + border-radius: 10px; + padding: 4px; + } + + section { + padding: 20px; + + + } + +} + +.docs-package-name { + display: none; +} + + +.admonition { + border-radius: 15px !important; +} +.admonition-header { + border-top-left-radius: 14px !important; + border-top-right-radius: 14px !important; +} + +// code.nohighlight.hljs { +// background-color: white !important; +// } + + + +.grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 20px; + max-width: 1200px; + padding: 20px; +} + +.grid-item { + position: relative; + overflow: hidden; + border-radius: 15px; + transition: transform 0.3s ease; + cursor: pointer; +} + +.grid-item img { + max-width: 100%; + height: auto; + display: block; +} + +.grid-item .item-title { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + background-color: rgba(0, 0, 0, 0.9); + color: #fff; + padding: 8px 15px; + font-size: 16px; +} + +.item-title p { + font-weight: normal !important; + display: none; +} + + + +.grid-item:hover p { + display: block; +} + +.grid-item:hover #colab { + display: block; +} + +#colab { + border-radius: 25%; + position: absolute; + top: 3px; + right: 3px; + width: 11%; + display: none; +} + +.content pre { + border-radius: 1rem !important; +} \ No newline at end of file diff --git a/docs/src/assets/logo.gif b/docs/src/assets/logo.gif new file mode 100644 index 0000000..3f24293 Binary files /dev/null and b/docs/src/assets/logo.gif differ diff --git a/docs/src/assets/logos.gif b/docs/src/assets/logos.gif new file mode 100644 index 0000000..1c63168 Binary files /dev/null and b/docs/src/assets/logos.gif differ diff --git a/docs/src/assets/static-logo.png b/docs/src/assets/static-logo.png new file mode 100644 index 0000000..42861df Binary files /dev/null and b/docs/src/assets/static-logo.png differ diff --git a/docs/src/assets/themes/documenter-light.css b/docs/src/assets/themes/documenter-light.css new file mode 100644 index 0000000..f0e3b9a --- /dev/null +++ b/docs/src/assets/themes/documenter-light.css @@ -0,0 +1,13637 @@ +ο»Ώ@keyframes spinAround { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(359deg); + } +} + +.tabs, +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, +.breadcrumb, +.file, +.button, +.is-unselectable, +.modal-close, +.delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.navbar-link:not(.is-arrowless)::after, +.select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid rgba(0, 0, 0, 0); + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; +} + +.admonition:not(:last-child), +.tabs:not(:last-child), +.message:not(:last-child), +.list:not(:last-child), +.level:not(:last-child), +.breadcrumb:not(:last-child), +.highlight:not(:last-child), +.block:not(:last-child), +.title:not(:last-child), +.subtitle:not(:last-child), +.table-container:not(:last-child), +.table:not(:last-child), +.progress:not(:last-child), +.notification:not(:last-child), +.content:not(:last-child), +.box:not(:last-child) { + margin-bottom: 1.5rem; +} + +.modal-close, +.delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; +} + +.modal-close::before, +.delete::before, +.modal-close::after, +.delete::after { + background-color: #fff; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; +} + +.modal-close::before, +.delete::before { + height: 2px; + width: 50%; +} + +.modal-close::after, +.delete::after { + height: 50%; + width: 2px; +} + +.modal-close:hover, +.delete:hover, +.modal-close:focus, +.delete:focus { + background-color: rgba(10, 10, 10, 0.3); +} + +.modal-close:active, +.delete:active { + background-color: rgba(10, 10, 10, 0.4); +} + +.is-small.modal-close, +#documenter .docs-sidebar form.docs-search>input.modal-close, +.is-small.delete, +#documenter .docs-sidebar form.docs-search>input.delete { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; +} + +.is-medium.modal-close, +.is-medium.delete { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; +} + +.is-large.modal-close, +.is-large.delete { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; +} + +.control.is-loading::after, +.select.is-loading::after, +.loader, +.button.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; +} + +.hero-video, +.modal-background, +.modal, +.image.is-square img, +#documenter .docs-sidebar .docs-logo>img.is-square img, +.image.is-square .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio, +.image.is-1by1 img, +#documenter .docs-sidebar .docs-logo>img.is-1by1 img, +.image.is-1by1 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio, +.image.is-5by4 img, +#documenter .docs-sidebar .docs-logo>img.is-5by4 img, +.image.is-5by4 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio, +.image.is-4by3 img, +#documenter .docs-sidebar .docs-logo>img.is-4by3 img, +.image.is-4by3 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio, +.image.is-3by2 img, +#documenter .docs-sidebar .docs-logo>img.is-3by2 img, +.image.is-3by2 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio, +.image.is-5by3 img, +#documenter .docs-sidebar .docs-logo>img.is-5by3 img, +.image.is-5by3 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio, +.image.is-16by9 img, +#documenter .docs-sidebar .docs-logo>img.is-16by9 img, +.image.is-16by9 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio, +.image.is-2by1 img, +#documenter .docs-sidebar .docs-logo>img.is-2by1 img, +.image.is-2by1 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio, +.image.is-3by1 img, +#documenter .docs-sidebar .docs-logo>img.is-3by1 img, +.image.is-3by1 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio, +.image.is-4by5 img, +#documenter .docs-sidebar .docs-logo>img.is-4by5 img, +.image.is-4by5 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio, +.image.is-3by4 img, +#documenter .docs-sidebar .docs-logo>img.is-3by4 img, +.image.is-3by4 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio, +.image.is-2by3 img, +#documenter .docs-sidebar .docs-logo>img.is-2by3 img, +.image.is-2by3 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio, +.image.is-3by5 img, +#documenter .docs-sidebar .docs-logo>img.is-3by5 img, +.image.is-3by5 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio, +.image.is-9by16 img, +#documenter .docs-sidebar .docs-logo>img.is-9by16 img, +.image.is-9by16 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio, +.image.is-1by2 img, +#documenter .docs-sidebar .docs-logo>img.is-1by2 img, +.image.is-1by2 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio, +.image.is-1by3 img, +#documenter .docs-sidebar .docs-logo>img.is-1by3 img, +.image.is-1by3 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio, +.is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, +.file-cta, +.file-name, +.select select, +.textarea, +.input, +#documenter .docs-sidebar form.docs-search>input, +.button { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: none; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; +} + +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus, +.pagination-ellipsis:focus, +.file-cta:focus, +.file-name:focus, +.select select:focus, +.textarea:focus, +.input:focus, +#documenter .docs-sidebar form.docs-search>input:focus, +.button:focus, +.is-focused.pagination-previous, +.is-focused.pagination-next, +.is-focused.pagination-link, +.is-focused.pagination-ellipsis, +.is-focused.file-cta, +.is-focused.file-name, +.select select.is-focused, +.is-focused.textarea, +.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-focused.button, +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active, +.pagination-ellipsis:active, +.file-cta:active, +.file-name:active, +.select select:active, +.textarea:active, +.input:active, +#documenter .docs-sidebar form.docs-search>input:active, +.button:active, +.is-active.pagination-previous, +.is-active.pagination-next, +.is-active.pagination-link, +.is-active.pagination-ellipsis, +.is-active.file-cta, +.is-active.file-name, +.select select.is-active, +.is-active.textarea, +.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active, +.is-active.button { + outline: none; +} + +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled], +.pagination-ellipsis[disabled], +.file-cta[disabled], +.file-name[disabled], +.select select[disabled], +.textarea[disabled], +.input[disabled], +#documenter .docs-sidebar form.docs-search>input[disabled], +.button[disabled], +fieldset[disabled] .pagination-previous, +fieldset[disabled] .pagination-next, +fieldset[disabled] .pagination-link, +fieldset[disabled] .pagination-ellipsis, +fieldset[disabled] .file-cta, +fieldset[disabled] .file-name, +fieldset[disabled] .select select, +.select fieldset[disabled] select, +fieldset[disabled] .textarea, +fieldset[disabled] .input, +fieldset[disabled] #documenter .docs-sidebar form.docs-search>input, +#documenter .docs-sidebar fieldset[disabled] form.docs-search>input, +fieldset[disabled] .button { + cursor: not-allowed; +} + +/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; +} + +ul { + list-style: none; +} + +button, +input, +select, +textarea { + margin: 0; +} + +html { + box-sizing: border-box; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +img, +embed, +iframe, +object, +video { + height: auto; + max-width: 100%; +} + +audio { + max-width: 100%; +} + +iframe { + border: 0; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +td:not([align]), +th:not([align]) { + text-align: left; +} + +html { + background-color: #fff; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; +} + +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; +} + +body, +button, +input, +select, +textarea { + font-family: "Lato", sans-serif; +} + +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: "Source Code Pro", monospace; +} + +body { + color: #222; + font-size: 1em; + font-weight: 400; + line-height: 1.5; +} + +a { + color: #2e63b8; + cursor: pointer; + text-decoration: none; +} + +a strong { + color: currentColor; +} + +a:hover { + color: #363636; +} + +code { + background-color: rgba(0, 0, 0, 0.05); + color: #000; + font-size: 0.875em; + font-weight: normal; + padding: 0.1em; +} + +hr { + background-color: #f5f5f5; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; +} + +img { + height: auto; + max-width: 100%; +} + +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; +} + +small { + font-size: 0.875em; +} + +span { + font-style: inherit; + font-weight: inherit; +} + +strong { + color: #222; + font-weight: 700; +} + +fieldset { + border: none; +} + +pre { + -webkit-overflow-scrolling: touch; + background-color: #f5f5f5; + color: #222; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; +} + +pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; +} + +table td, +table th { + vertical-align: top; +} + +table td:not([align]), +table th:not([align]) { + text-align: left; +} + +table th { + color: #222; +} + +.is-clearfix::after { + clear: both; + content: " "; + display: table; +} + +.is-pulled-left { + float: left !important; +} + +.is-pulled-right { + float: right !important; +} + +.is-clipped { + overflow: hidden !important; +} + +.is-size-1 { + font-size: 3rem !important; +} + +.is-size-2 { + font-size: 2.5rem !important; +} + +.is-size-3 { + font-size: 2rem !important; +} + +.is-size-4 { + font-size: 1.5rem !important; +} + +.is-size-5 { + font-size: 1.25rem !important; +} + +.is-size-6 { + font-size: 1rem !important; +} + +.is-size-7, +.docstring>section>a.docs-sourcelink { + font-size: 0.75rem !important; +} + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; + } + + .is-size-2-mobile { + font-size: 2.5rem !important; + } + + .is-size-3-mobile { + font-size: 2rem !important; + } + + .is-size-4-mobile { + font-size: 1.5rem !important; + } + + .is-size-5-mobile { + font-size: 1.25rem !important; + } + + .is-size-6-mobile { + font-size: 1rem !important; + } + + .is-size-7-mobile { + font-size: 0.75rem !important; + } +} + +@media screen and (min-width: 769px), +print { + .is-size-1-tablet { + font-size: 3rem !important; + } + + .is-size-2-tablet { + font-size: 2.5rem !important; + } + + .is-size-3-tablet { + font-size: 2rem !important; + } + + .is-size-4-tablet { + font-size: 1.5rem !important; + } + + .is-size-5-tablet { + font-size: 1.25rem !important; + } + + .is-size-6-tablet { + font-size: 1rem !important; + } + + .is-size-7-tablet { + font-size: 0.75rem !important; + } +} + +@media screen and (max-width: 1055px) { + .is-size-1-touch { + font-size: 3rem !important; + } + + .is-size-2-touch { + font-size: 2.5rem !important; + } + + .is-size-3-touch { + font-size: 2rem !important; + } + + .is-size-4-touch { + font-size: 1.5rem !important; + } + + .is-size-5-touch { + font-size: 1.25rem !important; + } + + .is-size-6-touch { + font-size: 1rem !important; + } + + .is-size-7-touch { + font-size: 0.75rem !important; + } +} + +@media screen and (min-width: 1056px) { + .is-size-1-desktop { + font-size: 3rem !important; + } + + .is-size-2-desktop { + font-size: 2.5rem !important; + } + + .is-size-3-desktop { + font-size: 2rem !important; + } + + .is-size-4-desktop { + font-size: 1.5rem !important; + } + + .is-size-5-desktop { + font-size: 1.25rem !important; + } + + .is-size-6-desktop { + font-size: 1rem !important; + } + + .is-size-7-desktop { + font-size: 0.75rem !important; + } +} + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; + } + + .is-size-2-widescreen { + font-size: 2.5rem !important; + } + + .is-size-3-widescreen { + font-size: 2rem !important; + } + + .is-size-4-widescreen { + font-size: 1.5rem !important; + } + + .is-size-5-widescreen { + font-size: 1.25rem !important; + } + + .is-size-6-widescreen { + font-size: 1rem !important; + } + + .is-size-7-widescreen { + font-size: 0.75rem !important; + } +} + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; + } + + .is-size-2-fullhd { + font-size: 2.5rem !important; + } + + .is-size-3-fullhd { + font-size: 2rem !important; + } + + .is-size-4-fullhd { + font-size: 1.5rem !important; + } + + .is-size-5-fullhd { + font-size: 1.25rem !important; + } + + .is-size-6-fullhd { + font-size: 1rem !important; + } + + .is-size-7-fullhd { + font-size: 0.75rem !important; + } +} + +.has-text-centered { + text-align: center !important; +} + +.has-text-justified { + text-align: justify !important; +} + +.has-text-left { + text-align: left !important; +} + +.has-text-right { + text-align: right !important; +} + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; + } +} + +@media screen and (min-width: 769px), +print { + .has-text-centered-tablet { + text-align: center !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-centered-tablet-only { + text-align: center !important; + } +} + +@media screen and (max-width: 1055px) { + .has-text-centered-touch { + text-align: center !important; + } +} + +@media screen and (min-width: 1056px) { + .has-text-centered-desktop { + text-align: center !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; + } +} + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; + } +} + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; + } +} + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; + } +} + +@media screen and (min-width: 769px), +print { + .has-text-justified-tablet { + text-align: justify !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-justified-tablet-only { + text-align: justify !important; + } +} + +@media screen and (max-width: 1055px) { + .has-text-justified-touch { + text-align: justify !important; + } +} + +@media screen and (min-width: 1056px) { + .has-text-justified-desktop { + text-align: justify !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; + } +} + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; + } +} + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; + } +} + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; + } +} + +@media screen and (min-width: 769px), +print { + .has-text-left-tablet { + text-align: left !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-left-tablet-only { + text-align: left !important; + } +} + +@media screen and (max-width: 1055px) { + .has-text-left-touch { + text-align: left !important; + } +} + +@media screen and (min-width: 1056px) { + .has-text-left-desktop { + text-align: left !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; + } +} + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; + } +} + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; + } +} + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; + } +} + +@media screen and (min-width: 769px), +print { + .has-text-right-tablet { + text-align: right !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-right-tablet-only { + text-align: right !important; + } +} + +@media screen and (max-width: 1055px) { + .has-text-right-touch { + text-align: right !important; + } +} + +@media screen and (min-width: 1056px) { + .has-text-right-desktop { + text-align: right !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; + } +} + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; + } +} + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; + } +} + +.is-capitalized { + text-transform: capitalize !important; +} + +.is-lowercase { + text-transform: lowercase !important; +} + +.is-uppercase { + text-transform: uppercase !important; +} + +.is-italic { + font-style: italic !important; +} + +.has-text-white { + color: #fff !important; +} + +a.has-text-white:hover, +a.has-text-white:focus { + color: #e6e6e6 !important; +} + +.has-background-white { + background-color: #fff !important; +} + +.has-text-black { + color: #0a0a0a !important; +} + +a.has-text-black:hover, +a.has-text-black:focus { + color: #000 !important; +} + +.has-background-black { + background-color: #0a0a0a !important; +} + +.has-text-light { + color: #f5f5f5 !important; +} + +a.has-text-light:hover, +a.has-text-light:focus { + color: #dbdbdb !important; +} + +.has-background-light { + background-color: #f5f5f5 !important; +} + +.has-text-dark { + color: #363636 !important; +} + +a.has-text-dark:hover, +a.has-text-dark:focus { + color: #1c1c1c !important; +} + +.has-background-dark { + background-color: #363636 !important; +} + +.has-text-primary { + color: #4eb5de !important; +} + +a.has-text-primary:hover, +a.has-text-primary:focus { + color: #27a1d2 !important; +} + +.has-background-primary { + background-color: #4eb5de !important; +} + +.has-text-link { + color: #2e63b8 !important; +} + +a.has-text-link:hover, +a.has-text-link:focus { + color: #244d8f !important; +} + +.has-background-link { + background-color: #2e63b8 !important; +} + +.has-text-info { + color: #209cee !important; +} + +a.has-text-info:hover, +a.has-text-info:focus { + color: #1081cb !important; +} + +.has-background-info { + background-color: #209cee !important; +} + +.has-text-success { + color: #22c35b !important; +} + +a.has-text-success:hover, +a.has-text-success:focus { + color: #1a9847 !important; +} + +.has-background-success { + background-color: #22c35b !important; +} + +.has-text-warning { + color: #ffdd57 !important; +} + +a.has-text-warning:hover, +a.has-text-warning:focus { + color: #ffd324 !important; +} + +.has-background-warning { + background-color: #ffdd57 !important; +} + +.has-text-danger { + color: #da0b00 !important; +} + +a.has-text-danger:hover, +a.has-text-danger:focus { + color: #a70800 !important; +} + +.has-background-danger { + background-color: #da0b00 !important; +} + +.has-text-black-bis { + color: #121212 !important; +} + +.has-background-black-bis { + background-color: #121212 !important; +} + +.has-text-black-ter { + color: #242424 !important; +} + +.has-background-black-ter { + background-color: #242424 !important; +} + +.has-text-grey-darker { + color: #363636 !important; +} + +.has-background-grey-darker { + background-color: #363636 !important; +} + +.has-text-grey-dark { + color: #4a4a4a !important; +} + +.has-background-grey-dark { + background-color: #4a4a4a !important; +} + +.has-text-grey { + color: #6b6b6b !important; +} + +.has-background-grey { + background-color: #6b6b6b !important; +} + +.has-text-grey-light { + color: #b5b5b5 !important; +} + +.has-background-grey-light { + background-color: #b5b5b5 !important; +} + +.has-text-grey-lighter { + color: #dbdbdb !important; +} + +.has-background-grey-lighter { + background-color: #dbdbdb !important; +} + +.has-text-white-ter { + color: #f5f5f5 !important; +} + +.has-background-white-ter { + background-color: #f5f5f5 !important; +} + +.has-text-white-bis { + color: #fafafa !important; +} + +.has-background-white-bis { + background-color: #fafafa !important; +} + +.has-text-weight-light { + font-weight: 300 !important; +} + +.has-text-weight-normal { + font-weight: 400 !important; +} + +.has-text-weight-medium { + font-weight: 500 !important; +} + +.has-text-weight-semibold { + font-weight: 600 !important; +} + +.has-text-weight-bold { + font-weight: 700 !important; +} + +.is-family-primary { + font-family: "Lato", sans-serif !important; +} + +.is-family-secondary { + font-family: "Lato", sans-serif !important; +} + +.is-family-sans-serif { + font-family: "Lato", sans-serif !important; +} + +.is-family-monospace { + font-family: "Source Code Pro", monospace !important; +} + +.is-family-code { + font-family: "Source Code Pro", monospace !important; +} + +.is-block { + display: block !important; +} + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; + } +} + +@media screen and (min-width: 769px), +print { + .is-block-tablet { + display: block !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-block-tablet-only { + display: block !important; + } +} + +@media screen and (max-width: 1055px) { + .is-block-touch { + display: block !important; + } +} + +@media screen and (min-width: 1056px) { + .is-block-desktop { + display: block !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; + } +} + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; + } +} + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; + } +} + +.is-flex { + display: flex !important; +} + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; + } +} + +@media screen and (min-width: 769px), +print { + .is-flex-tablet { + display: flex !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-flex-tablet-only { + display: flex !important; + } +} + +@media screen and (max-width: 1055px) { + .is-flex-touch { + display: flex !important; + } +} + +@media screen and (min-width: 1056px) { + .is-flex-desktop { + display: flex !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: flex !important; + } +} + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: flex !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: flex !important; + } +} + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: flex !important; + } +} + +.is-inline { + display: inline !important; +} + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; + } +} + +@media screen and (min-width: 769px), +print { + .is-inline-tablet { + display: inline !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-tablet-only { + display: inline !important; + } +} + +@media screen and (max-width: 1055px) { + .is-inline-touch { + display: inline !important; + } +} + +@media screen and (min-width: 1056px) { + .is-inline-desktop { + display: inline !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; + } +} + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; + } +} + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; + } +} + +.is-inline-block { + display: inline-block !important; +} + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; + } +} + +@media screen and (min-width: 769px), +print { + .is-inline-block-tablet { + display: inline-block !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-block-tablet-only { + display: inline-block !important; + } +} + +@media screen and (max-width: 1055px) { + .is-inline-block-touch { + display: inline-block !important; + } +} + +@media screen and (min-width: 1056px) { + .is-inline-block-desktop { + display: inline-block !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; + } +} + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; + } +} + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; + } +} + +.is-inline-flex { + display: inline-flex !important; +} + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; + } +} + +@media screen and (min-width: 769px), +print { + .is-inline-flex-tablet { + display: inline-flex !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; + } +} + +@media screen and (max-width: 1055px) { + .is-inline-flex-touch { + display: inline-flex !important; + } +} + +@media screen and (min-width: 1056px) { + .is-inline-flex-desktop { + display: inline-flex !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; + } +} + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: inline-flex !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; + } +} + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: inline-flex !important; + } +} + +.is-hidden { + display: none !important; +} + +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; +} + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; + } +} + +@media screen and (min-width: 769px), +print { + .is-hidden-tablet { + display: none !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-hidden-tablet-only { + display: none !important; + } +} + +@media screen and (max-width: 1055px) { + .is-hidden-touch { + display: none !important; + } +} + +@media screen and (min-width: 1056px) { + .is-hidden-desktop { + display: none !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; + } +} + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; + } +} + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; + } +} + +.is-invisible { + visibility: hidden !important; +} + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; + } +} + +@media screen and (min-width: 769px), +print { + .is-invisible-tablet { + visibility: hidden !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-invisible-tablet-only { + visibility: hidden !important; + } +} + +@media screen and (max-width: 1055px) { + .is-invisible-touch { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1056px) { + .is-invisible-desktop { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; + } +} + +.is-marginless { + margin: 0 !important; +} + +.is-paddingless { + padding: 0 !important; +} + +.is-radiusless { + border-radius: 0 !important; +} + +.is-shadowless { + box-shadow: none !important; +} + +.is-relative { + position: relative !important; +} + +.box { + background-color: #fff; + border-radius: 6px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #222; + display: block; + padding: 1.25rem; +} + +a.box:hover, +a.box:focus { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #2e63b8; +} + +a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #2e63b8; +} + +.button { + background-color: #fff; + border-color: #dbdbdb; + border-width: 1px; + color: #363636; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 0.75em; + padding-right: 0.75em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; +} + +.button strong { + color: inherit; +} + +.button .icon, +.button .icon.is-small, +.button #documenter .docs-sidebar form.docs-search>input.icon, +#documenter .docs-sidebar .button form.docs-search>input.icon, +.button .icon.is-medium, +.button .icon.is-large { + height: 1.5em; + width: 1.5em; +} + +.button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; +} + +.button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); +} + +.button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); +} + +.button:hover, +.button.is-hovered { + border-color: #b5b5b5; + color: #363636; +} + +.button:focus, +.button.is-focused { + border-color: #3c5dcd; + color: #363636; +} + +.button:focus:not(:active), +.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); +} + +.button:active, +.button.is-active { + border-color: #4a4a4a; + color: #363636; +} + +.button.is-text { + background-color: transparent; + border-color: transparent; + color: #222; + text-decoration: underline; +} + +.button.is-text:hover, +.button.is-text.is-hovered, +.button.is-text:focus, +.button.is-text.is-focused { + background-color: #f5f5f5; + color: #222; +} + +.button.is-text:active, +.button.is-text.is-active { + background-color: #e8e8e8; + color: #222; +} + +.button.is-text[disabled], +fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; +} + +.button.is-white { + background-color: #fff; + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white:hover, +.button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white:focus, +.button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white:focus:not(:active), +.button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); +} + +.button.is-white:active, +.button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white[disabled], +fieldset[disabled] .button.is-white { + background-color: #fff; + border-color: transparent; + box-shadow: none; +} + +.button.is-white.is-inverted { + background-color: #0a0a0a; + color: #fff; +} + +.button.is-white.is-inverted:hover, +.button.is-white.is-inverted.is-hovered { + background-color: #000; +} + +.button.is-white.is-inverted[disabled], +fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: #fff; +} + +.button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} + +.button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-white.is-outlined:hover, +.button.is-white.is-outlined.is-hovered, +.button.is-white.is-outlined:focus, +.button.is-white.is-outlined.is-focused { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} + +.button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-white.is-outlined.is-loading:hover::after, +.button.is-white.is-outlined.is-loading.is-hovered::after, +.button.is-white.is-outlined.is-loading:focus::after, +.button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} + +.button.is-white.is-outlined[disabled], +fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} + +.button.is-white.is-inverted.is-outlined:hover, +.button.is-white.is-inverted.is-outlined.is-hovered, +.button.is-white.is-inverted.is-outlined:focus, +.button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: #fff; +} + +.button.is-white.is-inverted.is-outlined.is-loading:hover::after, +.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-white.is-inverted.is-outlined.is-loading:focus::after, +.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-white.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: #fff; +} + +.button.is-black:hover, +.button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: #fff; +} + +.button.is-black:focus, +.button.is-black.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-black:focus:not(:active), +.button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); +} + +.button.is-black:active, +.button.is-black.is-active { + background-color: #000; + border-color: transparent; + color: #fff; +} + +.button.is-black[disabled], +fieldset[disabled] .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; +} + +.button.is-black.is-inverted { + background-color: #fff; + color: #0a0a0a; +} + +.button.is-black.is-inverted:hover, +.button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; +} + +.button.is-black.is-inverted[disabled], +fieldset[disabled] .button.is-black.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} + +.button.is-black.is-outlined:hover, +.button.is-black.is-outlined.is-hovered, +.button.is-black.is-outlined:focus, +.button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} + +.button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} + +.button.is-black.is-outlined.is-loading:hover::after, +.button.is-black.is-outlined.is-loading.is-hovered::after, +.button.is-black.is-outlined.is-loading:focus::after, +.button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-black.is-outlined[disabled], +fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-black.is-inverted.is-outlined:hover, +.button.is-black.is-inverted.is-outlined.is-hovered, +.button.is-black.is-inverted.is-outlined:focus, +.button.is-black.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #0a0a0a; +} + +.button.is-black.is-inverted.is-outlined.is-loading:hover::after, +.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-black.is-inverted.is-outlined.is-loading:focus::after, +.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} + +.button.is-black.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-light { + background-color: #f5f5f5; + border-color: transparent; + color: #363636; +} + +.button.is-light:hover, +.button.is-light.is-hovered { + background-color: #eee; + border-color: transparent; + color: #363636; +} + +.button.is-light:focus, +.button.is-light.is-focused { + border-color: transparent; + color: #363636; +} + +.button.is-light:focus:not(:active), +.button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); +} + +.button.is-light:active, +.button.is-light.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; +} + +.button.is-light[disabled], +fieldset[disabled] .button.is-light { + background-color: #f5f5f5; + border-color: transparent; + box-shadow: none; +} + +.button.is-light.is-inverted { + background-color: #363636; + color: #f5f5f5; +} + +.button.is-light.is-inverted:hover, +.button.is-light.is-inverted.is-hovered { + background-color: #292929; +} + +.button.is-light.is-inverted[disabled], +fieldset[disabled] .button.is-light.is-inverted { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: #f5f5f5; +} + +.button.is-light.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; +} + +.button.is-light.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + color: #f5f5f5; +} + +.button.is-light.is-outlined:hover, +.button.is-light.is-outlined.is-hovered, +.button.is-light.is-outlined:focus, +.button.is-light.is-outlined.is-focused { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: #363636; +} + +.button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} + +.button.is-light.is-outlined.is-loading:hover::after, +.button.is-light.is-outlined.is-loading.is-hovered::after, +.button.is-light.is-outlined.is-loading:focus::after, +.button.is-light.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; +} + +.button.is-light.is-outlined[disabled], +fieldset[disabled] .button.is-light.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + box-shadow: none; + color: #f5f5f5; +} + +.button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} + +.button.is-light.is-inverted.is-outlined:hover, +.button.is-light.is-inverted.is-outlined.is-hovered, +.button.is-light.is-inverted.is-outlined:focus, +.button.is-light.is-inverted.is-outlined.is-focused { + background-color: #363636; + color: #f5f5f5; +} + +.button.is-light.is-inverted.is-outlined.is-loading:hover::after, +.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-light.is-inverted.is-outlined.is-loading:focus::after, +.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} + +.button.is-light.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} + +.button.is-dark, +.content kbd.button { + background-color: #363636; + border-color: transparent; + color: #f5f5f5; +} + +.button.is-dark:hover, +.content kbd.button:hover, +.button.is-dark.is-hovered, +.content kbd.button.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: #f5f5f5; +} + +.button.is-dark:focus, +.content kbd.button:focus, +.button.is-dark.is-focused, +.content kbd.button.is-focused { + border-color: transparent; + color: #f5f5f5; +} + +.button.is-dark:focus:not(:active), +.content kbd.button:focus:not(:active), +.button.is-dark.is-focused:not(:active), +.content kbd.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); +} + +.button.is-dark:active, +.content kbd.button:active, +.button.is-dark.is-active, +.content kbd.button.is-active { + background-color: #292929; + border-color: transparent; + color: #f5f5f5; +} + +.button.is-dark[disabled], +.content kbd.button[disabled], +fieldset[disabled] .button.is-dark, +fieldset[disabled] .content kbd.button, +.content fieldset[disabled] kbd.button { + background-color: #363636; + border-color: transparent; + box-shadow: none; +} + +.button.is-dark.is-inverted, +.content kbd.button.is-inverted { + background-color: #f5f5f5; + color: #363636; +} + +.button.is-dark.is-inverted:hover, +.content kbd.button.is-inverted:hover, +.button.is-dark.is-inverted.is-hovered, +.content kbd.button.is-inverted.is-hovered { + background-color: #e8e8e8; +} + +.button.is-dark.is-inverted[disabled], +.content kbd.button.is-inverted[disabled], +fieldset[disabled] .button.is-dark.is-inverted, +fieldset[disabled] .content kbd.button.is-inverted, +.content fieldset[disabled] kbd.button.is-inverted { + background-color: #f5f5f5; + border-color: transparent; + box-shadow: none; + color: #363636; +} + +.button.is-dark.is-loading::after, +.content kbd.button.is-loading::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} + +.button.is-dark.is-outlined, +.content kbd.button.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} + +.button.is-dark.is-outlined:hover, +.content kbd.button.is-outlined:hover, +.button.is-dark.is-outlined.is-hovered, +.content kbd.button.is-outlined.is-hovered, +.button.is-dark.is-outlined:focus, +.content kbd.button.is-outlined:focus, +.button.is-dark.is-outlined.is-focused, +.content kbd.button.is-outlined.is-focused { + background-color: #363636; + border-color: #363636; + color: #f5f5f5; +} + +.button.is-dark.is-outlined.is-loading::after, +.content kbd.button.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; +} + +.button.is-dark.is-outlined.is-loading:hover::after, +.content kbd.button.is-outlined.is-loading:hover::after, +.button.is-dark.is-outlined.is-loading.is-hovered::after, +.content kbd.button.is-outlined.is-loading.is-hovered::after, +.button.is-dark.is-outlined.is-loading:focus::after, +.content kbd.button.is-outlined.is-loading:focus::after, +.button.is-dark.is-outlined.is-loading.is-focused::after, +.content kbd.button.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #f5f5f5 #f5f5f5 !important; +} + +.button.is-dark.is-outlined[disabled], +.content kbd.button.is-outlined[disabled], +fieldset[disabled] .button.is-dark.is-outlined, +fieldset[disabled] .content kbd.button.is-outlined, +.content fieldset[disabled] kbd.button.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; +} + +.button.is-dark.is-inverted.is-outlined, +.content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + color: #f5f5f5; +} + +.button.is-dark.is-inverted.is-outlined:hover, +.content kbd.button.is-inverted.is-outlined:hover, +.button.is-dark.is-inverted.is-outlined.is-hovered, +.content kbd.button.is-inverted.is-outlined.is-hovered, +.button.is-dark.is-inverted.is-outlined:focus, +.content kbd.button.is-inverted.is-outlined:focus, +.button.is-dark.is-inverted.is-outlined.is-focused, +.content kbd.button.is-inverted.is-outlined.is-focused { + background-color: #f5f5f5; + color: #363636; +} + +.button.is-dark.is-inverted.is-outlined.is-loading:hover::after, +.content kbd.button.is-inverted.is-outlined.is-loading:hover::after, +.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, +.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-dark.is-inverted.is-outlined.is-loading:focus::after, +.content kbd.button.is-inverted.is-outlined.is-loading:focus::after, +.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, +.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; +} + +.button.is-dark.is-inverted.is-outlined[disabled], +.content kbd.button.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-dark.is-inverted.is-outlined, +fieldset[disabled] .content kbd.button.is-inverted.is-outlined, +.content fieldset[disabled] kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + box-shadow: none; + color: #f5f5f5; +} + +.button.is-primary, +.docstring>section>a.button.docs-sourcelink { + background-color: #4eb5de; + border-color: transparent; + color: #fff; +} + +.button.is-primary:hover, +.docstring>section>a.button.docs-sourcelink:hover, +.button.is-primary.is-hovered, +.docstring>section>a.button.is-hovered.docs-sourcelink { + background-color: #43b1dc; + border-color: transparent; + color: #fff; +} + +.button.is-primary:focus, +.docstring>section>a.button.docs-sourcelink:focus, +.button.is-primary.is-focused, +.docstring>section>a.button.is-focused.docs-sourcelink { + border-color: transparent; + color: #fff; +} + +.button.is-primary:focus:not(:active), +.docstring>section>a.button.docs-sourcelink:focus:not(:active), +.button.is-primary.is-focused:not(:active), +.docstring>section>a.button.is-focused.docs-sourcelink:not(:active) { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); +} + +.button.is-primary:active, +.docstring>section>a.button.docs-sourcelink:active, +.button.is-primary.is-active, +.docstring>section>a.button.is-active.docs-sourcelink { + background-color: #39acda; + border-color: transparent; + color: #fff; +} + +.button.is-primary[disabled], +.docstring>section>a.button.docs-sourcelink[disabled], +fieldset[disabled] .button.is-primary, +fieldset[disabled] .docstring>section>a.button.docs-sourcelink { + background-color: #4eb5de; + border-color: transparent; + box-shadow: none; +} + +.button.is-primary.is-inverted, +.docstring>section>a.button.is-inverted.docs-sourcelink { + background-color: #fff; + color: #4eb5de; +} + +.button.is-primary.is-inverted:hover, +.docstring>section>a.button.is-inverted.docs-sourcelink:hover, +.button.is-primary.is-inverted.is-hovered, +.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink { + background-color: #f2f2f2; +} + +.button.is-primary.is-inverted[disabled], +.docstring>section>a.button.is-inverted.docs-sourcelink[disabled], +fieldset[disabled] .button.is-primary.is-inverted, +fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #4eb5de; +} + +.button.is-primary.is-loading::after, +.docstring>section>a.button.is-loading.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-primary.is-outlined, +.docstring>section>a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #4eb5de; + color: #4eb5de; +} + +.button.is-primary.is-outlined:hover, +.docstring>section>a.button.is-outlined.docs-sourcelink:hover, +.button.is-primary.is-outlined.is-hovered, +.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink, +.button.is-primary.is-outlined:focus, +.docstring>section>a.button.is-outlined.docs-sourcelink:focus, +.button.is-primary.is-outlined.is-focused, +.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink { + background-color: #4eb5de; + border-color: #4eb5de; + color: #fff; +} + +.button.is-primary.is-outlined.is-loading::after, +.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after { + border-color: transparent transparent #4eb5de #4eb5de !important; +} + +.button.is-primary.is-outlined.is-loading:hover::after, +.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after, +.button.is-primary.is-outlined.is-loading.is-hovered::after, +.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, +.button.is-primary.is-outlined.is-loading:focus::after, +.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after, +.button.is-primary.is-outlined.is-loading.is-focused::after, +.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-primary.is-outlined[disabled], +.docstring>section>a.button.is-outlined.docs-sourcelink[disabled], +fieldset[disabled] .button.is-primary.is-outlined, +fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #4eb5de; + box-shadow: none; + color: #4eb5de; +} + +.button.is-primary.is-inverted.is-outlined, +.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-primary.is-inverted.is-outlined:hover, +.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover, +.button.is-primary.is-inverted.is-outlined.is-hovered, +.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, +.button.is-primary.is-inverted.is-outlined:focus, +.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus, +.button.is-primary.is-inverted.is-outlined.is-focused, +.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { + background-color: #fff; + color: #4eb5de; +} + +.button.is-primary.is-inverted.is-outlined.is-loading:hover::after, +.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, +.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, +.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, +.button.is-primary.is-inverted.is-outlined.is-loading:focus::after, +.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, +.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, +.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #4eb5de #4eb5de !important; +} + +.button.is-primary.is-inverted.is-outlined[disabled], +.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled], +fieldset[disabled] .button.is-primary.is-inverted.is-outlined, +fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-link { + background-color: #2e63b8; + border-color: transparent; + color: #fff; +} + +.button.is-link:hover, +.button.is-link.is-hovered { + background-color: #2b5eae; + border-color: transparent; + color: #fff; +} + +.button.is-link:focus, +.button.is-link.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-link:focus:not(:active), +.button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); +} + +.button.is-link:active, +.button.is-link.is-active { + background-color: #2958a4; + border-color: transparent; + color: #fff; +} + +.button.is-link[disabled], +fieldset[disabled] .button.is-link { + background-color: #2e63b8; + border-color: transparent; + box-shadow: none; +} + +.button.is-link.is-inverted { + background-color: #fff; + color: #2e63b8; +} + +.button.is-link.is-inverted:hover, +.button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; +} + +.button.is-link.is-inverted[disabled], +fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #2e63b8; +} + +.button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-link.is-outlined { + background-color: transparent; + border-color: #2e63b8; + color: #2e63b8; +} + +.button.is-link.is-outlined:hover, +.button.is-link.is-outlined.is-hovered, +.button.is-link.is-outlined:focus, +.button.is-link.is-outlined.is-focused { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; +} + +.button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #2e63b8 #2e63b8 !important; +} + +.button.is-link.is-outlined.is-loading:hover::after, +.button.is-link.is-outlined.is-loading.is-hovered::after, +.button.is-link.is-outlined.is-loading:focus::after, +.button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-link.is-outlined[disabled], +fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #2e63b8; + box-shadow: none; + color: #2e63b8; +} + +.button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-link.is-inverted.is-outlined:hover, +.button.is-link.is-inverted.is-outlined.is-hovered, +.button.is-link.is-inverted.is-outlined:focus, +.button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #2e63b8; +} + +.button.is-link.is-inverted.is-outlined.is-loading:hover::after, +.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-link.is-inverted.is-outlined.is-loading:focus::after, +.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #2e63b8 #2e63b8 !important; +} + +.button.is-link.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-info { + background-color: #209cee; + border-color: transparent; + color: #fff; +} + +.button.is-info:hover, +.button.is-info.is-hovered { + background-color: #1497ed; + border-color: transparent; + color: #fff; +} + +.button.is-info:focus, +.button.is-info.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-info:focus:not(:active), +.button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); +} + +.button.is-info:active, +.button.is-info.is-active { + background-color: #1190e3; + border-color: transparent; + color: #fff; +} + +.button.is-info[disabled], +fieldset[disabled] .button.is-info { + background-color: #209cee; + border-color: transparent; + box-shadow: none; +} + +.button.is-info.is-inverted { + background-color: #fff; + color: #209cee; +} + +.button.is-info.is-inverted:hover, +.button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; +} + +.button.is-info.is-inverted[disabled], +fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #209cee; +} + +.button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + color: #209cee; +} + +.button.is-info.is-outlined:hover, +.button.is-info.is-outlined.is-hovered, +.button.is-info.is-outlined:focus, +.button.is-info.is-outlined.is-focused { + background-color: #209cee; + border-color: #209cee; + color: #fff; +} + +.button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #209cee #209cee !important; +} + +.button.is-info.is-outlined.is-loading:hover::after, +.button.is-info.is-outlined.is-loading.is-hovered::after, +.button.is-info.is-outlined.is-loading:focus::after, +.button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-info.is-outlined[disabled], +fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + box-shadow: none; + color: #209cee; +} + +.button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-info.is-inverted.is-outlined:hover, +.button.is-info.is-inverted.is-outlined.is-hovered, +.button.is-info.is-inverted.is-outlined:focus, +.button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #209cee; +} + +.button.is-info.is-inverted.is-outlined.is-loading:hover::after, +.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-info.is-inverted.is-outlined.is-loading:focus::after, +.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #209cee #209cee !important; +} + +.button.is-info.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-success { + background-color: #22c35b; + border-color: transparent; + color: #fff; +} + +.button.is-success:hover, +.button.is-success.is-hovered { + background-color: #20b856; + border-color: transparent; + color: #fff; +} + +.button.is-success:focus, +.button.is-success.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-success:focus:not(:active), +.button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); +} + +.button.is-success:active, +.button.is-success.is-active { + background-color: #1ead51; + border-color: transparent; + color: #fff; +} + +.button.is-success[disabled], +fieldset[disabled] .button.is-success { + background-color: #22c35b; + border-color: transparent; + box-shadow: none; +} + +.button.is-success.is-inverted { + background-color: #fff; + color: #22c35b; +} + +.button.is-success.is-inverted:hover, +.button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; +} + +.button.is-success.is-inverted[disabled], +fieldset[disabled] .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #22c35b; +} + +.button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-success.is-outlined { + background-color: transparent; + border-color: #22c35b; + color: #22c35b; +} + +.button.is-success.is-outlined:hover, +.button.is-success.is-outlined.is-hovered, +.button.is-success.is-outlined:focus, +.button.is-success.is-outlined.is-focused { + background-color: #22c35b; + border-color: #22c35b; + color: #fff; +} + +.button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #22c35b #22c35b !important; +} + +.button.is-success.is-outlined.is-loading:hover::after, +.button.is-success.is-outlined.is-loading.is-hovered::after, +.button.is-success.is-outlined.is-loading:focus::after, +.button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-success.is-outlined[disabled], +fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #22c35b; + box-shadow: none; + color: #22c35b; +} + +.button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-success.is-inverted.is-outlined:hover, +.button.is-success.is-inverted.is-outlined.is-hovered, +.button.is-success.is-inverted.is-outlined:focus, +.button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #22c35b; +} + +.button.is-success.is-inverted.is-outlined.is-loading:hover::after, +.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-success.is-inverted.is-outlined.is-loading:focus::after, +.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #22c35b #22c35b !important; +} + +.button.is-success.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-warning { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:hover, +.button.is-warning.is-hovered { + background-color: #ffda4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:focus, +.button.is-warning.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:focus:not(:active), +.button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); +} + +.button.is-warning:active, +.button.is-warning.is-active { + background-color: #ffd83e; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning[disabled], +fieldset[disabled] .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + box-shadow: none; +} + +.button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.button.is-warning.is-inverted:hover, +.button.is-warning.is-inverted.is-hovered { + background-color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-inverted[disabled], +fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #ffdd57; +} + +.button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; +} + +.button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + color: #ffdd57; +} + +.button.is-warning.is-outlined:hover, +.button.is-warning.is-outlined.is-hovered, +.button.is-warning.is-outlined:focus, +.button.is-warning.is-outlined.is-focused { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; +} + +.button.is-warning.is-outlined.is-loading:hover::after, +.button.is-warning.is-outlined.is-loading.is-hovered::after, +.button.is-warning.is-outlined.is-loading:focus::after, +.button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; +} + +.button.is-warning.is-outlined[disabled], +fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + box-shadow: none; + color: #ffdd57; +} + +.button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-inverted.is-outlined:hover, +.button.is-warning.is-inverted.is-outlined.is-hovered, +.button.is-warning.is-inverted.is-outlined:focus, +.button.is-warning.is-inverted.is-outlined.is-focused { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.button.is-warning.is-inverted.is-outlined.is-loading:hover::after, +.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-warning.is-inverted.is-outlined.is-loading:focus::after, +.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; +} + +.button.is-warning.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-danger { + background-color: #da0b00; + border-color: transparent; + color: #fff; +} + +.button.is-danger:hover, +.button.is-danger.is-hovered { + background-color: #cd0a00; + border-color: transparent; + color: #fff; +} + +.button.is-danger:focus, +.button.is-danger.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-danger:focus:not(:active), +.button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); +} + +.button.is-danger:active, +.button.is-danger.is-active { + background-color: #c10a00; + border-color: transparent; + color: #fff; +} + +.button.is-danger[disabled], +fieldset[disabled] .button.is-danger { + background-color: #da0b00; + border-color: transparent; + box-shadow: none; +} + +.button.is-danger.is-inverted { + background-color: #fff; + color: #da0b00; +} + +.button.is-danger.is-inverted:hover, +.button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; +} + +.button.is-danger.is-inverted[disabled], +fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #da0b00; +} + +.button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-danger.is-outlined { + background-color: transparent; + border-color: #da0b00; + color: #da0b00; +} + +.button.is-danger.is-outlined:hover, +.button.is-danger.is-outlined.is-hovered, +.button.is-danger.is-outlined:focus, +.button.is-danger.is-outlined.is-focused { + background-color: #da0b00; + border-color: #da0b00; + color: #fff; +} + +.button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #da0b00 #da0b00 !important; +} + +.button.is-danger.is-outlined.is-loading:hover::after, +.button.is-danger.is-outlined.is-loading.is-hovered::after, +.button.is-danger.is-outlined.is-loading:focus::after, +.button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-danger.is-outlined[disabled], +fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #da0b00; + box-shadow: none; + color: #da0b00; +} + +.button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-danger.is-inverted.is-outlined:hover, +.button.is-danger.is-inverted.is-outlined.is-hovered, +.button.is-danger.is-inverted.is-outlined:focus, +.button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #da0b00; +} + +.button.is-danger.is-inverted.is-outlined.is-loading:hover::after, +.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, +.button.is-danger.is-inverted.is-outlined.is-loading:focus::after, +.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #da0b00 #da0b00 !important; +} + +.button.is-danger.is-inverted.is-outlined[disabled], +fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; +} + +.button.is-small, +#documenter .docs-sidebar form.docs-search>input.button { + border-radius: 2px; + font-size: 0.75rem; +} + +.button.is-normal { + font-size: 1rem; +} + +.button.is-medium { + font-size: 1.25rem; +} + +.button.is-large { + font-size: 1.5rem; +} + +.button[disabled], +fieldset[disabled] .button { + background-color: #fff; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; +} + +.button.is-fullwidth { + display: flex; + width: 100%; +} + +.button.is-loading { + color: transparent !important; + pointer-events: none; +} + +.button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; +} + +.button.is-static { + background-color: #f5f5f5; + border-color: #dbdbdb; + color: #6b6b6b; + box-shadow: none; + pointer-events: none; +} + +.button.is-rounded, +#documenter .docs-sidebar form.docs-search>input.button { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; +} + +.buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} + +.buttons .button { + margin-bottom: 0.5rem; +} + +.buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; +} + +.buttons:last-child { + margin-bottom: -0.5rem; +} + +.buttons:not(:last-child) { + margin-bottom: 1rem; +} + +.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 2px; + font-size: 0.75rem; +} + +.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; +} + +.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; +} + +.buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; +} + +.buttons.has-addons .button:last-child { + margin-right: 0; +} + +.buttons.has-addons .button:hover, +.buttons.has-addons .button.is-hovered { + z-index: 2; +} + +.buttons.has-addons .button:focus, +.buttons.has-addons .button.is-focused, +.buttons.has-addons .button:active, +.buttons.has-addons .button.is-active, +.buttons.has-addons .button.is-selected { + z-index: 3; +} + +.buttons.has-addons .button:focus:hover, +.buttons.has-addons .button.is-focused:hover, +.buttons.has-addons .button:active:hover, +.buttons.has-addons .button.is-active:hover, +.buttons.has-addons .button.is-selected:hover { + z-index: 4; +} + +.buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} + +.buttons.is-centered { + justify-content: center; +} + +.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.buttons.is-right { + justify-content: flex-end; +} + +.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; +} + +@media screen and (min-width: 1056px) { + .container { + max-width: 992px; + } + + .container.is-fluid { + margin-left: 32px; + margin-right: 32px; + max-width: none; + } +} + +@media screen and (max-width: 1215px) { + .container.is-widescreen { + max-width: 1152px; + } +} + +@media screen and (max-width: 1407px) { + .container.is-fullhd { + max-width: 1344px; + } +} + +@media screen and (min-width: 1216px) { + .container { + max-width: 1152px; + } +} + +@media screen and (min-width: 1408px) { + .container { + max-width: 1344px; + } +} + +.content li+li { + margin-top: 0.25em; +} + +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; +} + +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #222; + font-weight: 600; + line-height: 1.125; +} + +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; +} + +.content h1:not(:first-child) { + margin-top: 1em; +} + +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; +} + +.content h2:not(:first-child) { + margin-top: 1.1428em; +} + +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; +} + +.content h3:not(:first-child) { + margin-top: 1.3333em; +} + +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; +} + +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; +} + +.content h6 { + font-size: 1em; + margin-bottom: 1em; +} + +.content blockquote { + background-color: #f5f5f5; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; +} + +.content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; +} + +.content ol:not([type]) { + list-style-type: decimal; +} + +.content ol.is-lower-alpha:not([type]) { + list-style-type: lower-alpha; +} + +.content ol.is-lower-roman:not([type]) { + list-style-type: lower-roman; +} + +.content ol.is-upper-alpha:not([type]) { + list-style-type: upper-alpha; +} + +.content ol.is-upper-roman:not([type]) { + list-style-type: upper-roman; +} + +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; +} + +.content ul ul { + list-style-type: circle; + margin-top: 0.5em; +} + +.content ul ul ul { + list-style-type: square; +} + +.content dd { + margin-left: 2em; +} + +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; +} + +.content figure:not(:first-child) { + margin-top: 2em; +} + +.content figure:not(:last-child) { + margin-bottom: 2em; +} + +.content figure img { + display: inline-block; +} + +.content figure figcaption { + font-style: italic; +} + +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 0; + white-space: pre; + word-wrap: normal; +} + +.content sup, +.content sub { + font-size: 75%; +} + +.content table { + width: 100%; +} + +.content table td, +.content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} + +.content table th { + color: #222; +} + +.content table th:not([align]) { + text-align: left; +} + +.content table thead td, +.content table thead th { + border-width: 0 0 2px; + color: #222; +} + +.content table tfoot td, +.content table tfoot th { + border-width: 2px 0 0; + color: #222; +} + +.content table tbody tr:last-child td, +.content table tbody tr:last-child th { + border-bottom-width: 0; +} + +.content .tabs li+li { + margin-top: 0; +} + +.content.is-small, +#documenter .docs-sidebar form.docs-search>input.content { + font-size: 0.75rem; +} + +.content.is-medium { + font-size: 1.25rem; +} + +.content.is-large { + font-size: 1.5rem; +} + +.icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; +} + +.icon.is-small, +#documenter .docs-sidebar form.docs-search>input.icon { + height: 1rem; + width: 1rem; +} + +.icon.is-medium { + height: 2rem; + width: 2rem; +} + +.icon.is-large { + height: 3rem; + width: 3rem; +} + +.image, +#documenter .docs-sidebar .docs-logo>img { + display: block; + position: relative; +} + +.image img, +#documenter .docs-sidebar .docs-logo>img img { + display: block; + height: auto; + width: 100%; +} + +.image img.is-rounded, +#documenter .docs-sidebar .docs-logo>img img.is-rounded { + border-radius: 290486px; +} + +.image.is-square img, +#documenter .docs-sidebar .docs-logo>img.is-square img, +.image.is-square .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio, +.image.is-1by1 img, +#documenter .docs-sidebar .docs-logo>img.is-1by1 img, +.image.is-1by1 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio, +.image.is-5by4 img, +#documenter .docs-sidebar .docs-logo>img.is-5by4 img, +.image.is-5by4 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio, +.image.is-4by3 img, +#documenter .docs-sidebar .docs-logo>img.is-4by3 img, +.image.is-4by3 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio, +.image.is-3by2 img, +#documenter .docs-sidebar .docs-logo>img.is-3by2 img, +.image.is-3by2 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio, +.image.is-5by3 img, +#documenter .docs-sidebar .docs-logo>img.is-5by3 img, +.image.is-5by3 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio, +.image.is-16by9 img, +#documenter .docs-sidebar .docs-logo>img.is-16by9 img, +.image.is-16by9 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio, +.image.is-2by1 img, +#documenter .docs-sidebar .docs-logo>img.is-2by1 img, +.image.is-2by1 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio, +.image.is-3by1 img, +#documenter .docs-sidebar .docs-logo>img.is-3by1 img, +.image.is-3by1 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio, +.image.is-4by5 img, +#documenter .docs-sidebar .docs-logo>img.is-4by5 img, +.image.is-4by5 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio, +.image.is-3by4 img, +#documenter .docs-sidebar .docs-logo>img.is-3by4 img, +.image.is-3by4 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio, +.image.is-2by3 img, +#documenter .docs-sidebar .docs-logo>img.is-2by3 img, +.image.is-2by3 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio, +.image.is-3by5 img, +#documenter .docs-sidebar .docs-logo>img.is-3by5 img, +.image.is-3by5 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio, +.image.is-9by16 img, +#documenter .docs-sidebar .docs-logo>img.is-9by16 img, +.image.is-9by16 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio, +.image.is-1by2 img, +#documenter .docs-sidebar .docs-logo>img.is-1by2 img, +.image.is-1by2 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio, +.image.is-1by3 img, +#documenter .docs-sidebar .docs-logo>img.is-1by3 img, +.image.is-1by3 .has-ratio, +#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio { + height: 100%; + width: 100%; +} + +.image.is-square, +#documenter .docs-sidebar .docs-logo>img.is-square, +.image.is-1by1, +#documenter .docs-sidebar .docs-logo>img.is-1by1 { + padding-top: 100%; +} + +.image.is-5by4, +#documenter .docs-sidebar .docs-logo>img.is-5by4 { + padding-top: 80%; +} + +.image.is-4by3, +#documenter .docs-sidebar .docs-logo>img.is-4by3 { + padding-top: 75%; +} + +.image.is-3by2, +#documenter .docs-sidebar .docs-logo>img.is-3by2 { + padding-top: 66.6666%; +} + +.image.is-5by3, +#documenter .docs-sidebar .docs-logo>img.is-5by3 { + padding-top: 60%; +} + +.image.is-16by9, +#documenter .docs-sidebar .docs-logo>img.is-16by9 { + padding-top: 56.25%; +} + +.image.is-2by1, +#documenter .docs-sidebar .docs-logo>img.is-2by1 { + padding-top: 50%; +} + +.image.is-3by1, +#documenter .docs-sidebar .docs-logo>img.is-3by1 { + padding-top: 33.3333%; +} + +.image.is-4by5, +#documenter .docs-sidebar .docs-logo>img.is-4by5 { + padding-top: 125%; +} + +.image.is-3by4, +#documenter .docs-sidebar .docs-logo>img.is-3by4 { + padding-top: 133.3333%; +} + +.image.is-2by3, +#documenter .docs-sidebar .docs-logo>img.is-2by3 { + padding-top: 150%; +} + +.image.is-3by5, +#documenter .docs-sidebar .docs-logo>img.is-3by5 { + padding-top: 166.6666%; +} + +.image.is-9by16, +#documenter .docs-sidebar .docs-logo>img.is-9by16 { + padding-top: 177.7777%; +} + +.image.is-1by2, +#documenter .docs-sidebar .docs-logo>img.is-1by2 { + padding-top: 200%; +} + +.image.is-1by3, +#documenter .docs-sidebar .docs-logo>img.is-1by3 { + padding-top: 300%; +} + +.image.is-16x16, +#documenter .docs-sidebar .docs-logo>img.is-16x16 { + height: 16px; + width: 16px; +} + +.image.is-24x24, +#documenter .docs-sidebar .docs-logo>img.is-24x24 { + height: 24px; + width: 24px; +} + +.image.is-32x32, +#documenter .docs-sidebar .docs-logo>img.is-32x32 { + height: 32px; + width: 32px; +} + +.image.is-48x48, +#documenter .docs-sidebar .docs-logo>img.is-48x48 { + height: 48px; + width: 48px; +} + +.image.is-64x64, +#documenter .docs-sidebar .docs-logo>img.is-64x64 { + height: 64px; + width: 64px; +} + +.image.is-96x96, +#documenter .docs-sidebar .docs-logo>img.is-96x96 { + height: 96px; + width: 96px; +} + +.image.is-128x128, +#documenter .docs-sidebar .docs-logo>img.is-128x128 { + height: 128px; + width: 128px; +} + +.notification { + background-color: #f5f5f5; + border-radius: 4px; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; +} + +.notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; +} + +.notification strong { + color: currentColor; +} + +.notification code, +.notification pre { + background: #fff; +} + +.notification pre code { + background: transparent; +} + +.notification>.delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; +} + +.notification .title, +.notification .subtitle, +.notification .content { + color: currentColor; +} + +.notification.is-white { + background-color: #fff; + color: #0a0a0a; +} + +.notification.is-black { + background-color: #0a0a0a; + color: #fff; +} + +.notification.is-light { + background-color: #f5f5f5; + color: #363636; +} + +.notification.is-dark, +.content kbd.notification { + background-color: #363636; + color: #f5f5f5; +} + +.notification.is-primary, +.docstring>section>a.notification.docs-sourcelink { + background-color: #4eb5de; + color: #fff; +} + +.notification.is-link { + background-color: #2e63b8; + color: #fff; +} + +.notification.is-info { + background-color: #209cee; + color: #fff; +} + +.notification.is-success { + background-color: #22c35b; + color: #fff; +} + +.notification.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.notification.is-danger { + background-color: #da0b00; + color: #fff; +} + +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; +} + +.progress::-webkit-progress-bar { + background-color: #dbdbdb; +} + +.progress::-webkit-progress-value { + background-color: #222; +} + +.progress::-moz-progress-bar { + background-color: #222; +} + +.progress::-ms-fill { + background-color: #222; + border: none; +} + +.progress.is-white::-webkit-progress-value { + background-color: #fff; +} + +.progress.is-white::-moz-progress-bar { + background-color: #fff; +} + +.progress.is-white::-ms-fill { + background-color: #fff; +} + +.progress.is-white:indeterminate { + background-image: linear-gradient(to right, #fff 30%, #dbdbdb 30%); +} + +.progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; +} + +.progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; +} + +.progress.is-black::-ms-fill { + background-color: #0a0a0a; +} + +.progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%); +} + +.progress.is-light::-webkit-progress-value { + background-color: #f5f5f5; +} + +.progress.is-light::-moz-progress-bar { + background-color: #f5f5f5; +} + +.progress.is-light::-ms-fill { + background-color: #f5f5f5; +} + +.progress.is-light:indeterminate { + background-image: linear-gradient(to right, #f5f5f5 30%, #dbdbdb 30%); +} + +.progress.is-dark::-webkit-progress-value, +.content kbd.progress::-webkit-progress-value { + background-color: #363636; +} + +.progress.is-dark::-moz-progress-bar, +.content kbd.progress::-moz-progress-bar { + background-color: #363636; +} + +.progress.is-dark::-ms-fill, +.content kbd.progress::-ms-fill { + background-color: #363636; +} + +.progress.is-dark:indeterminate, +.content kbd.progress:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #dbdbdb 30%); +} + +.progress.is-primary::-webkit-progress-value, +.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value { + background-color: #4eb5de; +} + +.progress.is-primary::-moz-progress-bar, +.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar { + background-color: #4eb5de; +} + +.progress.is-primary::-ms-fill, +.docstring>section>a.progress.docs-sourcelink::-ms-fill { + background-color: #4eb5de; +} + +.progress.is-primary:indeterminate, +.docstring>section>a.progress.docs-sourcelink:indeterminate { + background-image: linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%); +} + +.progress.is-link::-webkit-progress-value { + background-color: #2e63b8; +} + +.progress.is-link::-moz-progress-bar { + background-color: #2e63b8; +} + +.progress.is-link::-ms-fill { + background-color: #2e63b8; +} + +.progress.is-link:indeterminate { + background-image: linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%); +} + +.progress.is-info::-webkit-progress-value { + background-color: #209cee; +} + +.progress.is-info::-moz-progress-bar { + background-color: #209cee; +} + +.progress.is-info::-ms-fill { + background-color: #209cee; +} + +.progress.is-info:indeterminate { + background-image: linear-gradient(to right, #209cee 30%, #dbdbdb 30%); +} + +.progress.is-success::-webkit-progress-value { + background-color: #22c35b; +} + +.progress.is-success::-moz-progress-bar { + background-color: #22c35b; +} + +.progress.is-success::-ms-fill { + background-color: #22c35b; +} + +.progress.is-success:indeterminate { + background-image: linear-gradient(to right, #22c35b 30%, #dbdbdb 30%); +} + +.progress.is-warning::-webkit-progress-value { + background-color: #ffdd57; +} + +.progress.is-warning::-moz-progress-bar { + background-color: #ffdd57; +} + +.progress.is-warning::-ms-fill { + background-color: #ffdd57; +} + +.progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%); +} + +.progress.is-danger::-webkit-progress-value { + background-color: #da0b00; +} + +.progress.is-danger::-moz-progress-bar { + background-color: #da0b00; +} + +.progress.is-danger::-ms-fill { + background-color: #da0b00; +} + +.progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #da0b00 30%, #dbdbdb 30%); +} + +.progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #dbdbdb; + background-image: linear-gradient(to right, #222 30%, #dbdbdb 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; +} + +.progress:indeterminate::-webkit-progress-bar { + background-color: transparent; +} + +.progress:indeterminate::-moz-progress-bar { + background-color: transparent; +} + +.progress.is-small, +#documenter .docs-sidebar form.docs-search>input.progress { + height: 0.75rem; +} + +.progress.is-medium { + height: 1.25rem; +} + +.progress.is-large { + height: 1.5rem; +} + +@keyframes moveIndeterminate { + from { + background-position: 200% 0; + } + + to { + background-position: -200% 0; + } +} + +.table { + background-color: #fff; + color: #363636; +} + +.table td, +.table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} + +.table td.is-white, +.table th.is-white { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} + +.table td.is-black, +.table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} + +.table td.is-light, +.table th.is-light { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: #363636; +} + +.table td.is-dark, +.table th.is-dark { + background-color: #363636; + border-color: #363636; + color: #f5f5f5; +} + +.table td.is-primary, +.table th.is-primary { + background-color: #4eb5de; + border-color: #4eb5de; + color: #fff; +} + +.table td.is-link, +.table th.is-link { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; +} + +.table td.is-info, +.table th.is-info { + background-color: #209cee; + border-color: #209cee; + color: #fff; +} + +.table td.is-success, +.table th.is-success { + background-color: #22c35b; + border-color: #22c35b; + color: #fff; +} + +.table td.is-warning, +.table th.is-warning { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.table td.is-danger, +.table th.is-danger { + background-color: #da0b00; + border-color: #da0b00; + color: #fff; +} + +.table td.is-narrow, +.table th.is-narrow { + white-space: nowrap; + width: 1%; +} + +.table td.is-selected, +.table th.is-selected { + background-color: #4eb5de; + color: #fff; +} + +.table td.is-selected a, +.table td.is-selected strong, +.table th.is-selected a, +.table th.is-selected strong { + color: currentColor; +} + +.table th { + color: #222; +} + +.table th:not([align]) { + text-align: left; +} + +.table tr.is-selected { + background-color: #4eb5de; + color: #fff; +} + +.table tr.is-selected a, +.table tr.is-selected strong { + color: currentColor; +} + +.table tr.is-selected td, +.table tr.is-selected th { + border-color: #fff; + color: currentColor; +} + +.table thead { + background-color: rgba(0, 0, 0, 0); +} + +.table thead td, +.table thead th { + border-width: 0 0 2px; + color: #222; +} + +.table tfoot { + background-color: rgba(0, 0, 0, 0); +} + +.table tfoot td, +.table tfoot th { + border-width: 2px 0 0; + color: #222; +} + +.table tbody { + background-color: rgba(0, 0, 0, 0); +} + +.table tbody tr:last-child td, +.table tbody tr:last-child th { + border-bottom-width: 0; +} + +.table.is-bordered td, +.table.is-bordered th { + border-width: 1px; +} + +.table.is-bordered tr:last-child td, +.table.is-bordered tr:last-child th { + border-bottom-width: 1px; +} + +.table.is-fullwidth { + width: 100%; +} + +.table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #fafafa; +} + +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #fafafa; +} + +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: #f5f5f5; +} + +.table.is-narrow td, +.table.is-narrow th { + padding: 0.25em 0.5em; +} + +.table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #fafafa; +} + +.table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; +} + +.tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} + +.tags .tag, +.tags .content kbd, +.content .tags kbd, +.tags .docstring>section>a.docs-sourcelink { + margin-bottom: 0.5rem; +} + +.tags .tag:not(:last-child), +.tags .content kbd:not(:last-child), +.content .tags kbd:not(:last-child), +.tags .docstring>section>a.docs-sourcelink:not(:last-child) { + margin-right: 0.5rem; +} + +.tags:last-child { + margin-bottom: -0.5rem; +} + +.tags:not(:last-child) { + margin-bottom: 1rem; +} + +.tags.are-medium .tag:not(.is-normal):not(.is-large), +.tags.are-medium .content kbd:not(.is-normal):not(.is-large), +.content .tags.are-medium kbd:not(.is-normal):not(.is-large), +.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large) { + font-size: 1rem; +} + +.tags.are-large .tag:not(.is-normal):not(.is-medium), +.tags.are-large .content kbd:not(.is-normal):not(.is-medium), +.content .tags.are-large kbd:not(.is-normal):not(.is-medium), +.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; +} + +.tags.is-centered { + justify-content: center; +} + +.tags.is-centered .tag, +.tags.is-centered .content kbd, +.content .tags.is-centered kbd, +.tags.is-centered .docstring>section>a.docs-sourcelink { + margin-right: 0.25rem; + margin-left: 0.25rem; +} + +.tags.is-right { + justify-content: flex-end; +} + +.tags.is-right .tag:not(:first-child), +.tags.is-right .content kbd:not(:first-child), +.content .tags.is-right kbd:not(:first-child), +.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child) { + margin-left: 0.5rem; +} + +.tags.is-right .tag:not(:last-child), +.tags.is-right .content kbd:not(:last-child), +.content .tags.is-right kbd:not(:last-child), +.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child) { + margin-right: 0; +} + +.tags.has-addons .tag, +.tags.has-addons .content kbd, +.content .tags.has-addons kbd, +.tags.has-addons .docstring>section>a.docs-sourcelink { + margin-right: 0; +} + +.tags.has-addons .tag:not(:first-child), +.tags.has-addons .content kbd:not(:first-child), +.content .tags.has-addons kbd:not(:first-child), +.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.tags.has-addons .tag:not(:last-child), +.tags.has-addons .content kbd:not(:last-child), +.content .tags.has-addons kbd:not(:last-child), +.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.tag:not(body), +.content kbd:not(body), +.docstring>section>a.docs-sourcelink:not(body) { + align-items: center; + background-color: #f5f5f5; + border-radius: 4px; + color: #222; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} + +.tag:not(body) .delete, +.content kbd:not(body) .delete, +.docstring>section>a.docs-sourcelink:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; +} + +.tag.is-white:not(body), +.content kbd.is-white:not(body), +.docstring>section>a.docs-sourcelink.is-white:not(body) { + background-color: #fff; + color: #0a0a0a; +} + +.tag.is-black:not(body), +.content kbd.is-black:not(body), +.docstring>section>a.docs-sourcelink.is-black:not(body) { + background-color: #0a0a0a; + color: #fff; +} + +.tag.is-light:not(body), +.content kbd.is-light:not(body), +.docstring>section>a.docs-sourcelink.is-light:not(body) { + background-color: #f5f5f5; + color: #363636; +} + +.tag.is-dark:not(body), +.content kbd:not(body), +.docstring>section>a.docs-sourcelink.is-dark:not(body), +.content .docstring>section>kbd:not(body) { + background-color: #363636; + color: #f5f5f5; +} + +.tag.is-primary:not(body), +.content kbd.is-primary:not(body), +.docstring>section>a.docs-sourcelink:not(body) { + background-color: #4eb5de; + color: #fff; +} + +.tag.is-link:not(body), +.content kbd.is-link:not(body), +.docstring>section>a.docs-sourcelink.is-link:not(body) { + background-color: #2e63b8; + color: #fff; +} + +.tag.is-info:not(body), +.content kbd.is-info:not(body), +.docstring>section>a.docs-sourcelink.is-info:not(body) { + background-color: #209cee; + color: #fff; +} + +.tag.is-success:not(body), +.content kbd.is-success:not(body), +.docstring>section>a.docs-sourcelink.is-success:not(body) { + background-color: #22c35b; + color: #fff; +} + +.tag.is-warning:not(body), +.content kbd.is-warning:not(body), +.docstring>section>a.docs-sourcelink.is-warning:not(body) { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.tag.is-danger:not(body), +.content kbd.is-danger:not(body), +.docstring>section>a.docs-sourcelink.is-danger:not(body) { + background-color: #da0b00; + color: #fff; +} + +.tag.is-normal:not(body), +.content kbd.is-normal:not(body), +.docstring>section>a.docs-sourcelink.is-normal:not(body) { + font-size: 0.75rem; +} + +.tag.is-medium:not(body), +.content kbd.is-medium:not(body), +.docstring>section>a.docs-sourcelink.is-medium:not(body) { + font-size: 1rem; +} + +.tag.is-large:not(body), +.content kbd.is-large:not(body), +.docstring>section>a.docs-sourcelink.is-large:not(body) { + font-size: 1.25rem; +} + +.tag:not(body) .icon:first-child:not(:last-child), +.content kbd:not(body) .icon:first-child:not(:last-child), +.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; +} + +.tag:not(body) .icon:last-child:not(:first-child), +.content kbd:not(body) .icon:last-child:not(:first-child), +.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; +} + +.tag:not(body) .icon:first-child:last-child, +.content kbd:not(body) .icon:first-child:last-child, +.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; +} + +.tag.is-delete:not(body), +.content kbd.is-delete:not(body), +.docstring>section>a.docs-sourcelink.is-delete:not(body) { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; +} + +.tag.is-delete:not(body)::before, +.content kbd.is-delete:not(body)::before, +.docstring>section>a.docs-sourcelink.is-delete:not(body)::before, +.tag.is-delete:not(body)::after, +.content kbd.is-delete:not(body)::after, +.docstring>section>a.docs-sourcelink.is-delete:not(body)::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; +} + +.tag.is-delete:not(body)::before, +.content kbd.is-delete:not(body)::before, +.docstring>section>a.docs-sourcelink.is-delete:not(body)::before { + height: 1px; + width: 50%; +} + +.tag.is-delete:not(body)::after, +.content kbd.is-delete:not(body)::after, +.docstring>section>a.docs-sourcelink.is-delete:not(body)::after { + height: 50%; + width: 1px; +} + +.tag.is-delete:not(body):hover, +.content kbd.is-delete:not(body):hover, +.docstring>section>a.docs-sourcelink.is-delete:not(body):hover, +.tag.is-delete:not(body):focus, +.content kbd.is-delete:not(body):focus, +.docstring>section>a.docs-sourcelink.is-delete:not(body):focus { + background-color: #e8e8e8; +} + +.tag.is-delete:not(body):active, +.content kbd.is-delete:not(body):active, +.docstring>section>a.docs-sourcelink.is-delete:not(body):active { + background-color: #dbdbdb; +} + +.tag.is-rounded:not(body), +#documenter .docs-sidebar form.docs-search>input:not(body), +.content kbd.is-rounded:not(body), +#documenter .docs-sidebar .content form.docs-search>input:not(body), +.docstring>section>a.docs-sourcelink.is-rounded:not(body) { + border-radius: 290486px; +} + +a.tag:hover, +.docstring>section>a.docs-sourcelink:hover { + text-decoration: underline; +} + +.title, +.subtitle { + word-break: break-word; +} + +.title em, +.title span, +.subtitle em, +.subtitle span { + font-weight: inherit; +} + +.title sub, +.subtitle sub { + font-size: 0.75em; +} + +.title sup, +.subtitle sup { + font-size: 0.75em; +} + +.title .tag, +.title .content kbd, +.content .title kbd, +.title .docstring>section>a.docs-sourcelink, +.subtitle .tag, +.subtitle .content kbd, +.content .subtitle kbd, +.subtitle .docstring>section>a.docs-sourcelink { + vertical-align: middle; +} + +.title { + color: #363636; + font-size: 2rem; + font-weight: 600; + line-height: 1.125; +} + +.title strong { + color: inherit; + font-weight: inherit; +} + +.title+.highlight { + margin-top: -0.75rem; +} + +.title:not(.is-spaced)+.subtitle { + margin-top: -1.25rem; +} + +.title.is-1 { + font-size: 3rem; +} + +.title.is-2 { + font-size: 2.5rem; +} + +.title.is-3 { + font-size: 2rem; +} + +.title.is-4 { + font-size: 1.5rem; +} + +.title.is-5 { + font-size: 1.25rem; +} + +.title.is-6 { + font-size: 1rem; +} + +.title.is-7 { + font-size: 0.75rem; +} + +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; +} + +.subtitle strong { + color: #363636; + font-weight: 600; +} + +.subtitle:not(.is-spaced)+.title { + margin-top: -1.25rem; +} + +.subtitle.is-1 { + font-size: 3rem; +} + +.subtitle.is-2 { + font-size: 2.5rem; +} + +.subtitle.is-3 { + font-size: 2rem; +} + +.subtitle.is-4 { + font-size: 1.5rem; +} + +.subtitle.is-5 { + font-size: 1.25rem; +} + +.subtitle.is-6 { + font-size: 1rem; +} + +.subtitle.is-7 { + font-size: 0.75rem; +} + +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; +} + +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; +} + +.highlight pre { + overflow: auto; + max-width: 100%; +} + +.number { + align-items: center; + background-color: #f5f5f5; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; +} + +.select select, +.textarea, +.input, +#documenter .docs-sidebar form.docs-search>input { + background-color: #fff; + border-color: #dbdbdb; + border-radius: 4px; + color: #363636; +} + +.select select::-moz-placeholder, +.textarea::-moz-placeholder, +.input::-moz-placeholder, +#documenter .docs-sidebar form.docs-search>input::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select::-webkit-input-placeholder, +.textarea::-webkit-input-placeholder, +.input::-webkit-input-placeholder, +#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select:-moz-placeholder, +.textarea:-moz-placeholder, +.input:-moz-placeholder, +#documenter .docs-sidebar form.docs-search>input:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select:-ms-input-placeholder, +.textarea:-ms-input-placeholder, +.input:-ms-input-placeholder, +#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select:hover, +.textarea:hover, +.input:hover, +#documenter .docs-sidebar form.docs-search>input:hover, +.select select.is-hovered, +.is-hovered.textarea, +.is-hovered.input, +#documenter .docs-sidebar form.docs-search>input.is-hovered { + border-color: #b5b5b5; +} + +.select select:focus, +.textarea:focus, +.input:focus, +#documenter .docs-sidebar form.docs-search>input:focus, +.select select.is-focused, +.is-focused.textarea, +.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.select select:active, +.textarea:active, +.input:active, +#documenter .docs-sidebar form.docs-search>input:active, +.select select.is-active, +.is-active.textarea, +.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + border-color: #2e63b8; + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); +} + +.select select[disabled], +.textarea[disabled], +.input[disabled], +#documenter .docs-sidebar form.docs-search>input[disabled], +fieldset[disabled] .select select, +.select fieldset[disabled] select, +fieldset[disabled] .textarea, +fieldset[disabled] .input, +fieldset[disabled] #documenter .docs-sidebar form.docs-search>input, +#documenter .docs-sidebar fieldset[disabled] form.docs-search>input { + background-color: #f5f5f5; + border-color: #f5f5f5; + box-shadow: none; + color: #6b6b6b; +} + +.select select[disabled]::-moz-placeholder, +.textarea[disabled]::-moz-placeholder, +.input[disabled]::-moz-placeholder, +#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder, +fieldset[disabled] .select select::-moz-placeholder, +.select fieldset[disabled] select::-moz-placeholder, +fieldset[disabled] .textarea::-moz-placeholder, +fieldset[disabled] .input::-moz-placeholder, +fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder, +#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder { + color: rgba(107, 107, 107, 0.3); +} + +.select select[disabled]::-webkit-input-placeholder, +.textarea[disabled]::-webkit-input-placeholder, +.input[disabled]::-webkit-input-placeholder, +#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder, +fieldset[disabled] .select select::-webkit-input-placeholder, +.select fieldset[disabled] select::-webkit-input-placeholder, +fieldset[disabled] .textarea::-webkit-input-placeholder, +fieldset[disabled] .input::-webkit-input-placeholder, +fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder, +#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder { + color: rgba(107, 107, 107, 0.3); +} + +.select select[disabled]:-moz-placeholder, +.textarea[disabled]:-moz-placeholder, +.input[disabled]:-moz-placeholder, +#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder, +fieldset[disabled] .select select:-moz-placeholder, +.select fieldset[disabled] select:-moz-placeholder, +fieldset[disabled] .textarea:-moz-placeholder, +fieldset[disabled] .input:-moz-placeholder, +fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder, +#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder { + color: rgba(107, 107, 107, 0.3); +} + +.select select[disabled]:-ms-input-placeholder, +.textarea[disabled]:-ms-input-placeholder, +.input[disabled]:-ms-input-placeholder, +#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder, +fieldset[disabled] .select select:-ms-input-placeholder, +.select fieldset[disabled] select:-ms-input-placeholder, +fieldset[disabled] .textarea:-ms-input-placeholder, +fieldset[disabled] .input:-ms-input-placeholder, +fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder, +#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder { + color: rgba(107, 107, 107, 0.3); +} + +.textarea, +.input, +#documenter .docs-sidebar form.docs-search>input { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; +} + +.textarea[readonly], +.input[readonly], +#documenter .docs-sidebar form.docs-search>input[readonly] { + box-shadow: none; +} + +.is-white.textarea, +.is-white.input, +#documenter .docs-sidebar form.docs-search>input.is-white { + border-color: #fff; +} + +.is-white.textarea:focus, +.is-white.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-white:focus, +.is-white.is-focused.textarea, +.is-white.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-white.textarea:active, +.is-white.input:active, +#documenter .docs-sidebar form.docs-search>input.is-white:active, +.is-white.is-active.textarea, +.is-white.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); +} + +.is-black.textarea, +.is-black.input, +#documenter .docs-sidebar form.docs-search>input.is-black { + border-color: #0a0a0a; +} + +.is-black.textarea:focus, +.is-black.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-black:focus, +.is-black.is-focused.textarea, +.is-black.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-black.textarea:active, +.is-black.input:active, +#documenter .docs-sidebar form.docs-search>input.is-black:active, +.is-black.is-active.textarea, +.is-black.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); +} + +.is-light.textarea, +.is-light.input, +#documenter .docs-sidebar form.docs-search>input.is-light { + border-color: #f5f5f5; +} + +.is-light.textarea:focus, +.is-light.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-light:focus, +.is-light.is-focused.textarea, +.is-light.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-light.textarea:active, +.is-light.input:active, +#documenter .docs-sidebar form.docs-search>input.is-light:active, +.is-light.is-active.textarea, +.is-light.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); +} + +.is-dark.textarea, +.content kbd.textarea, +.is-dark.input, +#documenter .docs-sidebar form.docs-search>input.is-dark, +.content kbd.input { + border-color: #363636; +} + +.is-dark.textarea:focus, +.content kbd.textarea:focus, +.is-dark.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-dark:focus, +.content kbd.input:focus, +.is-dark.is-focused.textarea, +.content kbd.is-focused.textarea, +.is-dark.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.content kbd.is-focused.input, +#documenter .docs-sidebar .content form.docs-search>input.is-focused, +.is-dark.textarea:active, +.content kbd.textarea:active, +.is-dark.input:active, +#documenter .docs-sidebar form.docs-search>input.is-dark:active, +.content kbd.input:active, +.is-dark.is-active.textarea, +.content kbd.is-active.textarea, +.is-dark.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active, +.content kbd.is-active.input, +#documenter .docs-sidebar .content form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); +} + +.is-primary.textarea, +.docstring>section>a.textarea.docs-sourcelink, +.is-primary.input, +#documenter .docs-sidebar form.docs-search>input.is-primary, +.docstring>section>a.input.docs-sourcelink { + border-color: #4eb5de; +} + +.is-primary.textarea:focus, +.docstring>section>a.textarea.docs-sourcelink:focus, +.is-primary.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-primary:focus, +.docstring>section>a.input.docs-sourcelink:focus, +.is-primary.is-focused.textarea, +.docstring>section>a.is-focused.textarea.docs-sourcelink, +.is-primary.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.docstring>section>a.is-focused.input.docs-sourcelink, +.is-primary.textarea:active, +.docstring>section>a.textarea.docs-sourcelink:active, +.is-primary.input:active, +#documenter .docs-sidebar form.docs-search>input.is-primary:active, +.docstring>section>a.input.docs-sourcelink:active, +.is-primary.is-active.textarea, +.docstring>section>a.is-active.textarea.docs-sourcelink, +.is-primary.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active, +.docstring>section>a.is-active.input.docs-sourcelink { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); +} + +.is-link.textarea, +.is-link.input, +#documenter .docs-sidebar form.docs-search>input.is-link { + border-color: #2e63b8; +} + +.is-link.textarea:focus, +.is-link.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-link:focus, +.is-link.is-focused.textarea, +.is-link.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-link.textarea:active, +.is-link.input:active, +#documenter .docs-sidebar form.docs-search>input.is-link:active, +.is-link.is-active.textarea, +.is-link.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); +} + +.is-info.textarea, +.is-info.input, +#documenter .docs-sidebar form.docs-search>input.is-info { + border-color: #209cee; +} + +.is-info.textarea:focus, +.is-info.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-info:focus, +.is-info.is-focused.textarea, +.is-info.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-info.textarea:active, +.is-info.input:active, +#documenter .docs-sidebar form.docs-search>input.is-info:active, +.is-info.is-active.textarea, +.is-info.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); +} + +.is-success.textarea, +.is-success.input, +#documenter .docs-sidebar form.docs-search>input.is-success { + border-color: #22c35b; +} + +.is-success.textarea:focus, +.is-success.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-success:focus, +.is-success.is-focused.textarea, +.is-success.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-success.textarea:active, +.is-success.input:active, +#documenter .docs-sidebar form.docs-search>input.is-success:active, +.is-success.is-active.textarea, +.is-success.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); +} + +.is-warning.textarea, +.is-warning.input, +#documenter .docs-sidebar form.docs-search>input.is-warning { + border-color: #ffdd57; +} + +.is-warning.textarea:focus, +.is-warning.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-warning:focus, +.is-warning.is-focused.textarea, +.is-warning.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-warning.textarea:active, +.is-warning.input:active, +#documenter .docs-sidebar form.docs-search>input.is-warning:active, +.is-warning.is-active.textarea, +.is-warning.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); +} + +.is-danger.textarea, +.is-danger.input, +#documenter .docs-sidebar form.docs-search>input.is-danger { + border-color: #da0b00; +} + +.is-danger.textarea:focus, +.is-danger.input:focus, +#documenter .docs-sidebar form.docs-search>input.is-danger:focus, +.is-danger.is-focused.textarea, +.is-danger.is-focused.input, +#documenter .docs-sidebar form.docs-search>input.is-focused, +.is-danger.textarea:active, +.is-danger.input:active, +#documenter .docs-sidebar form.docs-search>input.is-danger:active, +.is-danger.is-active.textarea, +.is-danger.is-active.input, +#documenter .docs-sidebar form.docs-search>input.is-active { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); +} + +.is-small.textarea, +.is-small.input, +#documenter .docs-sidebar form.docs-search>input { + border-radius: 2px; + font-size: 0.75rem; +} + +.is-medium.textarea, +.is-medium.input, +#documenter .docs-sidebar form.docs-search>input.is-medium { + font-size: 1.25rem; +} + +.is-large.textarea, +.is-large.input, +#documenter .docs-sidebar form.docs-search>input.is-large { + font-size: 1.5rem; +} + +.is-fullwidth.textarea, +.is-fullwidth.input, +#documenter .docs-sidebar form.docs-search>input.is-fullwidth { + display: block; + width: 100%; +} + +.is-inline.textarea, +.is-inline.input, +#documenter .docs-sidebar form.docs-search>input.is-inline { + display: inline; + width: auto; +} + +.input.is-rounded, +#documenter .docs-sidebar form.docs-search>input { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; +} + +.input.is-static, +#documenter .docs-sidebar form.docs-search>input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; +} + +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: 0.625em; + resize: vertical; +} + +.textarea:not([rows]) { + max-height: 600px; + min-height: 120px; +} + +.textarea[rows] { + height: initial; +} + +.textarea.has-fixed-size { + resize: none; +} + +.radio, +.checkbox { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; +} + +.radio input, +.checkbox input { + cursor: pointer; +} + +.radio:hover, +.checkbox:hover { + color: #363636; +} + +.radio[disabled], +.checkbox[disabled], +fieldset[disabled] .radio, +fieldset[disabled] .checkbox { + color: #6b6b6b; + cursor: not-allowed; +} + +.radio+.radio { + margin-left: 0.5em; +} + +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; +} + +.select:not(.is-multiple) { + height: 2.25em; +} + +.select:not(.is-multiple):not(.is-loading)::after { + border-color: #2e63b8; + right: 1.125em; + z-index: 4; +} + +.select.is-rounded select, +#documenter .docs-sidebar form.docs-search>input.select select { + border-radius: 290486px; + padding-left: 1em; +} + +.select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; +} + +.select select::-ms-expand { + display: none; +} + +.select select[disabled]:hover, +fieldset[disabled] .select select:hover { + border-color: #f5f5f5; +} + +.select select:not([multiple]) { + padding-right: 2.5em; +} + +.select select[multiple] { + height: auto; + padding: 0; +} + +.select select[multiple] option { + padding: 0.5em 1em; +} + +.select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #363636; +} + +.select.is-white:not(:hover)::after { + border-color: #fff; +} + +.select.is-white select { + border-color: #fff; +} + +.select.is-white select:hover, +.select.is-white select.is-hovered { + border-color: #f2f2f2; +} + +.select.is-white select:focus, +.select.is-white select.is-focused, +.select.is-white select:active, +.select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); +} + +.select.is-black:not(:hover)::after { + border-color: #0a0a0a; +} + +.select.is-black select { + border-color: #0a0a0a; +} + +.select.is-black select:hover, +.select.is-black select.is-hovered { + border-color: #000; +} + +.select.is-black select:focus, +.select.is-black select.is-focused, +.select.is-black select:active, +.select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); +} + +.select.is-light:not(:hover)::after { + border-color: #f5f5f5; +} + +.select.is-light select { + border-color: #f5f5f5; +} + +.select.is-light select:hover, +.select.is-light select.is-hovered { + border-color: #e8e8e8; +} + +.select.is-light select:focus, +.select.is-light select.is-focused, +.select.is-light select:active, +.select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); +} + +.select.is-dark:not(:hover)::after, +.content kbd.select:not(:hover)::after { + border-color: #363636; +} + +.select.is-dark select, +.content kbd.select select { + border-color: #363636; +} + +.select.is-dark select:hover, +.content kbd.select select:hover, +.select.is-dark select.is-hovered, +.content kbd.select select.is-hovered { + border-color: #292929; +} + +.select.is-dark select:focus, +.content kbd.select select:focus, +.select.is-dark select.is-focused, +.content kbd.select select.is-focused, +.select.is-dark select:active, +.content kbd.select select:active, +.select.is-dark select.is-active, +.content kbd.select select.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); +} + +.select.is-primary:not(:hover)::after, +.docstring>section>a.select.docs-sourcelink:not(:hover)::after { + border-color: #4eb5de; +} + +.select.is-primary select, +.docstring>section>a.select.docs-sourcelink select { + border-color: #4eb5de; +} + +.select.is-primary select:hover, +.docstring>section>a.select.docs-sourcelink select:hover, +.select.is-primary select.is-hovered, +.docstring>section>a.select.docs-sourcelink select.is-hovered { + border-color: #39acda; +} + +.select.is-primary select:focus, +.docstring>section>a.select.docs-sourcelink select:focus, +.select.is-primary select.is-focused, +.docstring>section>a.select.docs-sourcelink select.is-focused, +.select.is-primary select:active, +.docstring>section>a.select.docs-sourcelink select:active, +.select.is-primary select.is-active, +.docstring>section>a.select.docs-sourcelink select.is-active { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); +} + +.select.is-link:not(:hover)::after { + border-color: #2e63b8; +} + +.select.is-link select { + border-color: #2e63b8; +} + +.select.is-link select:hover, +.select.is-link select.is-hovered { + border-color: #2958a4; +} + +.select.is-link select:focus, +.select.is-link select.is-focused, +.select.is-link select:active, +.select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); +} + +.select.is-info:not(:hover)::after { + border-color: #209cee; +} + +.select.is-info select { + border-color: #209cee; +} + +.select.is-info select:hover, +.select.is-info select.is-hovered { + border-color: #1190e3; +} + +.select.is-info select:focus, +.select.is-info select.is-focused, +.select.is-info select:active, +.select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); +} + +.select.is-success:not(:hover)::after { + border-color: #22c35b; +} + +.select.is-success select { + border-color: #22c35b; +} + +.select.is-success select:hover, +.select.is-success select.is-hovered { + border-color: #1ead51; +} + +.select.is-success select:focus, +.select.is-success select.is-focused, +.select.is-success select:active, +.select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); +} + +.select.is-warning:not(:hover)::after { + border-color: #ffdd57; +} + +.select.is-warning select { + border-color: #ffdd57; +} + +.select.is-warning select:hover, +.select.is-warning select.is-hovered { + border-color: #ffd83e; +} + +.select.is-warning select:focus, +.select.is-warning select.is-focused, +.select.is-warning select:active, +.select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); +} + +.select.is-danger:not(:hover)::after { + border-color: #da0b00; +} + +.select.is-danger select { + border-color: #da0b00; +} + +.select.is-danger select:hover, +.select.is-danger select.is-hovered { + border-color: #c10a00; +} + +.select.is-danger select:focus, +.select.is-danger select.is-focused, +.select.is-danger select:active, +.select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); +} + +.select.is-small, +#documenter .docs-sidebar form.docs-search>input.select { + border-radius: 2px; + font-size: 0.75rem; +} + +.select.is-medium { + font-size: 1.25rem; +} + +.select.is-large { + font-size: 1.5rem; +} + +.select.is-disabled::after { + border-color: #6b6b6b; +} + +.select.is-fullwidth { + width: 100%; +} + +.select.is-fullwidth select { + width: 100%; +} + +.select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; +} + +.select.is-loading.is-small:after, +#documenter .docs-sidebar form.docs-search>input.is-loading:after { + font-size: 0.75rem; +} + +.select.is-loading.is-medium:after { + font-size: 1.25rem; +} + +.select.is-loading.is-large:after { + font-size: 1.5rem; +} + +.file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; +} + +.file.is-white .file-cta { + background-color: #fff; + border-color: transparent; + color: #0a0a0a; +} + +.file.is-white:hover .file-cta, +.file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} + +.file.is-white:focus .file-cta, +.file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; +} + +.file.is-white:active .file-cta, +.file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; +} + +.file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: #fff; +} + +.file.is-black:hover .file-cta, +.file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: #fff; +} + +.file.is-black:focus .file-cta, +.file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: #fff; +} + +.file.is-black:active .file-cta, +.file.is-black.is-active .file-cta { + background-color: #000; + border-color: transparent; + color: #fff; +} + +.file.is-light .file-cta { + background-color: #f5f5f5; + border-color: transparent; + color: #363636; +} + +.file.is-light:hover .file-cta, +.file.is-light.is-hovered .file-cta { + background-color: #eee; + border-color: transparent; + color: #363636; +} + +.file.is-light:focus .file-cta, +.file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + color: #363636; +} + +.file.is-light:active .file-cta, +.file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; +} + +.file.is-dark .file-cta, +.content kbd.file .file-cta { + background-color: #363636; + border-color: transparent; + color: #f5f5f5; +} + +.file.is-dark:hover .file-cta, +.content kbd.file:hover .file-cta, +.file.is-dark.is-hovered .file-cta, +.content kbd.file.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: #f5f5f5; +} + +.file.is-dark:focus .file-cta, +.content kbd.file:focus .file-cta, +.file.is-dark.is-focused .file-cta, +.content kbd.file.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + color: #f5f5f5; +} + +.file.is-dark:active .file-cta, +.content kbd.file:active .file-cta, +.file.is-dark.is-active .file-cta, +.content kbd.file.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: #f5f5f5; +} + +.file.is-primary .file-cta, +.docstring>section>a.file.docs-sourcelink .file-cta { + background-color: #4eb5de; + border-color: transparent; + color: #fff; +} + +.file.is-primary:hover .file-cta, +.docstring>section>a.file.docs-sourcelink:hover .file-cta, +.file.is-primary.is-hovered .file-cta, +.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta { + background-color: #43b1dc; + border-color: transparent; + color: #fff; +} + +.file.is-primary:focus .file-cta, +.docstring>section>a.file.docs-sourcelink:focus .file-cta, +.file.is-primary.is-focused .file-cta, +.docstring>section>a.file.is-focused.docs-sourcelink .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(78, 181, 222, 0.25); + color: #fff; +} + +.file.is-primary:active .file-cta, +.docstring>section>a.file.docs-sourcelink:active .file-cta, +.file.is-primary.is-active .file-cta, +.docstring>section>a.file.is-active.docs-sourcelink .file-cta { + background-color: #39acda; + border-color: transparent; + color: #fff; +} + +.file.is-link .file-cta { + background-color: #2e63b8; + border-color: transparent; + color: #fff; +} + +.file.is-link:hover .file-cta, +.file.is-link.is-hovered .file-cta { + background-color: #2b5eae; + border-color: transparent; + color: #fff; +} + +.file.is-link:focus .file-cta, +.file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(46, 99, 184, 0.25); + color: #fff; +} + +.file.is-link:active .file-cta, +.file.is-link.is-active .file-cta { + background-color: #2958a4; + border-color: transparent; + color: #fff; +} + +.file.is-info .file-cta { + background-color: #209cee; + border-color: transparent; + color: #fff; +} + +.file.is-info:hover .file-cta, +.file.is-info.is-hovered .file-cta { + background-color: #1497ed; + border-color: transparent; + color: #fff; +} + +.file.is-info:focus .file-cta, +.file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); + color: #fff; +} + +.file.is-info:active .file-cta, +.file.is-info.is-active .file-cta { + background-color: #1190e3; + border-color: transparent; + color: #fff; +} + +.file.is-success .file-cta { + background-color: #22c35b; + border-color: transparent; + color: #fff; +} + +.file.is-success:hover .file-cta, +.file.is-success.is-hovered .file-cta { + background-color: #20b856; + border-color: transparent; + color: #fff; +} + +.file.is-success:focus .file-cta, +.file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(34, 195, 91, 0.25); + color: #fff; +} + +.file.is-success:active .file-cta, +.file.is-success.is-active .file-cta { + background-color: #1ead51; + border-color: transparent; + color: #fff; +} + +.file.is-warning .file-cta { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.file.is-warning:hover .file-cta, +.file.is-warning.is-hovered .file-cta { + background-color: #ffda4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.file.is-warning:focus .file-cta, +.file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); + color: rgba(0, 0, 0, 0.7); +} + +.file.is-warning:active .file-cta, +.file.is-warning.is-active .file-cta { + background-color: #ffd83e; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.file.is-danger .file-cta { + background-color: #da0b00; + border-color: transparent; + color: #fff; +} + +.file.is-danger:hover .file-cta, +.file.is-danger.is-hovered .file-cta { + background-color: #cd0a00; + border-color: transparent; + color: #fff; +} + +.file.is-danger:focus .file-cta, +.file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(218, 11, 0, 0.25); + color: #fff; +} + +.file.is-danger:active .file-cta, +.file.is-danger.is-active .file-cta { + background-color: #c10a00; + border-color: transparent; + color: #fff; +} + +.file.is-small, +#documenter .docs-sidebar form.docs-search>input.file { + font-size: 0.75rem; +} + +.file.is-medium { + font-size: 1.25rem; +} + +.file.is-medium .file-icon .fa { + font-size: 21px; +} + +.file.is-large { + font-size: 1.5rem; +} + +.file.is-large .file-icon .fa { + font-size: 28px; +} + +.file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.file.has-name.is-empty .file-cta { + border-radius: 4px; +} + +.file.has-name.is-empty .file-name { + display: none; +} + +.file.is-boxed .file-label { + flex-direction: column; +} + +.file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; +} + +.file.is-boxed .file-name { + border-width: 0 1px 1px; +} + +.file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; +} + +.file.is-boxed .file-icon .fa { + font-size: 21px; +} + +.file.is-boxed.is-small .file-icon .fa, +#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa { + font-size: 14px; +} + +.file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; +} + +.file.is-boxed.is-large .file-icon .fa { + font-size: 35px; +} + +.file.is-boxed.has-name .file-cta { + border-radius: 4px 4px 0 0; +} + +.file.is-boxed.has-name .file-name { + border-radius: 0 0 4px 4px; + border-width: 0 1px 1px; +} + +.file.is-centered { + justify-content: center; +} + +.file.is-fullwidth .file-label { + width: 100%; +} + +.file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; +} + +.file.is-right { + justify-content: flex-end; +} + +.file.is-right .file-cta { + border-radius: 0 4px 4px 0; +} + +.file.is-right .file-name { + border-radius: 4px 0 0 4px; + border-width: 1px 0 1px 1px; + order: -1; +} + +.file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; +} + +.file-label:hover .file-cta { + background-color: #eee; + color: #363636; +} + +.file-label:hover .file-name { + border-color: #d5d5d5; +} + +.file-label:active .file-cta { + background-color: #e8e8e8; + color: #363636; +} + +.file-label:active .file-name { + border-color: #cfcfcf; +} + +.file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; +} + +.file-cta, +.file-name { + border-color: #dbdbdb; + border-radius: 4px; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; +} + +.file-cta { + background-color: #f5f5f5; + color: #4a4a4a; +} + +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; +} + +.file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; +} + +.file-icon .fa { + font-size: 14px; +} + +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; +} + +.label:not(:last-child) { + margin-bottom: 0.5em; +} + +.label.is-small, +#documenter .docs-sidebar form.docs-search>input.label { + font-size: 0.75rem; +} + +.label.is-medium { + font-size: 1.25rem; +} + +.label.is-large { + font-size: 1.5rem; +} + +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; +} + +.help.is-white { + color: #fff; +} + +.help.is-black { + color: #0a0a0a; +} + +.help.is-light { + color: #f5f5f5; +} + +.help.is-dark, +.content kbd.help { + color: #363636; +} + +.help.is-primary, +.docstring>section>a.help.docs-sourcelink { + color: #4eb5de; +} + +.help.is-link { + color: #2e63b8; +} + +.help.is-info { + color: #209cee; +} + +.help.is-success { + color: #22c35b; +} + +.help.is-warning { + color: #ffdd57; +} + +.help.is-danger { + color: #da0b00; +} + +.field:not(:last-child) { + margin-bottom: 0.75rem; +} + +.field.has-addons { + display: flex; + justify-content: flex-start; +} + +.field.has-addons .control:not(:last-child) { + margin-right: -1px; +} + +.field.has-addons .control:not(:first-child):not(:last-child) .button, +.field.has-addons .control:not(:first-child):not(:last-child) .input, +.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input, +#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input, +.field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; +} + +.field.has-addons .control:first-child:not(:only-child) .button, +.field.has-addons .control:first-child:not(:only-child) .input, +.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input, +#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input, +.field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.field.has-addons .control:last-child:not(:only-child) .button, +.field.has-addons .control:last-child:not(:only-child) .input, +.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input, +#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input, +.field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.field.has-addons .control .button:not([disabled]):hover, +.field.has-addons .control .button.is-hovered:not([disabled]), +.field.has-addons .control .input:not([disabled]):hover, +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover, +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover, +.field.has-addons .control .input.is-hovered:not([disabled]), +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]), +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]), +.field.has-addons .control .select select:not([disabled]):hover, +.field.has-addons .control .select select.is-hovered:not([disabled]) { + z-index: 2; +} + +.field.has-addons .control .button:not([disabled]):focus, +.field.has-addons .control .button.is-focused:not([disabled]), +.field.has-addons .control .button:not([disabled]):active, +.field.has-addons .control .button.is-active:not([disabled]), +.field.has-addons .control .input:not([disabled]):focus, +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus, +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus, +.field.has-addons .control .input.is-focused:not([disabled]), +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]), +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]), +.field.has-addons .control .input:not([disabled]):active, +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active, +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active, +.field.has-addons .control .input.is-active:not([disabled]), +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]), +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]), +.field.has-addons .control .select select:not([disabled]):focus, +.field.has-addons .control .select select.is-focused:not([disabled]), +.field.has-addons .control .select select:not([disabled]):active, +.field.has-addons .control .select select.is-active:not([disabled]) { + z-index: 3; +} + +.field.has-addons .control .button:not([disabled]):focus:hover, +.field.has-addons .control .button.is-focused:not([disabled]):hover, +.field.has-addons .control .button:not([disabled]):active:hover, +.field.has-addons .control .button.is-active:not([disabled]):hover, +.field.has-addons .control .input:not([disabled]):focus:hover, +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover, +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover, +.field.has-addons .control .input.is-focused:not([disabled]):hover, +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover, +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover, +.field.has-addons .control .input:not([disabled]):active:hover, +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover, +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover, +.field.has-addons .control .input.is-active:not([disabled]):hover, +.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover, +#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover, +.field.has-addons .control .select select:not([disabled]):focus:hover, +.field.has-addons .control .select select.is-focused:not([disabled]):hover, +.field.has-addons .control .select select:not([disabled]):active:hover, +.field.has-addons .control .select select.is-active:not([disabled]):hover { + z-index: 4; +} + +.field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} + +.field.has-addons.has-addons-centered { + justify-content: center; +} + +.field.has-addons.has-addons-right { + justify-content: flex-end; +} + +.field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; +} + +.field.is-grouped { + display: flex; + justify-content: flex-start; +} + +.field.is-grouped>.control { + flex-shrink: 0; +} + +.field.is-grouped>.control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} + +.field.is-grouped>.control.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} + +.field.is-grouped.is-grouped-centered { + justify-content: center; +} + +.field.is-grouped.is-grouped-right { + justify-content: flex-end; +} + +.field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; +} + +.field.is-grouped.is-grouped-multiline>.control:last-child, +.field.is-grouped.is-grouped-multiline>.control:not(:last-child) { + margin-bottom: 0.75rem; +} + +.field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; +} + +.field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; +} + +@media screen and (min-width: 769px), +print { + .field.is-horizontal { + display: flex; + } +} + +.field-label .label { + font-size: inherit; +} + +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; + } +} + +@media screen and (min-width: 769px), +print { + .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; + } + + .field-label.is-small, + #documenter .docs-sidebar form.docs-search>input.field-label { + font-size: 0.75rem; + padding-top: 0.375em; + } + + .field-label.is-normal { + padding-top: 0.375em; + } + + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; + } + + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; + } +} + +.field-body .field .field { + margin-bottom: 0; +} + +@media screen and (min-width: 769px), +print { + .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; + } + + .field-body .field { + margin-bottom: 0; + } + + .field-body>.field { + flex-shrink: 1; + } + + .field-body>.field:not(.is-narrow) { + flex-grow: 1; + } + + .field-body>.field:not(:last-child) { + margin-right: 0.75rem; + } +} + +.control { + box-sizing: border-box; + clear: both; + font-size: 1rem; + position: relative; + text-align: left; +} + +.control.has-icons-left .input:focus~.icon, +.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon, +#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon, +.control.has-icons-left .select:focus~.icon, +.control.has-icons-right .input:focus~.icon, +.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon, +#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon, +.control.has-icons-right .select:focus~.icon { + color: #6b6b6b; +} + +.control.has-icons-left .input.is-small~.icon, +.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon, +#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon, +.control.has-icons-left .select.is-small~.icon, +.control.has-icons-right .input.is-small~.icon, +.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon, +#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon, +.control.has-icons-right .select.is-small~.icon { + font-size: 0.75rem; +} + +.control.has-icons-left .input.is-medium~.icon, +.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon, +#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon, +.control.has-icons-left .select.is-medium~.icon, +.control.has-icons-right .input.is-medium~.icon, +.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon, +#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon, +.control.has-icons-right .select.is-medium~.icon { + font-size: 1.25rem; +} + +.control.has-icons-left .input.is-large~.icon, +.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon, +#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon, +.control.has-icons-left .select.is-large~.icon, +.control.has-icons-right .input.is-large~.icon, +.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon, +#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon, +.control.has-icons-right .select.is-large~.icon { + font-size: 1.5rem; +} + +.control.has-icons-left .icon, +.control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; +} + +.control.has-icons-left .input, +.control.has-icons-left #documenter .docs-sidebar form.docs-search>input, +#documenter .docs-sidebar .control.has-icons-left form.docs-search>input, +.control.has-icons-left .select select { + padding-left: 2.25em; +} + +.control.has-icons-left .icon.is-left { + left: 0; +} + +.control.has-icons-right .input, +.control.has-icons-right #documenter .docs-sidebar form.docs-search>input, +#documenter .docs-sidebar .control.has-icons-right form.docs-search>input, +.control.has-icons-right .select select { + padding-right: 2.25em; +} + +.control.has-icons-right .icon.is-right { + right: 0; +} + +.control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; +} + +.control.is-loading.is-small:after, +#documenter .docs-sidebar form.docs-search>input.is-loading:after { + font-size: 0.75rem; +} + +.control.is-loading.is-medium:after { + font-size: 1.25rem; +} + +.control.is-loading.is-large:after { + font-size: 1.5rem; +} + +.breadcrumb { + font-size: 1rem; + white-space: nowrap; +} + +.breadcrumb a { + align-items: center; + color: #2e63b8; + display: flex; + justify-content: center; + padding: 0 0.75em; +} + +.breadcrumb a:hover { + color: #363636; +} + +.breadcrumb li { + align-items: center; + display: flex; +} + +.breadcrumb li:first-child a { + padding-left: 0; +} + +.breadcrumb li.is-active a { + color: #222; + cursor: default; + pointer-events: none; +} + +.breadcrumb li+li::before { + color: #b5b5b5; + content: "\0002f"; +} + +.breadcrumb ul, +.breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} + +.breadcrumb .icon:first-child { + margin-right: 0.5em; +} + +.breadcrumb .icon:last-child { + margin-left: 0.5em; +} + +.breadcrumb.is-centered ol, +.breadcrumb.is-centered ul { + justify-content: center; +} + +.breadcrumb.is-right ol, +.breadcrumb.is-right ul { + justify-content: flex-end; +} + +.breadcrumb.is-small, +#documenter .docs-sidebar form.docs-search>input.breadcrumb { + font-size: 0.75rem; +} + +.breadcrumb.is-medium { + font-size: 1.25rem; +} + +.breadcrumb.is-large { + font-size: 1.5rem; +} + +.breadcrumb.has-arrow-separator li+li::before { + content: "\02192"; +} + +.breadcrumb.has-bullet-separator li+li::before { + content: "\02022"; +} + +.breadcrumb.has-dot-separator li+li::before { + content: "\000b7"; +} + +.breadcrumb.has-succeeds-separator li+li::before { + content: "\0227B"; +} + +.card { + background-color: #fff; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #222; + max-width: 100%; + position: relative; +} + +.card-header { + background-color: rgba(0, 0, 0, 0); + align-items: stretch; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: flex; +} + +.card-header-title { + align-items: center; + color: #222; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; +} + +.card-header-title.is-centered { + justify-content: center; +} + +.card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem; +} + +.card-image { + display: block; + position: relative; +} + +.card-content { + background-color: rgba(0, 0, 0, 0); + padding: 1.5rem; +} + +.card-footer { + background-color: rgba(0, 0, 0, 0); + border-top: 1px solid #dbdbdb; + align-items: stretch; + display: flex; +} + +.card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; +} + +.card-footer-item:not(:last-child) { + border-right: 1px solid #dbdbdb; +} + +.card .media:not(:last-child) { + margin-bottom: 1.5rem; +} + +.dropdown { + display: inline-flex; + position: relative; + vertical-align: top; +} + +.dropdown.is-active .dropdown-menu, +.dropdown.is-hoverable:hover .dropdown-menu { + display: block; +} + +.dropdown.is-right .dropdown-menu { + left: auto; + right: 0; +} + +.dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; +} + +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; +} + +.dropdown-content { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} + +.dropdown-item { + color: #4a4a4a; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; +} + +a.dropdown-item, +button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; +} + +a.dropdown-item:hover, +button.dropdown-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; +} + +a.dropdown-item.is-active, +button.dropdown-item.is-active { + background-color: #2e63b8; + color: #fff; +} + +.dropdown-divider { + background-color: #dbdbdb; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; +} + +.level { + align-items: center; + justify-content: space-between; +} + +.level code { + border-radius: 4px; +} + +.level img { + display: inline-block; + vertical-align: top; +} + +.level.is-mobile { + display: flex; +} + +.level.is-mobile .level-left, +.level.is-mobile .level-right { + display: flex; +} + +.level.is-mobile .level-left+.level-right { + margin-top: 0; +} + +.level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} + +.level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; +} + +@media screen and (min-width: 769px), +print { + .level { + display: flex; + } + + .level>.level-item:not(.is-narrow) { + flex-grow: 1; + } +} + +.level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; +} + +.level-item .title, +.level-item .subtitle { + margin-bottom: 0; +} + +@media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; + } +} + +.level-left, +.level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; +} + +.level-left .level-item.is-flexible, +.level-right .level-item.is-flexible { + flex-grow: 1; +} + +@media screen and (min-width: 769px), +print { + + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; + } +} + +.level-left { + align-items: center; + justify-content: flex-start; +} + +@media screen and (max-width: 768px) { + .level-left+.level-right { + margin-top: 1.5rem; + } +} + +@media screen and (min-width: 769px), +print { + .level-left { + display: flex; + } +} + +.level-right { + align-items: center; + justify-content: flex-end; +} + +@media screen and (min-width: 769px), +print { + .level-right { + display: flex; + } +} + +.list { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); +} + +.list-item { + display: block; + padding: 0.5em 1em; +} + +.list-item:not(a) { + color: #222; +} + +.list-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +.list-item:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +.list-item:not(:last-child) { + border-bottom: 1px solid #dbdbdb; +} + +.list-item.is-active { + background-color: #2e63b8; + color: #fff; +} + +a.list-item { + background-color: #f5f5f5; + cursor: pointer; +} + +.media { + align-items: flex-start; + display: flex; + text-align: left; +} + +.media .content:not(:last-child) { + margin-bottom: 0.75rem; +} + +.media .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + display: flex; + padding-top: 0.75rem; +} + +.media .media .content:not(:last-child), +.media .media .control:not(:last-child) { + margin-bottom: 0.5rem; +} + +.media .media .media { + padding-top: 0.5rem; +} + +.media .media .media+.media { + margin-top: 0.5rem; +} + +.media+.media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + margin-top: 1rem; + padding-top: 1rem; +} + +.media.is-large+.media { + margin-top: 1.5rem; + padding-top: 1.5rem; +} + +.media-left, +.media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; +} + +.media-left { + margin-right: 1rem; +} + +.media-right { + margin-left: 1rem; +} + +.media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; +} + +@media screen and (max-width: 768px) { + .media-content { + overflow-x: auto; + } +} + +.menu { + font-size: 1rem; +} + +.menu.is-small, +#documenter .docs-sidebar form.docs-search>input.menu { + font-size: 0.75rem; +} + +.menu.is-medium { + font-size: 1.25rem; +} + +.menu.is-large { + font-size: 1.5rem; +} + +.menu-list { + line-height: 1.25; +} + +.menu-list a { + border-radius: 2px; + color: #222; + display: block; + padding: 0.5em 0.75em; +} + +.menu-list a:hover { + background-color: #f5f5f5; + color: #222; +} + +.menu-list a.is-active { + background-color: #2e63b8; + color: #fff; +} + +.menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; +} + +.menu-label { + color: #6b6b6b; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.menu-label:not(:first-child) { + margin-top: 1em; +} + +.menu-label:not(:last-child) { + margin-bottom: 1em; +} + +.message { + background-color: #f5f5f5; + border-radius: 4px; + font-size: 1rem; +} + +.message strong { + color: currentColor; +} + +.message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; +} + +.message.is-small, +#documenter .docs-sidebar form.docs-search>input.message { + font-size: 0.75rem; +} + +.message.is-medium { + font-size: 1.25rem; +} + +.message.is-large { + font-size: 1.5rem; +} + +.message.is-white { + background-color: #fff; +} + +.message.is-white .message-header { + background-color: #fff; + color: #0a0a0a; +} + +.message.is-white .message-body { + border-color: #fff; + color: #4d4d4d; +} + +.message.is-black { + background-color: #fafafa; +} + +.message.is-black .message-header { + background-color: #0a0a0a; + color: #fff; +} + +.message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; +} + +.message.is-light { + background-color: #fafafa; +} + +.message.is-light .message-header { + background-color: #f5f5f5; + color: #363636; +} + +.message.is-light .message-body { + border-color: #f5f5f5; + color: #505050; +} + +.message.is-dark, +.content kbd.message { + background-color: #fafafa; +} + +.message.is-dark .message-header, +.content kbd.message .message-header { + background-color: #363636; + color: #f5f5f5; +} + +.message.is-dark .message-body, +.content kbd.message .message-body { + border-color: #363636; + color: #2a2a2a; +} + +.message.is-primary, +.docstring>section>a.message.docs-sourcelink { + background-color: #f6fbfd; +} + +.message.is-primary .message-header, +.docstring>section>a.message.docs-sourcelink .message-header { + background-color: #4eb5de; + color: #fff; +} + +.message.is-primary .message-body, +.docstring>section>a.message.docs-sourcelink .message-body { + border-color: #4eb5de; + color: #1f556a; +} + +.message.is-link { + background-color: #f7f9fd; +} + +.message.is-link .message-header { + background-color: #2e63b8; + color: #fff; +} + +.message.is-link .message-body { + border-color: #2e63b8; + color: #264981; +} + +.message.is-info { + background-color: #f6fbfe; +} + +.message.is-info .message-header { + background-color: #209cee; + color: #fff; +} + +.message.is-info .message-body { + border-color: #209cee; + color: #12537d; +} + +.message.is-success { + background-color: #f6fdf9; +} + +.message.is-success .message-header { + background-color: #22c35b; + color: #fff; +} + +.message.is-success .message-body { + border-color: #22c35b; + color: #0f361d; +} + +.message.is-warning { + background-color: #fffdf5; +} + +.message.is-warning .message-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.message.is-warning .message-body { + border-color: #ffdd57; + color: #3c3108; +} + +.message.is-danger { + background-color: #fff5f5; +} + +.message.is-danger .message-header { + background-color: #da0b00; + color: #fff; +} + +.message.is-danger .message-body { + border-color: #da0b00; + color: #9b0c04; +} + +.message-header { + align-items: center; + background-color: #222; + border-radius: 4px 4px 0 0; + color: #fff; + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; +} + +.message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; +} + +.message-header+.message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.message-body { + border-color: #dbdbdb; + border-radius: 4px; + border-style: solid; + border-width: 0 0 0 4px; + color: #222; + padding: 1.25em 1.5em; +} + +.message-body code, +.message-body pre { + background-color: #fff; +} + +.message-body pre code { + background-color: rgba(0, 0, 0, 0); +} + +.modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; +} + +.modal.is-active { + display: flex; +} + +.modal-background { + background-color: rgba(10, 10, 10, 0.86); +} + +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; +} + +@media screen and (min-width: 769px), +print { + + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; + } +} + +.modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; +} + +.modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; +} + +.modal-card-head, +.modal-card-foot { + align-items: center; + background-color: #f5f5f5; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; +} + +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +.modal-card-title { + color: #222; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; +} + +.modal-card-foot { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 1px solid #dbdbdb; +} + +.modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; +} + +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: #fff; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; +} + +.navbar { + background-color: #fff; + min-height: 3.25rem; + position: relative; + z-index: 30; +} + +.navbar.is-white { + background-color: #fff; + color: #0a0a0a; +} + +.navbar.is-white .navbar-brand>.navbar-item, +.navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; +} + +.navbar.is-white .navbar-brand>a.navbar-item:focus, +.navbar.is-white .navbar-brand>a.navbar-item:hover, +.navbar.is-white .navbar-brand>a.navbar-item.is-active, +.navbar.is-white .navbar-brand .navbar-link:focus, +.navbar.is-white .navbar-brand .navbar-link:hover, +.navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; +} + +.navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; +} + +.navbar.is-white .navbar-burger { + color: #0a0a0a; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-white .navbar-start>.navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end>.navbar-item, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; + } + + .navbar.is-white .navbar-start>a.navbar-item:focus, + .navbar.is-white .navbar-start>a.navbar-item:hover, + .navbar.is-white .navbar-start>a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link:focus, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end>a.navbar-item:focus, + .navbar.is-white .navbar-end>a.navbar-item:hover, + .navbar.is-white .navbar-end>a.navbar-item.is-active, + .navbar.is-white .navbar-end .navbar-link:focus, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; + } + + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; + } + + .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; + } + + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: #fff; + color: #0a0a0a; + } +} + +.navbar.is-black { + background-color: #0a0a0a; + color: #fff; +} + +.navbar.is-black .navbar-brand>.navbar-item, +.navbar.is-black .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-black .navbar-brand>a.navbar-item:focus, +.navbar.is-black .navbar-brand>a.navbar-item:hover, +.navbar.is-black .navbar-brand>a.navbar-item.is-active, +.navbar.is-black .navbar-brand .navbar-link:focus, +.navbar.is-black .navbar-brand .navbar-link:hover, +.navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: #000; + color: #fff; +} + +.navbar.is-black .navbar-brand .navbar-link::after { + border-color: #fff; +} + +.navbar.is-black .navbar-burger { + color: #fff; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-black .navbar-start>.navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end>.navbar-item, + .navbar.is-black .navbar-end .navbar-link { + color: #fff; + } + + .navbar.is-black .navbar-start>a.navbar-item:focus, + .navbar.is-black .navbar-start>a.navbar-item:hover, + .navbar.is-black .navbar-start>a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link:focus, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end>a.navbar-item:focus, + .navbar.is-black .navbar-end>a.navbar-item:hover, + .navbar.is-black .navbar-end>a.navbar-item.is-active, + .navbar.is-black .navbar-end .navbar-link:focus, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: #000; + color: #fff; + } + + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: #fff; + } + + .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #000; + color: #fff; + } + + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: #fff; + } +} + +.navbar.is-light { + background-color: #f5f5f5; + color: #363636; +} + +.navbar.is-light .navbar-brand>.navbar-item, +.navbar.is-light .navbar-brand .navbar-link { + color: #363636; +} + +.navbar.is-light .navbar-brand>a.navbar-item:focus, +.navbar.is-light .navbar-brand>a.navbar-item:hover, +.navbar.is-light .navbar-brand>a.navbar-item.is-active, +.navbar.is-light .navbar-brand .navbar-link:focus, +.navbar.is-light .navbar-brand .navbar-link:hover, +.navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; +} + +.navbar.is-light .navbar-brand .navbar-link::after { + border-color: #363636; +} + +.navbar.is-light .navbar-burger { + color: #363636; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-light .navbar-start>.navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end>.navbar-item, + .navbar.is-light .navbar-end .navbar-link { + color: #363636; + } + + .navbar.is-light .navbar-start>a.navbar-item:focus, + .navbar.is-light .navbar-start>a.navbar-item:hover, + .navbar.is-light .navbar-start>a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link:focus, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end>a.navbar-item:focus, + .navbar.is-light .navbar-end>a.navbar-item:hover, + .navbar.is-light .navbar-end>a.navbar-item.is-active, + .navbar.is-light .navbar-end .navbar-link:focus, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; + } + + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: #363636; + } + + .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: #363636; + } + + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #363636; + } +} + +.navbar.is-dark, +.content kbd.navbar { + background-color: #363636; + color: #f5f5f5; +} + +.navbar.is-dark .navbar-brand>.navbar-item, +.content kbd.navbar .navbar-brand>.navbar-item, +.navbar.is-dark .navbar-brand .navbar-link, +.content kbd.navbar .navbar-brand .navbar-link { + color: #f5f5f5; +} + +.navbar.is-dark .navbar-brand>a.navbar-item:focus, +.content kbd.navbar .navbar-brand>a.navbar-item:focus, +.navbar.is-dark .navbar-brand>a.navbar-item:hover, +.content kbd.navbar .navbar-brand>a.navbar-item:hover, +.navbar.is-dark .navbar-brand>a.navbar-item.is-active, +.content kbd.navbar .navbar-brand>a.navbar-item.is-active, +.navbar.is-dark .navbar-brand .navbar-link:focus, +.content kbd.navbar .navbar-brand .navbar-link:focus, +.navbar.is-dark .navbar-brand .navbar-link:hover, +.content kbd.navbar .navbar-brand .navbar-link:hover, +.navbar.is-dark .navbar-brand .navbar-link.is-active, +.content kbd.navbar .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: #f5f5f5; +} + +.navbar.is-dark .navbar-brand .navbar-link::after, +.content kbd.navbar .navbar-brand .navbar-link::after { + border-color: #f5f5f5; +} + +.navbar.is-dark .navbar-burger, +.content kbd.navbar .navbar-burger { + color: #f5f5f5; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-dark .navbar-start>.navbar-item, + .content kbd.navbar .navbar-start>.navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .content kbd.navbar .navbar-start .navbar-link, + .navbar.is-dark .navbar-end>.navbar-item, + .content kbd.navbar .navbar-end>.navbar-item, + .navbar.is-dark .navbar-end .navbar-link, + .content kbd.navbar .navbar-end .navbar-link { + color: #f5f5f5; + } + + .navbar.is-dark .navbar-start>a.navbar-item:focus, + .content kbd.navbar .navbar-start>a.navbar-item:focus, + .navbar.is-dark .navbar-start>a.navbar-item:hover, + .content kbd.navbar .navbar-start>a.navbar-item:hover, + .navbar.is-dark .navbar-start>a.navbar-item.is-active, + .content kbd.navbar .navbar-start>a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link:focus, + .content kbd.navbar .navbar-start .navbar-link:focus, + .navbar.is-dark .navbar-start .navbar-link:hover, + .content kbd.navbar .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .content kbd.navbar .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end>a.navbar-item:focus, + .content kbd.navbar .navbar-end>a.navbar-item:focus, + .navbar.is-dark .navbar-end>a.navbar-item:hover, + .content kbd.navbar .navbar-end>a.navbar-item:hover, + .navbar.is-dark .navbar-end>a.navbar-item.is-active, + .content kbd.navbar .navbar-end>a.navbar-item.is-active, + .navbar.is-dark .navbar-end .navbar-link:focus, + .content kbd.navbar .navbar-end .navbar-link:focus, + .navbar.is-dark .navbar-end .navbar-link:hover, + .content kbd.navbar .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link.is-active, + .content kbd.navbar .navbar-end .navbar-link.is-active { + background-color: #292929; + color: #f5f5f5; + } + + .navbar.is-dark .navbar-start .navbar-link::after, + .content kbd.navbar .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after, + .content kbd.navbar .navbar-end .navbar-link::after { + border-color: #f5f5f5; + } + + .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: #f5f5f5; + } + + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, + .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: #f5f5f5; + } +} + +.navbar.is-primary, +.docstring>section>a.navbar.docs-sourcelink { + background-color: #4eb5de; + color: #fff; +} + +.navbar.is-primary .navbar-brand>.navbar-item, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item, +.navbar.is-primary .navbar-brand .navbar-link, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-primary .navbar-brand>a.navbar-item:focus, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus, +.navbar.is-primary .navbar-brand>a.navbar-item:hover, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover, +.navbar.is-primary .navbar-brand>a.navbar-item.is-active, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active, +.navbar.is-primary .navbar-brand .navbar-link:focus, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, +.navbar.is-primary .navbar-brand .navbar-link:hover, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, +.navbar.is-primary .navbar-brand .navbar-link.is-active, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { + background-color: #39acda; + color: #fff; +} + +.navbar.is-primary .navbar-brand .navbar-link::after, +.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { + border-color: #fff; +} + +.navbar.is-primary .navbar-burger, +.docstring>section>a.navbar.docs-sourcelink .navbar-burger { + color: #fff; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-primary .navbar-start>.navbar-item, + .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link, + .navbar.is-primary .navbar-end>.navbar-item, + .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item, + .navbar.is-primary .navbar-end .navbar-link, + .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link { + color: #fff; + } + + .navbar.is-primary .navbar-start>a.navbar-item:focus, + .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus, + .navbar.is-primary .navbar-start>a.navbar-item:hover, + .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover, + .navbar.is-primary .navbar-start>a.navbar-item.is-active, + .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link:focus, + .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, + .navbar.is-primary .navbar-start .navbar-link:hover, + .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end>a.navbar-item:focus, + .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus, + .navbar.is-primary .navbar-end>a.navbar-item:hover, + .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover, + .navbar.is-primary .navbar-end>a.navbar-item.is-active, + .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active, + .navbar.is-primary .navbar-end .navbar-link:focus, + .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, + .navbar.is-primary .navbar-end .navbar-link:hover, + .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link.is-active, + .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { + background-color: #39acda; + color: #fff; + } + + .navbar.is-primary .navbar-start .navbar-link::after, + .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after, + .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after { + border-color: #fff; + } + + .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, + .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, + .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #39acda; + color: #fff; + } + + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, + .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #4eb5de; + color: #fff; + } +} + +.navbar.is-link { + background-color: #2e63b8; + color: #fff; +} + +.navbar.is-link .navbar-brand>.navbar-item, +.navbar.is-link .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-link .navbar-brand>a.navbar-item:focus, +.navbar.is-link .navbar-brand>a.navbar-item:hover, +.navbar.is-link .navbar-brand>a.navbar-item.is-active, +.navbar.is-link .navbar-brand .navbar-link:focus, +.navbar.is-link .navbar-brand .navbar-link:hover, +.navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #2958a4; + color: #fff; +} + +.navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; +} + +.navbar.is-link .navbar-burger { + color: #fff; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-link .navbar-start>.navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end>.navbar-item, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; + } + + .navbar.is-link .navbar-start>a.navbar-item:focus, + .navbar.is-link .navbar-start>a.navbar-item:hover, + .navbar.is-link .navbar-start>a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link:focus, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end>a.navbar-item:focus, + .navbar.is-link .navbar-end>a.navbar-item:hover, + .navbar.is-link .navbar-end>a.navbar-item.is-active, + .navbar.is-link .navbar-end .navbar-link:focus, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #2958a4; + color: #fff; + } + + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; + } + + .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2958a4; + color: #fff; + } + + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #2e63b8; + color: #fff; + } +} + +.navbar.is-info { + background-color: #209cee; + color: #fff; +} + +.navbar.is-info .navbar-brand>.navbar-item, +.navbar.is-info .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-info .navbar-brand>a.navbar-item:focus, +.navbar.is-info .navbar-brand>a.navbar-item:hover, +.navbar.is-info .navbar-brand>a.navbar-item.is-active, +.navbar.is-info .navbar-brand .navbar-link:focus, +.navbar.is-info .navbar-brand .navbar-link:hover, +.navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #1190e3; + color: #fff; +} + +.navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; +} + +.navbar.is-info .navbar-burger { + color: #fff; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-info .navbar-start>.navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end>.navbar-item, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; + } + + .navbar.is-info .navbar-start>a.navbar-item:focus, + .navbar.is-info .navbar-start>a.navbar-item:hover, + .navbar.is-info .navbar-start>a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link:focus, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end>a.navbar-item:focus, + .navbar.is-info .navbar-end>a.navbar-item:hover, + .navbar.is-info .navbar-end>a.navbar-item.is-active, + .navbar.is-info .navbar-end .navbar-link:focus, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #1190e3; + color: #fff; + } + + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; + } + + .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1190e3; + color: #fff; + } + + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #209cee; + color: #fff; + } +} + +.navbar.is-success { + background-color: #22c35b; + color: #fff; +} + +.navbar.is-success .navbar-brand>.navbar-item, +.navbar.is-success .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-success .navbar-brand>a.navbar-item:focus, +.navbar.is-success .navbar-brand>a.navbar-item:hover, +.navbar.is-success .navbar-brand>a.navbar-item.is-active, +.navbar.is-success .navbar-brand .navbar-link:focus, +.navbar.is-success .navbar-brand .navbar-link:hover, +.navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #1ead51; + color: #fff; +} + +.navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; +} + +.navbar.is-success .navbar-burger { + color: #fff; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-success .navbar-start>.navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end>.navbar-item, + .navbar.is-success .navbar-end .navbar-link { + color: #fff; + } + + .navbar.is-success .navbar-start>a.navbar-item:focus, + .navbar.is-success .navbar-start>a.navbar-item:hover, + .navbar.is-success .navbar-start>a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link:focus, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end>a.navbar-item:focus, + .navbar.is-success .navbar-end>a.navbar-item:hover, + .navbar.is-success .navbar-end>a.navbar-item.is-active, + .navbar.is-success .navbar-end .navbar-link:focus, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #1ead51; + color: #fff; + } + + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; + } + + .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1ead51; + color: #fff; + } + + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #22c35b; + color: #fff; + } +} + +.navbar.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.navbar.is-warning .navbar-brand>.navbar-item, +.navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); +} + +.navbar.is-warning .navbar-brand>a.navbar-item:focus, +.navbar.is-warning .navbar-brand>a.navbar-item:hover, +.navbar.is-warning .navbar-brand>a.navbar-item.is-active, +.navbar.is-warning .navbar-brand .navbar-link:focus, +.navbar.is-warning .navbar-brand .navbar-link:hover, +.navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); +} + +.navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); +} + +.navbar.is-warning .navbar-burger { + color: rgba(0, 0, 0, 0.7); +} + +@media screen and (min-width: 1056px) { + + .navbar.is-warning .navbar-start>.navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end>.navbar-item, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); + } + + .navbar.is-warning .navbar-start>a.navbar-item:focus, + .navbar.is-warning .navbar-start>a.navbar-item:hover, + .navbar.is-warning .navbar-start>a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link:focus, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end>a.navbar-item:focus, + .navbar.is-warning .navbar-end>a.navbar-item:hover, + .navbar.is-warning .navbar-end>a.navbar-item.is-active, + .navbar.is-warning .navbar-end .navbar-link:focus, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); + } + + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); + } + + .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); + } + + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); + } +} + +.navbar.is-danger { + background-color: #da0b00; + color: #fff; +} + +.navbar.is-danger .navbar-brand>.navbar-item, +.navbar.is-danger .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-danger .navbar-brand>a.navbar-item:focus, +.navbar.is-danger .navbar-brand>a.navbar-item:hover, +.navbar.is-danger .navbar-brand>a.navbar-item.is-active, +.navbar.is-danger .navbar-brand .navbar-link:focus, +.navbar.is-danger .navbar-brand .navbar-link:hover, +.navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #c10a00; + color: #fff; +} + +.navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; +} + +.navbar.is-danger .navbar-burger { + color: #fff; +} + +@media screen and (min-width: 1056px) { + + .navbar.is-danger .navbar-start>.navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end>.navbar-item, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; + } + + .navbar.is-danger .navbar-start>a.navbar-item:focus, + .navbar.is-danger .navbar-start>a.navbar-item:hover, + .navbar.is-danger .navbar-start>a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link:focus, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end>a.navbar-item:focus, + .navbar.is-danger .navbar-end>a.navbar-item:hover, + .navbar.is-danger .navbar-end>a.navbar-item.is-active, + .navbar.is-danger .navbar-end .navbar-link:focus, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #c10a00; + color: #fff; + } + + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; + } + + .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #c10a00; + color: #fff; + } + + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #da0b00; + color: #fff; + } +} + +.navbar>.container { + align-items: stretch; + display: flex; + min-height: 3.25rem; + width: 100%; +} + +.navbar.has-shadow { + box-shadow: 0 2px 0 0 #f5f5f5; +} + +.navbar.is-fixed-bottom, +.navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; +} + +.navbar.is-fixed-bottom { + bottom: 0; +} + +.navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 #f5f5f5; +} + +.navbar.is-fixed-top { + top: 0; +} + +html.has-navbar-fixed-top, +body.has-navbar-fixed-top { + padding-top: 3.25rem; +} + +html.has-navbar-fixed-bottom, +body.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; +} + +.navbar-brand, +.navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 3.25rem; +} + +.navbar-brand a.navbar-item:focus, +.navbar-brand a.navbar-item:hover { + background-color: transparent; +} + +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; +} + +.navbar-burger { + color: #4a4a4a; + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; +} + +.navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; +} + +.navbar-burger span:nth-child(1) { + top: calc(50% - 6px); +} + +.navbar-burger span:nth-child(2) { + top: calc(50% - 1px); +} + +.navbar-burger span:nth-child(3) { + top: calc(50% + 4px); +} + +.navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); +} + +.navbar-burger.is-active span:nth-child(2) { + opacity: 0; +} + +.navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); +} + +.navbar-menu { + display: none; +} + +.navbar-item, +.navbar-link { + color: #4a4a4a; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; +} + +.navbar-item .icon:only-child, +.navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; +} + +a.navbar-item, +.navbar-link { + cursor: pointer; +} + +a.navbar-item:focus, +a.navbar-item:focus-within, +a.navbar-item:hover, +a.navbar-item.is-active, +.navbar-link:focus, +.navbar-link:focus-within, +.navbar-link:hover, +.navbar-link.is-active { + background-color: #fafafa; + color: #2e63b8; +} + +.navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; +} + +.navbar-item img { + max-height: 1.75rem; +} + +.navbar-item.has-dropdown { + padding: 0; +} + +.navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; +} + +.navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); +} + +.navbar-item.is-tab:focus, +.navbar-item.is-tab:hover { + background-color: rgba(0, 0, 0, 0); + border-bottom-color: #2e63b8; +} + +.navbar-item.is-tab.is-active { + background-color: rgba(0, 0, 0, 0); + border-bottom-color: #2e63b8; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #2e63b8; + padding-bottom: calc(0.5rem - 3px); +} + +.navbar-content { + flex-grow: 1; + flex-shrink: 1; +} + +.navbar-link:not(.is-arrowless) { + padding-right: 2.5em; +} + +.navbar-link:not(.is-arrowless)::after { + border-color: #2e63b8; + margin-top: -0.375em; + right: 1.125em; +} + +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} + +.navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.navbar-divider { + background-color: #f5f5f5; + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; +} + +@media screen and (max-width: 1055px) { + .navbar>.container { + display: block; + } + + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + align-items: center; + display: flex; + } + + .navbar-link::after { + display: none; + } + + .navbar-menu { + background-color: #fff; + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; + } + + .navbar-menu.is-active { + display: block; + } + + .navbar.is-fixed-bottom-touch, + .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + + .navbar.is-fixed-bottom-touch { + bottom: 0; + } + + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); + } + + .navbar.is-fixed-top-touch { + top: 0; + } + + .navbar.is-fixed-top .navbar-menu, + .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; + } + + html.has-navbar-fixed-top-touch, + body.has-navbar-fixed-top-touch { + padding-top: 3.25rem; + } + + html.has-navbar-fixed-bottom-touch, + body.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; + } +} + +@media screen and (min-width: 1056px) { + + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + align-items: stretch; + display: flex; + } + + .navbar { + min-height: 3.25rem; + } + + .navbar.is-spaced { + padding: 1rem 2rem; + } + + .navbar.is-spaced .navbar-start, + .navbar.is-spaced .navbar-end { + align-items: center; + } + + .navbar.is-spaced a.navbar-item, + .navbar.is-spaced .navbar-link { + border-radius: 4px; + } + + .navbar.is-transparent a.navbar-item:focus, + .navbar.is-transparent a.navbar-item:hover, + .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent .navbar-link:focus, + .navbar.is-transparent .navbar-link:hover, + .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; + } + + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, + .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; + } + + .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, + .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; + } + + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #2e63b8; + } + + .navbar-burger { + display: none; + } + + .navbar-item, + .navbar-link { + align-items: center; + display: flex; + } + + .navbar-item { + display: flex; + } + + .navbar-item.has-dropdown { + align-items: stretch; + } + + .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); + } + + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #dbdbdb; + border-radius: 6px 6px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; + } + + .navbar-item.is-active .navbar-dropdown, + .navbar-item.is-hoverable:focus .navbar-dropdown, + .navbar-item.is-hoverable:focus-within .navbar-dropdown, + .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; + } + + .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, + .navbar-item.is-active .navbar-dropdown.is-boxed, + .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, + .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, + .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, + .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, + .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, + .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); + } + + .navbar-menu { + flex-grow: 1; + flex-shrink: 0; + } + + .navbar-start { + justify-content: flex-start; + margin-right: auto; + } + + .navbar-end { + justify-content: flex-end; + margin-left: auto; + } + + .navbar-dropdown { + background-color: #fff; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 2px solid #dbdbdb; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; + } + + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; + } + + .navbar-dropdown a.navbar-item { + padding-right: 3rem; + } + + .navbar-dropdown a.navbar-item:focus, + .navbar-dropdown a.navbar-item:hover { + background-color: #f5f5f5; + color: #0a0a0a; + } + + .navbar-dropdown a.navbar-item.is-active { + background-color: #f5f5f5; + color: #2e63b8; + } + + .navbar.is-spaced .navbar-dropdown, + .navbar-dropdown.is-boxed { + border-radius: 6px; + border-top: none; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; + } + + .navbar-dropdown.is-right { + left: auto; + right: 0; + } + + .navbar-divider { + display: block; + } + + .navbar>.container .navbar-brand, + .container>.navbar .navbar-brand { + margin-left: -0.75rem; + } + + .navbar>.container .navbar-menu, + .container>.navbar .navbar-menu { + margin-right: -0.75rem; + } + + .navbar.is-fixed-bottom-desktop, + .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + + .navbar.is-fixed-bottom-desktop { + bottom: 0; + } + + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); + } + + .navbar.is-fixed-top-desktop { + top: 0; + } + + html.has-navbar-fixed-top-desktop, + body.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; + } + + html.has-navbar-fixed-bottom-desktop, + body.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; + } + + html.has-spaced-navbar-fixed-top, + body.has-spaced-navbar-fixed-top { + padding-top: 5.25rem; + } + + html.has-spaced-navbar-fixed-bottom, + body.has-spaced-navbar-fixed-bottom { + padding-bottom: 5.25rem; + } + + a.navbar-item.is-active, + .navbar-link.is-active { + color: #0a0a0a; + } + + a.navbar-item.is-active:not(:focus):not(:hover), + .navbar-link.is-active:not(:focus):not(:hover) { + background-color: rgba(0, 0, 0, 0); + } + + .navbar-item.has-dropdown:focus .navbar-link, + .navbar-item.has-dropdown:hover .navbar-link, + .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #fafafa; + } +} + +.hero.is-fullheight-with-navbar { + min-height: calc(100vh - 3.25rem); +} + +.pagination { + font-size: 1rem; + margin: -0.25rem; +} + +.pagination.is-small, +#documenter .docs-sidebar form.docs-search>input.pagination { + font-size: 0.75rem; +} + +.pagination.is-medium { + font-size: 1.25rem; +} + +.pagination.is-large { + font-size: 1.5rem; +} + +.pagination.is-rounded .pagination-previous, +#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous, +.pagination.is-rounded .pagination-next, +#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; +} + +.pagination.is-rounded .pagination-link, +#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link { + border-radius: 290486px; +} + +.pagination, +.pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; +} + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; +} + +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + color: #363636; + min-width: 2.25em; +} + +.pagination-previous:hover, +.pagination-next:hover, +.pagination-link:hover { + border-color: #b5b5b5; + color: #363636; +} + +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus { + border-color: #3c5dcd; +} + +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); +} + +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #6b6b6b; + opacity: 0.5; +} + +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} + +.pagination-link.is-current { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; +} + +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; +} + +.pagination-list { + flex-wrap: wrap; +} + +@media screen and (max-width: 768px) { + .pagination { + flex-wrap: wrap; + } + + .pagination-previous, + .pagination-next { + flex-grow: 1; + flex-shrink: 1; + } + + .pagination-list li { + flex-grow: 1; + flex-shrink: 1; + } +} + +@media screen and (min-width: 769px), +print { + .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; + } + + .pagination-previous { + order: 2; + } + + .pagination-next { + order: 3; + } + + .pagination { + justify-content: space-between; + } + + .pagination.is-centered .pagination-previous { + order: 1; + } + + .pagination.is-centered .pagination-list { + justify-content: center; + order: 2; + } + + .pagination.is-centered .pagination-next { + order: 3; + } + + .pagination.is-right .pagination-previous { + order: 1; + } + + .pagination.is-right .pagination-next { + order: 2; + } + + .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; + } +} + +.panel { + font-size: 1rem; +} + +.panel:not(:last-child) { + margin-bottom: 1.5rem; +} + +.panel-heading, +.panel-tabs, +.panel-block { + border-bottom: 1px solid #dbdbdb; + border-left: 1px solid #dbdbdb; + border-right: 1px solid #dbdbdb; +} + +.panel-heading:first-child, +.panel-tabs:first-child, +.panel-block:first-child { + border-top: 1px solid #dbdbdb; +} + +.panel-heading { + background-color: #f5f5f5; + border-radius: 4px 4px 0 0; + color: #222; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; +} + +.panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; +} + +.panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; +} + +.panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; +} + +.panel-list a { + color: #222; +} + +.panel-list a:hover { + color: #2e63b8; +} + +.panel-block { + align-items: center; + color: #222; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; +} + +.panel-block input[type="checkbox"] { + margin-right: 0.75em; +} + +.panel-block>.control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; +} + +.panel-block.is-wrapped { + flex-wrap: wrap; +} + +.panel-block.is-active { + border-left-color: #2e63b8; + color: #363636; +} + +.panel-block.is-active .panel-icon { + color: #2e63b8; +} + +a.panel-block, +label.panel-block { + cursor: pointer; +} + +a.panel-block:hover, +label.panel-block:hover { + background-color: #f5f5f5; +} + +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #6b6b6b; + margin-right: 0.75em; +} + +.panel-icon .fa { + font-size: inherit; + line-height: inherit; +} + +.tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 1rem; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; +} + +.tabs a { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #222; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; +} + +.tabs a:hover { + border-bottom-color: #222; + color: #222; +} + +.tabs li { + display: block; +} + +.tabs li.is-active a { + border-bottom-color: #2e63b8; + color: #2e63b8; +} + +.tabs ul { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; +} + +.tabs ul.is-left { + padding-right: 0.75em; +} + +.tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; +} + +.tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; +} + +.tabs .icon:first-child { + margin-right: 0.5em; +} + +.tabs .icon:last-child { + margin-left: 0.5em; +} + +.tabs.is-centered ul { + justify-content: center; +} + +.tabs.is-right ul { + justify-content: flex-end; +} + +.tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} + +.tabs.is-boxed a:hover { + background-color: #f5f5f5; + border-bottom-color: #dbdbdb; +} + +.tabs.is-boxed li.is-active a { + background-color: #fff; + border-color: #dbdbdb; + border-bottom-color: rgba(0, 0, 0, 0) !important; +} + +.tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; +} + +.tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; +} + +.tabs.is-toggle a:hover { + background-color: #f5f5f5; + border-color: #b5b5b5; + z-index: 2; +} + +.tabs.is-toggle li+li { + margin-left: -1px; +} + +.tabs.is-toggle li:first-child a { + border-radius: 4px 0 0 4px; +} + +.tabs.is-toggle li:last-child a { + border-radius: 0 4px 4px 0; +} + +.tabs.is-toggle li.is-active a { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; + z-index: 1; +} + +.tabs.is-toggle ul { + border-bottom: none; +} + +.tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; +} + +.tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; +} + +.tabs.is-small, +#documenter .docs-sidebar form.docs-search>input.tabs { + font-size: 0.75rem; +} + +.tabs.is-medium { + font-size: 1.25rem; +} + +.tabs.is-large { + font-size: 1.5rem; +} + +.column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; +} + +.columns.is-mobile>.column.is-narrow { + flex: none; +} + +.columns.is-mobile>.column.is-full { + flex: none; + width: 100%; +} + +.columns.is-mobile>.column.is-three-quarters { + flex: none; + width: 75%; +} + +.columns.is-mobile>.column.is-two-thirds { + flex: none; + width: 66.6666%; +} + +.columns.is-mobile>.column.is-half { + flex: none; + width: 50%; +} + +.columns.is-mobile>.column.is-one-third { + flex: none; + width: 33.3333%; +} + +.columns.is-mobile>.column.is-one-quarter { + flex: none; + width: 25%; +} + +.columns.is-mobile>.column.is-one-fifth { + flex: none; + width: 20%; +} + +.columns.is-mobile>.column.is-two-fifths { + flex: none; + width: 40%; +} + +.columns.is-mobile>.column.is-three-fifths { + flex: none; + width: 60%; +} + +.columns.is-mobile>.column.is-four-fifths { + flex: none; + width: 80%; +} + +.columns.is-mobile>.column.is-offset-three-quarters { + margin-left: 75%; +} + +.columns.is-mobile>.column.is-offset-two-thirds { + margin-left: 66.6666%; +} + +.columns.is-mobile>.column.is-offset-half { + margin-left: 50%; +} + +.columns.is-mobile>.column.is-offset-one-third { + margin-left: 33.3333%; +} + +.columns.is-mobile>.column.is-offset-one-quarter { + margin-left: 25%; +} + +.columns.is-mobile>.column.is-offset-one-fifth { + margin-left: 20%; +} + +.columns.is-mobile>.column.is-offset-two-fifths { + margin-left: 40%; +} + +.columns.is-mobile>.column.is-offset-three-fifths { + margin-left: 60%; +} + +.columns.is-mobile>.column.is-offset-four-fifths { + margin-left: 80%; +} + +.columns.is-mobile>.column.is-0 { + flex: none; + width: 0%; +} + +.columns.is-mobile>.column.is-offset-0 { + margin-left: 0%; +} + +.columns.is-mobile>.column.is-1 { + flex: none; + width: 8.3333333333%; +} + +.columns.is-mobile>.column.is-offset-1 { + margin-left: 8.3333333333%; +} + +.columns.is-mobile>.column.is-2 { + flex: none; + width: 16.6666666667%; +} + +.columns.is-mobile>.column.is-offset-2 { + margin-left: 16.6666666667%; +} + +.columns.is-mobile>.column.is-3 { + flex: none; + width: 25%; +} + +.columns.is-mobile>.column.is-offset-3 { + margin-left: 25%; +} + +.columns.is-mobile>.column.is-4 { + flex: none; + width: 33.3333333333%; +} + +.columns.is-mobile>.column.is-offset-4 { + margin-left: 33.3333333333%; +} + +.columns.is-mobile>.column.is-5 { + flex: none; + width: 41.6666666667%; +} + +.columns.is-mobile>.column.is-offset-5 { + margin-left: 41.6666666667%; +} + +.columns.is-mobile>.column.is-6 { + flex: none; + width: 50%; +} + +.columns.is-mobile>.column.is-offset-6 { + margin-left: 50%; +} + +.columns.is-mobile>.column.is-7 { + flex: none; + width: 58.3333333333%; +} + +.columns.is-mobile>.column.is-offset-7 { + margin-left: 58.3333333333%; +} + +.columns.is-mobile>.column.is-8 { + flex: none; + width: 66.6666666667%; +} + +.columns.is-mobile>.column.is-offset-8 { + margin-left: 66.6666666667%; +} + +.columns.is-mobile>.column.is-9 { + flex: none; + width: 75%; +} + +.columns.is-mobile>.column.is-offset-9 { + margin-left: 75%; +} + +.columns.is-mobile>.column.is-10 { + flex: none; + width: 83.3333333333%; +} + +.columns.is-mobile>.column.is-offset-10 { + margin-left: 83.3333333333%; +} + +.columns.is-mobile>.column.is-11 { + flex: none; + width: 91.6666666667%; +} + +.columns.is-mobile>.column.is-offset-11 { + margin-left: 91.6666666667%; +} + +.columns.is-mobile>.column.is-12 { + flex: none; + width: 100%; +} + +.columns.is-mobile>.column.is-offset-12 { + margin-left: 100%; +} + +@media screen and (max-width: 768px) { + .column.is-narrow-mobile { + flex: none; + } + + .column.is-full-mobile { + flex: none; + width: 100%; + } + + .column.is-three-quarters-mobile { + flex: none; + width: 75%; + } + + .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; + } + + .column.is-half-mobile { + flex: none; + width: 50%; + } + + .column.is-one-third-mobile { + flex: none; + width: 33.3333%; + } + + .column.is-one-quarter-mobile { + flex: none; + width: 25%; + } + + .column.is-one-fifth-mobile { + flex: none; + width: 20%; + } + + .column.is-two-fifths-mobile { + flex: none; + width: 40%; + } + + .column.is-three-fifths-mobile { + flex: none; + width: 60%; + } + + .column.is-four-fifths-mobile { + flex: none; + width: 80%; + } + + .column.is-offset-three-quarters-mobile { + margin-left: 75%; + } + + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; + } + + .column.is-offset-half-mobile { + margin-left: 50%; + } + + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; + } + + .column.is-offset-one-quarter-mobile { + margin-left: 25%; + } + + .column.is-offset-one-fifth-mobile { + margin-left: 20%; + } + + .column.is-offset-two-fifths-mobile { + margin-left: 40%; + } + + .column.is-offset-three-fifths-mobile { + margin-left: 60%; + } + + .column.is-offset-four-fifths-mobile { + margin-left: 80%; + } + + .column.is-0-mobile { + flex: none; + width: 0%; + } + + .column.is-offset-0-mobile { + margin-left: 0%; + } + + .column.is-1-mobile { + flex: none; + width: 8.3333333333%; + } + + .column.is-offset-1-mobile { + margin-left: 8.3333333333%; + } + + .column.is-2-mobile { + flex: none; + width: 16.6666666667%; + } + + .column.is-offset-2-mobile { + margin-left: 16.6666666667%; + } + + .column.is-3-mobile { + flex: none; + width: 25%; + } + + .column.is-offset-3-mobile { + margin-left: 25%; + } + + .column.is-4-mobile { + flex: none; + width: 33.3333333333%; + } + + .column.is-offset-4-mobile { + margin-left: 33.3333333333%; + } + + .column.is-5-mobile { + flex: none; + width: 41.6666666667%; + } + + .column.is-offset-5-mobile { + margin-left: 41.6666666667%; + } + + .column.is-6-mobile { + flex: none; + width: 50%; + } + + .column.is-offset-6-mobile { + margin-left: 50%; + } + + .column.is-7-mobile { + flex: none; + width: 58.3333333333%; + } + + .column.is-offset-7-mobile { + margin-left: 58.3333333333%; + } + + .column.is-8-mobile { + flex: none; + width: 66.6666666667%; + } + + .column.is-offset-8-mobile { + margin-left: 66.6666666667%; + } + + .column.is-9-mobile { + flex: none; + width: 75%; + } + + .column.is-offset-9-mobile { + margin-left: 75%; + } + + .column.is-10-mobile { + flex: none; + width: 83.3333333333%; + } + + .column.is-offset-10-mobile { + margin-left: 83.3333333333%; + } + + .column.is-11-mobile { + flex: none; + width: 91.6666666667%; + } + + .column.is-offset-11-mobile { + margin-left: 91.6666666667%; + } + + .column.is-12-mobile { + flex: none; + width: 100%; + } + + .column.is-offset-12-mobile { + margin-left: 100%; + } +} + +@media screen and (min-width: 769px), +print { + + .column.is-narrow, + .column.is-narrow-tablet { + flex: none; + } + + .column.is-full, + .column.is-full-tablet { + flex: none; + width: 100%; + } + + .column.is-three-quarters, + .column.is-three-quarters-tablet { + flex: none; + width: 75%; + } + + .column.is-two-thirds, + .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; + } + + .column.is-half, + .column.is-half-tablet { + flex: none; + width: 50%; + } + + .column.is-one-third, + .column.is-one-third-tablet { + flex: none; + width: 33.3333%; + } + + .column.is-one-quarter, + .column.is-one-quarter-tablet { + flex: none; + width: 25%; + } + + .column.is-one-fifth, + .column.is-one-fifth-tablet { + flex: none; + width: 20%; + } + + .column.is-two-fifths, + .column.is-two-fifths-tablet { + flex: none; + width: 40%; + } + + .column.is-three-fifths, + .column.is-three-fifths-tablet { + flex: none; + width: 60%; + } + + .column.is-four-fifths, + .column.is-four-fifths-tablet { + flex: none; + width: 80%; + } + + .column.is-offset-three-quarters, + .column.is-offset-three-quarters-tablet { + margin-left: 75%; + } + + .column.is-offset-two-thirds, + .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; + } + + .column.is-offset-half, + .column.is-offset-half-tablet { + margin-left: 50%; + } + + .column.is-offset-one-third, + .column.is-offset-one-third-tablet { + margin-left: 33.3333%; + } + + .column.is-offset-one-quarter, + .column.is-offset-one-quarter-tablet { + margin-left: 25%; + } + + .column.is-offset-one-fifth, + .column.is-offset-one-fifth-tablet { + margin-left: 20%; + } + + .column.is-offset-two-fifths, + .column.is-offset-two-fifths-tablet { + margin-left: 40%; + } + + .column.is-offset-three-fifths, + .column.is-offset-three-fifths-tablet { + margin-left: 60%; + } + + .column.is-offset-four-fifths, + .column.is-offset-four-fifths-tablet { + margin-left: 80%; + } + + .column.is-0, + .column.is-0-tablet { + flex: none; + width: 0%; + } + + .column.is-offset-0, + .column.is-offset-0-tablet { + margin-left: 0%; + } + + .column.is-1, + .column.is-1-tablet { + flex: none; + width: 8.3333333333%; + } + + .column.is-offset-1, + .column.is-offset-1-tablet { + margin-left: 8.3333333333%; + } + + .column.is-2, + .column.is-2-tablet { + flex: none; + width: 16.6666666667%; + } + + .column.is-offset-2, + .column.is-offset-2-tablet { + margin-left: 16.6666666667%; + } + + .column.is-3, + .column.is-3-tablet { + flex: none; + width: 25%; + } + + .column.is-offset-3, + .column.is-offset-3-tablet { + margin-left: 25%; + } + + .column.is-4, + .column.is-4-tablet { + flex: none; + width: 33.3333333333%; + } + + .column.is-offset-4, + .column.is-offset-4-tablet { + margin-left: 33.3333333333%; + } + + .column.is-5, + .column.is-5-tablet { + flex: none; + width: 41.6666666667%; + } + + .column.is-offset-5, + .column.is-offset-5-tablet { + margin-left: 41.6666666667%; + } + + .column.is-6, + .column.is-6-tablet { + flex: none; + width: 50%; + } + + .column.is-offset-6, + .column.is-offset-6-tablet { + margin-left: 50%; + } + + .column.is-7, + .column.is-7-tablet { + flex: none; + width: 58.3333333333%; + } + + .column.is-offset-7, + .column.is-offset-7-tablet { + margin-left: 58.3333333333%; + } + + .column.is-8, + .column.is-8-tablet { + flex: none; + width: 66.6666666667%; + } + + .column.is-offset-8, + .column.is-offset-8-tablet { + margin-left: 66.6666666667%; + } + + .column.is-9, + .column.is-9-tablet { + flex: none; + width: 75%; + } + + .column.is-offset-9, + .column.is-offset-9-tablet { + margin-left: 75%; + } + + .column.is-10, + .column.is-10-tablet { + flex: none; + width: 83.3333333333%; + } + + .column.is-offset-10, + .column.is-offset-10-tablet { + margin-left: 83.3333333333%; + } + + .column.is-11, + .column.is-11-tablet { + flex: none; + width: 91.6666666667%; + } + + .column.is-offset-11, + .column.is-offset-11-tablet { + margin-left: 91.6666666667%; + } + + .column.is-12, + .column.is-12-tablet { + flex: none; + width: 100%; + } + + .column.is-offset-12, + .column.is-offset-12-tablet { + margin-left: 100%; + } +} + +@media screen and (max-width: 1055px) { + .column.is-narrow-touch { + flex: none; + } + + .column.is-full-touch { + flex: none; + width: 100%; + } + + .column.is-three-quarters-touch { + flex: none; + width: 75%; + } + + .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; + } + + .column.is-half-touch { + flex: none; + width: 50%; + } + + .column.is-one-third-touch { + flex: none; + width: 33.3333%; + } + + .column.is-one-quarter-touch { + flex: none; + width: 25%; + } + + .column.is-one-fifth-touch { + flex: none; + width: 20%; + } + + .column.is-two-fifths-touch { + flex: none; + width: 40%; + } + + .column.is-three-fifths-touch { + flex: none; + width: 60%; + } + + .column.is-four-fifths-touch { + flex: none; + width: 80%; + } + + .column.is-offset-three-quarters-touch { + margin-left: 75%; + } + + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; + } + + .column.is-offset-half-touch { + margin-left: 50%; + } + + .column.is-offset-one-third-touch { + margin-left: 33.3333%; + } + + .column.is-offset-one-quarter-touch { + margin-left: 25%; + } + + .column.is-offset-one-fifth-touch { + margin-left: 20%; + } + + .column.is-offset-two-fifths-touch { + margin-left: 40%; + } + + .column.is-offset-three-fifths-touch { + margin-left: 60%; + } + + .column.is-offset-four-fifths-touch { + margin-left: 80%; + } + + .column.is-0-touch { + flex: none; + width: 0%; + } + + .column.is-offset-0-touch { + margin-left: 0%; + } + + .column.is-1-touch { + flex: none; + width: 8.3333333333%; + } + + .column.is-offset-1-touch { + margin-left: 8.3333333333%; + } + + .column.is-2-touch { + flex: none; + width: 16.6666666667%; + } + + .column.is-offset-2-touch { + margin-left: 16.6666666667%; + } + + .column.is-3-touch { + flex: none; + width: 25%; + } + + .column.is-offset-3-touch { + margin-left: 25%; + } + + .column.is-4-touch { + flex: none; + width: 33.3333333333%; + } + + .column.is-offset-4-touch { + margin-left: 33.3333333333%; + } + + .column.is-5-touch { + flex: none; + width: 41.6666666667%; + } + + .column.is-offset-5-touch { + margin-left: 41.6666666667%; + } + + .column.is-6-touch { + flex: none; + width: 50%; + } + + .column.is-offset-6-touch { + margin-left: 50%; + } + + .column.is-7-touch { + flex: none; + width: 58.3333333333%; + } + + .column.is-offset-7-touch { + margin-left: 58.3333333333%; + } + + .column.is-8-touch { + flex: none; + width: 66.6666666667%; + } + + .column.is-offset-8-touch { + margin-left: 66.6666666667%; + } + + .column.is-9-touch { + flex: none; + width: 75%; + } + + .column.is-offset-9-touch { + margin-left: 75%; + } + + .column.is-10-touch { + flex: none; + width: 83.3333333333%; + } + + .column.is-offset-10-touch { + margin-left: 83.3333333333%; + } + + .column.is-11-touch { + flex: none; + width: 91.6666666667%; + } + + .column.is-offset-11-touch { + margin-left: 91.6666666667%; + } + + .column.is-12-touch { + flex: none; + width: 100%; + } + + .column.is-offset-12-touch { + margin-left: 100%; + } +} + +@media screen and (min-width: 1056px) { + .column.is-narrow-desktop { + flex: none; + } + + .column.is-full-desktop { + flex: none; + width: 100%; + } + + .column.is-three-quarters-desktop { + flex: none; + width: 75%; + } + + .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; + } + + .column.is-half-desktop { + flex: none; + width: 50%; + } + + .column.is-one-third-desktop { + flex: none; + width: 33.3333%; + } + + .column.is-one-quarter-desktop { + flex: none; + width: 25%; + } + + .column.is-one-fifth-desktop { + flex: none; + width: 20%; + } + + .column.is-two-fifths-desktop { + flex: none; + width: 40%; + } + + .column.is-three-fifths-desktop { + flex: none; + width: 60%; + } + + .column.is-four-fifths-desktop { + flex: none; + width: 80%; + } + + .column.is-offset-three-quarters-desktop { + margin-left: 75%; + } + + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; + } + + .column.is-offset-half-desktop { + margin-left: 50%; + } + + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; + } + + .column.is-offset-one-quarter-desktop { + margin-left: 25%; + } + + .column.is-offset-one-fifth-desktop { + margin-left: 20%; + } + + .column.is-offset-two-fifths-desktop { + margin-left: 40%; + } + + .column.is-offset-three-fifths-desktop { + margin-left: 60%; + } + + .column.is-offset-four-fifths-desktop { + margin-left: 80%; + } + + .column.is-0-desktop { + flex: none; + width: 0%; + } + + .column.is-offset-0-desktop { + margin-left: 0%; + } + + .column.is-1-desktop { + flex: none; + width: 8.3333333333%; + } + + .column.is-offset-1-desktop { + margin-left: 8.3333333333%; + } + + .column.is-2-desktop { + flex: none; + width: 16.6666666667%; + } + + .column.is-offset-2-desktop { + margin-left: 16.6666666667%; + } + + .column.is-3-desktop { + flex: none; + width: 25%; + } + + .column.is-offset-3-desktop { + margin-left: 25%; + } + + .column.is-4-desktop { + flex: none; + width: 33.3333333333%; + } + + .column.is-offset-4-desktop { + margin-left: 33.3333333333%; + } + + .column.is-5-desktop { + flex: none; + width: 41.6666666667%; + } + + .column.is-offset-5-desktop { + margin-left: 41.6666666667%; + } + + .column.is-6-desktop { + flex: none; + width: 50%; + } + + .column.is-offset-6-desktop { + margin-left: 50%; + } + + .column.is-7-desktop { + flex: none; + width: 58.3333333333%; + } + + .column.is-offset-7-desktop { + margin-left: 58.3333333333%; + } + + .column.is-8-desktop { + flex: none; + width: 66.6666666667%; + } + + .column.is-offset-8-desktop { + margin-left: 66.6666666667%; + } + + .column.is-9-desktop { + flex: none; + width: 75%; + } + + .column.is-offset-9-desktop { + margin-left: 75%; + } + + .column.is-10-desktop { + flex: none; + width: 83.3333333333%; + } + + .column.is-offset-10-desktop { + margin-left: 83.3333333333%; + } + + .column.is-11-desktop { + flex: none; + width: 91.6666666667%; + } + + .column.is-offset-11-desktop { + margin-left: 91.6666666667%; + } + + .column.is-12-desktop { + flex: none; + width: 100%; + } + + .column.is-offset-12-desktop { + margin-left: 100%; + } +} + +@media screen and (min-width: 1216px) { + .column.is-narrow-widescreen { + flex: none; + } + + .column.is-full-widescreen { + flex: none; + width: 100%; + } + + .column.is-three-quarters-widescreen { + flex: none; + width: 75%; + } + + .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; + } + + .column.is-half-widescreen { + flex: none; + width: 50%; + } + + .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; + } + + .column.is-one-quarter-widescreen { + flex: none; + width: 25%; + } + + .column.is-one-fifth-widescreen { + flex: none; + width: 20%; + } + + .column.is-two-fifths-widescreen { + flex: none; + width: 40%; + } + + .column.is-three-fifths-widescreen { + flex: none; + width: 60%; + } + + .column.is-four-fifths-widescreen { + flex: none; + width: 80%; + } + + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; + } + + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; + } + + .column.is-offset-half-widescreen { + margin-left: 50%; + } + + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; + } + + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; + } + + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; + } + + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; + } + + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; + } + + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; + } + + .column.is-0-widescreen { + flex: none; + width: 0%; + } + + .column.is-offset-0-widescreen { + margin-left: 0%; + } + + .column.is-1-widescreen { + flex: none; + width: 8.3333333333%; + } + + .column.is-offset-1-widescreen { + margin-left: 8.3333333333%; + } + + .column.is-2-widescreen { + flex: none; + width: 16.6666666667%; + } + + .column.is-offset-2-widescreen { + margin-left: 16.6666666667%; + } + + .column.is-3-widescreen { + flex: none; + width: 25%; + } + + .column.is-offset-3-widescreen { + margin-left: 25%; + } + + .column.is-4-widescreen { + flex: none; + width: 33.3333333333%; + } + + .column.is-offset-4-widescreen { + margin-left: 33.3333333333%; + } + + .column.is-5-widescreen { + flex: none; + width: 41.6666666667%; + } + + .column.is-offset-5-widescreen { + margin-left: 41.6666666667%; + } + + .column.is-6-widescreen { + flex: none; + width: 50%; + } + + .column.is-offset-6-widescreen { + margin-left: 50%; + } + + .column.is-7-widescreen { + flex: none; + width: 58.3333333333%; + } + + .column.is-offset-7-widescreen { + margin-left: 58.3333333333%; + } + + .column.is-8-widescreen { + flex: none; + width: 66.6666666667%; + } + + .column.is-offset-8-widescreen { + margin-left: 66.6666666667%; + } + + .column.is-9-widescreen { + flex: none; + width: 75%; + } + + .column.is-offset-9-widescreen { + margin-left: 75%; + } + + .column.is-10-widescreen { + flex: none; + width: 83.3333333333%; + } + + .column.is-offset-10-widescreen { + margin-left: 83.3333333333%; + } + + .column.is-11-widescreen { + flex: none; + width: 91.6666666667%; + } + + .column.is-offset-11-widescreen { + margin-left: 91.6666666667%; + } + + .column.is-12-widescreen { + flex: none; + width: 100%; + } + + .column.is-offset-12-widescreen { + margin-left: 100%; + } +} + +@media screen and (min-width: 1408px) { + .column.is-narrow-fullhd { + flex: none; + } + + .column.is-full-fullhd { + flex: none; + width: 100%; + } + + .column.is-three-quarters-fullhd { + flex: none; + width: 75%; + } + + .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; + } + + .column.is-half-fullhd { + flex: none; + width: 50%; + } + + .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; + } + + .column.is-one-quarter-fullhd { + flex: none; + width: 25%; + } + + .column.is-one-fifth-fullhd { + flex: none; + width: 20%; + } + + .column.is-two-fifths-fullhd { + flex: none; + width: 40%; + } + + .column.is-three-fifths-fullhd { + flex: none; + width: 60%; + } + + .column.is-four-fifths-fullhd { + flex: none; + width: 80%; + } + + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; + } + + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; + } + + .column.is-offset-half-fullhd { + margin-left: 50%; + } + + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; + } + + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; + } + + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; + } + + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; + } + + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; + } + + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; + } + + .column.is-0-fullhd { + flex: none; + width: 0%; + } + + .column.is-offset-0-fullhd { + margin-left: 0%; + } + + .column.is-1-fullhd { + flex: none; + width: 8.3333333333%; + } + + .column.is-offset-1-fullhd { + margin-left: 8.3333333333%; + } + + .column.is-2-fullhd { + flex: none; + width: 16.6666666667%; + } + + .column.is-offset-2-fullhd { + margin-left: 16.6666666667%; + } + + .column.is-3-fullhd { + flex: none; + width: 25%; + } + + .column.is-offset-3-fullhd { + margin-left: 25%; + } + + .column.is-4-fullhd { + flex: none; + width: 33.3333333333%; + } + + .column.is-offset-4-fullhd { + margin-left: 33.3333333333%; + } + + .column.is-5-fullhd { + flex: none; + width: 41.6666666667%; + } + + .column.is-offset-5-fullhd { + margin-left: 41.6666666667%; + } + + .column.is-6-fullhd { + flex: none; + width: 50%; + } + + .column.is-offset-6-fullhd { + margin-left: 50%; + } + + .column.is-7-fullhd { + flex: none; + width: 58.3333333333%; + } + + .column.is-offset-7-fullhd { + margin-left: 58.3333333333%; + } + + .column.is-8-fullhd { + flex: none; + width: 66.6666666667%; + } + + .column.is-offset-8-fullhd { + margin-left: 66.6666666667%; + } + + .column.is-9-fullhd { + flex: none; + width: 75%; + } + + .column.is-offset-9-fullhd { + margin-left: 75%; + } + + .column.is-10-fullhd { + flex: none; + width: 83.3333333333%; + } + + .column.is-offset-10-fullhd { + margin-left: 83.3333333333%; + } + + .column.is-11-fullhd { + flex: none; + width: 91.6666666667%; + } + + .column.is-offset-11-fullhd { + margin-left: 91.6666666667%; + } + + .column.is-12-fullhd { + flex: none; + width: 100%; + } + + .column.is-offset-12-fullhd { + margin-left: 100%; + } +} + +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} + +.columns:last-child { + margin-bottom: -0.75rem; +} + +.columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); +} + +.columns.is-centered { + justify-content: center; +} + +.columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; +} + +.columns.is-gapless>.column { + margin: 0; + padding: 0 !important; +} + +.columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; +} + +.columns.is-gapless:last-child { + margin-bottom: 0; +} + +.columns.is-mobile { + display: flex; +} + +.columns.is-multiline { + flex-wrap: wrap; +} + +.columns.is-vcentered { + align-items: center; +} + +@media screen and (min-width: 769px), +print { + .columns:not(.is-desktop) { + display: flex; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-desktop { + display: flex; + } +} + +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); +} + +.columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); +} + +.columns.is-variable.is-0 { + --columnGap: 0rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-0-mobile { + --columnGap: 0rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-0-tablet { + --columnGap: 0rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-0-touch { + --columnGap: 0rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-0-desktop { + --columnGap: 0rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; + } +} + +.columns.is-variable.is-1 { + --columnGap: 0.25rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; + } +} + +.columns.is-variable.is-2 { + --columnGap: 0.5rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; + } +} + +.columns.is-variable.is-3 { + --columnGap: 0.75rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; + } +} + +.columns.is-variable.is-4 { + --columnGap: 1rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-4-mobile { + --columnGap: 1rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-4-tablet { + --columnGap: 1rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-4-touch { + --columnGap: 1rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-4-desktop { + --columnGap: 1rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; + } +} + +.columns.is-variable.is-5 { + --columnGap: 1.25rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; + } +} + +.columns.is-variable.is-6 { + --columnGap: 1.5rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; + } +} + +.columns.is-variable.is-7 { + --columnGap: 1.75rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; + } +} + +.columns.is-variable.is-8 { + --columnGap: 2rem; +} + +@media screen and (max-width: 768px) { + .columns.is-variable.is-8-mobile { + --columnGap: 2rem; + } +} + +@media screen and (min-width: 769px), +print { + .columns.is-variable.is-8-tablet { + --columnGap: 2rem; + } +} + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; + } +} + +@media screen and (max-width: 1055px) { + .columns.is-variable.is-8-touch { + --columnGap: 2rem; + } +} + +@media screen and (min-width: 1056px) { + .columns.is-variable.is-8-desktop { + --columnGap: 2rem; + } +} + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; + } +} + +@media screen and (min-width: 1216px) { + .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; + } +} + +@media screen and (min-width: 1408px) { + .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; + } +} + +.tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; +} + +.tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} + +.tile.is-ancestor:last-child { + margin-bottom: -0.75rem; +} + +.tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; +} + +.tile.is-child { + margin: 0 !important; +} + +.tile.is-parent { + padding: 0.75rem; +} + +.tile.is-vertical { + flex-direction: column; +} + +.tile.is-vertical>.tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; +} + +@media screen and (min-width: 769px), +print { + .tile:not(.is-child) { + display: flex; + } + + .tile.is-1 { + flex: none; + width: 8.3333333333%; + } + + .tile.is-2 { + flex: none; + width: 16.6666666667%; + } + + .tile.is-3 { + flex: none; + width: 25%; + } + + .tile.is-4 { + flex: none; + width: 33.3333333333%; + } + + .tile.is-5 { + flex: none; + width: 41.6666666667%; + } + + .tile.is-6 { + flex: none; + width: 50%; + } + + .tile.is-7 { + flex: none; + width: 58.3333333333%; + } + + .tile.is-8 { + flex: none; + width: 66.6666666667%; + } + + .tile.is-9 { + flex: none; + width: 75%; + } + + .tile.is-10 { + flex: none; + width: 83.3333333333%; + } + + .tile.is-11 { + flex: none; + width: 91.6666666667%; + } + + .tile.is-12 { + flex: none; + width: 100%; + } +} + +.hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.hero .navbar { + background: none; +} + +.hero .tabs ul { + border-bottom: none; +} + +.hero.is-white { + background-color: #fff; + color: #0a0a0a; +} + +.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-white strong { + color: inherit; +} + +.hero.is-white .title { + color: #0a0a0a; +} + +.hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); +} + +.hero.is-white .subtitle a:not(.button), +.hero.is-white .subtitle strong { + color: #0a0a0a; +} + +@media screen and (max-width: 1055px) { + .hero.is-white .navbar-menu { + background-color: #fff; + } +} + +.hero.is-white .navbar-item, +.hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); +} + +.hero.is-white a.navbar-item:hover, +.hero.is-white a.navbar-item.is-active, +.hero.is-white .navbar-link:hover, +.hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; +} + +.hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; +} + +.hero.is-white .tabs a:hover { + opacity: 1; +} + +.hero.is-white .tabs li.is-active a { + opacity: 1; +} + +.hero.is-white .tabs.is-boxed a, +.hero.is-white .tabs.is-toggle a { + color: #0a0a0a; +} + +.hero.is-white .tabs.is-boxed a:hover, +.hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-white .tabs.is-boxed li.is-active a, +.hero.is-white .tabs.is-boxed li.is-active a:hover, +.hero.is-white .tabs.is-toggle li.is-active a, +.hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff; +} + +.hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%); + } +} + +.hero.is-black { + background-color: #0a0a0a; + color: #fff; +} + +.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-black strong { + color: inherit; +} + +.hero.is-black .title { + color: #fff; +} + +.hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-black .subtitle a:not(.button), +.hero.is-black .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1055px) { + .hero.is-black .navbar-menu { + background-color: #0a0a0a; + } +} + +.hero.is-black .navbar-item, +.hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-black a.navbar-item:hover, +.hero.is-black a.navbar-item.is-active, +.hero.is-black .navbar-link:hover, +.hero.is-black .navbar-link.is-active { + background-color: #000; + color: #fff; +} + +.hero.is-black .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-black .tabs a:hover { + opacity: 1; +} + +.hero.is-black .tabs li.is-active a { + opacity: 1; +} + +.hero.is-black .tabs.is-boxed a, +.hero.is-black .tabs.is-toggle a { + color: #fff; +} + +.hero.is-black .tabs.is-boxed a:hover, +.hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-black .tabs.is-boxed li.is-active a, +.hero.is-black .tabs.is-boxed li.is-active a:hover, +.hero.is-black .tabs.is-toggle li.is-active a, +.hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #0a0a0a; +} + +.hero.is-black.is-bold { + background-image: linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, + #000 0%, + #0a0a0a 71%, + #181616 100%); + } +} + +.hero.is-light { + background-color: #f5f5f5; + color: #363636; +} + +.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-light strong { + color: inherit; +} + +.hero.is-light .title { + color: #363636; +} + +.hero.is-light .subtitle { + color: rgba(54, 54, 54, 0.9); +} + +.hero.is-light .subtitle a:not(.button), +.hero.is-light .subtitle strong { + color: #363636; +} + +@media screen and (max-width: 1055px) { + .hero.is-light .navbar-menu { + background-color: #f5f5f5; + } +} + +.hero.is-light .navbar-item, +.hero.is-light .navbar-link { + color: rgba(54, 54, 54, 0.7); +} + +.hero.is-light a.navbar-item:hover, +.hero.is-light a.navbar-item.is-active, +.hero.is-light .navbar-link:hover, +.hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; +} + +.hero.is-light .tabs a { + color: #363636; + opacity: 0.9; +} + +.hero.is-light .tabs a:hover { + opacity: 1; +} + +.hero.is-light .tabs li.is-active a { + opacity: 1; +} + +.hero.is-light .tabs.is-boxed a, +.hero.is-light .tabs.is-toggle a { + color: #363636; +} + +.hero.is-light .tabs.is-boxed a:hover, +.hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-light .tabs.is-boxed li.is-active a, +.hero.is-light .tabs.is-boxed li.is-active a:hover, +.hero.is-light .tabs.is-toggle li.is-active a, +.hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: #f5f5f5; +} + +.hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, + #dfd8d9 0%, + #f5f5f5 71%, + #fff 100%); + } +} + +.hero.is-dark, +.content kbd.hero { + background-color: #363636; + color: #f5f5f5; +} + +.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-dark strong, +.content kbd.hero strong { + color: inherit; +} + +.hero.is-dark .title, +.content kbd.hero .title { + color: #f5f5f5; +} + +.hero.is-dark .subtitle, +.content kbd.hero .subtitle { + color: rgba(245, 245, 245, 0.9); +} + +.hero.is-dark .subtitle a:not(.button), +.content kbd.hero .subtitle a:not(.button), +.hero.is-dark .subtitle strong, +.content kbd.hero .subtitle strong { + color: #f5f5f5; +} + +@media screen and (max-width: 1055px) { + + .hero.is-dark .navbar-menu, + .content kbd.hero .navbar-menu { + background-color: #363636; + } +} + +.hero.is-dark .navbar-item, +.content kbd.hero .navbar-item, +.hero.is-dark .navbar-link, +.content kbd.hero .navbar-link { + color: rgba(245, 245, 245, 0.7); +} + +.hero.is-dark a.navbar-item:hover, +.content kbd.hero a.navbar-item:hover, +.hero.is-dark a.navbar-item.is-active, +.content kbd.hero a.navbar-item.is-active, +.hero.is-dark .navbar-link:hover, +.content kbd.hero .navbar-link:hover, +.hero.is-dark .navbar-link.is-active, +.content kbd.hero .navbar-link.is-active { + background-color: #292929; + color: #f5f5f5; +} + +.hero.is-dark .tabs a, +.content kbd.hero .tabs a { + color: #f5f5f5; + opacity: 0.9; +} + +.hero.is-dark .tabs a:hover, +.content kbd.hero .tabs a:hover { + opacity: 1; +} + +.hero.is-dark .tabs li.is-active a, +.content kbd.hero .tabs li.is-active a { + opacity: 1; +} + +.hero.is-dark .tabs.is-boxed a, +.content kbd.hero .tabs.is-boxed a, +.hero.is-dark .tabs.is-toggle a, +.content kbd.hero .tabs.is-toggle a { + color: #f5f5f5; +} + +.hero.is-dark .tabs.is-boxed a:hover, +.content kbd.hero .tabs.is-boxed a:hover, +.hero.is-dark .tabs.is-toggle a:hover, +.content kbd.hero .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-dark .tabs.is-boxed li.is-active a, +.content kbd.hero .tabs.is-boxed li.is-active a, +.hero.is-dark .tabs.is-boxed li.is-active a:hover, +.hero.is-dark .tabs.is-toggle li.is-active a, +.content kbd.hero .tabs.is-toggle li.is-active a, +.hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: #363636; +} + +.hero.is-dark.is-bold, +.content kbd.hero.is-bold { + background-image: linear-gradient(141deg, + #1f191a 0%, + #363636 71%, + #46403f 100%); +} + +@media screen and (max-width: 768px) { + + .hero.is-dark.is-bold .navbar-menu, + .content kbd.hero.is-bold .navbar-menu { + background-image: linear-gradient(141deg, + #1f191a 0%, + #363636 71%, + #46403f 100%); + } +} + +.hero.is-primary, +.docstring>section>a.hero.docs-sourcelink { + background-color: #4eb5de; + color: #fff; +} + +.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-primary strong, +.docstring>section>a.hero.docs-sourcelink strong { + color: inherit; +} + +.hero.is-primary .title, +.docstring>section>a.hero.docs-sourcelink .title { + color: #fff; +} + +.hero.is-primary .subtitle, +.docstring>section>a.hero.docs-sourcelink .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-primary .subtitle a:not(.button), +.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button), +.hero.is-primary .subtitle strong, +.docstring>section>a.hero.docs-sourcelink .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1055px) { + + .hero.is-primary .navbar-menu, + .docstring>section>a.hero.docs-sourcelink .navbar-menu { + background-color: #4eb5de; + } +} + +.hero.is-primary .navbar-item, +.docstring>section>a.hero.docs-sourcelink .navbar-item, +.hero.is-primary .navbar-link, +.docstring>section>a.hero.docs-sourcelink .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-primary a.navbar-item:hover, +.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover, +.hero.is-primary a.navbar-item.is-active, +.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active, +.hero.is-primary .navbar-link:hover, +.docstring>section>a.hero.docs-sourcelink .navbar-link:hover, +.hero.is-primary .navbar-link.is-active, +.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active { + background-color: #39acda; + color: #fff; +} + +.hero.is-primary .tabs a, +.docstring>section>a.hero.docs-sourcelink .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-primary .tabs a:hover, +.docstring>section>a.hero.docs-sourcelink .tabs a:hover { + opacity: 1; +} + +.hero.is-primary .tabs li.is-active a, +.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a { + opacity: 1; +} + +.hero.is-primary .tabs.is-boxed a, +.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a, +.hero.is-primary .tabs.is-toggle a, +.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a { + color: #fff; +} + +.hero.is-primary .tabs.is-boxed a:hover, +.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover, +.hero.is-primary .tabs.is-toggle a:hover, +.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-primary .tabs.is-boxed li.is-active a, +.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, +.hero.is-primary .tabs.is-boxed li.is-active a:hover, +.hero.is-primary .tabs.is-toggle li.is-active a, +.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, +.hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #4eb5de; +} + +.hero.is-primary.is-bold, +.docstring>section>a.hero.is-bold.docs-sourcelink { + background-image: linear-gradient(141deg, + #1bc7de 0%, + #4eb5de 71%, + #5fa9e7 100%); +} + +@media screen and (max-width: 768px) { + + .hero.is-primary.is-bold .navbar-menu, + .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu { + background-image: linear-gradient(141deg, + #1bc7de 0%, + #4eb5de 71%, + #5fa9e7 100%); + } +} + +.hero.is-link { + background-color: #2e63b8; + color: #fff; +} + +.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-link strong { + color: inherit; +} + +.hero.is-link .title { + color: #fff; +} + +.hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-link .subtitle a:not(.button), +.hero.is-link .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1055px) { + .hero.is-link .navbar-menu { + background-color: #2e63b8; + } +} + +.hero.is-link .navbar-item, +.hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-link a.navbar-item:hover, +.hero.is-link a.navbar-item.is-active, +.hero.is-link .navbar-link:hover, +.hero.is-link .navbar-link.is-active { + background-color: #2958a4; + color: #fff; +} + +.hero.is-link .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-link .tabs a:hover { + opacity: 1; +} + +.hero.is-link .tabs li.is-active a { + opacity: 1; +} + +.hero.is-link .tabs.is-boxed a, +.hero.is-link .tabs.is-toggle a { + color: #fff; +} + +.hero.is-link .tabs.is-boxed a:hover, +.hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-link .tabs.is-boxed li.is-active a, +.hero.is-link .tabs.is-boxed li.is-active a:hover, +.hero.is-link .tabs.is-toggle li.is-active a, +.hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #2e63b8; +} + +.hero.is-link.is-bold { + background-image: linear-gradient(141deg, + #1b6098 0%, + #2e63b8 71%, + #2d51d2 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, + #1b6098 0%, + #2e63b8 71%, + #2d51d2 100%); + } +} + +.hero.is-info { + background-color: #209cee; + color: #fff; +} + +.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-info strong { + color: inherit; +} + +.hero.is-info .title { + color: #fff; +} + +.hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-info .subtitle a:not(.button), +.hero.is-info .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1055px) { + .hero.is-info .navbar-menu { + background-color: #209cee; + } +} + +.hero.is-info .navbar-item, +.hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-info a.navbar-item:hover, +.hero.is-info a.navbar-item.is-active, +.hero.is-info .navbar-link:hover, +.hero.is-info .navbar-link.is-active { + background-color: #1190e3; + color: #fff; +} + +.hero.is-info .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-info .tabs a:hover { + opacity: 1; +} + +.hero.is-info .tabs li.is-active a { + opacity: 1; +} + +.hero.is-info .tabs.is-boxed a, +.hero.is-info .tabs.is-toggle a { + color: #fff; +} + +.hero.is-info .tabs.is-boxed a:hover, +.hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-info .tabs.is-boxed li.is-active a, +.hero.is-info .tabs.is-boxed li.is-active a:hover, +.hero.is-info .tabs.is-toggle li.is-active a, +.hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #209cee; +} + +.hero.is-info.is-bold { + background-image: linear-gradient(141deg, + #05a6d6 0%, + #209cee 71%, + #3287f5 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, + #05a6d6 0%, + #209cee 71%, + #3287f5 100%); + } +} + +.hero.is-success { + background-color: #22c35b; + color: #fff; +} + +.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-success strong { + color: inherit; +} + +.hero.is-success .title { + color: #fff; +} + +.hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-success .subtitle a:not(.button), +.hero.is-success .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1055px) { + .hero.is-success .navbar-menu { + background-color: #22c35b; + } +} + +.hero.is-success .navbar-item, +.hero.is-success .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-success a.navbar-item:hover, +.hero.is-success a.navbar-item.is-active, +.hero.is-success .navbar-link:hover, +.hero.is-success .navbar-link.is-active { + background-color: #1ead51; + color: #fff; +} + +.hero.is-success .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-success .tabs a:hover { + opacity: 1; +} + +.hero.is-success .tabs li.is-active a { + opacity: 1; +} + +.hero.is-success .tabs.is-boxed a, +.hero.is-success .tabs.is-toggle a { + color: #fff; +} + +.hero.is-success .tabs.is-boxed a:hover, +.hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-success .tabs.is-boxed li.is-active a, +.hero.is-success .tabs.is-boxed li.is-active a:hover, +.hero.is-success .tabs.is-toggle li.is-active a, +.hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #22c35b; +} + +.hero.is-success.is-bold { + background-image: linear-gradient(141deg, + #12a02c 0%, + #22c35b 71%, + #1fdf83 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, + #12a02c 0%, + #22c35b 71%, + #1fdf83 100%); + } +} + +.hero.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-warning strong { + color: inherit; +} + +.hero.is-warning .title { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .subtitle { + color: rgba(0, 0, 0, 0.9); +} + +.hero.is-warning .subtitle a:not(.button), +.hero.is-warning .subtitle strong { + color: rgba(0, 0, 0, 0.7); +} + +@media screen and (max-width: 1055px) { + .hero.is-warning .navbar-menu { + background-color: #ffdd57; + } +} + +.hero.is-warning .navbar-item, +.hero.is-warning .navbar-link { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning a.navbar-item:hover, +.hero.is-warning a.navbar-item.is-active, +.hero.is-warning .navbar-link:hover, +.hero.is-warning .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; +} + +.hero.is-warning .tabs a:hover { + opacity: 1; +} + +.hero.is-warning .tabs li.is-active a { + opacity: 1; +} + +.hero.is-warning .tabs.is-boxed a, +.hero.is-warning .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .tabs.is-boxed a:hover, +.hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-warning .tabs.is-boxed li.is-active a, +.hero.is-warning .tabs.is-boxed li.is-active a:hover, +.hero.is-warning .tabs.is-toggle li.is-active a, +.hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.hero.is-warning.is-bold { + background-image: linear-gradient(141deg, + #ffae24 0%, + #ffdd57 71%, + #fffa71 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, + #ffae24 0%, + #ffdd57 71%, + #fffa71 100%); + } +} + +.hero.is-danger { + background-color: #da0b00; + color: #fff; +} + +.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), +.hero.is-danger strong { + color: inherit; +} + +.hero.is-danger .title { + color: #fff; +} + +.hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-danger .subtitle a:not(.button), +.hero.is-danger .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1055px) { + .hero.is-danger .navbar-menu { + background-color: #da0b00; + } +} + +.hero.is-danger .navbar-item, +.hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-danger a.navbar-item:hover, +.hero.is-danger a.navbar-item.is-active, +.hero.is-danger .navbar-link:hover, +.hero.is-danger .navbar-link.is-active { + background-color: #c10a00; + color: #fff; +} + +.hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-danger .tabs a:hover { + opacity: 1; +} + +.hero.is-danger .tabs li.is-active a { + opacity: 1; +} + +.hero.is-danger .tabs.is-boxed a, +.hero.is-danger .tabs.is-toggle a { + color: #fff; +} + +.hero.is-danger .tabs.is-boxed a:hover, +.hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-danger .tabs.is-boxed li.is-active a, +.hero.is-danger .tabs.is-boxed li.is-active a:hover, +.hero.is-danger .tabs.is-toggle li.is-active a, +.hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #da0b00; +} + +.hero.is-danger.is-bold { + background-image: linear-gradient(141deg, + #a70013 0%, + #da0b00 71%, + #f43500 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, + #a70013 0%, + #da0b00 71%, + #f43500 100%); + } +} + +.hero.is-small .hero-body, +#documenter .docs-sidebar form.docs-search>input.hero .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; +} + +@media screen and (min-width: 769px), +print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; + } +} + +@media screen and (min-width: 769px), +print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; + } +} + +.hero.is-halfheight .hero-body, +.hero.is-fullheight .hero-body, +.hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; +} + +.hero.is-halfheight .hero-body>.container, +.hero.is-fullheight .hero-body>.container, +.hero.is-fullheight-with-navbar .hero-body>.container { + flex-grow: 1; + flex-shrink: 1; +} + +.hero.is-halfheight { + min-height: 50vh; +} + +.hero.is-fullheight { + min-height: 100vh; +} + +.hero-video { + overflow: hidden; +} + +.hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); +} + +.hero-video.is-transparent { + opacity: 0.3; +} + +@media screen and (max-width: 768px) { + .hero-video { + display: none; + } +} + +.hero-buttons { + margin-top: 1.5rem; +} + +@media screen and (max-width: 768px) { + .hero-buttons .button { + display: flex; + } + + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; + } +} + +@media screen and (min-width: 769px), +print { + .hero-buttons { + display: flex; + justify-content: center; + } + + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; + } +} + +.hero-head, +.hero-foot { + flex-grow: 0; + flex-shrink: 0; +} + +.hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; +} + +.section { + padding: 3rem 1.5rem; +} + +@media screen and (min-width: 1056px) { + .section.is-medium { + padding: 9rem 1.5rem; + } + + .section.is-large { + padding: 18rem 1.5rem; + } +} + +.footer { + background-color: #fafafa; + padding: 3rem 1.5rem 6rem; +} + +h1 .docs-heading-anchor, +h1 .docs-heading-anchor:hover, +h1 .docs-heading-anchor:visited, +h2 .docs-heading-anchor, +h2 .docs-heading-anchor:hover, +h2 .docs-heading-anchor:visited, +h3 .docs-heading-anchor, +h3 .docs-heading-anchor:hover, +h3 .docs-heading-anchor:visited, +h4 .docs-heading-anchor, +h4 .docs-heading-anchor:hover, +h4 .docs-heading-anchor:visited, +h5 .docs-heading-anchor, +h5 .docs-heading-anchor:hover, +h5 .docs-heading-anchor:visited, +h6 .docs-heading-anchor, +h6 .docs-heading-anchor:hover, +h6 .docs-heading-anchor:visited { + color: #222; +} + +h1 .docs-heading-anchor-permalink, +h2 .docs-heading-anchor-permalink, +h3 .docs-heading-anchor-permalink, +h4 .docs-heading-anchor-permalink, +h5 .docs-heading-anchor-permalink, +h6 .docs-heading-anchor-permalink { + visibility: hidden; + vertical-align: middle; + margin-left: 0.5em; + font-size: 0.7rem; +} + +h1 .docs-heading-anchor-permalink::before, +h2 .docs-heading-anchor-permalink::before, +h3 .docs-heading-anchor-permalink::before, +h4 .docs-heading-anchor-permalink::before, +h5 .docs-heading-anchor-permalink::before, +h6 .docs-heading-anchor-permalink::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0c1"; +} + +h1:hover .docs-heading-anchor-permalink, +h2:hover .docs-heading-anchor-permalink, +h3:hover .docs-heading-anchor-permalink, +h4:hover .docs-heading-anchor-permalink, +h5:hover .docs-heading-anchor-permalink, +h6:hover .docs-heading-anchor-permalink { + visibility: visible; +} + +.docs-dark-only { + display: none !important; +} + +pre { + position: relative; + overflow: hidden; +} + +pre code, +pre code.hljs { + padding: 0 0.75rem !important; + overflow: auto; + display: block; +} + +pre code:first-of-type, +pre code.hljs:first-of-type { + padding-top: 0.5rem !important; +} + +pre code:last-of-type, +pre code.hljs:last-of-type { + padding-bottom: 0.5rem !important; +} + +pre .copy-button { + opacity: 0.2; + transition: opacity 0.2s; + position: absolute; + right: 0em; + top: 0em; + padding: 0.5em; + width: 2.5em; + height: 2.5em; + background: transparent; + border: none; + font-family: "Font Awesome 5 Free"; + color: #222; + cursor: pointer; + text-align: center; +} + +pre .copy-button:focus, +pre .copy-button:hover { + opacity: 1; + background: rgba(34, 34, 34, 0.1); + color: #2e63b8; +} + +pre .copy-button.success { + color: #259a12; + opacity: 1; +} + +pre .copy-button.error { + color: #cb3c33; + opacity: 1; +} + +pre:hover .copy-button { + opacity: 1; +} + +.admonition { + background-color: #b5b5b5; + border-style: solid; + border-width: 1px; + border-color: #363636; + border-radius: 4px; + font-size: 1rem; +} + +.admonition strong { + color: currentColor; +} + +.admonition.is-small, +#documenter .docs-sidebar form.docs-search>input.admonition { + font-size: 0.75rem; +} + +.admonition.is-medium { + font-size: 1.25rem; +} + +.admonition.is-large { + font-size: 1.5rem; +} + +.admonition.is-default { + background-color: #b5b5b5; + border-color: #363636; +} + +.admonition.is-default>.admonition-header { + background-color: #363636; + color: #fff; +} + +.admonition.is-default>.admonition-body { + color: #fff; +} + +.admonition.is-info { + background-color: #def0fc; + border-color: #209cee; +} + +.admonition.is-info>.admonition-header { + background-color: #209cee; + color: #fff; +} + +.admonition.is-info>.admonition-body { + color: rgba(0, 0, 0, 0.7); +} + +.admonition.is-success { + background-color: #bdf4d1; + border-color: #22c35b; +} + +.admonition.is-success>.admonition-header { + background-color: #22c35b; + color: #fff; +} + +.admonition.is-success>.admonition-body { + color: rgba(0, 0, 0, 0.7); +} + +.admonition.is-warning { + background-color: #fff3c5; + border-color: #ffdd57; +} + +.admonition.is-warning>.admonition-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.admonition.is-warning>.admonition-body { + color: rgba(0, 0, 0, 0.7); +} + +.admonition.is-danger { + background-color: #ffaba7; + border-color: #da0b00; +} + +.admonition.is-danger>.admonition-header { + background-color: #da0b00; + color: #fff; +} + +.admonition.is-danger>.admonition-body { + color: rgba(0, 0, 0, 0.7); +} + +.admonition.is-compat { + background-color: #bdeff5; + border-color: #1db5c9; +} + +.admonition.is-compat>.admonition-header { + background-color: #1db5c9; + color: #fff; +} + +.admonition.is-compat>.admonition-body { + color: rgba(0, 0, 0, 0.7); +} + +.admonition-header { + color: #fff; + background-color: #363636; + align-items: center; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.5rem 0.75rem; + position: relative; +} + +.admonition-header:before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 0.75rem; + content: "\f06a"; +} + +.admonition-header { + border-top-left-radius: 14px !important; + border-top-right-radius: 14px !important; +} + +.admonition-body { + color: #222; + padding: 0.5rem 0.75rem; +} + +.admonition-body pre { + background-color: #f5f5f5; +} + +.admonition-body code { + background-color: rgba(0, 0, 0, 0.05); +} + +.docstring { + margin-bottom: 1em; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #dbdbdb; + box-shadow: 2px 2px 3px rgba(10, 10, 10, 0.1); + max-width: 100%; +} + +.docstring>header { + display: flex; + flex-grow: 1; + gap: 1rem; + align-items: center; + padding: 0.5rem 0.75rem; + background-color: #f5f5f5; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: none; + border-bottom: 1px solid #dbdbdb; +} + +.docstring>header code { + background-color: transparent; +} + +.docstring>header .docstring-binding { + margin-right: 0.3em; +} + +.docstring>header .docstring-category { + margin-left: 0.3em; +} + +.docstring>section { + position: relative; + padding: 0.75rem 0.75rem; + border-bottom: 1px solid #dbdbdb; +} + +.docstring>section:last-child { + border-bottom: none; +} + +.docstring>section>a.docs-sourcelink { + transition: opacity 0.3s; + opacity: 0; + position: absolute; + right: 0.375rem; + bottom: 0.375rem; +} + +.docstring>section>a.docs-sourcelink:focus { + opacity: 1 !important; +} + +.docstring:hover>section>a.docs-sourcelink { + opacity: 0.2; +} + +.docstring:focus-within>section>a.docs-sourcelink { + opacity: 0.2; +} + +.docstring>section:hover a.docs-sourcelink { + opacity: 1; +} + +.documenter-example-output { + background-color: #fff; +} + +.outdated-warning-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + z-index: 999; + background-color: #ffaba7; + color: rgba(0, 0, 0, 0.7); + border-bottom: 3px solid #da0b00; + padding: 10px 35px; + text-align: center; + font-size: 15px; +} + +.outdated-warning-overlay .outdated-warning-closer { + position: absolute; + top: calc(50% - 10px); + right: 18px; + cursor: pointer; + width: 12px; +} + +.outdated-warning-overlay a { + color: #2e63b8; +} + +.outdated-warning-overlay a:hover { + color: #363636; +} + +.content pre { + border: 1px solid #dbdbdb; +} + +.content code { + font-weight: inherit; +} + +.content a code { + color: #2e63b8; +} + +.content h1 code, +.content h2 code, +.content h3 code, +.content h4 code, +.content h5 code, +.content h6 code { + color: #222; +} + +.content table { + display: block; + width: initial; + max-width: 100%; + overflow-x: auto; +} + +.content blockquote>ul:first-child, +.content blockquote>ol:first-child, +.content .admonition-body>ul:first-child, +.content .admonition-body>ol:first-child { + margin-top: 0; +} + +pre, +code { + font-variant-ligatures: no-contextual; +} + +.breadcrumb a.is-disabled { + cursor: default; + pointer-events: none; +} + +.breadcrumb a.is-disabled, +.breadcrumb a.is-disabled:hover { + color: #222; +} + +.hljs { + background: initial !important; +} + +.katex .katex-mathml { + top: 0; + right: 0; +} + +.katex-display, +mjx-container, +.MathJax_Display { + margin: 0.5em 0 !important; +} + +html { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; +} + +li.no-marker { + list-style: none; +} + +#documenter .docs-main>article { + overflow-wrap: break-word; +} + +#documenter .docs-main>article .math-container { + overflow-x: auto; + overflow-y: hidden; +} + +@media screen and (min-width: 1056px) { + #documenter .docs-main { + max-width: 60rem; + margin-left: 20rem; + padding-right: 1rem; + } +} + +@media screen and (max-width: 1055px) { + #documenter .docs-main { + width: 100%; + } + + #documenter .docs-main>article { + max-width: 60rem; + margin-left: auto; + margin-right: auto; + margin-bottom: 1rem; + padding: 0 1rem; + } + + #documenter .docs-main>header, + #documenter .docs-main>nav { + max-width: 100%; + width: 100%; + margin: 0; + } +} + +#documenter .docs-main header.docs-navbar { + background-color: #fff; + border-bottom: 1px solid #dbdbdb; + z-index: 2; + min-height: 4rem; + margin-bottom: 1rem; + display: flex; +} + +#documenter .docs-main header.docs-navbar .breadcrumb { + flex-grow: 1; +} + +#documenter .docs-main header.docs-navbar .docs-right { + display: flex; + white-space: nowrap; +} + +#documenter .docs-main header.docs-navbar .docs-right .docs-icon, +#documenter .docs-main header.docs-navbar .docs-right .docs-label, +#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + display: inline-block; +} + +#documenter .docs-main header.docs-navbar .docs-right .docs-label { + padding: 0; + margin-left: 0.3em; +} + +#documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { + margin: auto 0 auto 1rem; +} + +#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + font-size: 1.5rem; + margin: auto 0 auto 1rem; +} + +#documenter .docs-main header.docs-navbar>* { + margin: auto 0; +} + +@media screen and (max-width: 1055px) { + #documenter .docs-main header.docs-navbar { + position: sticky; + top: 0; + padding: 0 1rem; + transition-property: top, box-shadow; + -webkit-transition-property: top, box-shadow; + transition-duration: 0.3s; + -webkit-transition-duration: 0.3s; + } + + #documenter .docs-main header.docs-navbar.headroom--not-top { + box-shadow: 0.2rem 0rem 0.4rem #bbb; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + } + + #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { + top: -4.5rem; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + } +} + +#documenter .docs-main section.footnotes { + border-top: 1px solid #dbdbdb; +} + +#documenter .docs-main section.footnotes li .tag:first-child, +#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child, +#documenter .docs-main section.footnotes li .content kbd:first-child, +.content #documenter .docs-main section.footnotes li kbd:first-child { + margin-right: 1em; + margin-bottom: 0.4em; +} + +#documenter .docs-main .docs-footer { + display: flex; + flex-wrap: wrap; + margin-left: 0; + margin-right: 0; + border-top: 1px solid #dbdbdb; + padding-top: 1rem; + padding-bottom: 1rem; +} + +@media screen and (max-width: 1055px) { + #documenter .docs-main .docs-footer { + padding-left: 1rem; + padding-right: 1rem; + } +} + +#documenter .docs-main .docs-footer .docs-footer-nextpage, +#documenter .docs-main .docs-footer .docs-footer-prevpage { + flex-grow: 1; +} + +#documenter .docs-main .docs-footer .docs-footer-nextpage { + text-align: right; +} + +#documenter .docs-main .docs-footer .flexbox-break { + flex-basis: 100%; + height: 0; +} + +#documenter .docs-main .docs-footer .footer-message { + font-size: 0.8em; + margin: 0.5em auto 0 auto; + text-align: center; +} + +#documenter .docs-sidebar { + display: flex; + flex-direction: column; + color: #0a0a0a; + background-color: #f5f5f5; + border-right: 1px solid #dbdbdb; + padding: 0; + flex: 0 0 18rem; + z-index: 5; + font-size: 1rem; + position: fixed; + left: -18rem; + width: 18rem; + height: 100%; + transition: left 0.3s; +} + +#documenter .docs-sidebar.visible { + left: 0; + box-shadow: 0.4rem 0rem 0.8rem #bbb; +} + +@media screen and (min-width: 1056px) { + #documenter .docs-sidebar.visible { + box-shadow: none; + } +} + +@media screen and (min-width: 1056px) { + #documenter .docs-sidebar { + left: 0; + top: 0; + } +} + +#documenter .docs-sidebar .docs-logo { + margin-top: 1rem; + padding: 0 1rem; +} + +#documenter .docs-sidebar .docs-logo>img { + max-height: 6rem; + margin: auto; +} + +#documenter .docs-sidebar .docs-package-name { + flex-shrink: 0; + font-size: 1.5rem; + font-weight: 700; + text-align: center; + white-space: nowrap; + overflow: hidden; + padding: 0.5rem 0; +} + +#documenter .docs-sidebar .docs-package-name .docs-autofit { + max-width: 16.2rem; +} + +#documenter .docs-sidebar .docs-package-name a, +#documenter .docs-sidebar .docs-package-name a:hover { + color: #0a0a0a; +} + +#documenter .docs-sidebar .docs-version-selector { + border-top: 1px solid #dbdbdb; + display: none; + padding: 0.5rem; +} + +#documenter .docs-sidebar .docs-version-selector.visible { + display: flex; +} + +#documenter .docs-sidebar ul.docs-menu { + flex-grow: 1; + user-select: none; + border-top: 1px solid #dbdbdb; + padding-bottom: 1.5rem; +} + +#documenter .docs-sidebar ul.docs-menu>li>.tocitem { + font-weight: bold; +} + +#documenter .docs-sidebar ul.docs-menu>li li { + font-size: 0.95rem; + margin-left: 1em; + border-left: 1px solid #dbdbdb; +} + +#documenter .docs-sidebar ul.docs-menu input.collapse-toggle { + display: none; +} + +#documenter .docs-sidebar ul.docs-menu ul.collapsed { + display: none; +} + +#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed { + display: block; +} + +#documenter .docs-sidebar ul.docs-menu label.tocitem { + display: flex; +} + +#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { + flex-grow: 2; +} + +#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + font-size: 0.75rem; + margin-left: 1rem; + margin-top: auto; + margin-bottom: auto; +} + +#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f054"; +} + +#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before { + content: "\f078"; +} + +#documenter .docs-sidebar ul.docs-menu .tocitem { + display: block; + padding: 0.5rem 0.5rem; +} + +#documenter .docs-sidebar ul.docs-menu .tocitem, +#documenter .docs-sidebar ul.docs-menu .tocitem:hover { + color: #0a0a0a; + background: #f5f5f5; +} + +#documenter .docs-sidebar ul.docs-menu a.tocitem:hover, +#documenter .docs-sidebar ul.docs-menu label.tocitem:hover { + color: #0a0a0a; + background-color: #ebebeb; +} + +#documenter .docs-sidebar ul.docs-menu li.is-active { + border-top: 1px solid #dbdbdb; + border-bottom: 1px solid #dbdbdb; + background-color: #fff; +} + +#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, +#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { + background-color: #fff; + color: #0a0a0a; +} + +#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { + background-color: #ebebeb; + color: #0a0a0a; +} + +#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child { + border-top: none; +} + +#documenter .docs-sidebar ul.docs-menu ul.internal { + margin: 0 0.5rem 0.5rem; + border-top: 1px solid #dbdbdb; +} + +#documenter .docs-sidebar ul.docs-menu ul.internal li { + font-size: 0.85rem; + border-left: none; + margin-left: 0; + margin-top: 0.5rem; +} + +#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { + width: 100%; + padding: 0; +} + +#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { + content: "⚬"; + margin-right: 0.4em; +} + +#documenter .docs-sidebar form.docs-search { + margin: auto; + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +#documenter .docs-sidebar form.docs-search>input { + width: 14.4rem; +} + +@media screen and (min-width: 1056px) { + #documenter .docs-sidebar ul.docs-menu { + overflow-y: auto; + -webkit-overflow-scroll: touch; + } + + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { + width: 0.3rem; + background: none; + } + + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #e0e0e0; + } + + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { + background: #ccc; + } +} + +@media screen and (max-width: 1055px) { + #documenter .docs-sidebar { + overflow-y: auto; + -webkit-overflow-scroll: touch; + } + + #documenter .docs-sidebar::-webkit-scrollbar { + width: 0.3rem; + background: none; + } + + #documenter .docs-sidebar::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #e0e0e0; + } + + #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { + background: #ccc; + } +} + +#documenter .docs-main #documenter-search-info { + margin-bottom: 1rem; +} + +#documenter .docs-main #documenter-search-results { + list-style-type: circle; + list-style-position: outside; +} + +#documenter .docs-main #documenter-search-results li { + margin-left: 2rem; +} + +#documenter .docs-main #documenter-search-results .docs-highlight { + background-color: yellow; +} + +.ansi span.sgr1 { + font-weight: bolder; +} + +.ansi span.sgr2 { + font-weight: lighter; +} + +.ansi span.sgr3 { + font-style: italic; +} + +.ansi span.sgr4 { + text-decoration: underline; +} + +.ansi span.sgr7 { + color: #fff; + background-color: #222; +} + +.ansi span.sgr8 { + color: transparent; +} + +.ansi span.sgr8 span { + color: transparent; +} + +.ansi span.sgr9 { + text-decoration: line-through; +} + +.ansi span.sgr30 { + color: #242424; +} + +.ansi span.sgr31 { + color: #a7201f; +} + +.ansi span.sgr32 { + color: #066f00; +} + +.ansi span.sgr33 { + color: #856b00; +} + +.ansi span.sgr34 { + color: #2149b0; +} + +.ansi span.sgr35 { + color: #7d4498; +} + +.ansi span.sgr36 { + color: #007989; +} + +.ansi span.sgr37 { + color: gray; +} + +.ansi span.sgr40 { + background-color: #242424; +} + +.ansi span.sgr41 { + background-color: #a7201f; +} + +.ansi span.sgr42 { + background-color: #066f00; +} + +.ansi span.sgr43 { + background-color: #856b00; +} + +.ansi span.sgr44 { + background-color: #2149b0; +} + +.ansi span.sgr45 { + background-color: #7d4498; +} + +.ansi span.sgr46 { + background-color: #007989; +} + +.ansi span.sgr47 { + background-color: gray; +} + +.ansi span.sgr90 { + color: #616161; +} + +.ansi span.sgr91 { + color: #cb3c33; +} + +.ansi span.sgr92 { + color: #0e8300; +} + +.ansi span.sgr93 { + color: #a98800; +} + +.ansi span.sgr94 { + color: #3c5dcd; +} + +.ansi span.sgr95 { + color: #9256af; +} + +.ansi span.sgr96 { + color: #008fa3; +} + +.ansi span.sgr97 { + color: #f5f5f5; +} + +.ansi span.sgr100 { + background-color: #616161; +} + +.ansi span.sgr101 { + background-color: #cb3c33; +} + +.ansi span.sgr102 { + background-color: #0e8300; +} + +.ansi span.sgr103 { + background-color: #a98800; +} + +.ansi span.sgr104 { + background-color: #3c5dcd; +} + +.ansi span.sgr105 { + background-color: #9256af; +} + +.ansi span.sgr106 { + background-color: #008fa3; +} + +.ansi span.sgr107 { + background-color: #f5f5f5; +} + +code.language-julia-repl>span.hljs-meta { + color: #066f00; + font-weight: bolder; +} + +/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/ +pre code.hljs { + display: block; + overflow-x: auto; +} + +code.hljs { + padding: 3px 5px; +} + +.hljs { + background: #f0f0f0; + color: #444; +} + +.hljs-comment { + color: #888888; +} + +.hljs-tag, +.hljs-punctuation { + color: #444a; +} + +.hljs-tag .hljs-name, +.hljs-tag .hljs-attr { + color: #444; +} + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-meta .hljs-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; +} + +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; +} + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; +} + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-operator, +.hljs-selector-pseudo { + color: #bc6060; +} + +.hljs-literal { + color: #78a960; +} + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #397300; +} + +.hljs-meta { + color: #1f7199; +} + +.hljs-meta .hljs-string { + color: #4d99bf; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +#documenter .content p { + text-align: justify; +} + +.docstring { + border-radius: 15px !important; +} + +.docstring header { + border-radius: 15px 15px 0 0 !important; +} + +.docstring pre { + border-radius: 10px; + padding: 4px; +} + +.docstring section { + padding: 20px; +} + +.docs-package-name { + display: none; +} + +.admonition { + border-radius: 15px !important; +} + +/* code.nohighlight.hljs { + background-color: white !important; +} */ +.grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 20px; + max-width: 1200px; + padding: 20px; +} + +.grid-item { + position: relative; + overflow: hidden; + border-radius: 15px; + transition: transform 0.3s ease; + cursor: pointer; +} + +.grid-item img { + max-width: 100%; + height: auto; + display: block; +} + +.grid-item .item-title { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + background-color: rgba(0, 0, 0, 0.9); + color: #fff; + padding: 8px 15px; + font-size: 16px; +} + +.item-title p { + font-weight: normal !important; + display: none; +} + +.grid-item:hover p { + display: block; +} + +.grid-item:hover #colab { + display: block; +} + +#colab { + border-radius: 25%; + position: absolute; + top: 3px; + right: 3px; + width: 11%; + display: none; +} + +.input.is-rounded, +#documenter .docs-sidebar form.docs-search>input { + margin: 1.5rem 0.0rem !important; +} + +th, +td { + text-align: left !important; +} + +summary { + cursor: pointer; + margin: 1rem 0rem; + +} + +details { + padding: 10px 20px; + border: 0px solid #e4eaef; + border-radius: 20px; + margin-bottom: 1.5rem; + background-color: #e4eaef; +} \ No newline at end of file diff --git a/docs/src/contributing.md b/docs/src/contributing.md new file mode 100644 index 0000000..32296b6 --- /dev/null +++ b/docs/src/contributing.md @@ -0,0 +1,18 @@ +```@meta +CollapsedDocStrings = true +``` +### Adding new models to MLJTransforms + +In this package, data transformers are not implemented using a specific generic template, whereas categorical encoders are due to their systematic nature of encoding categorical levels into scalars or vectors. In light of this, the most pivotal method in implementing a new categorical encoder is: +```@docs +MLJTransforms.generic_fit +``` + +followed by: +```@docs +MLJTransforms.generic_transform +``` + +All categorical encoders in this packager are implemented using these two methods. For an example, see `FrequencyEncoder` [source code](https://github.com/JuliaAI/MLJTransforms.jl/blob/docs/src/encoders/frequency_encoding/frequency_encoding.jl). + +Moreover, you should implement the `MLJModelInterface` for any method you provide in this package. Check the interface [docs](https://juliaai.github.io/MLJModelInterface.jl/stable/) and/or the existing interfaces in this package (eg, [this interface](https://github.com/JuliaAI/MLJTransforms.jl/blob/docs/src/encoders/frequency_encoding/interface_mlj.jl) for the `FrequencyEncoder`). \ No newline at end of file diff --git a/docs/src/generate.jl b/docs/src/generate.jl new file mode 100644 index 0000000..d62e1ec --- /dev/null +++ b/docs/src/generate.jl @@ -0,0 +1,26 @@ +function generate(dir; execute = true, pluto = false) + quote + using Pkg + # Activate the specific tutorial directory instead of temp environment + Pkg.activate($dir) + Pkg.instantiate() + Pkg.add("Literate") + using Literate + + OUTDIR = $dir + outdir = splitpath(OUTDIR)[end] + INFILE = joinpath(OUTDIR, "notebook.jl") + + @info "Generating notebooks for $outdir. " + + Literate.markdown( + INFILE, + OUTDIR, + execute = true, + # Use regular julia code blocks instead of @example to prevent execution by Documenter + config = Dict("codefence" => Pair("````julia", "````")), + ) + + + end |> eval +end diff --git a/docs/src/index.md b/docs/src/index.md new file mode 100644 index 0000000..2e63a27 --- /dev/null +++ b/docs/src/index.md @@ -0,0 +1,53 @@ +# MLJTransforms.jl + +A Julia package providing a wide range of categorical encoders and transformers to be used with the [MLJ](https://juliaai.github.io/MLJ.jl/dev/) package. Transformers help convert raw features into a representation that's better suited for downstream models. Meanwhile, categorical encoders are a type of transformer that specifically encodes categorical features into numerical forms. + +## Installation + +```julia +import Pkg +Pkg.activate("my_environment", shared=true) +Pkg.add(["MLJ", "MLJTransforms"]) +``` + +## Quick Start + +For the following demo, you will need to additionally run `Pkg.add("RDatasets")`. + +```julia +using MLJ +import RDatasets + +# 1. Load Data +X = RDatasets.dataset("HSAUR", "Forbes2000"); + +# 2. Load the model +FrequencyEncoder = @load FrequencyEncoder pkg="MLJTransforms" +encoder = FrequencyEncoder( + features=[:Country, :Category], # The categorical columns to select + ignore=false, # Whether to exclude or include selected columns + ordered_factor = false, # Whether to also encode columns of ordered factor elements + normalize=true # Whether to normalize the frequencies used for encoding + ) + + +# 3. Wrap it in a machine and fit +mach = fit!(machine(encoder, X)) +Xnew = transform(mach, X) +``` + +## Available Transformers +See [complete list](transformers/all_transformers) of transformers in this package. + +In `MLJTransforms` we denote transformers that can operate on columns with `Continuous` and/or `Count` [scientific types](https://juliaai.github.io/ScientificTypes.jl/dev/) as *numerical transformers*. Meanwhile, *categorical transformers* operate on `Multiclass` and/or `OrderedFactor` [scientific types](https://juliaai.github.io/ScientificTypes.jl/dev/). Most categorical transformers in this package operate by converting categorical values into numerical values or vectors, and are therefore considered categorical encoders. We categorize categorical encoders as follows: + + +| **Category** | **Description** | +|:---------------------------:|:-------------------------------------------------------------------------------:| +| [Classical Encoders](transformers/classical.md) | Traditional categorical encoding algorithms and techniques. | +| [Neural-based Encoders](transformers/neural) | Categorical encoders based on neural networks. | +| [Contrast Encoders](transformers/contrast.md) | Categorical encoders that could be modeled via a contrast matrix. | +| [Utility Encoders](transformers/utility.md) | Categorical encoders meant to be used as preprocessors for other transformers or models.| + + +Some transformers in this package can even operate on both `Finite` and `Infinite` scientific types or other special scientific types (eg, to represent time). To learn more about scientific types see [the official documentation](https://juliaai.github.io/ScientificTypes.jl/dev/#Type-hierarchy). \ No newline at end of file diff --git a/docs/src/transformers/all_transformers.md b/docs/src/transformers/all_transformers.md new file mode 100644 index 0000000..520400d --- /dev/null +++ b/docs/src/transformers/all_transformers.md @@ -0,0 +1,91 @@ +### Summary Table +| Transformer | Brief Description | +|:----------:|:----------:| +| [Standardizer](@ref) | Transforming columns of numerical features by standardization | +| [UnivariateStandardizer](@ref) | Apply standardization given a single vector | +| [UnivariateBoxCoxTransformer](@ref) | Apply BoxCox transformation given a single vector | +| [InteractionTransformer](@ref) | Transforming columns of numerical features to create new interaction features | +| [UnivariateDiscretizer](@ref) | Discretize a continuous vector into an ordered factor | +| [FillImputer](@ref) | Fill missing values of features belonging to any scientific type | +| [UnivariateTimeTypeToContinuous](@ref) | Transform a vector of time type into continuous type | +| [UnivariateFillImputer](@ref) | Fill in missing values in a single vector | +| [OneHotEncoder](@ref) | Encode categorical variables into one-hot vectors | +| [ContinuousEncoder](@ref) | Adds type casting functionality to OnehotEncoder | +| [OrdinalEncoder](@ref) | Encode categorical variables into ordered integers | +| [FrequencyEncoder](@ref) | Encode categorical variables into their normalized or unormalized frequencies | +| [TargetEncoder](@ref) | Encode categorical variables into relevant target statistics | +| [DummyEncoder](@ref ContrastEncoder) | Encodes by comparing each level to the reference level, intercept being the cell mean of the reference group | +| [SumEncoder](@ref ContrastEncoder) | Encodes by comparing each level to the reference level, intercept being the grand mean | +| [HelmertEncoder](@ref ContrastEncoder) | Encodes by comparing levels of a variable with the mean of the subsequent levels of the variable +| [ForwardDifferenceEncoder](@ref ContrastEncoder) | Encodes by comparing adjacent levels of a variable (each level minus the next level) +| [ContrastEncoder](@ref) | Allows defining a custom contrast encoder via a contrast matrix | +| [HypothesisEncoder](@ref ContrastEncoder) | Allows defining a custom contrast encoder via a hypothesis matrix | +| [EntityEmbedder](@ref) | Encode categorical variables into dense embedding vectors | +| [CardinalityReducer](@ref) | Reduce cardinality of high cardinality categorical features by grouping infrequent categories | +| [MissingnessEncoder](@ref) | Encode missing values of categorical features into new values | + +### All Transformers + +```@docs; canonical = false +MLJTransforms.Standardizer +``` + +```@docs; canonical = false +MLJTransforms.UnivariateStandardizer +``` + +```@docs; canonical = false +MLJTransforms.UnivariateBoxCoxTransformer +``` + +```@docs; canonical = false +MLJTransforms.InteractionTransformer +``` + +```@docs; canonical = false +MLJTransforms.UnivariateDiscretizer +``` + +```@docs; canonical = false +MLJTransforms.FillImputer +``` + +```@docs; canonical = false +MLJTransforms.UnivariateTimeTypeToContinuous +``` + +```@docs; canonical = false +MLJTransforms.UnivariateFillImputer +``` + +```@docs; canonical = false +MLJTransforms.OneHotEncoder +``` + +```@docs; canonical = false +MLJTransforms.ContinuousEncoder +``` + +```@docs; canonical = false +MLJTransforms.OrdinalEncoder +``` + +```@docs; canonical = false +MLJTransforms.FrequencyEncoder +``` + +```@docs; canonical = false +MLJTransforms.TargetEncoder +``` + +```@docs; canonical = false +MLJTransforms.ContrastEncoder +``` + +```@docs; canonical = false +MLJTransforms.CardinalityReducer +``` + +```@docs; canonical = false +MLJTransforms.MissingnessEncoder +``` \ No newline at end of file diff --git a/docs/src/transformers/classical.md b/docs/src/transformers/classical.md new file mode 100644 index 0000000..399c65a --- /dev/null +++ b/docs/src/transformers/classical.md @@ -0,0 +1,30 @@ +Classical encoders include well known and commonly used categorical encoders: + +| Transformer | Brief Description | +|:----------:|:----------:| +| [OneHotEncoder](@ref) | Encode categorical variables into one-hot vectors | +| [ContinuousEncoder](@ref) | Adds type casting functionality to OnehotEncoder | +| [OrdinalEncoder](@ref) | Encode categorical variables into ordered integers | +| [FrequencyEncoder](@ref) | Encode categorical variables into their normalized or unormalized frequencies | +| [TargetEncoder](@ref) | Encode categorical variables into relevant target statistics | + + +```@docs +MLJTransforms.OneHotEncoder +``` + +```@docs +MLJTransforms.ContinuousEncoder +``` + +```@docs +MLJTransforms.OrdinalEncoder +``` + +```@docs +MLJTransforms.FrequencyEncoder +``` + +```@docs +MLJTransforms.TargetEncoder +``` \ No newline at end of file diff --git a/docs/src/transformers/contrast.md b/docs/src/transformers/contrast.md new file mode 100644 index 0000000..ccf79a5 --- /dev/null +++ b/docs/src/transformers/contrast.md @@ -0,0 +1,15 @@ +Contrast Encoders include categorical encoders that could be modeled by a contrast matrix: + +| Transformer | Brief Description | +|:----------:|:----------:| +| [DummyEncoder](@ref ContrastEncoder) | Encodes by comparing each level to the reference level, intercept being the cell mean of the reference group | +| [SumEncoder](@ref ContrastEncoder) | Encodes by comparing each level to the reference level, intercept being the grand mean | +| [HelmertEncoder](@ref ContrastEncoder) | Encodes by comparing levels of a variable with the mean of the subsequent levels of the variable +| [ForwardDifferenceEncoder](@ref ContrastEncoder) | Encodes by comparing adjacent levels of a variable (each level minus the next level) +| [ContrastEncoder](@ref) | Allows defining a custom contrast encoder via a contrast matrix | +| [HypothesisEncoder](@ref ContrastEncoder) | Allows defining a custom contrast encoder via a hypothesis matrix | + + +```@docs +MLJTransforms.ContrastEncoder +``` \ No newline at end of file diff --git a/docs/src/transformers/neural.md b/docs/src/transformers/neural.md new file mode 100644 index 0000000..91cd01d --- /dev/null +++ b/docs/src/transformers/neural.md @@ -0,0 +1,11 @@ +Neural-based Encoders include categorical encoders based on neural networks: + +| Transformer | Brief Description | +|:----------:|:----------:| +| [EntityEmbedder](@ref) | Encode categorical variables into dense embedding vectors | + +This method has been implemented in the [MLJFlux.jl](https://github.com/FluxML/MLJFlux.jl) which is a package that provides `MLJ` interfaces to deep learning models from [Flux.jl](https://fluxml.ai/Flux.jl/stable/). The `EntityEmbedder` encodes categorical features into dense vectors using a deep learning model that we must supply such as `MLJFlux.NeuralNetworkClassifier` or `MLJFlux.NeuralNetworkRegressor`. See the full docstring for more information: + +```@docs +MLJFlux.EntityEmbedder +``` \ No newline at end of file diff --git a/docs/src/transformers/utility.md b/docs/src/transformers/utility.md new file mode 100644 index 0000000..26873a9 --- /dev/null +++ b/docs/src/transformers/utility.md @@ -0,0 +1,14 @@ +Utility Encoders include categorical encoders meant to be used as preprocessors for other encoders or models. + +| Transformer | Brief Description | +|:----------:|:----------:| +| [CardinalityReducer](@ref) | Reduce cardinality of high cardinality categorical features by grouping infrequent categories | +| [MissingnessEncoder](@ref) | Encode missing values of categorical features into new values | + +```@docs +MLJTransforms.CardinalityReducer +``` + +```@docs +MLJTransforms.MissingnessEncoder +``` \ No newline at end of file diff --git a/docs/src/tutorials/T1.md b/docs/src/tutorials/T1.md new file mode 100644 index 0000000..3f8339d --- /dev/null +++ b/docs/src/tutorials/T1.md @@ -0,0 +1 @@ +This is an imaginary tutorial. \ No newline at end of file diff --git a/docs/src/tutorials/adult_example/Manifest.toml b/docs/src/tutorials/adult_example/Manifest.toml new file mode 100644 index 0000000..2f9bdea --- /dev/null +++ b/docs/src/tutorials/adult_example/Manifest.toml @@ -0,0 +1,2340 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.5" +manifest_format = "2.0" +project_hash = "2bc58e2f1d5ca6172834e6bda17b630aa9b5ac28" + +[[deps.ADTypes]] +git-tree-sha1 = "be7ae030256b8ef14a441726c4c37766b90b93a3" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.15.0" + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + + [deps.ADTypes.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + +[[deps.ARFFFiles]] +deps = ["CategoricalArrays", "Dates", "Parsers", "Tables"] +git-tree-sha1 = "678eb18590a8bc6674363da4d5faa4ac09c40a18" +uuid = "da404889-ca92-49ff-9e8b-0aa6b4d38dc8" +version = "1.5.0" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgCheck]] +git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.5.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "9606d7832795cbef89e06a550475be300364a8aa" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.19.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + 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" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "b5bb4dc6248fde467be2a863eb8452993e74d402" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.1" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.BangBang]] +deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"] +git-tree-sha1 = "26f41e1df02c330c4fa1e98d4aa2168fdafc9b1f" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.4.4" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTablesExt = "Tables" + 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" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.BenchmarkTools]] +deps = ["Compat", "JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "e38fbc49a620f5d0b660d7f543db1009fe0f8336" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.6.0" + +[[deps.BitBasis]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "89dc08420d4f593ff30f02611d136b475a5eb43d" +uuid = "50ba71b6-fa0f-514d-ae9a-0916efc90dcf" +version = "0.9.10" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.15" + +[[deps.CUDA_Driver_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "21ce786b1616c0f5f7c00331ae11fa59713654f7" +uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" +version = "12.9.0+0" + +[[deps.CUDA_Runtime_jll]] +deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "1b476b62a462e7ee17d33c0aca03415c9c17f8c9" +uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" +version = "0.18.0+0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.5+0" + +[[deps.CatBoost]] +deps = ["CategoricalArrays", "MLJModelInterface", "OrderedCollections", "PythonCall", "Tables"] +git-tree-sha1 = "632235d41688eb504a0efbbced347539f03197c4" +uuid = "e2e10f9a-a85d-4fa9-b6b2-639a32100a12" +version = "0.3.6" + +[[deps.CategoricalArrays]] +deps = ["DataAPI", "Future", "Missings", "Printf", "Requires", "Statistics", "Unicode"] +git-tree-sha1 = "1568b28f91293458345dabba6a5ea3f183250a61" +uuid = "324d7699-5711-5eae-9e2f-1d82baa6b597" +version = "0.10.8" +weakdeps = ["JSON", "RecipesBase", "SentinelArrays", "StructTypes"] + + [deps.CategoricalArrays.extensions] + CategoricalArraysJSONExt = "JSON" + CategoricalArraysRecipesBaseExt = "RecipesBase" + CategoricalArraysSentinelArraysExt = "SentinelArrays" + CategoricalArraysStructTypesExt = "StructTypes" + +[[deps.CategoricalDistributions]] +deps = ["CategoricalArrays", "Distributions", "Missings", "OrderedCollections", "Random", "ScientificTypes"] +git-tree-sha1 = "926862f549a82d6c3a7145bc7f1adff2a91a39f0" +uuid = "af321ab8-2d2e-40a6-b165-3d674595d28e" +version = "0.1.15" + + [deps.CategoricalDistributions.extensions] + UnivariateFiniteDisplayExt = "UnicodePlots" + + [deps.CategoricalDistributions.weakdeps] + UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "06ee8d1aa558d2833aa799f6f0b31b30cada405f" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.2" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.29.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.1" + +[[deps.Combinatorics]] +git-tree-sha1 = "8010b6bb3388abe68d95743dcbea77650bb2eddf" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.3" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "3a3dfb30697e96a440e4149c8c51bf32f818c0f3" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.17.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.5.0" + +[[deps.CondaPkg]] +deps = ["JSON3", "Markdown", "MicroMamba", "Pidfile", "Pkg", "Preferences", "Scratch", "TOML", "pixi_jll"] +git-tree-sha1 = "93e81a68a84dba7e652e61425d982cd71a1a0835" +uuid = "992eb4ea-22a4-4c89-a5bb-47a3300528ab" +version = "0.2.29" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ContextVariablesX]] +deps = ["Compat", "Logging", "UUIDs"] +git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" +uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" +version = "0.1.3" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataDeps]] +deps = ["HTTP", "Libdl", "Reexport", "SHA", "Scratch", "p7zip_jll"] +git-tree-sha1 = "8ae085b71c462c2cb1cfedcb10c3c877ec6cf03f" +uuid = "124859b0-ceae-595e-8997-d05f6a7a8dfe" +version = "0.7.13" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.7.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[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" +version = "1.11.0" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.16.2+0" + +[[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.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "210933c93f39f832d92f9efbbe69a49c453db36d" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.7.1" + + [deps.DifferentiationInterface.extensions] + DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" + DifferentiationInterfaceDiffractorExt = "Diffractor" + DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] + DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" + DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" + DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" + DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore" + DifferentiationInterfaceGTPSAExt = "GTPSA" + DifferentiationInterfaceMooncakeExt = "Mooncake" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] + DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] + DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" + DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" + DifferentiationInterfaceStaticArraysExt = "StaticArrays" + DifferentiationInterfaceSymbolicsExt = "Symbolics" + DifferentiationInterfaceTrackerExt = "Tracker" + DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] + + [deps.DifferentiationInterface.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" + Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "3e6d038b77f22791b8e3472b7c633acea1ecac06" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.120" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarlyStopping]] +deps = ["Dates", "Statistics"] +git-tree-sha1 = "98fdf08b707aaf69f524a6cd0a67858cefe0cfb6" +uuid = "792122b4-ca99-40de-a6bc-6742525f08b6" +version = "0.3.0" + +[[deps.EnumX]] +git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.5" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+1" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.5+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FLoops]] +deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] +git-tree-sha1 = "0a2e5873e9a5f54abb06418d57a8df689336a660" +uuid = "cc61a311-1640-44b5-9fba-1b764f453329" +version = "0.2.2" + +[[deps.FLoopsBase]] +deps = ["ContextVariablesX"] +git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" +uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" +version = "0.1.1" + +[[deps.FeatureSelection]] +deps = ["MLJModelInterface", "ScientificTypesBase", "Tables"] +git-tree-sha1 = "d78c565b6296e161193eb0f053bbcb3f1a82091d" +uuid = "33837fe5-dbff-4c9e-8c2f-c5612fe2b8b6" +version = "0.2.2" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.17.0" +weakdeps = ["HTTP"] + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] +git-tree-sha1 = "f089ab1f834470c525562030c8cfde4025d5e915" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.27.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffSparseArraysExt = "SparseArrays" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.16.0+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.0.1" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+2" + +[[deps.GLM]] +deps = ["Distributions", "LinearAlgebra", "Printf", "Reexport", "SparseArrays", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns", "StatsModels"] +git-tree-sha1 = "273bd1cd30768a2fddfa3fd63bbc746ed7249e5f" +uuid = "38e38edf-8417-5370-95a0-9cbb8c7f171a" +version = "1.9.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "1828eb7275491981fa5f1752a5e126e8f26f8741" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.17" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "27299071cc29e409488ada41ec7643e0ab19091f" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.17+0" + +[[deps.GettextRuntime_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] +git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" +uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" +version = "0.22.4+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "35fbd0cefb04a516104b8e183ce0df11b70a3f1a" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.84.3+0" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.15+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "ed5e9c58612c4e081aecdb6e1a479e18462e041e" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.17" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.1+0" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.28" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.5" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InlineStrings]] +git-tree-sha1 = "8594fac023c5ce1ef78260f24d1ad18b4327b420" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.4" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.IterationControl]] +deps = ["EarlyStopping", "InteractiveUtils"] +git-tree-sha1 = "e663925ebc3d93c1150a7570d114f9ea2f664726" +uuid = "b3c1a2ee-3fec-4384-bf48-272ea71de57c" +version = "0.5.4" + +[[deps.IterativeSolvers]] +deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] +git-tree-sha1 = "59545b0a2b27208b0650df0a46b8e3019f85055b" +uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" +version = "0.9.4" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["REPL", "Random", "fzf_jll"] +git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.11" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JSON3]] +deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] +git-tree-sha1 = "411eccfe8aba0814ffa0fdf4860913ed09c34975" +uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.3" + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + + [deps.JSON3.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.1+0" + +[[deps.JuliaVariables]] +deps = ["MLStyle", "NameResolution"] +git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" +uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" +version = "0.2.4" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "4efa9cec6f308e0f492ea635421638bff81cf6f8" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.36" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LIBLINEAR]] +deps = ["Libdl", "SparseArrays", "liblinear_jll"] +git-tree-sha1 = "2cd424d3bf9b36098009df5b1f399614c12b2ee4" +uuid = "2d691ee1-e668-5016-a719-b2531b85e0f5" +version = "0.7.1" + +[[deps.LIBSVM]] +deps = ["LIBLINEAR", "LinearAlgebra", "ScikitLearnBase", "SparseArrays", "libsvm_jll"] +git-tree-sha1 = "9016c6032aac779b13bbd1b3ce997606a6eb7a2b" +uuid = "b1bec4e5-fd48-53fe-b0cb-9723c09d164b" +version = "0.8.1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.8+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "4f34eaabe49ecb3fb0d58d6015e32fd31a733199" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.8" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + TectonicExt = "tectonic_jll" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + tectonic_jll = "d7dd28d6-a5e6-559c-9131-7eb760cdacc5" + +[[deps.LatinHypercubeSampling]] +deps = ["Random", "StableRNGs", "StatsBase", "Test"] +git-tree-sha1 = "825289d43c753c7f1bf9bed334c253e9913997f8" +uuid = "a5e1c1ea-c99a-51d3-a14d-a9a37257b02d" +version = "1.9.0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LearnAPI]] +git-tree-sha1 = "c276ed13346953f3035a6d35519ec816b820cd44" +uuid = "92ad9a40-7767-427a-9ee6-6e577f1266cb" +version = "1.0.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.4.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.1+1" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.41.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.1+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.41.0+0" + +[[deps.LightGBM]] +deps = ["Dates", "Libdl", "LightGBM_jll", "MLJModelInterface", "SparseArrays", "Statistics"] +git-tree-sha1 = "fa2e05581f7393693de1c3a3ca79ae2ded9394ac" +uuid = "7acf609c-83a4-11e9-1ffb-b912bcd3b04a" +version = "2.0.0" + +[[deps.LightGBM_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "20ee4be44c3149606abde993dc72dd2cf9909adb" +uuid = "0e4427ef-1ff7-5cd7-8faa-8ff0877bb2ec" +version = "3.3.5+1" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "4adee99b7262ad2a1a4bbbc59d993d24e55ea96f" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.4.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LinearMaps]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "7f6be2e4cdaaf558623d93113d6ddade7b916209" +uuid = "7a12625a-238d-50fd-b39a-03d52299707e" +version = "3.11.4" +weakdeps = ["ChainRulesCore", "SparseArrays", "Statistics"] + + [deps.LinearMaps.extensions] + LinearMapsChainRulesCoreExt = "ChainRulesCore" + LinearMapsSparseArraysExt = "SparseArrays" + LinearMapsStatisticsExt = "Statistics" + +[[deps.Literate]] +deps = ["Base64", "IOCapture", "JSON", "REPL"] +git-tree-sha1 = "da046be6d63304f7ba9c1bb04820fb306ba1ab12" +uuid = "98b081ad-f1c9-55d3-8b20-4c87d4299306" +version = "2.20.1" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [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" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.MLCore]] +deps = ["DataAPI", "SimpleTraits", "Tables"] +git-tree-sha1 = "73907695f35bc7ffd9f11f6c4f2ee8c1302084be" +uuid = "c2834f40-e789-41da-a90e-33b280584a8c" +version = "1.0.0" + +[[deps.MLFlowClient]] +deps = ["Dates", "FilePathsBase", "HTTP", "JSON", "ShowCases", "URIs", "UUIDs"] +git-tree-sha1 = "9abb12b62debc27261c008daa13627255bf79967" +uuid = "64a0f543-368b-4a9a-827a-e71edb2a0b83" +version = "0.5.1" + +[[deps.MLJ]] +deps = ["CategoricalArrays", "ComputationalResources", "Distributed", "Distributions", "FeatureSelection", "LinearAlgebra", "MLJBalancing", "MLJBase", "MLJEnsembles", "MLJFlow", "MLJIteration", "MLJModels", "MLJTuning", "OpenML", "Pkg", "ProgressMeter", "Random", "Reexport", "ScientificTypes", "StatisticalMeasures", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "65f2031dbd48117062c23931f243a0f8666535a1" +uuid = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +version = "0.20.8" + +[[deps.MLJBalancing]] +deps = ["MLJBase", "MLJModelInterface", "MLUtils", "OrderedCollections", "Random", "StatsBase"] +git-tree-sha1 = "f707a01a92d664479522313907c07afa5d81df19" +uuid = "45f359ea-796d-4f51-95a5-deb1a414c586" +version = "0.1.5" + +[[deps.MLJBase]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Dates", "DelimitedFiles", "Distributed", "Distributions", "InteractiveUtils", "InvertedIndices", "LearnAPI", "LinearAlgebra", "MLJModelInterface", "Missings", "OrderedCollections", "Parameters", "PrettyTables", "ProgressMeter", "Random", "RecipesBase", "Reexport", "ScientificTypes", "Serialization", "StatisticalMeasuresBase", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "05b91197e791cd1410aad3e421e9e47b27e9ce31" +uuid = "a7f614a8-145f-11e9-1d2a-a57a1082229d" +version = "1.8.1" +weakdeps = ["StatisticalMeasures"] + + [deps.MLJBase.extensions] + DefaultMeasuresExt = "StatisticalMeasures" + +[[deps.MLJEnsembles]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Distributed", "Distributions", "MLJModelInterface", "ProgressMeter", "Random", "ScientificTypesBase", "StatisticalMeasuresBase", "StatsBase"] +git-tree-sha1 = "84a5be55a364bb6b6dc7780bbd64317ebdd3ad1e" +uuid = "50ed68f4-41fd-4504-931a-ed422449fee0" +version = "0.4.3" + +[[deps.MLJFlow]] +deps = ["MLFlowClient", "MLJBase", "MLJModelInterface"] +git-tree-sha1 = "508bff8071d7d1902d6f1b9d1e868d58821f1cfe" +uuid = "7b7b8358-b45c-48ea-a8ef-7ca328ad328f" +version = "0.5.0" + +[[deps.MLJGLMInterface]] +deps = ["Distributions", "GLM", "MLJModelInterface", "StatsModels", "Tables"] +git-tree-sha1 = "db318813a5f07e3f93a1e530c8fd0e6bdc9cabac" +uuid = "caf8df21-4939-456d-ac9c-5fefbfb04c0c" +version = "0.3.7" + +[[deps.MLJIteration]] +deps = ["IterationControl", "MLJBase", "Random", "Serialization"] +git-tree-sha1 = "ad16cfd261e28204847f509d1221a581286448ae" +uuid = "614be32b-d00c-4edb-bd02-1eb411ab5e55" +version = "0.6.3" + +[[deps.MLJLinearModels]] +deps = ["DocStringExtensions", "IterativeSolvers", "LinearAlgebra", "LinearMaps", "MLJModelInterface", "Optim", "Parameters"] +git-tree-sha1 = "d23c53a454f01c03780621477000f03bae487a9a" +uuid = "6ee0df7b-362f-4a72-a706-9e79364fb692" +version = "0.10.1" + +[[deps.MLJModelInterface]] +deps = ["REPL", "Random", "ScientificTypesBase", "StatisticalTraits"] +git-tree-sha1 = "66626f80d5807921045d539b4f7153b1d47c5f8a" +uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" +version = "1.11.1" + +[[deps.MLJModels]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Combinatorics", "Dates", "Distances", "Distributions", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "Markdown", "OrderedCollections", "Parameters", "Pkg", "PrettyPrinting", "REPL", "Random", "RelocatableFolders", "ScientificTypes", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "09381923be5ed34416ed77badbc26e1adf295492" +uuid = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +version = "0.17.9" + +[[deps.MLJTransforms]] +deps = ["BitBasis", "CategoricalArrays", "Combinatorics", "Dates", "Distributions", "LinearAlgebra", "MLJModelInterface", "OrderedCollections", "Parameters", "ScientificTypes", "ScientificTypesBase", "Statistics", "StatsBase", "TableOperations", "Tables"] +path = "/Users/essamwisam/Documents/GitHub/MLJTransforms" +uuid = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" +version = "0.1.1" + +[[deps.MLJTuning]] +deps = ["ComputationalResources", "Distributed", "Distributions", "LatinHypercubeSampling", "MLJBase", "ProgressMeter", "Random", "RecipesBase", "StatisticalMeasuresBase"] +git-tree-sha1 = "38aab60b1274ce7d6da784808e3be69e585dbbf6" +uuid = "03970b2e-30c4-11ea-3135-d1576263f10f" +version = "0.8.8" + +[[deps.MLJXGBoostInterface]] +deps = ["MLJModelInterface", "SparseArrays", "Tables", "XGBoost"] +git-tree-sha1 = "385031c897e822755e7d194b0f9745fb20129972" +uuid = "54119dfa-1dab-4055-a167-80440f4f7a91" +version = "0.3.12" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MLUtils]] +deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "MLCore", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"] +git-tree-sha1 = "a772d8d1987433538a5c226f79393324b55f7846" +uuid = "f1d291b0-491e-4a28-83b9-f70985020b54" +version = "0.4.8" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.MicroCollections]] +deps = ["Accessors", "BangBang", "InitialValues"] +git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.2.0" + +[[deps.MicroMamba]] +deps = ["Pkg", "Scratch", "micromamba_jll"] +git-tree-sha1 = "011cab361eae7bcd7d278f0a7a00ff9c69000c51" +uuid = "0b3b1443-0f03-428d-bdfb-f27f9c1191ea" +version = "0.1.14" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.Mocking]] +deps = ["Compat", "ExprTools"] +git-tree-sha1 = "2c140d60d7cb82badf06d8783800d0bcd1a7daa2" +uuid = "78c3b35d-d492-501b-9361-3d52fe80e533" +version = "0.8.1" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.NLSolversBase]] +deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "25a6638571a902ecfb1ae2a18fc1575f86b1d4df" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.10.0" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "ScopedValues", "Statistics"] +git-tree-sha1 = "4abc63cdd8dd9dd925d8e879cda280bedc8013ca" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.30" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + NNlibSpecialFunctionsExt = "SpecialFunctions" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NameResolution]] +deps = ["PrettyPrint"] +git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" +uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" +version = "0.1.5" + +[[deps.NearestNeighborModels]] +deps = ["Distances", "FillArrays", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "NearestNeighbors", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "e411143a8362926e4284a54e745972e939fbab78" +uuid = "636a865e-7cf4-491e-846c-de09b730eb36" +version = "0.2.3" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "8a3271d8309285f4db73b4f662b1b290c715e85e" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.21" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenML]] +deps = ["ARFFFiles", "HTTP", "JSON", "Markdown", "Pkg", "Scratch"] +git-tree-sha1 = "63603b2b367107e87dbceda4e33c67aed17e50e0" +uuid = "8b6db2d4-7670-4922-a472-f9537c81ab66" +version = "0.3.2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "f1a7e086c677df53e064e0fdd2c9d0b0833e3f6e" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.5.0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "9216a80ff3682833ac4b733caa8c00390620ba5d" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.0+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Optim]] +deps = ["Compat", "EnumX", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "61942645c38dd2b5b78e2082c9b51ab315315d10" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.13.2" + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + + [deps.Optim.weakdeps] + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "f07c06228a1c670ae4c87d1276b92c7c597fdda0" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.35" + +[[deps.PalmerPenguins]] +deps = ["CSV", "DataDeps"] +git-tree-sha1 = "e7c581b0e29f7d35f47927d65d4965b413c10d90" +uuid = "8b842266-38fa-440a-9b57-31493939ab85" +version = "0.1.4" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "275a9a6d85dc86c24d03d1837a0010226a96f540" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.56.3+0" + +[[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 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.3" + +[[deps.Pidfile]] +deps = ["FileWatching", "Test"] +git-tree-sha1 = "2d8aaf8ee10df53d0dfb9b8ee44ae7c04ced2b03" +uuid = "fa939f87-e72e-5be4-a000-7fc836dbe307" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.44.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.3.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.3" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "28ea788b78009c695eb0d637587c81d26bdf0e36" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.14" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyPrint]] +git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" +uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" +version = "0.2.0" + +[[deps.PrettyPrinting]] +git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e" +uuid = "54e16d92-306c-5ea0-a30b-337be88ac337" +version = "0.4.2" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.Profile]] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" +version = "1.11.0" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "13c5103482a8ed1536a54c08d0e742ae3dca2d42" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.4" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.PythonCall]] +deps = ["CondaPkg", "Dates", "Libdl", "MacroTools", "Markdown", "Pkg", "Requires", "Serialization", "Tables", "UnsafePointers"] +git-tree-sha1 = "ce4a33749e0061fa51dbe40533dc112bf7d2d28e" +uuid = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" +version = "0.9.25" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "eb38d376097f47316fe089fc62cb7c6d85383a52" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.8.2+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "da7adf145cce0d44e892626e647f9dcbe9cb3e10" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.8.2+1" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "9eca9fc3fe515d619ce004c83c31ffd3f85c7ccf" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.8.2+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "e1d5e16d0f65762396f9ca4644a5f4ddab8d452b" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.8.2+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.RData]] +deps = ["CategoricalArrays", "CodecZlib", "DataFrames", "Dates", "FileIO", "Requires", "TimeZones", "Unicode"] +git-tree-sha1 = "19e47a495dfb7240eb44dc6971d660f7e4244a72" +uuid = "df47a6cb-8c03-5eed-afd8-b6050d6c41da" +version = "0.8.3" + +[[deps.RDatasets]] +deps = ["CSV", "CodecZlib", "DataFrames", "FileIO", "Printf", "RData", "Reexport"] +git-tree-sha1 = "2720e6f6afb3e562ccb70a6b62f8f308ff810333" +uuid = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +version = "0.7.7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.ScientificTypes]] +deps = ["CategoricalArrays", "ColorTypes", "Dates", "Distributions", "PrettyTables", "Reexport", "ScientificTypesBase", "StatisticalTraits", "Tables"] +git-tree-sha1 = "4d083ffec53dbd5097a6723b0699b175be2b61fb" +uuid = "321657f4-b219-11e9-178b-2701a2544e81" +version = "3.1.0" + +[[deps.ScientificTypesBase]] +git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b" +uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" +version = "3.0.0" + +[[deps.ScikitLearnBase]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "7877e55c1523a4b336b433da39c8e8c08d2f221f" +uuid = "6e75b9c4-186b-50bd-896f-2d2496a4843e" +version = "0.5.0" + +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "1147f140b4c8ddab224c94efa9569fc23d63ab44" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.3.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.8" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.ShiftedArrays]] +git-tree-sha1 = "503688b59397b3307443af35cd953a13e8005c16" +uuid = "1277b4bf-5013-50f5-be3d-901d8477a67a" +version = "2.0.0" + +[[deps.ShowCases]] +git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5" +uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" +version = "0.1.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SparseMatricesCSR]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "cc05d16e340aecfa0e4cf4616194abc894cd0bca" +uuid = "a0a7dd2c-ebf4-11e9-1f05-cf50bc540ca1" +version = "0.6.9" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.15" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.3" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.13" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.StatisticalMeasures]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Distributions", "LearnAPI", "LinearAlgebra", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "StatisticalMeasuresBase", "Statistics", "StatsBase"] +git-tree-sha1 = "d15f71761dce0a2833d458824e6b60edbfd4f138" +uuid = "a19d573c-0a75-4610-95b3-7071388c7541" +version = "0.2.1" + + [deps.StatisticalMeasures.extensions] + LossFunctionsExt = "LossFunctions" + ScientificTypesExt = "ScientificTypes" + + [deps.StatisticalMeasures.weakdeps] + LossFunctions = "30fc2ffe-d236-52d8-8643-a9d8f7c094a7" + ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" + +[[deps.StatisticalMeasuresBase]] +deps = ["CategoricalArrays", "InteractiveUtils", "MLUtils", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "Statistics"] +git-tree-sha1 = "e4f508cf3b3253f3eb357274fe36fb3332ca9896" +uuid = "c062fc1d-0d66-479b-b6ac-8b44719de4cc" +version = "0.1.2" + +[[deps.StatisticalTraits]] +deps = ["ScientificTypesBase"] +git-tree-sha1 = "542d979f6e756f13f862aa00b224f04f9e445f11" +uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" +version = "3.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.1" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.5" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "8e45cecc66f3b42633b8ce14d431e8e57a3e242e" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StatsModels]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Printf", "REPL", "ShiftedArrays", "SparseArrays", "StatsAPI", "StatsBase", "StatsFuns", "Tables"] +git-tree-sha1 = "9022bcaa2fc1d484f1326eaa4db8db543ca8c66d" +uuid = "3eaba693-59b7-5ba5-a881-562e759f1c8d" +version = "0.7.4" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StructTypes]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" +uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" +version = "1.11.0" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TZJData]] +deps = ["Artifacts"] +git-tree-sha1 = "72df96b3a595b7aab1e101eb07d2a435963a97e2" +uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" +version = "1.5.0+2025b" + +[[deps.TableOperations]] +deps = ["SentinelArrays", "Tables", "Test"] +git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" +uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" +version = "1.2.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TimeZones]] +deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"] +git-tree-sha1 = "2c705e96825b66c4a3f25031a683c06518256dd3" +uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" +version = "1.21.3" +weakdeps = ["RecipesBase"] + + [deps.TimeZones.extensions] + TimeZonesRecipesBaseExt = "RecipesBase" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Transducers]] +deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] +git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.84" + + [deps.Transducers.extensions] + TransducersAdaptExt = "Adapt" + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + TransducersReferenceablesExt = "Referenceables" + + [deps.Transducers.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + 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.URIs]] +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.6.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "d2282232f8a4d71f79e85dc4dd45e5b12a6297fb" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.23.1" +weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "Printf"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + ForwardDiffExt = "ForwardDiff" + InverseFunctionsUnitfulExt = "InverseFunctions" + PrintfExt = "Printf" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "af305cc62419f9bd61b6644d19170a4d258c7967" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.7.0" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + + [deps.UnsafeAtomics.weakdeps] + LLVM = "929cbde3-209d-540e-8aea-75f648917ca0" + +[[deps.UnsafePointers]] +git-tree-sha1 = "c81331b3b2e60a982be57c046ec91f599ede674a" +uuid = "e17b2a0c-0bdf-430a-bd0c-3a23cae4ff39" +version = "1.0.0" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "XML2_jll"] +git-tree-sha1 = "53ab3e9c94f4343c68d5905565be63002e13ec8c" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.23.1+1" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WorkerUtilities]] +git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" +uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" +version = "1.6.1" + +[[deps.XGBoost]] +deps = ["AbstractTrees", "CEnum", "JSON3", "LinearAlgebra", "OrderedCollections", "SparseArrays", "SparseMatricesCSR", "Statistics", "Tables", "XGBoost_jll"] +git-tree-sha1 = "bacb62e07d104630094c8dac2fd070f5d4b9b305" +uuid = "009559a3-9522-5dbb-924b-0b6ed2b22bb9" +version = "2.5.1" + + [deps.XGBoost.extensions] + XGBoostCUDAExt = "CUDA" + XGBoostTermExt = "Term" + + [deps.XGBoost.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Term = "22787eb5-b846-44ae-b979-8e399b8463ab" + +[[deps.XGBoost_jll]] +deps = ["Artifacts", "CUDA_Runtime_jll", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "1c0aa2390a7ebb28a3d6c214f64e57a24091fbd7" +uuid = "a5c6f535-4255-5ca2-a466-0e519f119c46" +version = "2.0.1+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.6+1" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.8.1+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.2+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.6+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.12+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.13+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.4+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.6+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.7+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "9caba99d38404b285db8801d5c45ef4f4f425a6d" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.1+0" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.8.3+0" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] +git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.6+0" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.5+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.12+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.1+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.3+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "c5bf2dad6a03dfef57ea0a170a1fe493601603f2" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.5+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"] +git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.10+0" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.2+0" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.7+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.44.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c3b0e6196d50eab0c5ed34021aaa0bb463489510" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.14+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.61.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.11.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "56d643b57b188d30cccc25e331d416d3d358e557" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.13.4+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "91d05d7f4a9f67205bd6cf395e488009fe85b499" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.28.1+0" + +[[deps.liblinear_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7f5f1953394b74739eaebd345f4515515a022a5b" +uuid = "275f1f90-abd2-5ca1-9ad8-abd4e3d66eb7" +version = "2.47.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "cd155272a3738da6db765745b89e466fa64d0830" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.49+0" + +[[deps.libsvm_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl", "Pkg"] +git-tree-sha1 = "7625dde5e9eab416c1cb791627f065ce55297eff" +uuid = "08558c22-525a-5d2a-acf6-0ac6658ffce4" +version = "3.25.0+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.micromamba_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "b4a5a3943078f9fd11ae0b5ab1bdbf7718617945" +uuid = "f8abcde7-e9b7-5caa-b8af-a437887ae8e4" +version = "1.5.8+0" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b4d631fd51f2e9cdd93724ae25b2efc198b059b1" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.7+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.pixi_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "f349584316617063160a947a82638f7611a8ef0f" +uuid = "4d7b5844-a134-5dcd-ac86-c8f19cd51bed" +version = "0.41.3+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "fbf139bce07a534df0e699dbb5f5cc9346f95cc1" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.9.2+0" diff --git a/docs/src/tutorials/adult_example/Project.toml b/docs/src/tutorials/adult_example/Project.toml new file mode 100644 index 0000000..57f8c27 --- /dev/null +++ b/docs/src/tutorials/adult_example/Project.toml @@ -0,0 +1,21 @@ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +CatBoost = "e2e10f9a-a85d-4fa9-b6b2-639a32100a12" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +GLM = "38e38edf-8417-5370-95a0-9cbb8c7f171a" +HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" +LIBSVM = "b1bec4e5-fd48-53fe-b0cb-9723c09d164b" +LightGBM = "7acf609c-83a4-11e9-1ffb-b912bcd3b04a" +Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" +MLJ = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +MLJGLMInterface = "caf8df21-4939-456d-ac9c-5fefbfb04c0c" +MLJLinearModels = "6ee0df7b-362f-4a72-a706-9e79364fb692" +MLJModels = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +MLJTransforms = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" +MLJXGBoostInterface = "54119dfa-1dab-4055-a167-80440f4f7a91" +NearestNeighborModels = "636a865e-7cf4-491e-846c-de09b730eb36" +PalmerPenguins = "8b842266-38fa-440a-9b57-31493939ab85" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" diff --git a/docs/src/tutorials/adult_example/adult_encoding_comparison.png b/docs/src/tutorials/adult_example/adult_encoding_comparison.png new file mode 100644 index 0000000..787eba2 Binary files /dev/null and b/docs/src/tutorials/adult_example/adult_encoding_comparison.png differ diff --git a/docs/src/tutorials/adult_example/generate.jl b/docs/src/tutorials/adult_example/generate.jl new file mode 100644 index 0000000..b2ab909 --- /dev/null +++ b/docs/src/tutorials/adult_example/generate.jl @@ -0,0 +1,3 @@ +# Use the per-tutorial environment defined by `Project.toml` in this folder +joinpath(@__DIR__, "..", "..", "generate.jl") |> include +generate(@__DIR__, execute = true) diff --git a/docs/src/tutorials/adult_example/notebook.ipynb b/docs/src/tutorials/adult_example/notebook.ipynb new file mode 100644 index 0000000..17af1c7 --- /dev/null +++ b/docs/src/tutorials/adult_example/notebook.ipynb @@ -0,0 +1,385 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Wine Quality Prediction: Comparing Categorical Encoders\n", + "\n", + "This tutorial compares different categorical encoding approaches on wine quality prediction.\n", + "We'll test OneHot, Frequency, and Cardinality Reduction encoders with CatBoost regression.\n", + "\n", + "**Why compare encoders?** Categorical variables with many levels (like wine varieties)\n", + "can create high-dimensional sparse features. Different encoding strategies handle this\n", + "challenge differently, affecting both model performance and training speed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Note: we do not endorse drinking alcohol, this tutorial is purely for educational purposes." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Activating project at `~/Documents/GitHub/MLJTransforms/docs/src/tutorials/wine_example`\n" + ] + } + ], + "cell_type": "code", + "source": [ + "using Pkg;\n", + "Pkg.activate(@__DIR__);\n", + "\n", + "using MLJ, MLJTransforms, DataFrames, ScientificTypes\n", + "using Random, CSV, StatsBase, Plots" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Load and Prepare Data\n", + "Load the wine dataset and take a sample for faster computation.\n", + "The dataset contains wine reviews with categorical features like variety, winery, and region:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "\u001b[1m5Γ—8 DataFrame\u001b[0m\n\u001b[1m Row \u001b[0mβ”‚\u001b[1m country \u001b[0m\u001b[1m points \u001b[0m\u001b[1m price \u001b[0m\u001b[1m province \u001b[0m\u001b[1m region_1 \u001b[0m\u001b[1m region_2 \u001b[0m β‹―\n β”‚\u001b[90m String3 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m String15 \u001b[0m\u001b[90m String \u001b[0m\u001b[90m String31 \u001b[0m β‹―\n─────┼──────────────────────────────────────────────────────────────────────────\n 1 β”‚ US 87 14.0 Oregon Willamette Valley Willamette Val β‹―\n 2 β”‚ US 87 65.0 Oregon Willamette Valley Willamette Val\n 3 β”‚ US 87 19.0 California Napa Valley Napa\n 4 β”‚ US 87 34.0 California Alexander Valley Sonoma\n 5 β”‚ US 87 12.0 California Central Coast Central Coast β‹―\n\u001b[36m 3 columns omitted\u001b[0m", + "text/html": [ + "
5Γ—8 DataFrame
Rowcountrypointspriceprovinceregion_1region_2varietywinery
String3Int64Float64String15StringString31StringString
1US8714.0OregonWillamette ValleyWillamette ValleyPinot GrisRainstorm
2US8765.0OregonWillamette ValleyWillamette ValleyPinot NoirSweet Cheeks
3US8719.0CaliforniaNapa ValleyNapaCabernet SauvignonKirkland Signature
4US8734.0CaliforniaAlexander ValleySonomaCabernet SauvignonLouis M. Martini
5US8712.0CaliforniaCentral CoastCentral CoastChardonnayMirassou
" + ] + }, + "metadata": {}, + "execution_count": 2 + } + ], + "cell_type": "code", + "source": [ + "df = CSV.read(\"./clean_wine.csv\", DataFrame)\n", + "\n", + "first(df, 5)" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "Sample 10,000 rows for faster computation (the full dataset is quite large):" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "df = df[sample(1:nrow(df), 10000, replace = false), :];" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "Coerce categorical columns to appropriate scientific types. We use `autotype` to automatically detect\n", + "categorical features by recognizing columns with few unique values:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "df = coerce(df, autotype(df, :few_to_finite));\n", + "df = coerce(df, :points => Continuous, :region_1 => Multiclass,\n", + " :variety => Multiclass, :winery => Multiclass);" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Split Data\n", + "Separate features (X) from target (y), then split into train/test sets:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "y, X = unpack(df, ==(:points); rng = 123);\n", + "train, test = partition(eachindex(y), 0.8, shuffle = true, rng = 100);" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "## Setup Encoders and Model\n", + "Load the required models and create different encoding strategies:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ Info: For silent loading, specify `verbosity=0`. \n", + "import CatBoost βœ”\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": "CatBoost.MLJCatBoostInterface.CatBoostRegressor" + }, + "metadata": {}, + "execution_count": 6 + } + ], + "cell_type": "code", + "source": [ + "OneHot = @load OneHotEncoder pkg = MLJModels verbosity = 0\n", + "CatBoostRegressor = @load CatBoostRegressor pkg = CatBoost" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "**Encoding Strategies:**\n", + "1. **OneHotEncoder**: Creates binary columns for each category\n", + "2. **FrequencyEncoder**: Replaces categories with their frequency counts\n", + "In case of the one-hot-encoder, we worry when categories have high cardinality as that would lead to an explosion in the number of features." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "card_reducer = MLJTransforms.CardinalityReducer(min_frequency = 10, ordered_factor = true)\n", + "onehot_model = OneHot(drop_last = true, ordered_factor = true)\n", + "freq_model = MLJTransforms.FrequencyEncoder(normalize = false, ordered_factor = true)\n", + "cat = CatBoostRegressor();" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Create three different pipelines to compare:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "3-element Vector{Tuple{String, MLJBase.DeterministicPipeline{N, MLJModelInterface.predict} where N<:NamedTuple}}:\n (\"CardRed + OneHot + CAT\", DeterministicPipeline(cardinality_reducer = CardinalityReducer(features = Symbol[], …), …))\n (\"OneHot + CAT\", DeterministicPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …))\n (\"FreqEnc + CAT\", DeterministicPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …))" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "cell_type": "code", + "source": [ + "pipelines = [\n", + " (\"CardRed + OneHot + CAT\", card_reducer |> onehot_model |> cat),\n", + " (\"OneHot + CAT\", onehot_model |> cat),\n", + " (\"FreqEnc + CAT\", freq_model |> cat),\n", + "]" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "## Evaluate Pipelines\n", + "Train each pipeline and measure both performance (RMSE) and training time:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training: CardRed + OneHot + CAT\n", + "[ Info: Training machine(DeterministicPipeline(cardinality_reducer = CardinalityReducer(features = Symbol[], …), …), …).\n", + "[ Info: Training machine(:cardinality_reducer, …).\n", + "[ Info: Training machine(:one_hot_encoder, …).\n", + "[ Info: Spawning 0 sub-features to one-hot encode feature :country.\n", + "[ Info: Spawning 3 sub-features to one-hot encode feature :province.\n", + "[ Info: Spawning 100 sub-features to one-hot encode feature :region_1.\n", + "[ Info: Spawning 16 sub-features to one-hot encode feature :region_2.\n", + "[ Info: Spawning 48 sub-features to one-hot encode feature :variety.\n", + "[ Info: Spawning 401 sub-features to one-hot encode feature :winery.\n", + "[ Info: Training machine(:cat_boost_regressor, …).\n", + "Training: OneHot + CAT\n", + "[ Info: Training machine(DeterministicPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …), …).\n", + "[ Info: Training machine(:one_hot_encoder, …).\n", + "[ Info: Spawning 0 sub-features to one-hot encode feature :country.\n", + "[ Info: Spawning 3 sub-features to one-hot encode feature :province.\n", + "[ Info: Spawning 163 sub-features to one-hot encode feature :region_1.\n", + "[ Info: Spawning 16 sub-features to one-hot encode feature :region_2.\n", + "[ Info: Spawning 155 sub-features to one-hot encode feature :variety.\n", + "[ Info: Spawning 3015 sub-features to one-hot encode feature :winery.\n", + "[ Info: Training machine(:cat_boost_regressor, …).\n", + "Training: FreqEnc + CAT\n", + "[ Info: Training machine(DeterministicPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …), …).\n", + "[ Info: Training machine(:frequency_encoder, …).\n", + "[ Info: Training machine(:cat_boost_regressor, …).\n" + ] + } + ], + "cell_type": "code", + "source": [ + "results = DataFrame(pipeline = String[], rmse = Float64[], training_time = Float64[]);\n", + "\n", + "for (name, pipe) in pipelines\n", + " println(\"Training: $name\")\n", + " mach = machine(pipe, X, y)\n", + " training_time = @elapsed MLJ.fit!(mach, rows = train)\n", + " predictions = MLJ.predict(mach, rows = test)\n", + " rmse_value = MLJ.root_mean_squared_error(y[test], predictions)\n", + " push!(results, (name, rmse_value, training_time))\n", + "end" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "Sort by RMSE (lower is better) and display results:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "\u001b[1m3Γ—3 DataFrame\u001b[0m\n\u001b[1m Row \u001b[0mβ”‚\u001b[1m pipeline \u001b[0m\u001b[1m rmse \u001b[0m\u001b[1m training_time \u001b[0m\n β”‚\u001b[90m String \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\n─────┼────────────────────────────────────────────────\n 1 β”‚ OneHot + CAT 2.41128 140.636\n 2 β”‚ CardRed + OneHot + CAT 2.41138 117.443\n 3 β”‚ FreqEnc + CAT 2.41764 27.9614", + "text/html": [ + "
3Γ—3 DataFrame
Rowpipelinermsetraining_time
StringFloat64Float64
1OneHot + CAT2.41128140.636
2CardRed + OneHot + CAT2.41138117.443
3FreqEnc + CAT2.4176427.9614
" + ] + }, + "metadata": {}, + "execution_count": 10 + } + ], + "cell_type": "code", + "source": [ + "sort!(results, :rmse)\n", + "results" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "## Visualization\n", + "Create side-by-side bar charts to compare both training time and model performance:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "n = nrow(results)\n", + "\n", + "time_plot = bar(1:n, results.training_time;\n", + " xticks = (1:n, results.pipeline), title = \"Training Time (seconds)\",\n", + " xlabel = \"Pipeline\", ylabel = \"Time (s)\", xrotation = 45,\n", + " legend = false, color = :lightblue);\n", + "\n", + "rmse_plot = bar(1:n, results.rmse;\n", + " xticks = (1:n, results.pipeline), title = \"Root Mean Squared Error\",\n", + " xlabel = \"Pipeline\", ylabel = \"RMSE\", xrotation = 45,\n", + " legend = false, color = :lightcoral);\n", + "\n", + "combined_plot = plot(time_plot, rmse_plot; layout = (1, 2), size = (1200, 500));" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "Save the plot" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "savefig(combined_plot, \"wine_encoding_comparison.png\"); #hide" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "## Conclusion\n", + "\n", + "**Key Findings:**\n", + "- The model performance did not vary significantly across encoding strategies.\n", + "- We observe a decent speed up in using the cardinality reducer before one-hot encoding with close to no impact on performance.\n", + "- That said, frequency encoder led to the least training time as it didn't add any new features" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.5" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.5", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/tutorials/adult_example/notebook.jl b/docs/src/tutorials/adult_example/notebook.jl new file mode 100644 index 0000000..7e35b5d --- /dev/null +++ b/docs/src/tutorials/adult_example/notebook.jl @@ -0,0 +1,240 @@ +# # Adult Income Prediction: Comparing Categorical Encoders + +# **Julia version** is assumed to be 1.10.* + +# This demonstration is available as a Jupyter notebook or julia script (as well as the dataset) +# [here](https://github.com/essamwise/MLJTransforms.jl/tree/main/docs/src/tutorials/wine_example). +# +# This tutorial compares different categorical encoding approaches on adult income prediction. +# We'll test OneHot, Frequency, and Cardinality Reduction encoders with CatBoost classification. +# +# **Why compare encoders?** Categorical variables with many levels (like occupation, education) +# can create high-dimensional sparse features. Different encoding strategies handle this +# challenge differently, affecting both model performance and training speed. +# +# **High Cardinality Challenge:** We've added a synthetic feature with 100 categories to +# demonstrate how encoders handle extreme cardinality - a common real-world scenario with +# features like customer IDs, product codes, or geographical subdivisions. + +# packages are already activated by generate.jl + +using MLJ, MLJTransforms, DataFrames, ScientificTypes +using Random, CSV, StatsBase, Plots, BenchmarkTools + +# Import scitypes from MLJ to avoid any package version skew +using MLJ: OrderedFactor, Continuous, Multiclass + +# ## Load and Prepare Data +# Load the Adult Income dataset. This dataset contains demographic information +# and the task is to predict whether a person makes over $50K per year. + +# Load data with header and rename columns to the expected symbols +df = CSV.read("./adult.csv", DataFrame; header = true) +rename!( + df, + [ + :age, + :workclass, + :fnlwgt, + :education, + :education_num, + :marital_status, + :occupation, + :relationship, + :race, + :sex, + :capital_gain, + :capital_loss, + :hours_per_week, + :native_country, + :income, + ], +) + +first(df, 5) + + +# Clean the data by removing leading/trailing spaces and converting income to binary: +for col in [:workclass, :education, :marital_status, :occupation, :relationship, + :race, :sex, :native_country, :income] + df[!, col] = strip.(string.(df[!, col])) +end + +# Convert income to binary (0 for <=50K, 1 for >50K) +df.income = ifelse.(df.income .== ">50K", 1, 0); + +# Let's a high-cardinality categorical feature to showcase encoder handling +# Create a realistic frequency distribution: A1-A3 make up 90% of data, A4-A500 make up 10% +Random.seed!(42) +high_card_categories = ["A$i" for i in 1:500] + +n_rows = nrow(df) +n_frequent = Int(round(0.9 * n_rows)) # 90% for A1, A2, A3 +n_rare = n_rows - n_frequent # 10% for A4-A500 + +frequent_samples = rand(["A1", "A2", "A3"], n_frequent) + +rare_categories = ["A$i" for i in 4:500] +rare_samples = rand(rare_categories, n_rare); + +# Combine and shuffle +all_samples = vcat(frequent_samples, rare_samples) +df.high_cardinality_feature = all_samples[randperm(n_rows)]; + +# Coerce categorical columns to appropriate scientific types. +# Apply explicit type coercions using fully qualified names +type_dict = Dict( + :income => OrderedFactor, + :age => Continuous, + :fnlwgt => Continuous, + :education_num => Continuous, + :capital_gain => Continuous, + :capital_loss => Continuous, + :hours_per_week => Continuous, + :workclass => Multiclass, + :education => Multiclass, + :marital_status => Multiclass, + :occupation => Multiclass, + :relationship => Multiclass, + :race => Multiclass, + :sex => Multiclass, + :native_country => Multiclass, + :high_cardinality_feature => Multiclass, +) +df = coerce(df, type_dict); + +# Let's examine the cardinality of our categorical features: +categorical_cols = [:workclass, :education, :marital_status, :occupation, + :relationship, :race, :sex, :native_country, :high_cardinality_feature] +println("Cardinality of categorical features:") +for col in categorical_cols + n_unique = length(unique(df[!, col])) + println(" $col: $n_unique unique values") +end + + + +# ## Split Data +# Separate features (X) from target (y), then split into train/test sets: + +y, X = unpack(df, ==(:income); rng = 123); +train, test = partition(eachindex(y), 0.8, shuffle = true, rng = 100); + +# ## Setup Encoders and Model +# Load the required models and create different encoding strategies: + +OneHot = @load OneHotEncoder pkg = MLJModels verbosity = 0 +CatBoostClassifier = @load CatBoostClassifier pkg = CatBoost + + +# **Encoding Strategies:** +# 1. **OneHotEncoder**: Creates binary columns for each category +# 2. **FrequencyEncoder**: Replaces categories with their frequency counts +# In case of the one-hot-encoder, we worry when categories have high cardinality as that would lead to an explosion in the number of features. + +card_reducer = MLJTransforms.CardinalityReducer( + min_frequency = 0.15, + ordered_factor = true, + label_for_infrequent = Dict( + AbstractString => "OtherItems", + Char => 'O', + ), +) +onehot_model = OneHot(drop_last = true, ordered_factor = true) +freq_model = MLJTransforms.FrequencyEncoder(normalize = false, ordered_factor = true) +cat = CatBoostClassifier(); + +# Create three different pipelines to compare: +pipelines = [ + ("CardRed + OneHot + CAT", card_reducer |> onehot_model |> cat), + ("OneHot + CAT", onehot_model |> cat), + ("FreqEnc + CAT", freq_model |> cat), +] + +# ## Evaluate Pipelines with Proper Benchmarking +# Train each pipeline and measure both performance (accuracy) and training time using @btime: + +results = DataFrame(pipeline = String[], accuracy = Float64[], training_time = Float64[]); + +# Prepare results DataFrame + +for (name, pipe) in pipelines + println("Training and benchmarking: $name") + + ## Train once to compute accuracy + mach = machine(pipe, X, y) + MLJ.fit!(mach, rows = train) + predictions = MLJ.predict_mode(mach, rows = test) + accuracy_value = MLJ.accuracy(predictions, y[test]) + + ## Measure training time using @belapsed (returns Float64 seconds) with 5 samples + ## Create a fresh machine inside the benchmark to avoid state sharing + training_time = + @belapsed MLJ.fit!(machine($pipe, $X, $y), rows = $train, force = true) samples = 5 + + println(" Training time (min over 5 samples): $(training_time) s") + println(" Accuracy: $(round(accuracy_value, digits=4))\n") + + push!(results, (string(name), accuracy_value, training_time)) +end + + +# Sort by accuracy (higher is better) and display results: +sort!(results, :accuracy, rev = true) +results + +# ## Visualization +# Create side-by-side bar charts to compare both training time and model performance: + +n = nrow(results) + +# Create a simple timing visualization (note: timing strings from @btime need manual parsing for plotting) +# Sort by accuracy (higher is better) +sort!(results, :accuracy, rev = true) +results # show table + +# ------------------------- +# Visualization (side-by-side) +# ------------------------- +n = nrow(results) +# training time plot (seconds) +time_plot = bar(1:n, results.training_time; + xticks = (1:n, results.pipeline), + title = "Training Time (s)", + xlabel = "Pipeline", ylabel = "Time (s)", + xrotation = 8, + legend = false, + color = :lightblue, +); + +# accuracy plot +accuracy_plot = bar(1:n, results.accuracy; + xticks = (1:n, results.pipeline), + title = "Classification Accuracy", + xlabel = "Pipeline", ylabel = "Accuracy", + xrotation = 8, + legend = false, + ylim = (0.0, 1.0), + color = :lightcoral, +); + + +combined_plot = plot(time_plot, accuracy_plot; layout = (1, 2), size = (1200, 500)); + +# Save the plot +savefig(combined_plot, "adult_encoding_comparison.png"); #hide + +#md # ![Adult Encoding Comparison](adult_encoding_comparison.png) + +# ## Conclusion +# +# **Key Findings from Results:** +# +# **Training Time Performance (dramatic differences!):** +# - **FreqEnc + CAT**: 0.32 seconds - **fastest approach** +# - **CardRed + OneHot + CAT**: 0.57 seconds - **10x faster than pure OneHot** +# - **OneHot + CAT**: 5.85 seconds - **significantly slower due to high cardinality** +# +# **Accuracy:** In this example, we don't see a difference in accuracy but the savings in time are big. + +# Note that we still observe a speed improvement with the cardinality reducer if we omit the high cardinality feature we added but it's much smaller as the adults dataset is not that high in cardinality. \ No newline at end of file diff --git a/docs/src/tutorials/adult_example/notebook.md b/docs/src/tutorials/adult_example/notebook.md new file mode 100644 index 0000000..931af16 --- /dev/null +++ b/docs/src/tutorials/adult_example/notebook.md @@ -0,0 +1,474 @@ +```@meta +EditURL = "notebook.jl" +``` + +# Adult Income Prediction: Comparing Categorical Encoders + +**Julia version** is assumed to be 1.10.* + +This demonstration is available as a Jupyter notebook or julia script (as well as the dataset) +[here](https://github.com/essamwise/MLJTransforms.jl/tree/main/docs/src/tutorials/wine_example). + +This tutorial compares different categorical encoding approaches on adult income prediction. +We'll test OneHot, Frequency, and Cardinality Reduction encoders with CatBoost classification. + +**Why compare encoders?** Categorical variables with many levels (like occupation, education) +can create high-dimensional sparse features. Different encoding strategies handle this +challenge differently, affecting both model performance and training speed. + +**High Cardinality Challenge:** We've added a synthetic feature with 100 categories to +demonstrate how encoders handle extreme cardinality - a common real-world scenario with +features like customer IDs, product codes, or geographical subdivisions. + +packages are already activated by generate.jl + +````julia +using MLJ, MLJTransforms, DataFrames, ScientificTypes +using Random, CSV, StatsBase, Plots, BenchmarkTools +```` + +Import scitypes from MLJ to avoid any package version skew + +````julia +using MLJ: OrderedFactor, Continuous, Multiclass +```` + +## Load and Prepare Data +Load the Adult Income dataset. This dataset contains demographic information +and the task is to predict whether a person makes over $50K per year. + +Load data with header and rename columns to the expected symbols + +````julia +df = CSV.read("./adult.csv", DataFrame; header = true) +rename!( + df, + [ + :age, + :workclass, + :fnlwgt, + :education, + :education_num, + :marital_status, + :occupation, + :relationship, + :race, + :sex, + :capital_gain, + :capital_loss, + :hours_per_week, + :native_country, + :income, + ], +) + +first(df, 5) +```` + +```@raw html +
5Γ—15 DataFrame
Rowageworkclassfnlwgteducationeducation_nummarital_statusoccupationrelationshipracesexcapital_gaincapital_losshours_per_weeknative_countryincome
Int64String31Int64String15Int64String31String31String15String31String7Int64Int64Int64String31String7
125Private22680211th7Never-marriedMachine-op-inspctOwn-childBlackMale0040United-States<=50K
238Private89814HS-grad9Married-civ-spouseFarming-fishingHusbandWhiteMale0050United-States<=50K
328Local-gov336951Assoc-acdm12Married-civ-spouseProtective-servHusbandWhiteMale0040United-States>50K
444Private160323Some-college10Married-civ-spouseMachine-op-inspctHusbandBlackMale7688040United-States>50K
518?103497Some-college10Never-married?Own-childWhiteFemale0030United-States<=50K
+``` + +Clean the data by removing leading/trailing spaces and converting income to binary: + +````julia +for col in [:workclass, :education, :marital_status, :occupation, :relationship, + :race, :sex, :native_country, :income] + df[!, col] = strip.(string.(df[!, col])) +end +```` + +Convert income to binary (0 for <=50K, 1 for >50K) + +````julia +df.income = ifelse.(df.income .== ">50K", 1, 0); +```` + +Let's a high-cardinality categorical feature to showcase encoder handling +Create a realistic frequency distribution: A1-A3 make up 90% of data, A4-A500 make up 10% + +````julia +Random.seed!(42) +high_card_categories = ["A$i" for i in 1:500] + +n_rows = nrow(df) +n_frequent = Int(round(0.9 * n_rows)) # 90% for A1, A2, A3 +n_rare = n_rows - n_frequent # 10% for A4-A500 + +frequent_samples = rand(["A1", "A2", "A3"], n_frequent) + +rare_categories = ["A$i" for i in 4:500] +rare_samples = rand(rare_categories, n_rare); +```` + +Combine and shuffle + +````julia +all_samples = vcat(frequent_samples, rare_samples) +df.high_cardinality_feature = all_samples[randperm(n_rows)]; +```` + +Coerce categorical columns to appropriate scientific types. +Apply explicit type coercions using fully qualified names + +````julia +type_dict = Dict( + :income => OrderedFactor, + :age => Continuous, + :fnlwgt => Continuous, + :education_num => Continuous, + :capital_gain => Continuous, + :capital_loss => Continuous, + :hours_per_week => Continuous, + :workclass => Multiclass, + :education => Multiclass, + :marital_status => Multiclass, + :occupation => Multiclass, + :relationship => Multiclass, + :race => Multiclass, + :sex => Multiclass, + :native_country => Multiclass, + :high_cardinality_feature => Multiclass, +) +df = coerce(df, type_dict); +```` + +Let's examine the cardinality of our categorical features: + +````julia +categorical_cols = [:workclass, :education, :marital_status, :occupation, + :relationship, :race, :sex, :native_country, :high_cardinality_feature] +println("Cardinality of categorical features:") +for col in categorical_cols + n_unique = length(unique(df[!, col])) + println(" $col: $n_unique unique values") +end +```` + +```` +Cardinality of categorical features: + workclass: 9 unique values + education: 16 unique values + marital_status: 7 unique values + occupation: 15 unique values + relationship: 6 unique values + race: 5 unique values + sex: 2 unique values + native_country: 42 unique values + high_cardinality_feature: 500 unique values + +```` + +## Split Data +Separate features (X) from target (y), then split into train/test sets: + +````julia +y, X = unpack(df, ==(:income); rng = 123); +train, test = partition(eachindex(y), 0.8, shuffle = true, rng = 100); +```` + +## Setup Encoders and Model +Load the required models and create different encoding strategies: + +````julia +OneHot = @load OneHotEncoder pkg = MLJModels verbosity = 0 +CatBoostClassifier = @load CatBoostClassifier pkg = CatBoost +```` + +```` +CatBoost.MLJCatBoostInterface.CatBoostClassifier +```` + +**Encoding Strategies:** +1. **OneHotEncoder**: Creates binary columns for each category +2. **FrequencyEncoder**: Replaces categories with their frequency counts +In case of the one-hot-encoder, we worry when categories have high cardinality as that would lead to an explosion in the number of features. + +````julia +card_reducer = MLJTransforms.CardinalityReducer( + min_frequency = 0.15, + ordered_factor = true, + label_for_infrequent = Dict( + AbstractString => "OtherItems", + Char => 'O', + ), +) +onehot_model = OneHot(drop_last = true, ordered_factor = true) +freq_model = MLJTransforms.FrequencyEncoder(normalize = false, ordered_factor = true) +cat = CatBoostClassifier(); +```` + +Create three different pipelines to compare: + +````julia +pipelines = [ + ("CardRed + OneHot + CAT", card_reducer |> onehot_model |> cat), + ("OneHot + CAT", onehot_model |> cat), + ("FreqEnc + CAT", freq_model |> cat), +] +```` + +```` +3-element Vector{Tuple{String, MLJBase.ProbabilisticPipeline{N, MLJModelInterface.predict} where N<:NamedTuple}}: + ("CardRed + OneHot + CAT", ProbabilisticPipeline(cardinality_reducer = CardinalityReducer(features = Symbol[], …), …)) + ("OneHot + CAT", ProbabilisticPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …)) + ("FreqEnc + CAT", ProbabilisticPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …)) +```` + +## Evaluate Pipelines with Proper Benchmarking +Train each pipeline and measure both performance (accuracy) and training time using @btime: + +````julia +results = DataFrame(pipeline = String[], accuracy = Float64[], training_time = Float64[]); +```` + +Prepare results DataFrame + +````julia +for (name, pipe) in pipelines + println("Training and benchmarking: $name") + + # Train once to compute accuracy + mach = machine(pipe, X, y) + MLJ.fit!(mach, rows = train) + predictions = MLJ.predict_mode(mach, rows = test) + accuracy_value = MLJ.accuracy(predictions, y[test]) + + # Measure training time using @belapsed (returns Float64 seconds) with 5 samples + # Create a fresh machine inside the benchmark to avoid state sharing + training_time = + @belapsed MLJ.fit!(machine($pipe, $X, $y), rows = $train, force = true) samples = 5 + + println(" Training time (min over 5 samples): $(training_time) s") + println(" Accuracy: $(round(accuracy_value, digits=4))\n") + + push!(results, (string(name), accuracy_value, training_time)) +end +```` + +```` +Training and benchmarking: CardRed + OneHot + CAT +[ Info: Training machine(ProbabilisticPipeline(cardinality_reducer = CardinalityReducer(features = Symbol[], …), …), …). +[ Info: Training machine(:cardinality_reducer, …). +[ Info: Training machine(:one_hot_encoder, …). +[ Info: Spawning 1 sub-features to one-hot encode feature :workclass. +[ Info: Spawning 3 sub-features to one-hot encode feature :education. +[ Info: Spawning 2 sub-features to one-hot encode feature :marital_status. +[ Info: Spawning 0 sub-features to one-hot encode feature :occupation. +[ Info: Spawning 3 sub-features to one-hot encode feature :relationship. +[ Info: Spawning 1 sub-features to one-hot encode feature :race. +[ Info: Spawning 1 sub-features to one-hot encode feature :sex. +[ Info: Spawning 2 sub-features to one-hot encode feature :native_country. +[ Info: Spawning 3 sub-features to one-hot encode feature :high_cardinality_feature. +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(cardinality_reducer = CardinalityReducer(features = Symbol[], …), …), …). +[ Info: Training machine(:cardinality_reducer, …). +[ Info: Training machine(:one_hot_encoder, …). +[ Info: Spawning 1 sub-features to one-hot encode feature :workclass. +[ Info: Spawning 3 sub-features to one-hot encode feature :education. +[ Info: Spawning 2 sub-features to one-hot encode feature :marital_status. +[ Info: Spawning 0 sub-features to one-hot encode feature :occupation. +[ Info: Spawning 3 sub-features to one-hot encode feature :relationship. +[ Info: Spawning 1 sub-features to one-hot encode feature :race. +[ Info: Spawning 1 sub-features to one-hot encode feature :sex. +[ Info: Spawning 2 sub-features to one-hot encode feature :native_country. +[ Info: Spawning 3 sub-features to one-hot encode feature :high_cardinality_feature. +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(cardinality_reducer = CardinalityReducer(features = Symbol[], …), …), …). +[ Info: Training machine(:cardinality_reducer, …). +[ Info: Training machine(:one_hot_encoder, …). +[ Info: Spawning 1 sub-features to one-hot encode feature :workclass. +[ Info: Spawning 3 sub-features to one-hot encode feature :education. +[ Info: Spawning 2 sub-features to one-hot encode feature :marital_status. +[ Info: Spawning 0 sub-features to one-hot encode feature :occupation. +[ Info: Spawning 3 sub-features to one-hot encode feature :relationship. +[ Info: Spawning 1 sub-features to one-hot encode feature :race. +[ Info: Spawning 1 sub-features to one-hot encode feature :sex. +[ Info: Spawning 2 sub-features to one-hot encode feature :native_country. +[ Info: Spawning 3 sub-features to one-hot encode feature :high_cardinality_feature. +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(cardinality_reducer = CardinalityReducer(features = Symbol[], …), …), …). +[ Info: Training machine(:cardinality_reducer, …). +[ Info: Training machine(:one_hot_encoder, …). +[ Info: Spawning 1 sub-features to one-hot encode feature :workclass. +[ Info: Spawning 3 sub-features to one-hot encode feature :education. +[ Info: Spawning 2 sub-features to one-hot encode feature :marital_status. +[ Info: Spawning 0 sub-features to one-hot encode feature :occupation. +[ Info: Spawning 3 sub-features to one-hot encode feature :relationship. +[ Info: Spawning 1 sub-features to one-hot encode feature :race. +[ Info: Spawning 1 sub-features to one-hot encode feature :sex. +[ Info: Spawning 2 sub-features to one-hot encode feature :native_country. +[ Info: Spawning 3 sub-features to one-hot encode feature :high_cardinality_feature. +[ Info: Training machine(:cat_boost_classifier, …). + Training time (min over 5 samples): 6.941996542 s + Accuracy: 0.8697 + +Training and benchmarking: OneHot + CAT +[ Info: Training machine(ProbabilisticPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …), …). +[ Info: Training machine(:one_hot_encoder, …). +[ Info: Spawning 8 sub-features to one-hot encode feature :workclass. +[ Info: Spawning 15 sub-features to one-hot encode feature :education. +[ Info: Spawning 6 sub-features to one-hot encode feature :marital_status. +[ Info: Spawning 14 sub-features to one-hot encode feature :occupation. +[ Info: Spawning 5 sub-features to one-hot encode feature :relationship. +[ Info: Spawning 4 sub-features to one-hot encode feature :race. +[ Info: Spawning 1 sub-features to one-hot encode feature :sex. +[ Info: Spawning 41 sub-features to one-hot encode feature :native_country. +[ Info: Spawning 499 sub-features to one-hot encode feature :high_cardinality_feature. +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …), …). +[ Info: Training machine(:one_hot_encoder, …). +[ Info: Spawning 8 sub-features to one-hot encode feature :workclass. +[ Info: Spawning 15 sub-features to one-hot encode feature :education. +[ Info: Spawning 6 sub-features to one-hot encode feature :marital_status. +[ Info: Spawning 14 sub-features to one-hot encode feature :occupation. +[ Info: Spawning 5 sub-features to one-hot encode feature :relationship. +[ Info: Spawning 4 sub-features to one-hot encode feature :race. +[ Info: Spawning 1 sub-features to one-hot encode feature :sex. +[ Info: Spawning 41 sub-features to one-hot encode feature :native_country. +[ Info: Spawning 499 sub-features to one-hot encode feature :high_cardinality_feature. +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …), …). +[ Info: Training machine(:one_hot_encoder, …). +[ Info: Spawning 8 sub-features to one-hot encode feature :workclass. +[ Info: Spawning 15 sub-features to one-hot encode feature :education. +[ Info: Spawning 6 sub-features to one-hot encode feature :marital_status. +[ Info: Spawning 14 sub-features to one-hot encode feature :occupation. +[ Info: Spawning 5 sub-features to one-hot encode feature :relationship. +[ Info: Spawning 4 sub-features to one-hot encode feature :race. +[ Info: Spawning 1 sub-features to one-hot encode feature :sex. +[ Info: Spawning 41 sub-features to one-hot encode feature :native_country. +[ Info: Spawning 499 sub-features to one-hot encode feature :high_cardinality_feature. +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …), …). +[ Info: Training machine(:one_hot_encoder, …). +[ Info: Spawning 8 sub-features to one-hot encode feature :workclass. +[ Info: Spawning 15 sub-features to one-hot encode feature :education. +[ Info: Spawning 6 sub-features to one-hot encode feature :marital_status. +[ Info: Spawning 14 sub-features to one-hot encode feature :occupation. +[ Info: Spawning 5 sub-features to one-hot encode feature :relationship. +[ Info: Spawning 4 sub-features to one-hot encode feature :race. +[ Info: Spawning 1 sub-features to one-hot encode feature :sex. +[ Info: Spawning 41 sub-features to one-hot encode feature :native_country. +[ Info: Spawning 499 sub-features to one-hot encode feature :high_cardinality_feature. +[ Info: Training machine(:cat_boost_classifier, …). + Training time (min over 5 samples): 13.276352708 s + Accuracy: 0.8775 + +Training and benchmarking: FreqEnc + CAT +[ Info: Training machine(ProbabilisticPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …), …). +[ Info: Training machine(:frequency_encoder, …). +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …), …). +[ Info: Training machine(:frequency_encoder, …). +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …), …). +[ Info: Training machine(:frequency_encoder, …). +[ Info: Training machine(:cat_boost_classifier, …). +[ Info: Training machine(ProbabilisticPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …), …). +[ Info: Training machine(:frequency_encoder, …). +[ Info: Training machine(:cat_boost_classifier, …). + Training time (min over 5 samples): 6.405741208 s + Accuracy: 0.8765 + + +```` + +Sort by accuracy (higher is better) and display results: + +````julia +sort!(results, :accuracy, rev = true) +results +```` + +```@raw html +
3Γ—3 DataFrame
Rowpipelineaccuracytraining_time
StringFloat64Float64
1OneHot + CAT0.87745713.2764
2FreqEnc + CAT0.8765366.40574
3CardRed + OneHot + CAT0.8696766.942
+``` + +## Visualization +Create side-by-side bar charts to compare both training time and model performance: + +````julia +n = nrow(results) +```` + +```` +3 +```` + +Create a simple timing visualization (note: timing strings from @btime need manual parsing for plotting) +Sort by accuracy (higher is better) + +````julia +sort!(results, :accuracy, rev = true) +results # show table +```` + +```@raw html +
3Γ—3 DataFrame
Rowpipelineaccuracytraining_time
StringFloat64Float64
1OneHot + CAT0.87745713.2764
2FreqEnc + CAT0.8765366.40574
3CardRed + OneHot + CAT0.8696766.942
+``` + +------------------------- +Visualization (side-by-side) +------------------------- + +````julia +n = nrow(results) +```` + +```` +3 +```` + +training time plot (seconds) + +````julia +time_plot = bar(1:n, results.training_time; + xticks = (1:n, results.pipeline), + title = "Training Time (s)", + xlabel = "Pipeline", ylabel = "Time (s)", + xrotation = 8, + legend = false, + color = :lightblue, +); +```` + +accuracy plot + +````julia +accuracy_plot = bar(1:n, results.accuracy; + xticks = (1:n, results.pipeline), + title = "Classification Accuracy", + xlabel = "Pipeline", ylabel = "Accuracy", + xrotation = 8, + legend = false, + ylim = (0.0, 1.0), + color = :lightcoral, +); + + +combined_plot = plot(time_plot, accuracy_plot; layout = (1, 2), size = (1200, 500)); +```` + +Save the plot + + +![Adult Encoding Comparison](adult_encoding_comparison.png) + +## Conclusion + +**Key Findings from Results:** + +**Training Time Performance (dramatic differences!):** +- **FreqEnc + CAT**: 0.32 seconds - **fastest approach** +- **CardRed + OneHot + CAT**: 0.57 seconds - **10x faster than pure OneHot** +- **OneHot + CAT**: 5.85 seconds - **significantly slower due to high cardinality** + +**Accuracy:** In this example, we don't see a difference in accuracy but the savings in time are big. + +Note that we still observe a speed improvement with the cardinality reducer if we omit the high cardinality feature we added but it's much smaller as the adults dataset is not that high in cardinality. + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/tutorials/adult_example/notebook.unexecuted.ipynb b/docs/src/tutorials/adult_example/notebook.unexecuted.ipynb new file mode 100644 index 0000000..985c2ed --- /dev/null +++ b/docs/src/tutorials/adult_example/notebook.unexecuted.ipynb @@ -0,0 +1,295 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Wine Quality Prediction: Comparing Categorical Encoders\n", + "\n", + "This tutorial compares different categorical encoding approaches on wine quality prediction.\n", + "We'll test OneHot, Frequency, and Cardinality Reduction encoders with CatBoost regression.\n", + "\n", + "**Why compare encoders?** Categorical variables with many levels (like wine varieties)\n", + "can create high-dimensional sparse features. Different encoding strategies handle this\n", + "challenge differently, affecting both model performance and training speed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Note: we do not endorse drinking alcohol, this tutorial is purely for educational purposes." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Pkg;\n", + "Pkg.activate(@__DIR__);\n", + "\n", + "using MLJ, MLJTransforms, DataFrames, ScientificTypes\n", + "using Random, CSV, StatsBase, Plots" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Load and Prepare Data\n", + "Load the wine dataset and take a sample for faster computation.\n", + "The dataset contains wine reviews with categorical features like variety, winery, and region:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "df = CSV.read(\"./clean_wine.csv\", DataFrame)\n", + "\n", + "first(df, 5)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Sample 10,000 rows for faster computation (the full dataset is quite large):" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "df = df[sample(1:nrow(df), 10000, replace = false), :];" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Coerce categorical columns to appropriate scientific types. We use `autotype` to automatically detect\n", + "categorical features by recognizing columns with few unique values:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "df = coerce(df, autotype(df, :few_to_finite));\n", + "df = coerce(df, :points => Continuous, :region_1 => Multiclass,\n", + " :variety => Multiclass, :winery => Multiclass);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Split Data\n", + "Separate features (X) from target (y), then split into train/test sets:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "y, X = unpack(df, ==(:points); rng = 123);\n", + "train, test = partition(eachindex(y), 0.8, shuffle = true, rng = 100);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Setup Encoders and Model\n", + "Load the required models and create different encoding strategies:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "OneHot = @load OneHotEncoder pkg = MLJModels verbosity = 0\n", + "CatBoostRegressor = @load CatBoostRegressor pkg = CatBoost" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "**Encoding Strategies:**\n", + "1. **OneHotEncoder**: Creates binary columns for each category\n", + "2. **FrequencyEncoder**: Replaces categories with their frequency counts\n", + "In case of the one-hot-encoder, we worry when categories have high cardinality as that would lead to an explosion in the number of features." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "card_reducer = MLJTransforms.CardinalityReducer(min_frequency = 10, ordered_factor = true)\n", + "onehot_model = OneHot(drop_last = true, ordered_factor = true)\n", + "freq_model = MLJTransforms.FrequencyEncoder(normalize = false, ordered_factor = true)\n", + "cat = CatBoostRegressor();" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Create three different pipelines to compare:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "pipelines = [\n", + " (\"CardRed + OneHot + CAT\", card_reducer |> onehot_model |> cat),\n", + " (\"OneHot + CAT\", onehot_model |> cat),\n", + " (\"FreqEnc + CAT\", freq_model |> cat),\n", + "]" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Evaluate Pipelines\n", + "Train each pipeline and measure both performance (RMSE) and training time:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "results = DataFrame(pipeline = String[], rmse = Float64[], training_time = Float64[]);\n", + "\n", + "for (name, pipe) in pipelines\n", + " println(\"Training: $name\")\n", + " mach = machine(pipe, X, y)\n", + " training_time = @elapsed MLJ.fit!(mach, rows = train)\n", + " predictions = MLJ.predict(mach, rows = test)\n", + " rmse_value = MLJ.root_mean_squared_error(y[test], predictions)\n", + " push!(results, (name, rmse_value, training_time))\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Sort by RMSE (lower is better) and display results:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sort!(results, :rmse)\n", + "results" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Visualization\n", + "Create side-by-side bar charts to compare both training time and model performance:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "n = nrow(results)\n", + "\n", + "time_plot = bar(1:n, results.training_time;\n", + " xticks = (1:n, results.pipeline), title = \"Training Time (seconds)\",\n", + " xlabel = \"Pipeline\", ylabel = \"Time (s)\", xrotation = 45,\n", + " legend = false, color = :lightblue);\n", + "\n", + "rmse_plot = bar(1:n, results.rmse;\n", + " xticks = (1:n, results.pipeline), title = \"Root Mean Squared Error\",\n", + " xlabel = \"Pipeline\", ylabel = \"RMSE\", xrotation = 45,\n", + " legend = false, color = :lightcoral);\n", + "\n", + "combined_plot = plot(time_plot, rmse_plot; layout = (1, 2), size = (1200, 500));" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Save the plot" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "savefig(combined_plot, \"wine_encoding_comparison.png\"); #hide" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Conclusion\n", + "\n", + "**Key Findings:**\n", + "- The model performance did not vary significantly across encoding strategies.\n", + "- We observe a decent speed up in using the cardinality reducer before one-hot encoding with close to no impact on performance.\n", + "- That said, frequency encoder led to the least training time as it didn't add any new features" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.5" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.5", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/tutorials/classic_comparison/Manifest.toml b/docs/src/tutorials/classic_comparison/Manifest.toml new file mode 100644 index 0000000..29b7e95 --- /dev/null +++ b/docs/src/tutorials/classic_comparison/Manifest.toml @@ -0,0 +1,2318 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.5" +manifest_format = "2.0" +project_hash = "5a14cc2e68cb2e8e5e7b95aca3553ebdf3e9929e" + +[[deps.ADTypes]] +git-tree-sha1 = "be7ae030256b8ef14a441726c4c37766b90b93a3" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.15.0" + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + + [deps.ADTypes.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + +[[deps.ARFFFiles]] +deps = ["CategoricalArrays", "Dates", "Parsers", "Tables"] +git-tree-sha1 = "678eb18590a8bc6674363da4d5faa4ac09c40a18" +uuid = "da404889-ca92-49ff-9e8b-0aa6b4d38dc8" +version = "1.5.0" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgCheck]] +git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.5.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "9606d7832795cbef89e06a550475be300364a8aa" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.19.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + 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" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "b5bb4dc6248fde467be2a863eb8452993e74d402" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.1" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.BangBang]] +deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"] +git-tree-sha1 = "26f41e1df02c330c4fa1e98d4aa2168fdafc9b1f" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.4.4" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTablesExt = "Tables" + 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" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.BitBasis]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "89dc08420d4f593ff30f02611d136b475a5eb43d" +uuid = "50ba71b6-fa0f-514d-ae9a-0916efc90dcf" +version = "0.9.10" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.15" + +[[deps.CUDA_Driver_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "21ce786b1616c0f5f7c00331ae11fa59713654f7" +uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" +version = "12.9.0+0" + +[[deps.CUDA_Runtime_jll]] +deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "1b476b62a462e7ee17d33c0aca03415c9c17f8c9" +uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" +version = "0.18.0+0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.5+0" + +[[deps.CatBoost]] +deps = ["CategoricalArrays", "MLJModelInterface", "OrderedCollections", "PythonCall", "Tables"] +git-tree-sha1 = "632235d41688eb504a0efbbced347539f03197c4" +uuid = "e2e10f9a-a85d-4fa9-b6b2-639a32100a12" +version = "0.3.6" + +[[deps.CategoricalArrays]] +deps = ["DataAPI", "Future", "Missings", "Printf", "Requires", "Statistics", "Unicode"] +git-tree-sha1 = "1568b28f91293458345dabba6a5ea3f183250a61" +uuid = "324d7699-5711-5eae-9e2f-1d82baa6b597" +version = "0.10.8" +weakdeps = ["JSON", "RecipesBase", "SentinelArrays", "StructTypes"] + + [deps.CategoricalArrays.extensions] + CategoricalArraysJSONExt = "JSON" + CategoricalArraysRecipesBaseExt = "RecipesBase" + CategoricalArraysSentinelArraysExt = "SentinelArrays" + CategoricalArraysStructTypesExt = "StructTypes" + +[[deps.CategoricalDistributions]] +deps = ["CategoricalArrays", "Distributions", "Missings", "OrderedCollections", "Random", "ScientificTypes"] +git-tree-sha1 = "926862f549a82d6c3a7145bc7f1adff2a91a39f0" +uuid = "af321ab8-2d2e-40a6-b165-3d674595d28e" +version = "0.1.15" + + [deps.CategoricalDistributions.extensions] + UnivariateFiniteDisplayExt = "UnicodePlots" + + [deps.CategoricalDistributions.weakdeps] + UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "06ee8d1aa558d2833aa799f6f0b31b30cada405f" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.2" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.29.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.1" + +[[deps.Combinatorics]] +git-tree-sha1 = "8010b6bb3388abe68d95743dcbea77650bb2eddf" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.3" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "3a3dfb30697e96a440e4149c8c51bf32f818c0f3" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.17.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.5.0" + +[[deps.CondaPkg]] +deps = ["JSON3", "Markdown", "MicroMamba", "Pidfile", "Pkg", "Preferences", "Scratch", "TOML", "pixi_jll"] +git-tree-sha1 = "93e81a68a84dba7e652e61425d982cd71a1a0835" +uuid = "992eb4ea-22a4-4c89-a5bb-47a3300528ab" +version = "0.2.29" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ContextVariablesX]] +deps = ["Compat", "Logging", "UUIDs"] +git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" +uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" +version = "0.1.3" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataDeps]] +deps = ["HTTP", "Libdl", "Reexport", "SHA", "Scratch", "p7zip_jll"] +git-tree-sha1 = "8ae085b71c462c2cb1cfedcb10c3c877ec6cf03f" +uuid = "124859b0-ceae-595e-8997-d05f6a7a8dfe" +version = "0.7.13" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.7.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[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" +version = "1.11.0" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.16.2+0" + +[[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.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "210933c93f39f832d92f9efbbe69a49c453db36d" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.7.1" + + [deps.DifferentiationInterface.extensions] + DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" + DifferentiationInterfaceDiffractorExt = "Diffractor" + DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] + DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" + DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" + DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" + DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore" + DifferentiationInterfaceGTPSAExt = "GTPSA" + DifferentiationInterfaceMooncakeExt = "Mooncake" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] + DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] + DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" + DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" + DifferentiationInterfaceStaticArraysExt = "StaticArrays" + DifferentiationInterfaceSymbolicsExt = "Symbolics" + DifferentiationInterfaceTrackerExt = "Tracker" + DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] + + [deps.DifferentiationInterface.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" + Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "3e6d038b77f22791b8e3472b7c633acea1ecac06" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.120" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarlyStopping]] +deps = ["Dates", "Statistics"] +git-tree-sha1 = "98fdf08b707aaf69f524a6cd0a67858cefe0cfb6" +uuid = "792122b4-ca99-40de-a6bc-6742525f08b6" +version = "0.3.0" + +[[deps.EnumX]] +git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.5" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+1" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.5+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FLoops]] +deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] +git-tree-sha1 = "0a2e5873e9a5f54abb06418d57a8df689336a660" +uuid = "cc61a311-1640-44b5-9fba-1b764f453329" +version = "0.2.2" + +[[deps.FLoopsBase]] +deps = ["ContextVariablesX"] +git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" +uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" +version = "0.1.1" + +[[deps.FeatureSelection]] +deps = ["MLJModelInterface", "ScientificTypesBase", "Tables"] +git-tree-sha1 = "d78c565b6296e161193eb0f053bbcb3f1a82091d" +uuid = "33837fe5-dbff-4c9e-8c2f-c5612fe2b8b6" +version = "0.2.2" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.17.0" +weakdeps = ["HTTP"] + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] +git-tree-sha1 = "f089ab1f834470c525562030c8cfde4025d5e915" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.27.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffSparseArraysExt = "SparseArrays" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.16.0+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.0.1" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+2" + +[[deps.GLM]] +deps = ["Distributions", "LinearAlgebra", "Printf", "Reexport", "SparseArrays", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns", "StatsModels"] +git-tree-sha1 = "273bd1cd30768a2fddfa3fd63bbc746ed7249e5f" +uuid = "38e38edf-8417-5370-95a0-9cbb8c7f171a" +version = "1.9.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "1828eb7275491981fa5f1752a5e126e8f26f8741" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.17" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "27299071cc29e409488ada41ec7643e0ab19091f" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.17+0" + +[[deps.GettextRuntime_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] +git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" +uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" +version = "0.22.4+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "35fbd0cefb04a516104b8e183ce0df11b70a3f1a" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.84.3+0" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.15+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "ed5e9c58612c4e081aecdb6e1a479e18462e041e" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.17" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.1+0" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.28" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InlineStrings]] +git-tree-sha1 = "8594fac023c5ce1ef78260f24d1ad18b4327b420" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.4" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.IterationControl]] +deps = ["EarlyStopping", "InteractiveUtils"] +git-tree-sha1 = "e663925ebc3d93c1150a7570d114f9ea2f664726" +uuid = "b3c1a2ee-3fec-4384-bf48-272ea71de57c" +version = "0.5.4" + +[[deps.IterativeSolvers]] +deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] +git-tree-sha1 = "59545b0a2b27208b0650df0a46b8e3019f85055b" +uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" +version = "0.9.4" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["REPL", "Random", "fzf_jll"] +git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.11" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JSON3]] +deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] +git-tree-sha1 = "411eccfe8aba0814ffa0fdf4860913ed09c34975" +uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.3" + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + + [deps.JSON3.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.1+0" + +[[deps.JuliaVariables]] +deps = ["MLStyle", "NameResolution"] +git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" +uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" +version = "0.2.4" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "4efa9cec6f308e0f492ea635421638bff81cf6f8" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.36" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LIBLINEAR]] +deps = ["Libdl", "SparseArrays", "liblinear_jll"] +git-tree-sha1 = "2cd424d3bf9b36098009df5b1f399614c12b2ee4" +uuid = "2d691ee1-e668-5016-a719-b2531b85e0f5" +version = "0.7.1" + +[[deps.LIBSVM]] +deps = ["LIBLINEAR", "LinearAlgebra", "ScikitLearnBase", "SparseArrays", "libsvm_jll"] +git-tree-sha1 = "9016c6032aac779b13bbd1b3ce997606a6eb7a2b" +uuid = "b1bec4e5-fd48-53fe-b0cb-9723c09d164b" +version = "0.8.1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.8+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "4f34eaabe49ecb3fb0d58d6015e32fd31a733199" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.8" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + TectonicExt = "tectonic_jll" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + tectonic_jll = "d7dd28d6-a5e6-559c-9131-7eb760cdacc5" + +[[deps.LatinHypercubeSampling]] +deps = ["Random", "StableRNGs", "StatsBase", "Test"] +git-tree-sha1 = "825289d43c753c7f1bf9bed334c253e9913997f8" +uuid = "a5e1c1ea-c99a-51d3-a14d-a9a37257b02d" +version = "1.9.0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LearnAPI]] +git-tree-sha1 = "c276ed13346953f3035a6d35519ec816b820cd44" +uuid = "92ad9a40-7767-427a-9ee6-6e577f1266cb" +version = "1.0.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.4.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.1+1" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.41.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.1+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.41.0+0" + +[[deps.LightGBM]] +deps = ["Dates", "Libdl", "LightGBM_jll", "MLJModelInterface", "SparseArrays", "Statistics"] +git-tree-sha1 = "fa2e05581f7393693de1c3a3ca79ae2ded9394ac" +uuid = "7acf609c-83a4-11e9-1ffb-b912bcd3b04a" +version = "2.0.0" + +[[deps.LightGBM_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "20ee4be44c3149606abde993dc72dd2cf9909adb" +uuid = "0e4427ef-1ff7-5cd7-8faa-8ff0877bb2ec" +version = "3.3.5+1" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "4adee99b7262ad2a1a4bbbc59d993d24e55ea96f" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.4.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LinearMaps]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "7f6be2e4cdaaf558623d93113d6ddade7b916209" +uuid = "7a12625a-238d-50fd-b39a-03d52299707e" +version = "3.11.4" +weakdeps = ["ChainRulesCore", "SparseArrays", "Statistics"] + + [deps.LinearMaps.extensions] + LinearMapsChainRulesCoreExt = "ChainRulesCore" + LinearMapsSparseArraysExt = "SparseArrays" + LinearMapsStatisticsExt = "Statistics" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [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" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.MLCore]] +deps = ["DataAPI", "SimpleTraits", "Tables"] +git-tree-sha1 = "73907695f35bc7ffd9f11f6c4f2ee8c1302084be" +uuid = "c2834f40-e789-41da-a90e-33b280584a8c" +version = "1.0.0" + +[[deps.MLFlowClient]] +deps = ["Dates", "FilePathsBase", "HTTP", "JSON", "ShowCases", "URIs", "UUIDs"] +git-tree-sha1 = "9abb12b62debc27261c008daa13627255bf79967" +uuid = "64a0f543-368b-4a9a-827a-e71edb2a0b83" +version = "0.5.1" + +[[deps.MLJ]] +deps = ["CategoricalArrays", "ComputationalResources", "Distributed", "Distributions", "FeatureSelection", "LinearAlgebra", "MLJBalancing", "MLJBase", "MLJEnsembles", "MLJFlow", "MLJIteration", "MLJModels", "MLJTuning", "OpenML", "Pkg", "ProgressMeter", "Random", "Reexport", "ScientificTypes", "StatisticalMeasures", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "65f2031dbd48117062c23931f243a0f8666535a1" +uuid = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +version = "0.20.8" + +[[deps.MLJBalancing]] +deps = ["MLJBase", "MLJModelInterface", "MLUtils", "OrderedCollections", "Random", "StatsBase"] +git-tree-sha1 = "f707a01a92d664479522313907c07afa5d81df19" +uuid = "45f359ea-796d-4f51-95a5-deb1a414c586" +version = "0.1.5" + +[[deps.MLJBase]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Dates", "DelimitedFiles", "Distributed", "Distributions", "InteractiveUtils", "InvertedIndices", "LearnAPI", "LinearAlgebra", "MLJModelInterface", "Missings", "OrderedCollections", "Parameters", "PrettyTables", "ProgressMeter", "Random", "RecipesBase", "Reexport", "ScientificTypes", "Serialization", "StatisticalMeasuresBase", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "05b91197e791cd1410aad3e421e9e47b27e9ce31" +uuid = "a7f614a8-145f-11e9-1d2a-a57a1082229d" +version = "1.8.1" +weakdeps = ["StatisticalMeasures"] + + [deps.MLJBase.extensions] + DefaultMeasuresExt = "StatisticalMeasures" + +[[deps.MLJEnsembles]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Distributed", "Distributions", "MLJModelInterface", "ProgressMeter", "Random", "ScientificTypesBase", "StatisticalMeasuresBase", "StatsBase"] +git-tree-sha1 = "84a5be55a364bb6b6dc7780bbd64317ebdd3ad1e" +uuid = "50ed68f4-41fd-4504-931a-ed422449fee0" +version = "0.4.3" + +[[deps.MLJFlow]] +deps = ["MLFlowClient", "MLJBase", "MLJModelInterface"] +git-tree-sha1 = "508bff8071d7d1902d6f1b9d1e868d58821f1cfe" +uuid = "7b7b8358-b45c-48ea-a8ef-7ca328ad328f" +version = "0.5.0" + +[[deps.MLJGLMInterface]] +deps = ["Distributions", "GLM", "MLJModelInterface", "StatsModels", "Tables"] +git-tree-sha1 = "db318813a5f07e3f93a1e530c8fd0e6bdc9cabac" +uuid = "caf8df21-4939-456d-ac9c-5fefbfb04c0c" +version = "0.3.7" + +[[deps.MLJIteration]] +deps = ["IterationControl", "MLJBase", "Random", "Serialization"] +git-tree-sha1 = "ad16cfd261e28204847f509d1221a581286448ae" +uuid = "614be32b-d00c-4edb-bd02-1eb411ab5e55" +version = "0.6.3" + +[[deps.MLJLinearModels]] +deps = ["DocStringExtensions", "IterativeSolvers", "LinearAlgebra", "LinearMaps", "MLJModelInterface", "Optim", "Parameters"] +git-tree-sha1 = "d23c53a454f01c03780621477000f03bae487a9a" +uuid = "6ee0df7b-362f-4a72-a706-9e79364fb692" +version = "0.10.1" + +[[deps.MLJModelInterface]] +deps = ["REPL", "Random", "ScientificTypesBase", "StatisticalTraits"] +git-tree-sha1 = "66626f80d5807921045d539b4f7153b1d47c5f8a" +uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" +version = "1.11.1" + +[[deps.MLJModels]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Combinatorics", "Dates", "Distances", "Distributions", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "Markdown", "OrderedCollections", "Parameters", "Pkg", "PrettyPrinting", "REPL", "Random", "RelocatableFolders", "ScientificTypes", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "09381923be5ed34416ed77badbc26e1adf295492" +uuid = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +version = "0.17.9" + +[[deps.MLJTransforms]] +deps = ["BitBasis", "CategoricalArrays", "Combinatorics", "Dates", "Distributions", "LinearAlgebra", "MLJModelInterface", "OrderedCollections", "Parameters", "ScientificTypes", "Statistics", "StatsBase", "TableOperations", "Tables"] +path = "/Users/essamwisam/Documents/GitHub/MLJTransforms" +uuid = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" +version = "0.1.6" + +[[deps.MLJTuning]] +deps = ["ComputationalResources", "Distributed", "Distributions", "LatinHypercubeSampling", "MLJBase", "ProgressMeter", "Random", "RecipesBase", "StatisticalMeasuresBase"] +git-tree-sha1 = "38aab60b1274ce7d6da784808e3be69e585dbbf6" +uuid = "03970b2e-30c4-11ea-3135-d1576263f10f" +version = "0.8.8" + +[[deps.MLJXGBoostInterface]] +deps = ["MLJModelInterface", "SparseArrays", "Tables", "XGBoost"] +git-tree-sha1 = "385031c897e822755e7d194b0f9745fb20129972" +uuid = "54119dfa-1dab-4055-a167-80440f4f7a91" +version = "0.3.12" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MLUtils]] +deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "MLCore", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"] +git-tree-sha1 = "a772d8d1987433538a5c226f79393324b55f7846" +uuid = "f1d291b0-491e-4a28-83b9-f70985020b54" +version = "0.4.8" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.MicroCollections]] +deps = ["Accessors", "BangBang", "InitialValues"] +git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.2.0" + +[[deps.MicroMamba]] +deps = ["Pkg", "Scratch", "micromamba_jll"] +git-tree-sha1 = "011cab361eae7bcd7d278f0a7a00ff9c69000c51" +uuid = "0b3b1443-0f03-428d-bdfb-f27f9c1191ea" +version = "0.1.14" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.Mocking]] +deps = ["Compat", "ExprTools"] +git-tree-sha1 = "2c140d60d7cb82badf06d8783800d0bcd1a7daa2" +uuid = "78c3b35d-d492-501b-9361-3d52fe80e533" +version = "0.8.1" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.NLSolversBase]] +deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "25a6638571a902ecfb1ae2a18fc1575f86b1d4df" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.10.0" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "ScopedValues", "Statistics"] +git-tree-sha1 = "4abc63cdd8dd9dd925d8e879cda280bedc8013ca" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.30" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + NNlibSpecialFunctionsExt = "SpecialFunctions" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NameResolution]] +deps = ["PrettyPrint"] +git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" +uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" +version = "0.1.5" + +[[deps.NearestNeighborModels]] +deps = ["Distances", "FillArrays", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "NearestNeighbors", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "e411143a8362926e4284a54e745972e939fbab78" +uuid = "636a865e-7cf4-491e-846c-de09b730eb36" +version = "0.2.3" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "8a3271d8309285f4db73b4f662b1b290c715e85e" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.21" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenML]] +deps = ["ARFFFiles", "HTTP", "JSON", "Markdown", "Pkg", "Scratch"] +git-tree-sha1 = "63603b2b367107e87dbceda4e33c67aed17e50e0" +uuid = "8b6db2d4-7670-4922-a472-f9537c81ab66" +version = "0.3.2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "f1a7e086c677df53e064e0fdd2c9d0b0833e3f6e" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.5.0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "9216a80ff3682833ac4b733caa8c00390620ba5d" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.0+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Optim]] +deps = ["Compat", "EnumX", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "61942645c38dd2b5b78e2082c9b51ab315315d10" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.13.2" + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + + [deps.Optim.weakdeps] + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "f07c06228a1c670ae4c87d1276b92c7c597fdda0" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.35" + +[[deps.PalmerPenguins]] +deps = ["CSV", "DataDeps"] +git-tree-sha1 = "e7c581b0e29f7d35f47927d65d4965b413c10d90" +uuid = "8b842266-38fa-440a-9b57-31493939ab85" +version = "0.1.4" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "275a9a6d85dc86c24d03d1837a0010226a96f540" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.56.3+0" + +[[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 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.3" + +[[deps.Pidfile]] +deps = ["FileWatching", "Test"] +git-tree-sha1 = "2d8aaf8ee10df53d0dfb9b8ee44ae7c04ced2b03" +uuid = "fa939f87-e72e-5be4-a000-7fc836dbe307" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.44.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.3.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.3" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "28ea788b78009c695eb0d637587c81d26bdf0e36" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.14" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyPrint]] +git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" +uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" +version = "0.2.0" + +[[deps.PrettyPrinting]] +git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e" +uuid = "54e16d92-306c-5ea0-a30b-337be88ac337" +version = "0.4.2" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "13c5103482a8ed1536a54c08d0e742ae3dca2d42" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.4" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.PythonCall]] +deps = ["CondaPkg", "Dates", "Libdl", "MacroTools", "Markdown", "Pkg", "Requires", "Serialization", "Tables", "UnsafePointers"] +git-tree-sha1 = "ce4a33749e0061fa51dbe40533dc112bf7d2d28e" +uuid = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" +version = "0.9.25" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "eb38d376097f47316fe089fc62cb7c6d85383a52" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.8.2+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "da7adf145cce0d44e892626e647f9dcbe9cb3e10" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.8.2+1" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "9eca9fc3fe515d619ce004c83c31ffd3f85c7ccf" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.8.2+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "e1d5e16d0f65762396f9ca4644a5f4ddab8d452b" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.8.2+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.RData]] +deps = ["CategoricalArrays", "CodecZlib", "DataFrames", "Dates", "FileIO", "Requires", "TimeZones", "Unicode"] +git-tree-sha1 = "19e47a495dfb7240eb44dc6971d660f7e4244a72" +uuid = "df47a6cb-8c03-5eed-afd8-b6050d6c41da" +version = "0.8.3" + +[[deps.RDatasets]] +deps = ["CSV", "CodecZlib", "DataFrames", "FileIO", "Printf", "RData", "Reexport"] +git-tree-sha1 = "2720e6f6afb3e562ccb70a6b62f8f308ff810333" +uuid = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +version = "0.7.7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.ScientificTypes]] +deps = ["CategoricalArrays", "ColorTypes", "Dates", "Distributions", "PrettyTables", "Reexport", "ScientificTypesBase", "StatisticalTraits", "Tables"] +git-tree-sha1 = "4d083ffec53dbd5097a6723b0699b175be2b61fb" +uuid = "321657f4-b219-11e9-178b-2701a2544e81" +version = "3.1.0" + +[[deps.ScientificTypesBase]] +git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b" +uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" +version = "3.0.0" + +[[deps.ScikitLearnBase]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "7877e55c1523a4b336b433da39c8e8c08d2f221f" +uuid = "6e75b9c4-186b-50bd-896f-2d2496a4843e" +version = "0.5.0" + +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "1147f140b4c8ddab224c94efa9569fc23d63ab44" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.3.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.8" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.ShiftedArrays]] +git-tree-sha1 = "503688b59397b3307443af35cd953a13e8005c16" +uuid = "1277b4bf-5013-50f5-be3d-901d8477a67a" +version = "2.0.0" + +[[deps.ShowCases]] +git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5" +uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" +version = "0.1.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SparseMatricesCSR]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "cc05d16e340aecfa0e4cf4616194abc894cd0bca" +uuid = "a0a7dd2c-ebf4-11e9-1f05-cf50bc540ca1" +version = "0.6.9" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.15" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.3" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.13" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.StatisticalMeasures]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Distributions", "LearnAPI", "LinearAlgebra", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "StatisticalMeasuresBase", "Statistics", "StatsBase"] +git-tree-sha1 = "d15f71761dce0a2833d458824e6b60edbfd4f138" +uuid = "a19d573c-0a75-4610-95b3-7071388c7541" +version = "0.2.1" + + [deps.StatisticalMeasures.extensions] + LossFunctionsExt = "LossFunctions" + ScientificTypesExt = "ScientificTypes" + + [deps.StatisticalMeasures.weakdeps] + LossFunctions = "30fc2ffe-d236-52d8-8643-a9d8f7c094a7" + ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" + +[[deps.StatisticalMeasuresBase]] +deps = ["CategoricalArrays", "InteractiveUtils", "MLUtils", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "Statistics"] +git-tree-sha1 = "e4f508cf3b3253f3eb357274fe36fb3332ca9896" +uuid = "c062fc1d-0d66-479b-b6ac-8b44719de4cc" +version = "0.1.2" + +[[deps.StatisticalTraits]] +deps = ["ScientificTypesBase"] +git-tree-sha1 = "542d979f6e756f13f862aa00b224f04f9e445f11" +uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" +version = "3.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.1" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.5" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "8e45cecc66f3b42633b8ce14d431e8e57a3e242e" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StatsModels]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Printf", "REPL", "ShiftedArrays", "SparseArrays", "StatsAPI", "StatsBase", "StatsFuns", "Tables"] +git-tree-sha1 = "9022bcaa2fc1d484f1326eaa4db8db543ca8c66d" +uuid = "3eaba693-59b7-5ba5-a881-562e759f1c8d" +version = "0.7.4" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StructTypes]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" +uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" +version = "1.11.0" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TZJData]] +deps = ["Artifacts"] +git-tree-sha1 = "72df96b3a595b7aab1e101eb07d2a435963a97e2" +uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" +version = "1.5.0+2025b" + +[[deps.TableOperations]] +deps = ["SentinelArrays", "Tables", "Test"] +git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" +uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" +version = "1.2.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TimeZones]] +deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"] +git-tree-sha1 = "2c705e96825b66c4a3f25031a683c06518256dd3" +uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" +version = "1.21.3" +weakdeps = ["RecipesBase"] + + [deps.TimeZones.extensions] + TimeZonesRecipesBaseExt = "RecipesBase" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Transducers]] +deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] +git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.84" + + [deps.Transducers.extensions] + TransducersAdaptExt = "Adapt" + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + TransducersReferenceablesExt = "Referenceables" + + [deps.Transducers.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + 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.URIs]] +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.6.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "d2282232f8a4d71f79e85dc4dd45e5b12a6297fb" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.23.1" +weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "Printf"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + ForwardDiffExt = "ForwardDiff" + InverseFunctionsUnitfulExt = "InverseFunctions" + PrintfExt = "Printf" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "af305cc62419f9bd61b6644d19170a4d258c7967" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.7.0" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + + [deps.UnsafeAtomics.weakdeps] + LLVM = "929cbde3-209d-540e-8aea-75f648917ca0" + +[[deps.UnsafePointers]] +git-tree-sha1 = "c81331b3b2e60a982be57c046ec91f599ede674a" +uuid = "e17b2a0c-0bdf-430a-bd0c-3a23cae4ff39" +version = "1.0.0" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "XML2_jll"] +git-tree-sha1 = "53ab3e9c94f4343c68d5905565be63002e13ec8c" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.23.1+1" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WorkerUtilities]] +git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" +uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" +version = "1.6.1" + +[[deps.XGBoost]] +deps = ["AbstractTrees", "CEnum", "JSON3", "LinearAlgebra", "OrderedCollections", "SparseArrays", "SparseMatricesCSR", "Statistics", "Tables", "XGBoost_jll"] +git-tree-sha1 = "bacb62e07d104630094c8dac2fd070f5d4b9b305" +uuid = "009559a3-9522-5dbb-924b-0b6ed2b22bb9" +version = "2.5.1" + + [deps.XGBoost.extensions] + XGBoostCUDAExt = "CUDA" + XGBoostTermExt = "Term" + + [deps.XGBoost.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Term = "22787eb5-b846-44ae-b979-8e399b8463ab" + +[[deps.XGBoost_jll]] +deps = ["Artifacts", "CUDA_Runtime_jll", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "1c0aa2390a7ebb28a3d6c214f64e57a24091fbd7" +uuid = "a5c6f535-4255-5ca2-a466-0e519f119c46" +version = "2.0.1+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.6+1" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.8.1+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.2+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.6+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.12+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.13+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.4+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.6+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.7+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "9caba99d38404b285db8801d5c45ef4f4f425a6d" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.1+0" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.8.3+0" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] +git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.6+0" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.5+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.12+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.1+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.3+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "c5bf2dad6a03dfef57ea0a170a1fe493601603f2" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.5+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"] +git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.10+0" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.2+0" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.7+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.44.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c3b0e6196d50eab0c5ed34021aaa0bb463489510" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.14+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.61.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.11.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "56d643b57b188d30cccc25e331d416d3d358e557" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.13.4+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "91d05d7f4a9f67205bd6cf395e488009fe85b499" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.28.1+0" + +[[deps.liblinear_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7f5f1953394b74739eaebd345f4515515a022a5b" +uuid = "275f1f90-abd2-5ca1-9ad8-abd4e3d66eb7" +version = "2.47.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "cd155272a3738da6db765745b89e466fa64d0830" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.49+0" + +[[deps.libsvm_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl", "Pkg"] +git-tree-sha1 = "7625dde5e9eab416c1cb791627f065ce55297eff" +uuid = "08558c22-525a-5d2a-acf6-0ac6658ffce4" +version = "3.25.0+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.micromamba_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "b4a5a3943078f9fd11ae0b5ab1bdbf7718617945" +uuid = "f8abcde7-e9b7-5caa-b8af-a437887ae8e4" +version = "1.5.8+0" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b4d631fd51f2e9cdd93724ae25b2efc198b059b1" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.7+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.pixi_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "f349584316617063160a947a82638f7611a8ef0f" +uuid = "4d7b5844-a134-5dcd-ac86-c8f19cd51bed" +version = "0.41.3+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "fbf139bce07a534df0e699dbb5f5cc9346f95cc1" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.9.2+0" diff --git a/docs/src/tutorials/classic_comparison/Project.toml b/docs/src/tutorials/classic_comparison/Project.toml new file mode 100644 index 0000000..5d1fd0e --- /dev/null +++ b/docs/src/tutorials/classic_comparison/Project.toml @@ -0,0 +1,19 @@ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +CatBoost = "e2e10f9a-a85d-4fa9-b6b2-639a32100a12" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +GLM = "38e38edf-8417-5370-95a0-9cbb8c7f171a" +HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" +LIBSVM = "b1bec4e5-fd48-53fe-b0cb-9723c09d164b" +LightGBM = "7acf609c-83a4-11e9-1ffb-b912bcd3b04a" +MLJ = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +MLJGLMInterface = "caf8df21-4939-456d-ac9c-5fefbfb04c0c" +MLJLinearModels = "6ee0df7b-362f-4a72-a706-9e79364fb692" +MLJModels = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +MLJTransforms = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" +MLJXGBoostInterface = "54119dfa-1dab-4055-a167-80440f4f7a91" +NearestNeighborModels = "636a865e-7cf4-491e-846c-de09b730eb36" +PalmerPenguins = "8b842266-38fa-440a-9b57-31493939ab85" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" diff --git a/docs/src/tutorials/classic_comparison/encoder_comparison.png b/docs/src/tutorials/classic_comparison/encoder_comparison.png new file mode 100644 index 0000000..438862d Binary files /dev/null and b/docs/src/tutorials/classic_comparison/encoder_comparison.png differ diff --git a/docs/src/tutorials/classic_comparison/generate.jl b/docs/src/tutorials/classic_comparison/generate.jl new file mode 100644 index 0000000..8f1b8f8 --- /dev/null +++ b/docs/src/tutorials/classic_comparison/generate.jl @@ -0,0 +1,2 @@ +joinpath(@__DIR__, "..", "..", "generate.jl") |> include +generate(@__DIR__, execute=true) diff --git a/docs/src/tutorials/classic_comparison/notebook.ipynb b/docs/src/tutorials/classic_comparison/notebook.ipynb new file mode 100644 index 0000000..c09fe02 --- /dev/null +++ b/docs/src/tutorials/classic_comparison/notebook.ipynb @@ -0,0 +1,331 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Categorical Encoders Performance: A Classic Comparison\n", + "\n", + "This tutorial compares four fundamental categorical encoding approaches on a milk quality dataset:\n", + "OneHot, Frequency, Target, and Ordinal encoders paired with SVM classification." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Activating project at `~/Documents/GitHub/MLJTransforms/docs/src/tutorials/classic_comparison`\n" + ] + } + ], + "cell_type": "code", + "source": [ + "using Pkg;\n", + "Pkg.activate(@__DIR__);\n", + "\n", + "using MLJ, MLJTransforms, LIBSVM, DataFrames, ScientificTypes\n", + "using Random, CSV" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Load and Prepare Data\n", + "Load the milk quality dataset which contains categorical features for quality prediction:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "\u001b[1m5Γ—8 DataFrame\u001b[0m\n\u001b[1m Row \u001b[0mβ”‚\u001b[1m pH \u001b[0m\u001b[1m Temprature \u001b[0m\u001b[1m Taste \u001b[0m\u001b[1m Odor \u001b[0m\u001b[1m Fat \u001b[0m\u001b[1m Turbidity \u001b[0m\u001b[1m Colour \u001b[0m\u001b[1m Grade \u001b[0m\n β”‚\u001b[90m Float64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m String7 \u001b[0m\n─────┼──────────────────────────────────────────────────────────────────────\n 1 β”‚ 6.6 35 1 0 1 0 254 high\n 2 β”‚ 6.6 36 0 1 0 1 253 high\n 3 β”‚ 8.5 70 1 1 1 1 246 low\n 4 β”‚ 9.5 34 1 1 0 1 255 low\n 5 β”‚ 6.6 37 0 0 0 0 255 medium", + "text/html": [ + "
5Γ—8 DataFrame
RowpHTempratureTasteOdorFat TurbidityColourGrade
Float64Int64Int64Int64Int64Int64Int64String7
16.6351010254high
26.6360101253high
38.5701111246low
49.5341101255low
56.6370000255medium
" + ] + }, + "metadata": {}, + "execution_count": 2 + } + ], + "cell_type": "code", + "source": [ + "df = CSV.read(\"./milknew.csv\", DataFrame)\n", + "\n", + "first(df, 5)" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "Check the scientific types to understand our data structure:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”\nβ”‚\u001b[22m names \u001b[0mβ”‚\u001b[22m scitypes \u001b[0mβ”‚\u001b[22m types \u001b[0mβ”‚\nβ”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\nβ”‚ pH β”‚ Continuous β”‚ Float64 β”‚\nβ”‚ Temprature β”‚ Count β”‚ Int64 β”‚\nβ”‚ Taste β”‚ Count β”‚ Int64 β”‚\nβ”‚ Odor β”‚ Count β”‚ Int64 β”‚\nβ”‚ Fat β”‚ Count β”‚ Int64 β”‚\nβ”‚ Turbidity β”‚ Count β”‚ Int64 β”‚\nβ”‚ Colour β”‚ Count β”‚ Int64 β”‚\nβ”‚ Grade β”‚ Textual β”‚ String7 β”‚\nβ””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n" + }, + "metadata": {}, + "execution_count": 3 + } + ], + "cell_type": "code", + "source": [ + "ScientificTypes.schema(df)" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "Automatically coerce columns with few unique values to categorical:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”\nβ”‚\u001b[22m names \u001b[0mβ”‚\u001b[22m scitypes \u001b[0mβ”‚\u001b[22m types \u001b[0mβ”‚\nβ”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\nβ”‚ pH β”‚ OrderedFactor{16} β”‚ CategoricalValue{Float64, UInt32} β”‚\nβ”‚ Temprature β”‚ OrderedFactor{17} β”‚ CategoricalValue{Int64, UInt32} β”‚\nβ”‚ Taste β”‚ OrderedFactor{2} β”‚ CategoricalValue{Int64, UInt32} β”‚\nβ”‚ Odor β”‚ OrderedFactor{2} β”‚ CategoricalValue{Int64, UInt32} β”‚\nβ”‚ Fat β”‚ OrderedFactor{2} β”‚ CategoricalValue{Int64, UInt32} β”‚\nβ”‚ Turbidity β”‚ OrderedFactor{2} β”‚ CategoricalValue{Int64, UInt32} β”‚\nβ”‚ Colour β”‚ OrderedFactor{9} β”‚ CategoricalValue{Int64, UInt32} β”‚\nβ”‚ Grade β”‚ Multiclass{3} β”‚ CategoricalValue{String7, UInt32} β”‚\nβ””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n" + }, + "metadata": {}, + "execution_count": 4 + } + ], + "cell_type": "code", + "source": [ + "df = coerce(df, autotype(df, :few_to_finite))\n", + "\n", + "ScientificTypes.schema(df)" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Split Data\n", + "Separate features from target and create train/test split:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "y, X = unpack(df, ==(:Grade); rng = 123)\n", + "train, test = partition(eachindex(y), 0.9, shuffle = true, rng = 100);" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "## Setup Encoders and Classifier\n", + "Load the required models and create different encoding strategies:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "MLJLIBSVMInterface.SVC" + }, + "metadata": {}, + "execution_count": 6 + } + ], + "cell_type": "code", + "source": [ + "OneHot = @load OneHotEncoder pkg = MLJModels verbosity = 0\n", + "SVC = @load SVC pkg = LIBSVM verbosity = 0" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "**Encoding Strategies Explained:**\n", + "1. **OneHot**: Creates binary columns for each category (sparse, interpretable)\n", + "2. **Frequency**: Replaces categories with their occurrence frequency\n", + "3. **Target**: Uses target statistics for each category\n", + "4. **Ordinal**: Assigns integer codes to categories (assumes ordering)" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "SVC(\n kernel = LIBSVM.Kernel.RadialBasis, \n gamma = 0.0, \n cost = 1.0, \n cachesize = 200.0, \n degree = 3, \n coef0 = 0.0, \n tolerance = 0.001, \n shrinking = true)" + }, + "metadata": {}, + "execution_count": 7 + } + ], + "cell_type": "code", + "source": [ + "onehot_model = OneHot(drop_last = true, ordered_factor = true)\n", + "freq_model = MLJTransforms.FrequencyEncoder(normalize = false, ordered_factor = true)\n", + "target_model = MLJTransforms.TargetEncoder(lambda = 0.9, m = 5, ordered_factor = true)\n", + "ordinal_model = MLJTransforms.OrdinalEncoder(ordered_factor = true)\n", + "svm = SVC()" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Create four different pipelines to compare:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "4-element Vector{Tuple{String, MLJBase.DeterministicPipeline{N, MLJModelInterface.predict} where N<:NamedTuple}}:\n (\"OneHot + SVM\", DeterministicPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …))\n (\"FreqEnc + SVM\", DeterministicPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …))\n (\"TargetEnc + SVM\", DeterministicPipeline(target_encoder = TargetEncoder(features = Symbol[], …), …))\n (\"Ordinal + SVM\", DeterministicPipeline(ordinal_encoder = OrdinalEncoder(features = Symbol[], …), …))" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "cell_type": "code", + "source": [ + "pipelines = [\n", + " (\"OneHot + SVM\", onehot_model |> svm),\n", + " (\"FreqEnc + SVM\", freq_model |> svm),\n", + " (\"TargetEnc + SVM\", target_model |> svm),\n", + " (\"Ordinal + SVM\", ordinal_model |> svm),\n", + "]" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "## Evaluate Pipelines\n", + "Use 10-fold cross-validation to robustly estimate each pipeline's accuracy:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Evaluating: OneHot + SVM\n", + "Evaluating: FreqEnc + SVM\n", + "Evaluating: TargetEnc + SVM\n", + "Evaluating: Ordinal + SVM\n" + ] + } + ], + "cell_type": "code", + "source": [ + "results = DataFrame(pipeline = String[], accuracy = Float64[])\n", + "\n", + "for (name, pipe) in pipelines\n", + " println(\"Evaluating: $name\")\n", + " mach = machine(pipe, X, y)\n", + " eval_results = evaluate!(\n", + " mach,\n", + " resampling = CV(nfolds = 10, rng = 123),\n", + " measure = accuracy,\n", + " rows = train,\n", + " verbosity = 0,\n", + " )\n", + " acc = mean(eval_results.measurement)\n", + " push!(results, (name, acc))\n", + "end" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "Sort results by accuracy (highest first) and display:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "\u001b[1m4Γ—2 DataFrame\u001b[0m\n\u001b[1m Row \u001b[0mβ”‚\u001b[1m pipeline \u001b[0m\u001b[1m accuracy \u001b[0m\n β”‚\u001b[90m String \u001b[0m\u001b[90m Float64 \u001b[0m\n─────┼───────────────────────────\n 1 β”‚ OneHot + SVM 0.998951\n 2 β”‚ TargetEnc + SVM 0.974816\n 3 β”‚ Ordinal + SVM 0.940189\n 4 β”‚ FreqEnc + SVM 0.885624", + "text/html": [ + "
4Γ—2 DataFrame
Rowpipelineaccuracy
StringFloat64
1OneHot + SVM0.998951
2TargetEnc + SVM0.974816
3Ordinal + SVM0.940189
4FreqEnc + SVM0.885624
" + ] + }, + "metadata": {}, + "execution_count": 10 + } + ], + "cell_type": "code", + "source": [ + "sort!(results, :accuracy, rev = true)\n", + "results" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "## Results Analysis\n", + "We notice that one-hot-encoding was the most performant here followed by target encoding.\n", + "Ordinal encoding also produced decent results because we can perceive all the categorical variables to be ordered\n", + "On the other hand, frequency encoding lagged behind. Observe that this method doesn't distinguish categories from one another if they occur with similar frequencies." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.5" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.5", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/tutorials/classic_comparison/notebook.jl b/docs/src/tutorials/classic_comparison/notebook.jl new file mode 100644 index 0000000..44c3a79 --- /dev/null +++ b/docs/src/tutorials/classic_comparison/notebook.jl @@ -0,0 +1,158 @@ +# # Categorical Encoders Performance: A Classic Comparison + +# **Julia version** is assumed to be 1.10.* + +# This demonstration is available as a Jupyter notebook or julia script (as well as the dataset) +# [here](https://github.com/essamwise/MLJTransforms.jl/tree/main/docs/src/tutorials/classic_comparison). +# +# This tutorial compares four fundamental categorical encoding approaches on a milk quality dataset: +# OneHot, Frequency, Target, and Ordinal encoders paired with SVM classification. +# + +using Pkg; +Pkg.activate(@__DIR__); +Pkg.instantiate(); #src + +using MLJ, MLJTransforms, LIBSVM, DataFrames, ScientificTypes +using Random, CSV, Plots + +# ## Load and Prepare Data +# Load the milk quality dataset which contains categorical features for quality prediction: + +df = CSV.read("./milknew.csv", DataFrame) + +first(df, 5) + +#- + +# Check the scientific types to understand our data structure: +ScientificTypes.schema(df) + +#- + +# Automatically coerce columns with few unique values to categorical: +df = coerce(df, autotype(df, :few_to_finite)) + +ScientificTypes.schema(df) + +# ## Split Data +# Separate features from target and create train/test split: +y, X = unpack(df, ==(:Grade); rng = 123) +train, test = partition(eachindex(y), 0.9, shuffle = true, rng = 100); + +# ## Setup Encoders and Classifier +# Load the required models and create different encoding strategies: + +OneHot = @load OneHotEncoder pkg = MLJModels verbosity = 0 +SVC = @load SVC pkg = LIBSVM verbosity = 0 + +# **Encoding Strategies Explained:** +# 1. **OneHot**: Creates binary columns for each category (sparse, interpretable) +# 2. **Frequency**: Replaces categories with their occurrence frequency +# 3. **Target**: Uses target statistics for each category +# 4. **Ordinal**: Assigns integer codes to categories (assumes ordering) + +onehot_model = OneHot(drop_last = true, ordered_factor = true) +freq_model = MLJTransforms.FrequencyEncoder(normalize = false, ordered_factor = true) +target_model = MLJTransforms.TargetEncoder(lambda = 0.9, m = 5, ordered_factor = true) +ordinal_model = MLJTransforms.OrdinalEncoder(ordered_factor = true) +svm = SVC() + +# Create four different pipelines to compare: +pipelines = [ + ("OneHot + SVM", onehot_model |> svm), + ("FreqEnc + SVM", freq_model |> svm), + ("TargetEnc + SVM", target_model |> svm), + ("Ordinal + SVM", ordinal_model |> svm), +] + + +# ## Evaluate Pipelines +# Use 10-fold cross-validation to robustly estimate each pipeline's accuracy: + +results = DataFrame( + pipeline = String[], + accuracy = Float64[], + std_error = Float64[], + ci_lower = Float64[], + ci_upper = Float64[], +) + +for (name, pipe) in pipelines + println("Evaluating: $name") + eval_results = evaluate( + pipe, + X, + y, + resampling = CV(nfolds = 5, rng = 123), + measure = accuracy, + rows = train, + verbosity = 0, + ) + acc = eval_results.measurement[1] # scalar mean + per_fold = eval_results.per_fold[1] # vector of fold results + se = std(per_fold) / sqrt(length(per_fold)) + ci = 1.96 * se + push!( + results, + ( + pipeline = name, + accuracy = acc, + std_error = se, + ci_lower = acc - ci, + ci_upper = acc + ci, + ), + ) + println(" Mean accuracy: $(round(acc, digits=4)) Β± $(round(ci, digits=4))") +end + +# Sort results by accuracy (highest first) and display: +sort!(results, :accuracy, rev = true) + +# Display results with confidence intervals +println("\nResults with 95% Confidence Intervals (see caveats below):") +println("="^60) +for row in eachrow(results) + pipeline = row.pipeline + acc = round(row.accuracy, digits = 4) + ci_lower = round(row.ci_lower, digits = 4) + ci_upper = round(row.ci_upper, digits = 4) + println("$pipeline: $acc (95% CI: [$ci_lower, $ci_upper])") +end + +results + +# ## Results Analysis +# +# ### Performance Summary +# The results show OneHot encoding performing best, followed by Target encoding, with Ordinal and Frequency encoders showing lower performance. +# +# The confidence intervals should be interpreted with caution and primarily serve to illustrate uncertainty rather than provide definitive statistical significance tests. +# See Bengio & Grandvalet, 2004: "No Unbiased Estimator of the Variance of K-Fold Cross-Validation"). That said, reporting the interval is still more informative than reporting only the mean. + +# Prepare data for plotting +labels = results.pipeline +mean_acc = results.accuracy +ci_lower = results.ci_lower +ci_upper = results.ci_upper + +# Error bars: distance from mean to CI bounds +lower_err = mean_acc .- ci_lower +upper_err = ci_upper .- mean_acc + +bar( + labels, + mean_acc, + yerror = (lower_err, upper_err), + legend = false, + xlabel = "Encoder + SVM", + ylabel = "Accuracy", + title = "Mean Accuracy with 95% Confidence Intervals", + ylim = (0, 1.05), + color = :skyblue, + size = (700, 400), +); + +# save the figure and load it +savefig("encoder_comparison.png"); +# ![`encoder_comparison.png`](encoder_comparison.png) diff --git a/docs/src/tutorials/classic_comparison/notebook.md b/docs/src/tutorials/classic_comparison/notebook.md new file mode 100644 index 0000000..e15b2bf --- /dev/null +++ b/docs/src/tutorials/classic_comparison/notebook.md @@ -0,0 +1,291 @@ +```@meta +EditURL = "notebook.jl" +``` + +# Categorical Encoders Performance: A Classic Comparison + +**Julia version** is assumed to be 1.10.* + +This demonstration is available as a Jupyter notebook or julia script (as well as the dataset) +[here](https://github.com/essamwise/MLJTransforms.jl/tree/main/docs/src/tutorials/classic_comparison). + +This tutorial compares four fundamental categorical encoding approaches on a milk quality dataset: +OneHot, Frequency, Target, and Ordinal encoders paired with SVM classification. + +````julia +using Pkg; +Pkg.activate(@__DIR__); + +using MLJ, MLJTransforms, LIBSVM, DataFrames, ScientificTypes +using Random, CSV, Plots +```` + +```` + Activating project at `~/Documents/GitHub/MLJTransforms/docs/src/tutorials/classic_comparison` + +```` + +## Load and Prepare Data +Load the milk quality dataset which contains categorical features for quality prediction: + +````julia +df = CSV.read("./milknew.csv", DataFrame) + +first(df, 5) +```` + +```@raw html +
5Γ—8 DataFrame
RowpHTempratureTasteOdorFat TurbidityColourGrade
Float64Int64Int64Int64Int64Int64Int64String7
16.6351010254high
26.6360101253high
38.5701111246low
49.5341101255low
56.6370000255medium
+``` + +Check the scientific types to understand our data structure: + +````julia +ScientificTypes.schema(df) +```` + +```` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ names β”‚ scitypes β”‚ types β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ pH β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Temprature β”‚ Count β”‚ Int64 β”‚ +β”‚ Taste β”‚ Count β”‚ Int64 β”‚ +β”‚ Odor β”‚ Count β”‚ Int64 β”‚ +β”‚ Fat β”‚ Count β”‚ Int64 β”‚ +β”‚ Turbidity β”‚ Count β”‚ Int64 β”‚ +β”‚ Colour β”‚ Count β”‚ Int64 β”‚ +β”‚ Grade β”‚ Textual β”‚ String7 β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +```` + +Automatically coerce columns with few unique values to categorical: + +````julia +df = coerce(df, autotype(df, :few_to_finite)) + +ScientificTypes.schema(df) +```` + +```` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ names β”‚ scitypes β”‚ types β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ pH β”‚ OrderedFactor{16} β”‚ CategoricalValue{Float64, UInt32} β”‚ +β”‚ Temprature β”‚ OrderedFactor{17} β”‚ CategoricalValue{Int64, UInt32} β”‚ +β”‚ Taste β”‚ OrderedFactor{2} β”‚ CategoricalValue{Int64, UInt32} β”‚ +β”‚ Odor β”‚ OrderedFactor{2} β”‚ CategoricalValue{Int64, UInt32} β”‚ +β”‚ Fat β”‚ OrderedFactor{2} β”‚ CategoricalValue{Int64, UInt32} β”‚ +β”‚ Turbidity β”‚ OrderedFactor{2} β”‚ CategoricalValue{Int64, UInt32} β”‚ +β”‚ Colour β”‚ OrderedFactor{9} β”‚ CategoricalValue{Int64, UInt32} β”‚ +β”‚ Grade β”‚ Multiclass{3} β”‚ CategoricalValue{String7, UInt32} β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +```` + +## Split Data +Separate features from target and create train/test split: + +````julia +y, X = unpack(df, ==(:Grade); rng = 123) +train, test = partition(eachindex(y), 0.9, shuffle = true, rng = 100); +```` + +## Setup Encoders and Classifier +Load the required models and create different encoding strategies: + +````julia +OneHot = @load OneHotEncoder pkg = MLJModels verbosity = 0 +SVC = @load SVC pkg = LIBSVM verbosity = 0 +```` + +```` +MLJLIBSVMInterface.SVC +```` + +**Encoding Strategies Explained:** +1. **OneHot**: Creates binary columns for each category (sparse, interpretable) +2. **Frequency**: Replaces categories with their occurrence frequency +3. **Target**: Uses target statistics for each category +4. **Ordinal**: Assigns integer codes to categories (assumes ordering) + +````julia +onehot_model = OneHot(drop_last = true, ordered_factor = true) +freq_model = MLJTransforms.FrequencyEncoder(normalize = false, ordered_factor = true) +target_model = MLJTransforms.TargetEncoder(lambda = 0.9, m = 5, ordered_factor = true) +ordinal_model = MLJTransforms.OrdinalEncoder(ordered_factor = true) +svm = SVC() +```` + +```` +SVC( + kernel = LIBSVM.Kernel.RadialBasis, + gamma = 0.0, + cost = 1.0, + cachesize = 200.0, + degree = 3, + coef0 = 0.0, + tolerance = 0.001, + shrinking = true) +```` + +Create four different pipelines to compare: + +````julia +pipelines = [ + ("OneHot + SVM", onehot_model |> svm), + ("FreqEnc + SVM", freq_model |> svm), + ("TargetEnc + SVM", target_model |> svm), + ("Ordinal + SVM", ordinal_model |> svm), +] +```` + +```` +4-element Vector{Tuple{String, MLJBase.DeterministicPipeline{N, MLJModelInterface.predict} where N<:NamedTuple}}: + ("OneHot + SVM", DeterministicPipeline(one_hot_encoder = OneHotEncoder(features = Symbol[], …), …)) + ("FreqEnc + SVM", DeterministicPipeline(frequency_encoder = FrequencyEncoder(features = Symbol[], …), …)) + ("TargetEnc + SVM", DeterministicPipeline(target_encoder = TargetEncoder(features = Symbol[], …), …)) + ("Ordinal + SVM", DeterministicPipeline(ordinal_encoder = OrdinalEncoder(features = Symbol[], …), …)) +```` + +## Evaluate Pipelines +Use 10-fold cross-validation to robustly estimate each pipeline's accuracy: + +````julia +results = DataFrame( + pipeline = String[], + accuracy = Float64[], + std_error = Float64[], + ci_lower = Float64[], + ci_upper = Float64[], +) + +for (name, pipe) in pipelines + println("Evaluating: $name") + eval_results = evaluate( + pipe, + X, + y, + resampling = CV(nfolds = 5, rng = 123), + measure = accuracy, + rows = train, + verbosity = 0, + ) + acc = eval_results.measurement[1] # scalar mean + per_fold = eval_results.per_fold[1] # vector of fold results + se = std(per_fold) / sqrt(length(per_fold)) + ci = 1.96 * se + push!( + results, + ( + pipeline = name, + accuracy = acc, + std_error = se, + ci_lower = acc - ci, + ci_upper = acc + ci, + ), + ) + println(" Mean accuracy: $(round(acc, digits=4)) Β± $(round(ci, digits=4))") +end +```` + +```` +Evaluating: OneHot + SVM + Mean accuracy: 0.999 Β± 0.0021 +Evaluating: FreqEnc + SVM + Mean accuracy: 0.8804 Β± 0.0286 +Evaluating: TargetEnc + SVM + Mean accuracy: 0.9738 Β± 0.0086 +Evaluating: Ordinal + SVM + Mean accuracy: 0.9328 Β± 0.0119 + +```` + +Sort results by accuracy (highest first) and display: + +````julia +sort!(results, :accuracy, rev = true) +```` + +```@raw html +
4Γ—5 DataFrame
Rowpipelineaccuracystd_errorci_lowerci_upper
StringFloat64Float64Float64Float64
1OneHot + SVM0.9989510.001052630.9968881.00101
2TargetEnc + SVM0.9737670.004410170.9651230.982411
3Ordinal + SVM0.9328440.006069850.9209470.944741
4FreqEnc + SVM0.8803780.01459610.8517690.908986
+``` + +Display results with confidence intervals + +````julia +println("\nResults with 95% Confidence Intervals (see caveats below):") +println("="^60) +for row in eachrow(results) + pipeline = row.pipeline + acc = round(row.accuracy, digits = 4) + ci_lower = round(row.ci_lower, digits = 4) + ci_upper = round(row.ci_upper, digits = 4) + println("$pipeline: $acc (95% CI: [$ci_lower, $ci_upper])") +end + +results +```` + +```@raw html +
4Γ—5 DataFrame
Rowpipelineaccuracystd_errorci_lowerci_upper
StringFloat64Float64Float64Float64
1OneHot + SVM0.9989510.001052630.9968881.00101
2TargetEnc + SVM0.9737670.004410170.9651230.982411
3Ordinal + SVM0.9328440.006069850.9209470.944741
4FreqEnc + SVM0.8803780.01459610.8517690.908986
+``` + +## Results Analysis + +### Performance Summary +The results show OneHot encoding performing best, followed by Target encoding, with Ordinal and Frequency encoders showing lower performance. + +The confidence intervals should be interpreted with caution and primarily serve to illustrate uncertainty rather than provide definitive statistical significance tests. +See Bengio & Grandvalet, 2004: "No Unbiased Estimator of the Variance of K-Fold Cross-Validation"). That said, reporting the interval is still more informative than reporting only the mean. + +Prepare data for plotting + +````julia +labels = results.pipeline +mean_acc = results.accuracy +ci_lower = results.ci_lower +ci_upper = results.ci_upper +```` + +```` +4-element Vector{Float64}: + 1.0010138399514 + 0.9824109872813186 + 0.9447405610093282 + 0.9089860558215551 +```` + +Error bars: distance from mean to CI bounds + +````julia +lower_err = mean_acc .- ci_lower +upper_err = ci_upper .- mean_acc + +bar( + labels, + mean_acc, + yerror = (lower_err, upper_err), + legend = false, + xlabel = "Encoder + SVM", + ylabel = "Accuracy", + title = "Mean Accuracy with 95% Confidence Intervals", + ylim = (0, 1.05), + color = :skyblue, + size = (700, 400), +); +```` + +save the figure and load it + +````julia +savefig("encoder_comparison.png"); +```` + +![`encoder_comparison.png`](encoder_comparison.png) + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/tutorials/classic_comparison/notebook.unexecuted.ipynb b/docs/src/tutorials/classic_comparison/notebook.unexecuted.ipynb new file mode 100644 index 0000000..4e1f750 --- /dev/null +++ b/docs/src/tutorials/classic_comparison/notebook.unexecuted.ipynb @@ -0,0 +1,243 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Categorical Encoders Performance: A Classic Comparison\n", + "\n", + "This tutorial compares four fundamental categorical encoding approaches on a milk quality dataset:\n", + "OneHot, Frequency, Target, and Ordinal encoders paired with SVM classification." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Pkg;\n", + "Pkg.activate(@__DIR__);\n", + "\n", + "using MLJ, MLJTransforms, LIBSVM, DataFrames, ScientificTypes\n", + "using Random, CSV" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Load and Prepare Data\n", + "Load the milk quality dataset which contains categorical features for quality prediction:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "df = CSV.read(\"./milknew.csv\", DataFrame)\n", + "\n", + "first(df, 5)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Check the scientific types to understand our data structure:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "ScientificTypes.schema(df)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Automatically coerce columns with few unique values to categorical:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "df = coerce(df, autotype(df, :few_to_finite))\n", + "\n", + "ScientificTypes.schema(df)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Split Data\n", + "Separate features from target and create train/test split:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "y, X = unpack(df, ==(:Grade); rng = 123)\n", + "train, test = partition(eachindex(y), 0.9, shuffle = true, rng = 100);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Setup Encoders and Classifier\n", + "Load the required models and create different encoding strategies:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "OneHot = @load OneHotEncoder pkg = MLJModels verbosity = 0\n", + "SVC = @load SVC pkg = LIBSVM verbosity = 0" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "**Encoding Strategies Explained:**\n", + "1. **OneHot**: Creates binary columns for each category (sparse, interpretable)\n", + "2. **Frequency**: Replaces categories with their occurrence frequency\n", + "3. **Target**: Uses target statistics for each category\n", + "4. **Ordinal**: Assigns integer codes to categories (assumes ordering)" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "onehot_model = OneHot(drop_last = true, ordered_factor = true)\n", + "freq_model = MLJTransforms.FrequencyEncoder(normalize = false, ordered_factor = true)\n", + "target_model = MLJTransforms.TargetEncoder(lambda = 0.9, m = 5, ordered_factor = true)\n", + "ordinal_model = MLJTransforms.OrdinalEncoder(ordered_factor = true)\n", + "svm = SVC()" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Create four different pipelines to compare:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "pipelines = [\n", + " (\"OneHot + SVM\", onehot_model |> svm),\n", + " (\"FreqEnc + SVM\", freq_model |> svm),\n", + " (\"TargetEnc + SVM\", target_model |> svm),\n", + " (\"Ordinal + SVM\", ordinal_model |> svm),\n", + "]" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Evaluate Pipelines\n", + "Use 10-fold cross-validation to robustly estimate each pipeline's accuracy:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "results = DataFrame(pipeline = String[], accuracy = Float64[])\n", + "\n", + "for (name, pipe) in pipelines\n", + " println(\"Evaluating: $name\")\n", + " mach = machine(pipe, X, y)\n", + " eval_results = evaluate!(\n", + " mach,\n", + " resampling = CV(nfolds = 10, rng = 123),\n", + " measure = accuracy,\n", + " rows = train,\n", + " verbosity = 0,\n", + " )\n", + " acc = mean(eval_results.measurement)\n", + " push!(results, (name, acc))\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Sort results by accuracy (highest first) and display:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sort!(results, :accuracy, rev = true)\n", + "results" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Results Analysis\n", + "We notice that one-hot-encoding was the most performant here followed by target encoding.\n", + "Ordinal encoding also produced decent results because we can perceive all the categorical variables to be ordered\n", + "On the other hand, frequency encoding lagged behind. Observe that this method doesn't distinguish categories from one another if they occur with similar frequencies." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.5" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.5", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/tutorials/entity_embeddings/Manifest.toml b/docs/src/tutorials/entity_embeddings/Manifest.toml new file mode 100644 index 0000000..ef7d843 --- /dev/null +++ b/docs/src/tutorials/entity_embeddings/Manifest.toml @@ -0,0 +1,2158 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.5" +manifest_format = "2.0" +project_hash = "75720b2f6861fcfa542195516a10067488e753e7" + +[[deps.ARFFFiles]] +deps = ["CategoricalArrays", "Dates", "Parsers", "Tables"] +git-tree-sha1 = "678eb18590a8bc6674363da4d5faa4ac09c40a18" +uuid = "da404889-ca92-49ff-9e8b-0aa6b4d38dc8" +version = "1.5.0" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"] +git-tree-sha1 = "b392ede862e506d451fc1616e79aa6f4c673dab8" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.38" + + [deps.Accessors.extensions] + AccessorsAxisKeysExt = "AxisKeys" + AccessorsDatesExt = "Dates" + AccessorsIntervalSetsExt = "IntervalSets" + AccessorsStaticArraysExt = "StaticArrays" + AccessorsStructArraysExt = "StructArrays" + AccessorsTestExt = "Test" + AccessorsUnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "d80af0733c99ea80575f612813fa6aa71022d33a" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.1.0" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[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.2" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "0.1.0" + +[[deps.BSON]] +git-tree-sha1 = "4c3e506685c527ac6a54ccc0c8c76fd6f91b42fb" +uuid = "fbb218c0-5317-5bc6-957e-2ee96dd4b1f0" +version = "0.3.9" + +[[deps.BangBang]] +deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires"] +git-tree-sha1 = "e2144b631226d9eeab2d746ca8880b7ccff504ae" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.4.3" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTablesExt = "Tables" + 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" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "8873e196c2eb87962a2048b3b8e08946535864a1" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+2" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.15" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "009060c9a6168704143100f36ab08f06c2af4642" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.2+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.CategoricalDistributions]] +deps = ["CategoricalArrays", "Distributions", "Missings", "OrderedCollections", "Random", "ScientificTypes"] +git-tree-sha1 = "926862f549a82d6c3a7145bc7f1adff2a91a39f0" +uuid = "af321ab8-2d2e-40a6-b165-3d674595d28e" +version = "0.1.15" + + [deps.CategoricalDistributions.extensions] + UnivariateFiniteDisplayExt = "UnicodePlots" + + [deps.CategoricalDistributions.weakdeps] + UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" + +[[deps.ChainRules]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] +git-tree-sha1 = "be227d253d132a6d57f9ccf5f67c0fb6488afd87" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.71.0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "3e4b134270b372f2ed4d4d0e936aabaefc1802bc" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.6" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "13951eb68769ad1cd460cdb2e64e5e95f1bf123d" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.27.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.11" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.2" + +[[deps.ConstructionBase]] +git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.8" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ContextVariablesX]] +deps = ["Compat", "Logging", "UUIDs"] +git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" +uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" +version = "0.1.3" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.7.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[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" +version = "1.11.0" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fc173b380865f70627d7dd1190dc2fce6cc105af" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.14.10+0" + +[[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.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "d7477ecdafb813ddee2ae727afa94e9dcb5f3fb0" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.112" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[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.EarlyStopping]] +deps = ["Dates", "Statistics"] +git-tree-sha1 = "98fdf08b707aaf69f524a6cd0a67858cefe0cfb6" +uuid = "792122b4-ca99-40de-a6bc-6742525f08b6" +version = "0.3.0" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.2+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FLoops]] +deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] +git-tree-sha1 = "0a2e5873e9a5f54abb06418d57a8df689336a660" +uuid = "cc61a311-1640-44b5-9fba-1b764f453329" +version = "0.2.2" + +[[deps.FLoopsBase]] +deps = ["ContextVariablesX"] +git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" +uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" +version = "0.1.1" + +[[deps.FeatureSelection]] +deps = ["MLJModelInterface", "ScientificTypesBase", "Tables"] +git-tree-sha1 = "d78c565b6296e161193eb0f053bbcb3f1a82091d" +uuid = "33837fe5-dbff-4c9e-8c2f-c5612fe2b8b6" +version = "0.2.2" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "62ca0547a14c57e98154423419d8a342dca75ca9" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.4" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "7878ff7172a8e6beedd1dea14bd27c3c6340d361" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.22" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Flux]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLDataDevices", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "Setfield", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"] +git-tree-sha1 = "37fa32a50c69c10c6ea1465d3054d98c75bd7777" +uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c" +version = "0.14.22" + + [deps.Flux.extensions] + FluxAMDGPUExt = "AMDGPU" + FluxCUDAExt = "CUDA" + FluxCUDAcuDNNExt = ["CUDA", "cuDNN"] + FluxEnzymeExt = "Enzyme" + FluxMPIExt = "MPI" + FluxMPINCCLExt = ["CUDA", "MPI", "NCCL"] + FluxMetalExt = "Metal" + + [deps.Flux.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + NCCL = "3fe64909-d7a1-4096-9b7d-7a0f12cf0f6b" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.96+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.2+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.14+0" + +[[deps.Functors]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "64d8e93700c7a3f28f717d265382d52fac9fa1c1" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.4.12" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "532f9126ad901533af1d4f5c198867227a7bb077" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+1" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "62ee71528cca49be797076a76bdc654a170a523e" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "10.3.1" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.6" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "ee28ddcd5517d54e417182fec3886e7412d3926f" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.8" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "f31929b9e67066bee48eec8b03c0df47d31a74b3" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.8+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "674ff0db93fffcd11a3573986e550d66cd4fd71f" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.80.5+0" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.8" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "401e4f3f30f43af2c8478fc008da50096ea5240f" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.3.1+0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "7c4195be1649ae622304031ed46a2f4df989f1eb" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.24" + +[[deps.IRTools]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "950c3717af761bc3ff906c2e8e52bd83390b6ec2" +uuid = "7869d1d1-7146-5819-86e3-90919afe41df" +version = "0.4.14" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InlineStrings]] +git-tree-sha1 = "45521d31238e87ee9f9732561bfee12d4eebd52d" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.2" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[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.IterationControl]] +deps = ["EarlyStopping", "InteractiveUtils"] +git-tree-sha1 = "e663925ebc3d93c1150a7570d114f9ea2f664726" +uuid = "b3c1a2ee-3fec-4384-bf48-272ea71de57c" +version = "0.5.4" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "Requires", "TranscodingStreams"] +git-tree-sha1 = "783c1be5213a09609b23237a0c9e5dfd258ae6f2" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.5.7" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "39d64b09147620f5ffbf6b2d3255be3c901bec63" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.8" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "be3dc50a92e5a386872a493a10050136d4703f9b" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.6.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "25ee0be4d43d0269027024d75a24c24d6c6e590c" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.4+0" + +[[deps.JuliaVariables]] +deps = ["MLStyle", "NameResolution"] +git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" +uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" +version = "0.2.4" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "04e52f596d0871fa3890170fa79cb15e481e4cd8" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.28" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "36bdbc52f13a7d1dcb0f3cd694e01677a515655b" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.0+0" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "d422dfd9707bec6617335dc2ea3c5172a87d5908" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.1.3" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "05a8bd5a42309a9ec82f700876903abce1017dd3" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.34+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "854a9c268c43b77b0a27f22d7fab8d33cdb3a731" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+1" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "ce5f5621cac23a86011836badfedf664a612cee4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.5" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LatinHypercubeSampling]] +deps = ["Random", "StableRNGs", "StatsBase", "Test"] +git-tree-sha1 = "825289d43c753c7f1bf9bed334c253e9913997f8" +uuid = "a5e1c1ea-c99a-51d3-a14d-a9a37257b02d" +version = "1.9.0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LearnAPI]] +deps = ["InteractiveUtils", "Statistics"] +git-tree-sha1 = "ec695822c1faaaa64cee32d0b21505e1977b4809" +uuid = "92ad9a40-7767-427a-9ee6-6e577f1266cb" +version = "0.1.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.11+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c6ce1e19f3aec9b59186bdf06cdf3c4fc5f5f3e6" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.50.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.1+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "b404131d06f7886402758c9ce2214b636eb4d54a" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.1+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.28" + + [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" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.MLDataDevices]] +deps = ["Adapt", "Compat", "Functors", "LinearAlgebra", "Preferences", "Random"] +git-tree-sha1 = "3207c2e66164e6366440ad3f0243a8d67abb4a47" +uuid = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40" +version = "1.4.1" + + [deps.MLDataDevices.extensions] + MLDataDevicesAMDGPUExt = "AMDGPU" + MLDataDevicesCUDAExt = "CUDA" + MLDataDevicesChainRulesCoreExt = "ChainRulesCore" + MLDataDevicesFillArraysExt = "FillArrays" + MLDataDevicesGPUArraysExt = "GPUArrays" + MLDataDevicesMLUtilsExt = "MLUtils" + MLDataDevicesMetalExt = ["GPUArrays", "Metal"] + MLDataDevicesReactantExt = "Reactant" + MLDataDevicesRecursiveArrayToolsExt = "RecursiveArrayTools" + MLDataDevicesReverseDiffExt = "ReverseDiff" + MLDataDevicesSparseArraysExt = "SparseArrays" + MLDataDevicesTrackerExt = "Tracker" + MLDataDevicesZygoteExt = "Zygote" + MLDataDevicescuDNNExt = ["CUDA", "cuDNN"] + MLDataDevicesoneAPIExt = ["GPUArrays", "oneAPI"] + + [deps.MLDataDevices.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" + GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" + MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.MLFlowClient]] +deps = ["Dates", "FilePathsBase", "HTTP", "JSON", "ShowCases", "URIs", "UUIDs"] +git-tree-sha1 = "9abb12b62debc27261c008daa13627255bf79967" +uuid = "64a0f543-368b-4a9a-827a-e71edb2a0b83" +version = "0.5.1" + +[[deps.MLJ]] +deps = ["CategoricalArrays", "ComputationalResources", "Distributed", "Distributions", "FeatureSelection", "LinearAlgebra", "MLJBalancing", "MLJBase", "MLJEnsembles", "MLJFlow", "MLJIteration", "MLJModels", "MLJTuning", "OpenML", "Pkg", "ProgressMeter", "Random", "Reexport", "ScientificTypes", "StatisticalMeasures", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "521eec7a22417d54fdc66f5dc0b7dc9628931c54" +uuid = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +version = "0.20.7" + +[[deps.MLJBalancing]] +deps = ["MLJBase", "MLJModelInterface", "MLUtils", "OrderedCollections", "Random", "StatsBase"] +git-tree-sha1 = "f707a01a92d664479522313907c07afa5d81df19" +uuid = "45f359ea-796d-4f51-95a5-deb1a414c586" +version = "0.1.5" + +[[deps.MLJBase]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Dates", "DelimitedFiles", "Distributed", "Distributions", "InteractiveUtils", "InvertedIndices", "LearnAPI", "LinearAlgebra", "MLJModelInterface", "Missings", "OrderedCollections", "Parameters", "PrettyTables", "ProgressMeter", "Random", "RecipesBase", "Reexport", "ScientificTypes", "Serialization", "StatisticalMeasuresBase", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "6f45e12073bc2f2e73ed0473391db38c31e879c9" +uuid = "a7f614a8-145f-11e9-1d2a-a57a1082229d" +version = "1.7.0" +weakdeps = ["StatisticalMeasures"] + + [deps.MLJBase.extensions] + DefaultMeasuresExt = "StatisticalMeasures" + +[[deps.MLJEnsembles]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Distributed", "Distributions", "MLJModelInterface", "ProgressMeter", "Random", "ScientificTypesBase", "StatisticalMeasuresBase", "StatsBase"] +git-tree-sha1 = "84a5be55a364bb6b6dc7780bbd64317ebdd3ad1e" +uuid = "50ed68f4-41fd-4504-931a-ed422449fee0" +version = "0.4.3" + +[[deps.MLJFlow]] +deps = ["MLFlowClient", "MLJBase", "MLJModelInterface"] +git-tree-sha1 = "508bff8071d7d1902d6f1b9d1e868d58821f1cfe" +uuid = "7b7b8358-b45c-48ea-a8ef-7ca328ad328f" +version = "0.5.0" + +[[deps.MLJFlux]] +deps = ["CategoricalArrays", "ColorTypes", "ComputationalResources", "Flux", "MLJModelInterface", "Metalhead", "Optimisers", "ProgressMeter", "Random", "Statistics", "Tables"] +git-tree-sha1 = "cb65604a17525c341222e5379aad3dc6d322e719" +uuid = "094fc8d1-fd35-5302-93ea-dabda2abf845" +version = "0.6.6" + +[[deps.MLJIteration]] +deps = ["IterationControl", "MLJBase", "Random", "Serialization"] +git-tree-sha1 = "ad16cfd261e28204847f509d1221a581286448ae" +uuid = "614be32b-d00c-4edb-bd02-1eb411ab5e55" +version = "0.6.3" + +[[deps.MLJModelInterface]] +deps = ["Random", "ScientificTypesBase", "StatisticalTraits"] +git-tree-sha1 = "ceaff6618408d0e412619321ae43b33b40c1a733" +uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" +version = "1.11.0" + +[[deps.MLJModels]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Combinatorics", "Dates", "Distances", "Distributions", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "Markdown", "OrderedCollections", "Parameters", "Pkg", "PrettyPrinting", "REPL", "Random", "RelocatableFolders", "ScientificTypes", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "c1b1f72379d15079d2c97937d9c1ed38f9ab4679" +uuid = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +version = "0.17.4" + +[[deps.MLJTuning]] +deps = ["ComputationalResources", "Distributed", "Distributions", "LatinHypercubeSampling", "MLJBase", "ProgressMeter", "Random", "RecipesBase", "StatisticalMeasuresBase"] +git-tree-sha1 = "38aab60b1274ce7d6da784808e3be69e585dbbf6" +uuid = "03970b2e-30c4-11ea-3135-d1576263f10f" +version = "0.8.8" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MLUtils]] +deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"] +git-tree-sha1 = "b45738c2e3d0d402dffa32b2c1654759a2ac35a4" +uuid = "f1d291b0-491e-4a28-83b9-f70985020b54" +version = "0.4.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Metalhead]] +deps = ["Artifacts", "BSON", "ChainRulesCore", "Flux", "Functors", "JLD2", "LazyArtifacts", "MLUtils", "NNlib", "PartialFunctions", "Random", "Statistics"] +git-tree-sha1 = "aef476e4958303f5ea9e1deb81a1ba2f510d4e11" +uuid = "dbeba491-748d-5e0e-a39e-b530a07fa0cc" +version = "0.9.4" + + [deps.Metalhead.extensions] + MetalheadCUDAExt = "CUDA" + + [deps.Metalhead.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.MicroCollections]] +deps = ["Accessors", "BangBang", "InitialValues"] +git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.2.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.Mocking]] +deps = ["Compat", "ExprTools"] +git-tree-sha1 = "2c140d60d7cb82badf06d8783800d0bcd1a7daa2" +uuid = "78c3b35d-d492-501b-9361-3d52fe80e533" +version = "0.8.1" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "da09a1e112fd75f9af2a5229323f01b56ec96a4c" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.24" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NameResolution]] +deps = ["PrettyPrint"] +git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" +uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" +version = "0.1.5" + +[[deps.NearestNeighborModels]] +deps = ["Distances", "FillArrays", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "NearestNeighbors", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "e411143a8362926e4284a54e745972e939fbab78" +uuid = "636a865e-7cf4-491e-846c-de09b730eb36" +version = "0.2.3" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "ca7e18198a166a1f3eb92a3650d53d94ed8ca8a1" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.22" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OneHotArrays]] +deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"] +git-tree-sha1 = "963a3f28a2e65bb87a68033ea4a616002406037d" +uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f" +version = "0.2.5" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenML]] +deps = ["ARFFFiles", "HTTP", "JSON", "Markdown", "Pkg", "Scratch"] +git-tree-sha1 = "6efb039ae888699d5a74fb593f6f3e10c7193e33" +uuid = "8b6db2d4-7670-4922-a472-f9537c81ab66" +version = "0.3.1" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.15+1" + +[[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.Optimisers]] +deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "6572fe0c5b74431aaeb0b18a4aa5ef03c84678be" +uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" +version = "0.3.3" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e127b609fb9ecba6f201ba7ab753d5a605d53801" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.54.1+0" + +[[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 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.PartialFunctions]] +deps = ["MacroTools"] +git-tree-sha1 = "47b49a4dbc23b76682205c646252c0f9e1eb75af" +uuid = "570af359-4316-4cb7-8c74-252c00c2016b" +version = "1.2.0" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.43.4+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "6e55c6841ce3411ccb3457ee52fc48cb698d6fb0" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.2.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "650a022b2ce86c7dcfbdecf00f78afeeb20e5655" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.2" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "45470145863035bb124ca51b320ed35d071cc6c2" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.8" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyPrint]] +git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" +uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" +version = "0.2.0" + +[[deps.PrettyPrinting]] +git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e" +uuid = "54e16d92-306c-5ea0-a30b-337be88ac337" +version = "0.4.2" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[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 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.2" + +[[deps.PtrArrays]] +git-tree-sha1 = "77a42d78b6a92df47ab37e177b2deac405e1c88f" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.2.1" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "492601870742dcd38f233b23c3ec629628c1d724" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.7.1+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "e5dd466bf2569fe08c91a2cc29c1003f4797ac3b" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.7.1+2" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "1a180aeced866700d4bebc3120ea1451201f16bc" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.7.1+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "729927532d48cf79f49070341e1d918a65aba6b0" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.7.1+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "cda3b045cf9ef07a08ad46731f5a3165e56cf3da" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.1" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.RData]] +deps = ["CategoricalArrays", "CodecZlib", "DataFrames", "Dates", "FileIO", "Requires", "TimeZones", "Unicode"] +git-tree-sha1 = "19e47a495dfb7240eb44dc6971d660f7e4244a72" +uuid = "df47a6cb-8c03-5eed-afd8-b6050d6c41da" +version = "0.8.3" + +[[deps.RDatasets]] +deps = ["CSV", "CodecZlib", "DataFrames", "FileIO", "Printf", "RData", "Reexport"] +git-tree-sha1 = "2720e6f6afb3e562ccb70a6b62f8f308ff810333" +uuid = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +version = "0.7.7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[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 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.ScientificTypes]] +deps = ["CategoricalArrays", "ColorTypes", "Dates", "Distributions", "PrettyTables", "Reexport", "ScientificTypesBase", "StatisticalTraits", "Tables"] +git-tree-sha1 = "75ccd10ca65b939dab03b812994e571bf1e3e1da" +uuid = "321657f4-b219-11e9-178b-2701a2544e81" +version = "3.0.2" + +[[deps.ScientificTypesBase]] +git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b" +uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" +version = "3.0.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "305becf8af67eae1dbc912ee9097f00aeeabb8d5" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.6" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.ShowCases]] +git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5" +uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" +version = "0.1.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SparseInverseSubset]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" +uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" +version = "0.1.2" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.4.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.15" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.2" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "777657803913ffc7e8cc20f0fd04b634f871af8f" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.8" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.StatisticalMeasures]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Distributions", "LearnAPI", "LinearAlgebra", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "StatisticalMeasuresBase", "Statistics", "StatsBase"] +git-tree-sha1 = "c1d4318fa41056b839dfbb3ee841f011fa6e8518" +uuid = "a19d573c-0a75-4610-95b3-7071388c7541" +version = "0.1.7" + + [deps.StatisticalMeasures.extensions] + LossFunctionsExt = "LossFunctions" + ScientificTypesExt = "ScientificTypes" + + [deps.StatisticalMeasures.weakdeps] + LossFunctions = "30fc2ffe-d236-52d8-8643-a9d8f7c094a7" + ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" + +[[deps.StatisticalMeasuresBase]] +deps = ["CategoricalArrays", "InteractiveUtils", "MLUtils", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "Statistics"] +git-tree-sha1 = "17dfb22e2e4ccc9cd59b487dce52883e0151b4d3" +uuid = "c062fc1d-0d66-479b-b6ac-8b44719de4cc" +version = "0.1.1" + +[[deps.StatisticalTraits]] +deps = ["ScientificTypesBase"] +git-tree-sha1 = "542d979f6e756f13f862aa00b224f04f9e445f11" +uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" +version = "3.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.5" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.2" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "a6b1675a536c5ad1a60e5a5153e1fee12eb146e3" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.0" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.18" +weakdeps = ["Adapt", "GPUArraysCore", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = "GPUArraysCore" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TZJData]] +deps = ["Artifacts"] +git-tree-sha1 = "36b40607bf2bf856828690e097e1c799623b0602" +uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" +version = "1.3.0+2024b" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TimeZones]] +deps = ["Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"] +git-tree-sha1 = "8323074bc977aa85cf5ad71099a83ac75b0ac107" +uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" +version = "1.18.1" +weakdeps = ["RecipesBase"] + + [deps.TimeZones.extensions] + TimeZonesRecipesBaseExt = "RecipesBase" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Transducers]] +deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] +git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.84" + + [deps.Transducers.extensions] + TransducersAdaptExt = "Adapt" + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + TransducersReferenceablesExt = "Referenceables" + + [deps.Transducers.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + 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.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "d95fe458f26209c66a187b1114df96fd70839efd" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.21.0" +weakdeps = ["ConstructionBase", "InverseFunctions"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "975c354fcd5f7e1ddcc1f1a23e6e091d99e99bc8" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.4" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.2.1" + +[[deps.UnsafeAtomicsLLVM]] +deps = ["LLVM", "UnsafeAtomics"] +git-tree-sha1 = "2d17fabcd17e67d7625ce9c531fb9f40b7c42ce4" +uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" +version = "0.2.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+1" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.31.0+0" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WorkerUtilities]] +git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" +uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" +version = "1.6.1" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "1165b0443d0eca63ac1e32b8c0eb69ed2f4f8127" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.3+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "a54ee957f4c86b526460a720dbc882fa5edcbefc" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.41+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "15e637a697345f6743674f1322beefbc5dcd5cfc" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.6.3+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.1+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.4+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+0" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "bcd466676fef0878338c61e655629fa7bbc69d8e" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.0+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.6+1" + +[[deps.Zygote]] +deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] +git-tree-sha1 = "f816633be6dc5c0ed9ffedda157ecfda0b3b6a69" +uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" +version = "0.6.72" + + [deps.Zygote.extensions] + ZygoteColorsExt = "Colors" + ZygoteDistancesExt = "Distances" + ZygoteTrackerExt = "Tracker" + + [deps.Zygote.weakdeps] + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ZygoteRules]] +deps = ["ChainRulesCore", "MacroTools"] +git-tree-sha1 = "27798139afc0a2afa7b1824c206d5e87ea587a00" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.5" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "936081b536ae4aa65415d869287d43ef3cb576b2" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.53.0+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.9.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "b70c870239dc3d7bc094eb2d6be9b73d27bef280" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.44+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+1" diff --git a/docs/src/tutorials/entity_embeddings/Project.toml b/docs/src/tutorials/entity_embeddings/Project.toml new file mode 100644 index 0000000..e1b35c2 --- /dev/null +++ b/docs/src/tutorials/entity_embeddings/Project.toml @@ -0,0 +1,16 @@ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +CategoricalArrays = "324d7699-5711-5eae-9e2f-1d82baa6b597" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" +MLJ = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +MLJFlux = "094fc8d1-fd35-5302-93ea-dabda2abf845" +NearestNeighborModels = "636a865e-7cf4-491e-846c-de09b730eb36" +Optimisers = "3bd65402-5787-11e9-1adc-39752487f4e2" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca" +RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" diff --git a/docs/src/tutorials/entity_embeddings/embedding_android_ver.png b/docs/src/tutorials/entity_embeddings/embedding_android_ver.png new file mode 100644 index 0000000..c171b54 Binary files /dev/null and b/docs/src/tutorials/entity_embeddings/embedding_android_ver.png differ diff --git a/docs/src/tutorials/entity_embeddings/embedding_category.png b/docs/src/tutorials/entity_embeddings/embedding_category.png new file mode 100644 index 0000000..9ab40c0 Binary files /dev/null and b/docs/src/tutorials/entity_embeddings/embedding_category.png differ diff --git a/docs/src/tutorials/entity_embeddings/embedding_content_rating.png b/docs/src/tutorials/entity_embeddings/embedding_content_rating.png new file mode 100644 index 0000000..c037eb1 Binary files /dev/null and b/docs/src/tutorials/entity_embeddings/embedding_content_rating.png differ diff --git a/docs/src/tutorials/entity_embeddings/embedding_genres.png b/docs/src/tutorials/entity_embeddings/embedding_genres.png new file mode 100644 index 0000000..bee1860 Binary files /dev/null and b/docs/src/tutorials/entity_embeddings/embedding_genres.png differ diff --git a/docs/src/tutorials/entity_embeddings/embedding_type.png b/docs/src/tutorials/entity_embeddings/embedding_type.png new file mode 100644 index 0000000..5796d0d Binary files /dev/null and b/docs/src/tutorials/entity_embeddings/embedding_type.png differ diff --git a/docs/src/tutorials/entity_embeddings/generate.jl b/docs/src/tutorials/entity_embeddings/generate.jl new file mode 100644 index 0000000..8f1b8f8 --- /dev/null +++ b/docs/src/tutorials/entity_embeddings/generate.jl @@ -0,0 +1,2 @@ +joinpath(@__DIR__, "..", "..", "generate.jl") |> include +generate(@__DIR__, execute=true) diff --git a/docs/src/tutorials/entity_embeddings/notebook.ipynb b/docs/src/tutorials/entity_embeddings/notebook.ipynb new file mode 100644 index 0000000..38fb30c --- /dev/null +++ b/docs/src/tutorials/entity_embeddings/notebook.ipynb @@ -0,0 +1,701 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Entity Embeddi# ## Package Setup and Environment" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Pkg\n", + "Pkg.activate(@__DIR__);\n", + "Pkg.instantiate();" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "**Julia version** is assumed to be 1.10.*\n", + "\n", + "## Required Packages\n", + "\n", + "We'll need several packages for this tutorial:\n", + "- **MLJ ecosystem**: Core machine learning framework and MLJFlux for neural networks\n", + "- **Flux**: Deep learning framework for building the embedding models\n", + "- **Data handling**: CSV, DataFrames, CategoricalArrays for data manipulation\n", + "- **Visualization**: Plots for visualizing the learned embeddings\n", + "- **Utilities**: Random, Tables, ProgressMeter, StatsBase for various helper functionsedder\n", + "\n", + "This demonstration is available as a Jupyter notebook or julia script\n", + "[here](https://github.com/FluxML/MLJFlux.jl/tree/dev/docs/src/common_workflows/entity_embeddings).\n", + "\n", + "Entity embedding is a newer deep learning approach for categorical encoding introduced in 2016 by Cheng Guo and Felix Berkhahn.\n", + "It employs a set of embedding layers to map each categorical feature into a dense continuous vector in a similar fashion to how they are employed in NLP architectures.\n", + "\n", + "In MLJFlux, the `EntityEmbedder` provides a high-level interface to learn entity embeddings using any supervised MLJFlux model as the underlying learner.\n", + "The embedder can be used as a transformer in MLJ pipelines to encode categorical features with learned embeddings, which can then be used as features in downstream machine learning models.\n", + "\n", + "In this tutorial, we will explore how to use the `EntityEmbedder` to learn and apply entity embeddings on the Google Play Store dataset.\n", + "\n", + "## Learning Objectives\n", + "- Understand the concept of entity embeddings for categorical encoding\n", + "- Learn how to use `EntityEmbedder` from MLJFlux\n", + "- Apply entity embeddings to a real-world dataset\n", + "- Visualize the learned embedding spaces\n", + "- Build pipelines combining embeddings with downstream models" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Pkg\n", + "Pkg.activate(@__DIR__);\n", + "Pkg.instantiate();\n", + "\n", + "\n", + "\n", + "# Import all required packages\n", + "using MLJ\n", + "using Flux\n", + "using Optimisers\n", + "using CategoricalArrays\n", + "using DataFrames\n", + "using Random\n", + "using Tables\n", + "using ProgressMeter\n", + "using Plots\n", + "using ScientificTypes\n", + "using CSV\n", + "using StatsBase ## For countmap\n", + "import Plots: mm ## For margin units" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Data Loading and Preprocessing\n", + "\n", + "We'll use the Google Play Store dataset which contains information about mobile applications.\n", + "This dataset has several categorical features that are perfect for demonstrating entity embeddings:\n", + "- **Category**: App category (e.g., Games, Social, Tools)\n", + "- **Content Rating**: Age rating (e.g., Everyone, Teen, Mature)\n", + "- **Genres**: Primary genre of the app\n", + "- **Android Ver**: Required Android version\n", + "- **Type**: Free or Paid" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load the Google Play Store dataset\n", + "df = CSV.read(\"./googleplaystore.csv\", DataFrame)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Data Cleaning and Type Conversion\n", + "\n", + "The raw dataset requires significant cleaning. We'll handle:\n", + "1. **Reviews**: Convert to integers\n", + "2. **Size**: Parse size strings like \"14M\", \"512k\" to numeric values\n", + "3. **Installs**: Remove formatting characters and convert to integers\n", + "4. **Price**: Remove dollar signs and convert to numeric\n", + "5. **Genres**: Extract primary genre only" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Custom parsing function that returns missing instead of nothing\n", + "safe_parse(T, s) = something(tryparse(T, s), missing)\n", + "\n", + "# Reviews: ensure integer\n", + "df.Reviews = safe_parse.(Int, string.(df.Reviews))\n", + "\n", + "# Size: \"14M\", \"512k\", or \"Varies with device\"\n", + "function parse_size(s)\n", + " if s == \"Varies with device\"\n", + " return missing\n", + " elseif occursin('M', s)\n", + " return safe_parse(Float64, replace(s, \"M\" => \"\")) * 1_000_000\n", + " elseif occursin('k', s)\n", + " return safe_parse(Float64, replace(s, \"k\" => \"\")) * 1_000\n", + " else\n", + " return safe_parse(Float64, s)\n", + " end\n", + "end\n", + "df.Size = parse_size.(string.(df.Size))\n", + "\n", + "# Installs: strip '+' and ',' then parse\n", + "clean_installs = replace.(string.(df.Installs), r\"[+,]\" => \"\")\n", + "df.Installs = safe_parse.(Int, clean_installs)\n", + "\n", + "# Price: strip leading '$'\n", + "df.Price = safe_parse.(Float64, replace.(string.(df.Price), r\"^\\$\" => \"\"))\n", + "\n", + "# Genres: take only the primary genre\n", + "df.Genres = first.(split.(string.(df.Genres), ';'))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Storing Category Information for Visualization\n", + "\n", + "We'll store the unique values of each categorical feature to use later when visualizing the embeddings." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Store unique category names for visualization later\n", + "category_names = Dict(\n", + " :Category => sort(unique(df.Category)),\n", + " Symbol(\"Content Rating\") => sort(unique(df[!, Symbol(\"Content Rating\")])),\n", + " :Genres => sort(unique(df.Genres)),\n", + " Symbol(\"Android Ver\") => sort(unique(df[!, Symbol(\"Android Ver\")])),\n", + ")\n", + "\n", + "println(\"Category names extracted:\")\n", + "for (feature, names) in category_names\n", + " println(\"$feature: $(length(names)) categories\")\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Feature Selection and Missing Value Handling\n", + "\n", + "We'll select the most relevant features and remove any rows with missing values to ensure clean data for our embedding model." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "select!(\n", + " df,\n", + " [\n", + " :Category, :Reviews, :Size, :Installs, :Type,\n", + " :Price, Symbol(\"Content Rating\"), :Genres, Symbol(\"Android Ver\"), :Rating,\n", + " ],\n", + ")\n", + "dropmissing!(df)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Creating Categorical Target Variable\n", + "\n", + "For this tutorial, we'll convert the continuous rating into a categorical classification problem.\n", + "This will allow us to use a classification model that can learn meaningful embeddings.\n", + "\n", + "We'll create 10 rating categories by rounding to the nearest 0.5 (e.g., 0.0, 0.5, 1.0, ..., 4.5, 5.0)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create 10 classes: 0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5\n", + "function rating_to_categorical(rating)\n", + " # Clamp rating to valid range and round to nearest 0.5\n", + " clamped_rating = clamp(rating, 0.0, 5.0)\n", + " rounded_rating = round(clamped_rating * 2) / 2 ## Round to nearest 0.5\n", + " return string(rounded_rating)\n", + "end\n", + "\n", + "# Apply the transformation\n", + "df.RatingCategory = categorical([rating_to_categorical(r) for r in df.Rating])\n", + "\n", + "# Check the distribution of categorical rating labels\n", + "println(\"Distribution of categorical rating labels:\")\n", + "println(sort(countmap(df.RatingCategory)))\n", + "println(\"\\nUnique rating categories: $(sort(unique(df.RatingCategory)))\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Type Coercion for MLJ\n", + "\n", + "MLJ requires explicit type coercion to understand which columns are categorical vs continuous.\n", + "This step is crucial for the `EntityEmbedder` to identify which features need embedding layers." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Coerce types for MLJ compatibility\n", + "df = coerce(df,\n", + " :Category => Multiclass,\n", + " :Reviews => Continuous,\n", + " :Size => Continuous,\n", + " :Installs => Continuous,\n", + " :Type => Multiclass,\n", + " :Price => Continuous,\n", + " Symbol(\"Content Rating\") => Multiclass,\n", + " :Genres => Multiclass,\n", + " Symbol(\"Android Ver\") => Multiclass,\n", + " :Rating => Continuous, ## Keep original for reference\n", + " :RatingCategory => Multiclass, ## New categorical target\n", + ")\n", + "schema(df)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Data Splitting\n", + "\n", + "We'll split our data into training and testing sets using stratified sampling to ensure balanced representation of rating categories." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Split into features and target\n", + "y = df[!, :RatingCategory] ## Use categorical rating as target\n", + "X = select(df, Not([:Rating, :RatingCategory])) ## Exclude both rating columns from features\n", + "\n", + "# Split the data with stratification\n", + "(X_train, X_test), (y_train, y_test) = partition(\n", + " (X, y),\n", + " 0.8,\n", + " multi = true,\n", + " shuffle = true,\n", + " stratify = y,\n", + " rng = Random.Xoshiro(41),\n", + ");\n", + "\n", + "using MLJFlux" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Building the EntityEmbedder Model\n", + "\n", + "The `EntityEmbedder` works by wrapping a supervised learning model that will learn embeddings as part of its training process.\n", + "\n", + "### Key Components:\n", + "1. **Base Model**: A neural network classifier that learns to predict our target\n", + "2. **Embedding Dimensions**: We specify how many dimensions each categorical feature should be embedded into\n", + "3. **Architecture**: The embeddings are learned jointly with the prediction task\n", + "\n", + "### Why Entity Embeddings Work:\n", + "- Similar categories get mapped to similar vectors in the embedding space\n", + "- The embedding captures semantic relationships between categories\n", + "- Dimensionality reduction helps with the curse of dimensionality\n", + "- Learned representations often generalize better than one-hot encoding" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load the neural network classifier\n", + "NeuralNetworkClassifier = @load NeuralNetworkClassifier pkg = MLJFlux" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Configuring the Base Neural Network\n", + "\n", + "We'll create a neural network classifier with custom embedding dimensions for each categorical feature.\n", + "Setting smaller embedding dimensions (like 2D) makes it easier to visualize the learned representations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create the underlying supervised model that will learn the embeddings\n", + "base_clf = NeuralNetworkClassifier(\n", + " builder = MLJFlux.Short(n_hidden = 14),\n", + " optimiser = Optimisers.Adam(10e-2),\n", + " batch_size = 20,\n", + " epochs = 5,\n", + " acceleration = CUDALibs(),\n", + " embedding_dims = Dict(\n", + " :Category => 2,\n", + " :Type => 2,\n", + " Symbol(\"Content Rating\") => 2,\n", + " :Genres => 2,\n", + " Symbol(\"Android Ver\") => 2,\n", + " ),\n", + " rng = 39,\n", + ")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Creating the EntityEmbedder\n", + "\n", + "The `EntityEmbedder` wraps our neural network and can be used as a transformer in MLJ pipelines.\n", + "By default, it uses `min(n_categories - 1, 10)` dimensions for any categorical feature not explicitly specified." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create the EntityEmbedder using the neural network\n", + "embedder = EntityEmbedder(base_clf)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Training the EntityEmbedder\n", + "\n", + "Now we'll train the embedder on our training data. The model learns to predict app ratings while simultaneously learning meaningful embeddings for categorical features.\n", + "\n", + "### What Happens During Training:\n", + "1. Each categorical value gets mapped to a learnable embedding vector\n", + "2. The neural network learns to predict ratings using these embeddings + continuous features\n", + "3. Similar categories that lead to similar predictions get similar embedding vectors\n", + "4. The embeddings capture semantic relationships in the data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create and train the machine\n", + "mach = machine(embedder, X_train, y_train)\n", + "MLJ.fit!(mach, force = true, verbosity = 1)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Transforming Data with Learned Embeddings\n", + "\n", + "After training, we can use the embedder as a transformer to convert categorical features into their learned embedding representations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Transform the data using the learned embeddings\n", + "X_train_embedded = MLJFlux.transform(mach, X_train)\n", + "X_test_embedded = MLJFlux.transform(mach, X_test)\n", + "\n", + "# Check the schema transformation\n", + "println(\"Original schema:\")\n", + "schema(X_train)\n", + "println(\"\\nEmbedded schema:\")\n", + "schema(X_train_embedded)\n", + "X_train_embedded" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Using Embeddings in ML Pipelines\n", + "\n", + "One of the key advantages of entity embeddings is that they can be used as features in any downstream machine learning model.\n", + "Let's create a pipeline that combines our `EntityEmbedder` with a k-nearest neighbors classifier.\n", + "\n", + "### Pipeline Benefits:\n", + "- **Modular**: Easy to swap out different downstream models\n", + "- **Reusable**: Embeddings learned once can be used with multiple models\n", + "- **Interpretable**: Can analyze embedding spaces separately from final predictions" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load KNN classifier\n", + "KNNClassifier = @load KNNClassifier pkg = NearestNeighborModels\n", + "\n", + "# Create a pipeline: EntityEmbedder -> KNNClassifier\n", + "pipe = embedder |> KNNClassifier(K = 5)\n", + "\n", + "# Train the pipeline\n", + "pipe_mach = machine(pipe, X_train, y_train)\n", + "MLJ.fit!(pipe_mach, verbosity = 0)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the Learned Embedding Spaces\n", + "\n", + "One of the most powerful aspects of entity embeddings is their interpretability. Since we used 2D embeddings, we can visualize how the model has organized different categories in the embedding space.\n", + "\n", + "### What to Look For:\n", + "- **Clustering**: Similar categories should be close together\n", + "- **Separation**: Different types of categories should be well-separated\n", + "- **Meaningful patterns**: The spatial arrangement should reflect semantic relationships" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Extract the learned embedding matrices from the fitted model\n", + "mapping_matrices = fitted_params(mach)[4]" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Creating Embedding Visualization Function\n", + "\n", + "We'll create a helper function to plot the 2D embedding space for each categorical feature.\n", + "Each point represents a category, and its position shows how the model learned to represent it." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Function to create and display scatter plot for categorical embeddings\n", + "function plot_categorical_embeddings(feature_name, feature_categories, embedding_matrix)\n", + " # Create scatter plot for this feature's embeddings\n", + " p = scatter(embedding_matrix[1, :], embedding_matrix[2, :],\n", + " title = \"$(feature_name) Embeddings\",\n", + " xlabel = \"Dimension 1\",\n", + " ylabel = \"Dimension 2\",\n", + " label = \"$(feature_name)\",\n", + " legend = :topright,\n", + " markersize = 8,\n", + " size = (1200, 600))\n", + "\n", + " # Annotate each point with the actual category name\n", + " for (i, col) in enumerate(eachcol(embedding_matrix))\n", + " if i <= length(feature_categories)\n", + " cat_name = string(feature_categories[i])\n", + " # Truncate long category names for readability\n", + " display_name = length(cat_name) > 10 ? cat_name[1:10] * \"...\" : cat_name\n", + " annotate!(p, col[1] + 0.02, col[2] + 0.02, text(display_name, :black, 5))\n", + " end\n", + " end\n", + "\n", + " # Display the plot\n", + " display(p)\n", + " println(\"Displayed embedding plot for: $(feature_name)\")\n", + " return p\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Generating Embedding Plots for Each Categorical Feature\n", + "\n", + "Let's visualize the embedding space for each of our categorical features to understand what patterns the model learned." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create separate plots for each categorical feature's embeddings\n", + "\n", + "# Plot 1: Category embeddings\n", + "if haskey(mapping_matrices, :Category)\n", + " plot_categorical_embeddings(\n", + " :Category,\n", + " category_names[:Category],\n", + " mapping_matrices[:Category],\n", + " )\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Notice that pairs such as social and entertainment, shopping and finance, and comics and art are closer together than others." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Plot 2: Content Rating embeddings\n", + "if haskey(mapping_matrices, Symbol(\"Content Rating\"))\n", + " plot_categorical_embeddings(\n", + " Symbol(\"Content Rating\"),\n", + " category_names[Symbol(\"Content Rating\")],\n", + " mapping_matrices[Symbol(\"Content Rating\")],\n", + " )\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The `Everyone` category is positioned far from all others." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Plot 3: Genres embeddings\n", + "if haskey(mapping_matrices, :Genres)\n", + " plot_categorical_embeddings(:Genres, category_names[:Genres], mapping_matrices[:Genres])\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Here the results may be less interpretable; the idea is that for purposes of indetifying the rating, the model considered categories closer together as more similar." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Plot 4: Android Ver embeddings\n", + "if haskey(mapping_matrices, Symbol(\"Android Ver\"))\n", + " plot_categorical_embeddings(\n", + " Symbol(\"Android Ver\"),\n", + " category_names[Symbol(\"Android Ver\")],\n", + " mapping_matrices[Symbol(\"Android Ver\")],\n", + " )\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Clear patterns like close proximity between (7.1 and up) and, 7.0-7.1" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Plot 5: Type embeddings (if it exists in the mapping)\n", + "if haskey(mapping_matrices, :Type)\n", + " plot_categorical_embeddings(:Type, sort(unique(df.Type)), mapping_matrices[:Type])\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Indeed, `Free` and `Paid` are too dissimilar." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This demonstrates the power of entity embeddings as a modern approach to categorical feature encoding that goes beyond traditional methods like one-hot encoding or label encoding." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.5" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.5", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/tutorials/entity_embeddings/notebook.jl b/docs/src/tutorials/entity_embeddings/notebook.jl new file mode 100644 index 0000000..4e6d778 --- /dev/null +++ b/docs/src/tutorials/entity_embeddings/notebook.jl @@ -0,0 +1,350 @@ +# # Entity Embeddings Tutorial + +# **Julia version** is assumed to be 1.10.* + +# This demonstration is available as a Jupyter notebook or julia script (as well as the dataset) +# [here](https://github.com/FluxML/MLJFlux.jl/tree/dev/docs/src/common_workflows/entity_embeddings). +# +# Entity embedding is a newer deep learning approach for categorical encoding introduced in 2016 by Cheng Guo and Felix Berkhahn. +# It employs a set of embedding layers to map each categorical feature into a dense continuous vector in a similar fashion to how they are employed in NLP architectures. +# +# In MLJFlux, the `EntityEmbedder` provides a high-level interface to learn entity embeddings using any supervised MLJFlux model as the underlying learner. +# The embedder can be used as a transformer in MLJ pipelines to encode categorical features with learned embeddings, which can then be used as features in downstream machine learning models. +# +# In this tutorial, we will explore how to use the `EntityEmbedder` to learn and apply entity embeddings on the Google Play Store dataset. +# +# ## Learning Objectives +# - Understand the concept of entity embeddings for categorical encoding +# - Learn how to use `EntityEmbedder` from MLJFlux +# - Apply entity embeddings to a real-world dataset +# - Visualize the learned embedding spaces +# - Build pipelines combining embeddings with downstream models + +using Pkg; +Pkg.activate(@__DIR__); +Pkg.instantiate(); #src + + + +## Import all required packages +using MLJ +using MLJFlux +using CategoricalArrays +using DataFrames +using Optimisers +using Random +using Tables +using ProgressMeter +using Plots +using ScientificTypes +using CSV +using StatsBase ## For countmap +import Plots: mm ## For margin units + +# ## Data Loading and Preprocessing +# +# We'll use the Google Play Store dataset which contains information about mobile applications. +# This dataset has several categorical features that are perfect for demonstrating entity embeddings: +# - **Category**: App category (e.g., Games, Social, Tools) +# - **Content Rating**: Age rating (e.g., Everyone, Teen, Mature) +# - **Genres**: Primary genre of the app +# - **Android Ver**: Required Android version +# - **Type**: Free or Paid + +## Load the Google Play Store dataset +df = CSV.read("./googleplaystore.csv", DataFrame); + +# ### Data Cleaning and Type Conversion +# +# The raw dataset requires significant cleaning. We'll handle: +# 1. **Reviews**: Convert to integers +# 2. **Size**: Parse size strings like "14M", "512k" to numeric values +# 3. **Installs**: Remove formatting characters and convert to integers +# 4. **Price**: Remove dollar signs and convert to numeric +# 5. **Genres**: Extract primary genre only + +## Custom parsing function that returns missing instead of nothing +safe_parse(T, s) = something(tryparse(T, s), missing); + +## Reviews: ensure integer +df.Reviews = safe_parse.(Int, string.(df.Reviews)); + +## Size: "14M", "512k", or "Varies with device" +function parse_size(s) + if s == "Varies with device" + return missing + elseif occursin('M', s) + return safe_parse(Float64, replace(s, "M" => "")) * 1_000_000 + elseif occursin('k', s) + return safe_parse(Float64, replace(s, "k" => "")) * 1_000 + else + return safe_parse(Float64, s) + end +end +df.Size = parse_size.(string.(df.Size)); + +## Installs: strip '+' and ',' then parse +clean_installs = replace.(string.(df.Installs), r"[+,]" => "") +df.Installs = safe_parse.(Int, clean_installs); + +## Price: strip leading '$' +df.Price = safe_parse.(Float64, replace.(string.(df.Price), r"^\$" => "")); + +## Genres: take only the primary genre +df.Genres = first.(split.(string.(df.Genres), ';')); + +# ### Storing Category Information for Visualization +# +# We'll store the unique values of each categorical feature to use later when visualizing the embeddings. + +## Store unique category names for visualization later +category_names = Dict( + :Category => sort(unique(df.Category)), + Symbol("Content Rating") => sort(unique(df[!, Symbol("Content Rating")])), + :Genres => sort(unique(df.Genres)), + Symbol("Android Ver") => sort(unique(df[!, Symbol("Android Ver")])), +); + +println("Category names extracted:") +for (feature, names) in category_names + println("$feature: $(length(names)) categories") +end +# ### Feature Selection and Missing Value Handling +# +# We'll select the most relevant features and remove any rows with missing values to ensure clean data for our embedding model. + +select!( + df, + [ + :Category, :Reviews, :Size, :Installs, :Type, + :Price, Symbol("Content Rating"), :Genres, Symbol("Android Ver"), :Rating, + ], +); +dropmissing!(df); + +# ### Creating Categorical Target Variable +# +# For this tutorial, we'll convert the continuous rating into a categorical classification problem. +# This will allow us to use a classification model that can learn meaningful embeddings. +# +# We'll create 10 rating categories by rounding to the nearest 0.5 (e.g., 0.0, 0.5, 1.0, ..., 4.5, 5.0). + +## Create 10 classes: 0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5 +function rating_to_categorical(rating) + ## Clamp rating to valid range and round to nearest 0.5 + clamped_rating = clamp(rating, 0.0, 5.0) + rounded_rating = round(clamped_rating * 2) / 2 ## Round to nearest 0.5 + return string(rounded_rating) +end + +## Apply the transformation +df.RatingCategory = categorical([rating_to_categorical(r) for r in df.Rating]); + +## Check the distribution of categorical rating labels +println("Distribution of categorical rating labels:") +println(sort(countmap(df.RatingCategory))) +println("\nUnique rating categories: $(sort(unique(df.RatingCategory)))") + +# ### Type Coercion for MLJ +# +# MLJ requires explicit type coercion to understand which columns are categorical vs continuous. +# This step is crucial for the `EntityEmbedder` to identify which features need embedding layers. + +## Coerce types for MLJ compatibility +df = coerce(df, + :Category => Multiclass, + :Reviews => Continuous, + :Size => Continuous, + :Installs => Continuous, + :Type => Multiclass, + :Price => Continuous, + Symbol("Content Rating") => Multiclass, + :Genres => Multiclass, + Symbol("Android Ver") => Multiclass, + :Rating => Continuous, ## Keep original for reference + :RatingCategory => OrderedFactor, ## New categorical target +); +schema(df) + +# ### Data Splitting +# +# We'll split our data into training and testing sets using stratified sampling to ensure balanced representation of rating categories. + +## Split into features and target +y = df[!, :RatingCategory] ## Use categorical rating as target +X = select(df, Not([:Rating, :RatingCategory])); ## Exclude both rating columns from features + +## Split the data with stratification +(X_train, X_test), (y_train, y_test) = partition( + (X, y), + 0.8, + multi = true, + shuffle = true, + stratify = y, + rng = Random.Xoshiro(41), +); + + +# ## Building the EntityEmbedder Model + +## Load the neural network classifier +NeuralNetworkClassifier = @load NeuralNetworkClassifier pkg = MLJFlux + +# ### Configuring the Base Neural Network +# +# We'll create a neural network classifier with custom embedding dimensions for each categorical feature. +# Setting smaller embedding dimensions (like 2D) makes it easier to visualize the learned representations. + +## Create the underlying supervised model that will learn the embeddings +base_clf = NeuralNetworkClassifier( + builder = MLJFlux.Short(n_hidden = 14), + optimiser = Optimisers.Adam(10e-2), + batch_size = 20, + epochs = 5, + acceleration = CUDALibs(), + embedding_dims = Dict( + :Category => 2, + :Type => 2, + Symbol("Content Rating") => 2, + :Genres => 2, + Symbol("Android Ver") => 2, + ), + rng = 39, +); + +# ### Creating the EntityEmbedder +# +# The `EntityEmbedder` wraps our neural network and can be used as a transformer in MLJ pipelines. +# By default, it uses `min(n_categories - 1, 10)` dimensions for any categorical feature not explicitly specified. + +## Create the EntityEmbedder using the neural network +embedder = EntityEmbedder(base_clf) + +# ## Training the EntityEmbedder +# +# Now we'll train the embedder on our training data. The model learns to predict app ratings while simultaneously learning meaningful embeddings for categorical features. + +## Create and train the machine +mach = machine(embedder, X_train, y_train) +MLJ.fit!(mach, force = true, verbosity = 1); + +# ### Transforming Data with Learned Embeddings +# +# After training, we can use the embedder as a transformer to convert categorical features into their learned embedding representations. + +## Transform the data using the learned embeddings +X_train_embedded = MLJ.transform(mach, X_train) +X_test_embedded = MLJ.transform(mach, X_test); + +## Check the schema transformation +println("Original schema:") +schema(X_train) +println("\nEmbedded schema:") +schema(X_train_embedded) +X_train_embedded; #hide + +# ## Using Embeddings in ML Pipelines +# +# One of the key advantages of entity embeddings is that they can be used as features in any downstream machine learning model. +# Let's create a pipeline that combines our `EntityEmbedder` with a k-nearest neighbors classifier. + +## Load KNN classifier +KNNClassifier = @load KNNClassifier pkg = NearestNeighborModels + +## Create a pipeline: EntityEmbedder -> KNNClassifier +pipe = embedder |> KNNClassifier(K = 5); + +## Train the pipeline +pipe_mach = machine(pipe, X_train, y_train) +MLJ.fit!(pipe_mach, verbosity = 0) + +# ## Visualizing the Learned Embedding Spaces +# +# One of the most powerful aspects of entity embeddings is their interpretability. Since we used 2D embeddings, we can visualize how the model has organized different categories in the embedding space. + +## Extract the learned embedding matrices from the fitted model +mapping_matrices = fitted_params(mach)[4] + +# ### Creating Embedding Visualization Function +# +# We'll create a helper function to plot the 2D embedding space for each categorical feature. +# Each point represents a category, and its position shows how the model learned to represent it. + +## Function to create and display scatter plot for categorical embeddings +function plot_categorical_embeddings(feature_name, feature_categories, embedding_matrix) + ## Convert feature_name to string to handle both Symbol and String inputs + feature_name_str = string(feature_name) + + ## Create scatter plot for this feature's embeddings + p = scatter(embedding_matrix[1, :], embedding_matrix[2, :], + title = "$(feature_name_str) Embeddings", + xlabel = "Dimension 1", + ylabel = "Dimension 2", + label = "$(feature_name_str)", + legend = :topright, + markersize = 8, + size = (1200, 600)) + + ## Annotate each point with the actual category name + for (i, col) in enumerate(eachcol(embedding_matrix)) + if i <= length(feature_categories) + cat_name = string(feature_categories[i]) + ## Truncate long category names for readability + display_name = length(cat_name) > 10 ? cat_name[1:10] * "..." : cat_name + annotate!(p, col[1] + 0.02, col[2] + 0.02, text(display_name, :black, 5)) + end + end + + ## Save the plot + savefig(p, "embedding_$(lowercase(replace(feature_name_str, " " => "_"))).png") #hide + + ## Display the plot + display(p) #hide + println("Displayed embedding plot for: $(feature_name_str)") #hide + return p +end; + +# ### Generating Embedding Plots for Each Categorical Feature +# +# Let's visualize the embedding space for each of our categorical features to understand what patterns the model learned. + +## Create separate plots for each categorical feature's embeddings + +## Plot 1: Category embeddings +plot_categorical_embeddings( + :Category, + category_names[:Category], + mapping_matrices[:Category], +); +#md # ![Category Embeddings](embedding_category.png) +# Notice that pairs such as social and entertainment, shopping and finance, and comics and art are closer together than others. + +## Plot 2: Content Rating embeddings +plot_categorical_embeddings( + Symbol("Content Rating"), + category_names[Symbol("Content Rating")], + mapping_matrices[Symbol("Content Rating")], +); +#md # ![Content Rating Embeddings](embedding_content_rating.png) +# The `Everyone` category is positioned far from all others. + +## Plot 3: Genres embeddings +plot_categorical_embeddings(:Genres, category_names[:Genres], mapping_matrices[:Genres]); +#md # ![Genres Embeddings](embedding_genres.png) +# Here the results may be less interpretable; the idea is that for purposes of indetifying the rating, the model considered categories closer together as more similar. + +## Plot 4: Android Ver embeddings +plot_categorical_embeddings( + Symbol("Android Ver"), + category_names[Symbol("Android Ver")], + mapping_matrices[Symbol("Android Ver")], +); +#md # ![Android Ver Embeddings](embedding_android_ver.png) +# Clear patterns like close proximity between (7.1 and up) and, 7.0-7.1 + +## Plot 5: Type embeddings (if it exists in the mapping) +plot_categorical_embeddings(:Type, sort(unique(df.Type)), mapping_matrices[:Type]); +#md # ![Type Embeddings](embedding_type.png) +# Indeed, `Free` and `Paid` are too dissimilar. + +# This demonstrates the power of entity embeddings as a modern approach to categorical feature encoding that goes beyond traditional methods like one-hot encoding or label encoding. diff --git a/docs/src/tutorials/entity_embeddings/notebook.md b/docs/src/tutorials/entity_embeddings/notebook.md new file mode 100644 index 0000000..e2bb96f --- /dev/null +++ b/docs/src/tutorials/entity_embeddings/notebook.md @@ -0,0 +1,540 @@ +```@meta +EditURL = "notebook.jl" +``` + +# Entity Embeddings Tutorial + +**Julia version** is assumed to be 1.10.* + +This demonstration is available as a Jupyter notebook or julia script (as well as the dataset) +[here](https://github.com/FluxML/MLJFlux.jl/tree/dev/docs/src/common_workflows/entity_embeddings). + +Entity embedding is a newer deep learning approach for categorical encoding introduced in 2016 by Cheng Guo and Felix Berkhahn. +It employs a set of embedding layers to map each categorical feature into a dense continuous vector in a similar fashion to how they are employed in NLP architectures. + +In MLJFlux, the `EntityEmbedder` provides a high-level interface to learn entity embeddings using any supervised MLJFlux model as the underlying learner. +The embedder can be used as a transformer in MLJ pipelines to encode categorical features with learned embeddings, which can then be used as features in downstream machine learning models. + +In this tutorial, we will explore how to use the `EntityEmbedder` to learn and apply entity embeddings on the Google Play Store dataset. + +## Learning Objectives +- Understand the concept of entity embeddings for categorical encoding +- Learn how to use `EntityEmbedder` from MLJFlux +- Apply entity embeddings to a real-world dataset +- Visualize the learned embedding spaces +- Build pipelines combining embeddings with downstream models + +````julia +using Pkg; +Pkg.activate(@__DIR__); + + + +# Import all required packages +using MLJ +using MLJFlux +using CategoricalArrays +using DataFrames +using Optimisers +using Random +using Tables +using ProgressMeter +using Plots +using ScientificTypes +using CSV +using StatsBase ## For countmap +import Plots: mm ## For margin units +```` + +```` + Activating project at `~/Documents/GitHub/MLJTransforms/docs/src/tutorials/entity_embeddings` + +```` + +## Data Loading and Preprocessing + +We'll use the Google Play Store dataset which contains information about mobile applications. +This dataset has several categorical features that are perfect for demonstrating entity embeddings: +- **Category**: App category (e.g., Games, Social, Tools) +- **Content Rating**: Age rating (e.g., Everyone, Teen, Mature) +- **Genres**: Primary genre of the app +- **Android Ver**: Required Android version +- **Type**: Free or Paid + +````julia +# Load the Google Play Store dataset +df = CSV.read("./googleplaystore.csv", DataFrame); +```` + +```` +β”Œ Warning: thread = 1 warning: only found 12 / 13 columns around data row: 10473. Filling remaining columns with `missing` +β”” @ CSV ~/.julia/packages/CSV/XLcqT/src/file.jl:592 +β”Œ Warning: thread = 1 warning: only found 12 / 13 columns around data row: 10473. Filling remaining columns with `missing` +β”” @ CSV ~/.julia/packages/CSV/XLcqT/src/file.jl:592 + +```` + +### Data Cleaning and Type Conversion + +The raw dataset requires significant cleaning. We'll handle: +1. **Reviews**: Convert to integers +2. **Size**: Parse size strings like "14M", "512k" to numeric values +3. **Installs**: Remove formatting characters and convert to integers +4. **Price**: Remove dollar signs and convert to numeric +5. **Genres**: Extract primary genre only + +````julia +# Custom parsing function that returns missing instead of nothing +safe_parse(T, s) = something(tryparse(T, s), missing); + +# Reviews: ensure integer +df.Reviews = safe_parse.(Int, string.(df.Reviews)); + +# Size: "14M", "512k", or "Varies with device" +function parse_size(s) + if s == "Varies with device" + return missing + elseif occursin('M', s) + return safe_parse(Float64, replace(s, "M" => "")) * 1_000_000 + elseif occursin('k', s) + return safe_parse(Float64, replace(s, "k" => "")) * 1_000 + else + return safe_parse(Float64, s) + end +end +df.Size = parse_size.(string.(df.Size)); + +# Installs: strip '+' and ',' then parse +clean_installs = replace.(string.(df.Installs), r"[+,]" => "") +df.Installs = safe_parse.(Int, clean_installs); + +# Price: strip leading '$' +df.Price = safe_parse.(Float64, replace.(string.(df.Price), r"^\$" => "")); + +# Genres: take only the primary genre +df.Genres = first.(split.(string.(df.Genres), ';')); +```` + +### Storing Category Information for Visualization + +We'll store the unique values of each categorical feature to use later when visualizing the embeddings. + +````julia +# Store unique category names for visualization later +category_names = Dict( + :Category => sort(unique(df.Category)), + Symbol("Content Rating") => sort(unique(df[!, Symbol("Content Rating")])), + :Genres => sort(unique(df.Genres)), + Symbol("Android Ver") => sort(unique(df[!, Symbol("Android Ver")])), +); + +println("Category names extracted:") +for (feature, names) in category_names + println("$feature: $(length(names)) categories") +end +```` + +```` +Category names extracted: +Category: 34 categories +Content Rating: 7 categories +Android Ver: 35 categories +Genres: 49 categories + +```` + +### Feature Selection and Missing Value Handling + +We'll select the most relevant features and remove any rows with missing values to ensure clean data for our embedding model. + +````julia +select!( + df, + [ + :Category, :Reviews, :Size, :Installs, :Type, + :Price, Symbol("Content Rating"), :Genres, Symbol("Android Ver"), :Rating, + ], +); +dropmissing!(df); +```` + +### Creating Categorical Target Variable + +For this tutorial, we'll convert the continuous rating into a categorical classification problem. +This will allow us to use a classification model that can learn meaningful embeddings. + +We'll create 10 rating categories by rounding to the nearest 0.5 (e.g., 0.0, 0.5, 1.0, ..., 4.5, 5.0). + +````julia +# Create 10 classes: 0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5 +function rating_to_categorical(rating) + # Clamp rating to valid range and round to nearest 0.5 + clamped_rating = clamp(rating, 0.0, 5.0) + rounded_rating = round(clamped_rating * 2) / 2 ## Round to nearest 0.5 + return string(rounded_rating) +end + +# Apply the transformation +df.RatingCategory = categorical([rating_to_categorical(r) for r in df.Rating]); + +# Check the distribution of categorical rating labels +println("Distribution of categorical rating labels:") +println(sort(countmap(df.RatingCategory))) +println("\nUnique rating categories: $(sort(unique(df.RatingCategory)))") +```` + +```` +Distribution of categorical rating labels: +OrderedCollections.OrderedDict{CategoricalValue{String, UInt32}, Int64}("1.0" => 17, "1.5" => 18, "2.0" => 53, "2.5" => 105, "3.0" => 281, "3.5" => 722, "4.0" => 2420, "4.5" => 3542, "5.0" => 571, "NaN" => 1416) + +Unique rating categories: ["1.0", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0", "NaN"] + +```` + +### Type Coercion for MLJ + +MLJ requires explicit type coercion to understand which columns are categorical vs continuous. +This step is crucial for the `EntityEmbedder` to identify which features need embedding layers. + +````julia +# Coerce types for MLJ compatibility +df = coerce(df, + :Category => Multiclass, + :Reviews => Continuous, + :Size => Continuous, + :Installs => Continuous, + :Type => Multiclass, + :Price => Continuous, + Symbol("Content Rating") => Multiclass, + :Genres => Multiclass, + Symbol("Android Ver") => Multiclass, + :Rating => Continuous, ## Keep original for reference + :RatingCategory => OrderedFactor, ## New categorical target +); +schema(df) +```` + +```` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ names β”‚ scitypes β”‚ types β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ Category β”‚ Multiclass{33} β”‚ CategoricalValue{String31, UInt32} β”‚ +β”‚ Reviews β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Size β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Installs β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Type β”‚ Multiclass{2} β”‚ CategoricalValue{String7, UInt32} β”‚ +β”‚ Price β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Content Rating β”‚ Multiclass{6} β”‚ CategoricalValue{String15, UInt32} β”‚ +β”‚ Genres β”‚ Multiclass{48} β”‚ CategoricalValue{String, UInt32} β”‚ +β”‚ Android Ver β”‚ Multiclass{34} β”‚ CategoricalValue{String31, UInt32} β”‚ +β”‚ Rating β”‚ Continuous β”‚ Float64 β”‚ +β”‚ RatingCategory β”‚ OrderedFactor{10} β”‚ CategoricalValue{String, UInt32} β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +```` + +### Data Splitting + +We'll split our data into training and testing sets using stratified sampling to ensure balanced representation of rating categories. + +````julia +# Split into features and target +y = df[!, :RatingCategory] ## Use categorical rating as target +X = select(df, Not([:Rating, :RatingCategory])); ## Exclude both rating columns from features + +# Split the data with stratification +(X_train, X_test), (y_train, y_test) = partition( + (X, y), + 0.8, + multi = true, + shuffle = true, + stratify = y, + rng = Random.Xoshiro(41), +); +```` + +## Building the EntityEmbedder Model + +````julia +# Load the neural network classifier +NeuralNetworkClassifier = @load NeuralNetworkClassifier pkg = MLJFlux +```` + +```` +MLJFlux.NeuralNetworkClassifier +```` + +### Configuring the Base Neural Network + +We'll create a neural network classifier with custom embedding dimensions for each categorical feature. +Setting smaller embedding dimensions (like 2D) makes it easier to visualize the learned representations. + +````julia +# Create the underlying supervised model that will learn the embeddings +base_clf = NeuralNetworkClassifier( + builder = MLJFlux.Short(n_hidden = 14), + optimiser = Optimisers.Adam(10e-2), + batch_size = 20, + epochs = 5, + acceleration = CUDALibs(), + embedding_dims = Dict( + :Category => 2, + :Type => 2, + Symbol("Content Rating") => 2, + :Genres => 2, + Symbol("Android Ver") => 2, + ), + rng = 39, +); +```` + +```` +β”Œ Info: The CUDA functionality is being called but +β”‚ `CUDA.jl` must be loaded to access it. +β”” Add `using CUDA` or `import CUDA` to your code. Alternatively, configure a different GPU backend by calling `Flux.gpu_backend!`. +β”Œ Warning: `acceleration isa CUDALibs` but no CUDA device (GPU) currently live. Specifying an RNG seed when `acceleration isa CUDALibs()` may fail for layers depending on an RNG during training, such as `Dropout`. Consider using `Random.default_rng()` instead. ` +β”” @ MLJFlux ~/.julia/packages/MLJFlux/5eWpt/src/types.jl:62 + +```` + +### Creating the EntityEmbedder + +The `EntityEmbedder` wraps our neural network and can be used as a transformer in MLJ pipelines. +By default, it uses `min(n_categories - 1, 10)` dimensions for any categorical feature not explicitly specified. + +````julia +# Create the EntityEmbedder using the neural network +embedder = EntityEmbedder(base_clf) +```` + +```` +EntityEmbedder( + model = NeuralNetworkClassifier( + builder = Short(n_hidden = 14, …), + finaliser = NNlib.softmax, + optimiser = Adam(0.1, (0.9, 0.999), 1.0e-8), + loss = Flux.Losses.crossentropy, + epochs = 5, + batch_size = 20, + lambda = 0.0, + alpha = 0.0, + rng = 39, + optimiser_changes_trigger_retraining = false, + acceleration = CUDALibs{Nothing}(nothing), + embedding_dims = Dict{Symbol, Real}(:Category => 2, Symbol("Content Rating") => 2, Symbol("Android Ver") => 2, :Genres => 2, :Type => 2))) +```` + +## Training the EntityEmbedder + +Now we'll train the embedder on our training data. The model learns to predict app ratings while simultaneously learning meaningful embeddings for categorical features. + +````julia +# Create and train the machine +mach = machine(embedder, X_train, y_train) +MLJ.fit!(mach, force = true, verbosity = 1); +```` + +```` +[ Info: Training machine(EntityEmbedder(model = NeuralNetworkClassifier(builder = Short(n_hidden = 14, …), …)), …). +β”Œ Info: The CUDA functionality is being called but +β”‚ `CUDA.jl` must be loaded to access it. +β”” Add `using CUDA` or `import CUDA` to your code. Alternatively, configure a different GPU backend by calling `Flux.gpu_backend!`. +[ Info: MLJFlux: converting input data to Float32 + Optimising neural net: 33%[========> ] ETA: 0:00:00 Optimising neural net: 50%[============> ] ETA: 0:00:00 Optimising neural net: 67%[================> ] ETA: 0:00:00 Optimising neural net: 83%[====================> ] ETA: 0:00:00 Optimising neural net: 100%[=========================] Time: 0:00:00 + +```` + +### Transforming Data with Learned Embeddings + +After training, we can use the embedder as a transformer to convert categorical features into their learned embedding representations. + +````julia +# Transform the data using the learned embeddings +X_train_embedded = MLJ.transform(mach, X_train) +X_test_embedded = MLJ.transform(mach, X_test); + +# Check the schema transformation +println("Original schema:") +schema(X_train) +println("\nEmbedded schema:") +schema(X_train_embedded) +```` + +```` +Original schema: + +Embedded schema: + +```` + +## Using Embeddings in ML Pipelines + +One of the key advantages of entity embeddings is that they can be used as features in any downstream machine learning model. +Let's create a pipeline that combines our `EntityEmbedder` with a k-nearest neighbors classifier. + +````julia +# Load KNN classifier +KNNClassifier = @load KNNClassifier pkg = NearestNeighborModels + +# Create a pipeline: EntityEmbedder -> KNNClassifier +pipe = embedder |> KNNClassifier(K = 5); + +# Train the pipeline +pipe_mach = machine(pipe, X_train, y_train) +MLJ.fit!(pipe_mach, verbosity = 0) +```` + +```` +trained Machine; does not cache data + model: ProbabilisticPipeline(entity_embedder = EntityEmbedder(model = NeuralNetworkClassifier(builder = Short(n_hidden = 14, …), …)), …) + args: + 1: Source @927 ⏎ Table{Union{AbstractVector{Continuous}, AbstractVector{Multiclass{33}}, AbstractVector{Multiclass{2}}, AbstractVector{Multiclass{6}}, AbstractVector{Multiclass{48}}, AbstractVector{Multiclass{34}}}} + 2: Source @044 ⏎ AbstractVector{OrderedFactor{10}} + +```` + +## Visualizing the Learned Embedding Spaces + +One of the most powerful aspects of entity embeddings is their interpretability. Since we used 2D embeddings, we can visualize how the model has organized different categories in the embedding space. + +````julia +# Extract the learned embedding matrices from the fitted model +mapping_matrices = fitted_params(mach)[4] +```` + +```` +Dict{Symbol, Matrix{Float32}} with 5 entries: + :Category => [-0.334237 -0.0392749 0.104473 0.256099 -0.0655005 -0.141202 -0.0970246 0.179792 -0.270771 -0.214171 -0.12692 0.41105 0.256761 -0.0494666 -0.111133 0.285277 -0.331778 0.328676 -0.342993 -0.129262 -0.230373 -0.038213 0.108276 -0.153902 -0.324451 -0.237727 0.0345672 -0.0572035 -0.0585397 -0.288544 -0.242574 0.257894 0.00108838; 0.165236 -0.296432 -0.404019 -0.294493 0.185582 0.309341 -0.264846 -0.0410865 0.262034 0.384784 -0.0927044 0.0317509 0.232903 -0.406631 0.288323 0.0836039 0.334631 0.293926 0.290643 -0.334773 -0.306882 -0.00893126 0.185925 -0.309297 0.237027 0.0541817 0.39381 -0.400486 -0.123453 -0.163497 -0.00332076 0.0662401 0.160035] + Symbol("Content Rating") => [0.133581 -0.728943 0.0488496 -0.17392 0.32843 0.563167; 0.525009 -0.258198 0.859755 -0.263517 -0.040722 0.33474] + Symbol("Android Ver") => [0.170607 0.141154 -0.39162 0.403547 0.196919 -0.384571 -0.148519 -0.130053 0.170175 0.0752836 0.0634965 0.188923 0.179924 -0.346638 0.213056 0.104962 -0.0845368 -0.154221 -0.121818 -0.303438 0.275882 -0.201961 0.0978208 0.212295 -0.00877398 -0.296715 -0.0364835 -0.285863 -0.249095 0.00626427 -0.262972 0.152306 -0.131261 0.177531; -0.100683 -0.194721 0.364714 -0.199976 0.0840546 0.196454 -0.288194 0.215619 -0.282248 -0.0873126 -0.351141 0.0446604 0.37886 -0.151878 0.173701 -0.285421 -0.288342 0.270182 -0.181768 0.0513307 -0.0748576 0.303714 -0.230258 -0.123035 0.147936 0.169242 0.172273 -0.048809 -0.19322 0.239702 -0.130154 -0.407279 0.158713 0.322129] + :Genres => [-0.146774 -0.310947 0.163455 0.186525 0.209192 -0.0957032 -0.309449 0.0804618 -0.289171 -0.105948 0.18964 -0.0232951 -0.303402 0.104239 0.213892 -0.0944015 -0.0128954 0.25166 -0.14625 0.340541 0.278481 0.118645 0.049088 -0.269987 -0.336882 -0.0115204 -0.121047 -0.269735 0.233099 -0.159103 -0.0351166 -0.102524 0.0211413 -0.0635436 -0.309698 -0.150375 -0.294988 0.243549 -0.121398 -0.257364 0.309162 0.260066 -0.32487 0.0512156 -0.113218 -0.128149 -0.285641 0.32328; -0.0240456 -0.0927238 -0.320587 -0.337704 0.265411 -0.102303 0.254456 0.288764 0.0950742 0.343972 -0.0132413 0.106584 0.0865783 -0.0157523 -0.121958 0.205434 -0.0508129 0.200128 -0.330792 0.337839 0.226497 0.131038 0.0368269 -0.243523 -0.259971 -0.144437 0.282105 0.223037 -0.0473506 0.131549 -0.22308 0.0791805 -0.17695 0.0639658 -0.344229 -0.274745 0.238469 0.0954359 0.340802 -0.0461901 -0.242701 0.016714 -0.0969492 0.142659 -0.0661325 0.165366 0.0977414 0.255571] + :Type => [-1.02336 1.02435; -0.887775 0.944183] +```` + +### Creating Embedding Visualization Function + +We'll create a helper function to plot the 2D embedding space for each categorical feature. +Each point represents a category, and its position shows how the model learned to represent it. + +````julia +# Function to create and display scatter plot for categorical embeddings +function plot_categorical_embeddings(feature_name, feature_categories, embedding_matrix) + # Convert feature_name to string to handle both Symbol and String inputs + feature_name_str = string(feature_name) + + # Create scatter plot for this feature's embeddings + p = scatter(embedding_matrix[1, :], embedding_matrix[2, :], + title = "$(feature_name_str) Embeddings", + xlabel = "Dimension 1", + ylabel = "Dimension 2", + label = "$(feature_name_str)", + legend = :topright, + markersize = 8, + size = (1200, 600)) + + # Annotate each point with the actual category name + for (i, col) in enumerate(eachcol(embedding_matrix)) + if i <= length(feature_categories) + cat_name = string(feature_categories[i]) + # Truncate long category names for readability + display_name = length(cat_name) > 10 ? cat_name[1:10] * "..." : cat_name + annotate!(p, col[1] + 0.02, col[2] + 0.02, text(display_name, :black, 5)) + end + end + + # Save the plot + + # Display the plot + return p +end; +```` + +### Generating Embedding Plots for Each Categorical Feature + +Let's visualize the embedding space for each of our categorical features to understand what patterns the model learned. + +````julia +# Create separate plots for each categorical feature's embeddings + +# Plot 1: Category embeddings +plot_categorical_embeddings( + :Category, + category_names[:Category], + mapping_matrices[:Category], +); +```` + +```` +Displayed embedding plot for: Category + +```` + +![Category Embeddings](embedding_category.png) +Notice that pairs such as social and entertainment, shopping and finance, and comics and art are closer together than others. + +````julia +# Plot 2: Content Rating embeddings +plot_categorical_embeddings( + Symbol("Content Rating"), + category_names[Symbol("Content Rating")], + mapping_matrices[Symbol("Content Rating")], +); +```` + +```` +Displayed embedding plot for: Content Rating + +```` + +![Content Rating Embeddings](embedding_content_rating.png) +The `Everyone` category is positioned far from all others. + +````julia +# Plot 3: Genres embeddings +plot_categorical_embeddings(:Genres, category_names[:Genres], mapping_matrices[:Genres]); +```` + +```` +Displayed embedding plot for: Genres + +```` + +![Genres Embeddings](embedding_genres.png) +Here the results may be less interpretable; the idea is that for purposes of indetifying the rating, the model considered categories closer together as more similar. + +````julia +# Plot 4: Android Ver embeddings +plot_categorical_embeddings( + Symbol("Android Ver"), + category_names[Symbol("Android Ver")], + mapping_matrices[Symbol("Android Ver")], +); +```` + +```` +Displayed embedding plot for: Android Ver + +```` + +![Android Ver Embeddings](embedding_android_ver.png) +Clear patterns like close proximity between (7.1 and up) and, 7.0-7.1 + +````julia +# Plot 5: Type embeddings (if it exists in the mapping) +plot_categorical_embeddings(:Type, sort(unique(df.Type)), mapping_matrices[:Type]); +```` + +```` +Displayed embedding plot for: Type + +```` + +![Type Embeddings](embedding_type.png) +Indeed, `Free` and `Paid` are too dissimilar. + +This demonstrates the power of entity embeddings as a modern approach to categorical feature encoding that goes beyond traditional methods like one-hot encoding or label encoding. + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/tutorials/entity_embeddings/notebook.unexecuted.ipynb b/docs/src/tutorials/entity_embeddings/notebook.unexecuted.ipynb new file mode 100644 index 0000000..38fb30c --- /dev/null +++ b/docs/src/tutorials/entity_embeddings/notebook.unexecuted.ipynb @@ -0,0 +1,701 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Entity Embeddi# ## Package Setup and Environment" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Pkg\n", + "Pkg.activate(@__DIR__);\n", + "Pkg.instantiate();" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "**Julia version** is assumed to be 1.10.*\n", + "\n", + "## Required Packages\n", + "\n", + "We'll need several packages for this tutorial:\n", + "- **MLJ ecosystem**: Core machine learning framework and MLJFlux for neural networks\n", + "- **Flux**: Deep learning framework for building the embedding models\n", + "- **Data handling**: CSV, DataFrames, CategoricalArrays for data manipulation\n", + "- **Visualization**: Plots for visualizing the learned embeddings\n", + "- **Utilities**: Random, Tables, ProgressMeter, StatsBase for various helper functionsedder\n", + "\n", + "This demonstration is available as a Jupyter notebook or julia script\n", + "[here](https://github.com/FluxML/MLJFlux.jl/tree/dev/docs/src/common_workflows/entity_embeddings).\n", + "\n", + "Entity embedding is a newer deep learning approach for categorical encoding introduced in 2016 by Cheng Guo and Felix Berkhahn.\n", + "It employs a set of embedding layers to map each categorical feature into a dense continuous vector in a similar fashion to how they are employed in NLP architectures.\n", + "\n", + "In MLJFlux, the `EntityEmbedder` provides a high-level interface to learn entity embeddings using any supervised MLJFlux model as the underlying learner.\n", + "The embedder can be used as a transformer in MLJ pipelines to encode categorical features with learned embeddings, which can then be used as features in downstream machine learning models.\n", + "\n", + "In this tutorial, we will explore how to use the `EntityEmbedder` to learn and apply entity embeddings on the Google Play Store dataset.\n", + "\n", + "## Learning Objectives\n", + "- Understand the concept of entity embeddings for categorical encoding\n", + "- Learn how to use `EntityEmbedder` from MLJFlux\n", + "- Apply entity embeddings to a real-world dataset\n", + "- Visualize the learned embedding spaces\n", + "- Build pipelines combining embeddings with downstream models" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Pkg\n", + "Pkg.activate(@__DIR__);\n", + "Pkg.instantiate();\n", + "\n", + "\n", + "\n", + "# Import all required packages\n", + "using MLJ\n", + "using Flux\n", + "using Optimisers\n", + "using CategoricalArrays\n", + "using DataFrames\n", + "using Random\n", + "using Tables\n", + "using ProgressMeter\n", + "using Plots\n", + "using ScientificTypes\n", + "using CSV\n", + "using StatsBase ## For countmap\n", + "import Plots: mm ## For margin units" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Data Loading and Preprocessing\n", + "\n", + "We'll use the Google Play Store dataset which contains information about mobile applications.\n", + "This dataset has several categorical features that are perfect for demonstrating entity embeddings:\n", + "- **Category**: App category (e.g., Games, Social, Tools)\n", + "- **Content Rating**: Age rating (e.g., Everyone, Teen, Mature)\n", + "- **Genres**: Primary genre of the app\n", + "- **Android Ver**: Required Android version\n", + "- **Type**: Free or Paid" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load the Google Play Store dataset\n", + "df = CSV.read(\"./googleplaystore.csv\", DataFrame)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Data Cleaning and Type Conversion\n", + "\n", + "The raw dataset requires significant cleaning. We'll handle:\n", + "1. **Reviews**: Convert to integers\n", + "2. **Size**: Parse size strings like \"14M\", \"512k\" to numeric values\n", + "3. **Installs**: Remove formatting characters and convert to integers\n", + "4. **Price**: Remove dollar signs and convert to numeric\n", + "5. **Genres**: Extract primary genre only" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Custom parsing function that returns missing instead of nothing\n", + "safe_parse(T, s) = something(tryparse(T, s), missing)\n", + "\n", + "# Reviews: ensure integer\n", + "df.Reviews = safe_parse.(Int, string.(df.Reviews))\n", + "\n", + "# Size: \"14M\", \"512k\", or \"Varies with device\"\n", + "function parse_size(s)\n", + " if s == \"Varies with device\"\n", + " return missing\n", + " elseif occursin('M', s)\n", + " return safe_parse(Float64, replace(s, \"M\" => \"\")) * 1_000_000\n", + " elseif occursin('k', s)\n", + " return safe_parse(Float64, replace(s, \"k\" => \"\")) * 1_000\n", + " else\n", + " return safe_parse(Float64, s)\n", + " end\n", + "end\n", + "df.Size = parse_size.(string.(df.Size))\n", + "\n", + "# Installs: strip '+' and ',' then parse\n", + "clean_installs = replace.(string.(df.Installs), r\"[+,]\" => \"\")\n", + "df.Installs = safe_parse.(Int, clean_installs)\n", + "\n", + "# Price: strip leading '$'\n", + "df.Price = safe_parse.(Float64, replace.(string.(df.Price), r\"^\\$\" => \"\"))\n", + "\n", + "# Genres: take only the primary genre\n", + "df.Genres = first.(split.(string.(df.Genres), ';'))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Storing Category Information for Visualization\n", + "\n", + "We'll store the unique values of each categorical feature to use later when visualizing the embeddings." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Store unique category names for visualization later\n", + "category_names = Dict(\n", + " :Category => sort(unique(df.Category)),\n", + " Symbol(\"Content Rating\") => sort(unique(df[!, Symbol(\"Content Rating\")])),\n", + " :Genres => sort(unique(df.Genres)),\n", + " Symbol(\"Android Ver\") => sort(unique(df[!, Symbol(\"Android Ver\")])),\n", + ")\n", + "\n", + "println(\"Category names extracted:\")\n", + "for (feature, names) in category_names\n", + " println(\"$feature: $(length(names)) categories\")\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Feature Selection and Missing Value Handling\n", + "\n", + "We'll select the most relevant features and remove any rows with missing values to ensure clean data for our embedding model." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "select!(\n", + " df,\n", + " [\n", + " :Category, :Reviews, :Size, :Installs, :Type,\n", + " :Price, Symbol(\"Content Rating\"), :Genres, Symbol(\"Android Ver\"), :Rating,\n", + " ],\n", + ")\n", + "dropmissing!(df)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Creating Categorical Target Variable\n", + "\n", + "For this tutorial, we'll convert the continuous rating into a categorical classification problem.\n", + "This will allow us to use a classification model that can learn meaningful embeddings.\n", + "\n", + "We'll create 10 rating categories by rounding to the nearest 0.5 (e.g., 0.0, 0.5, 1.0, ..., 4.5, 5.0)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create 10 classes: 0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5\n", + "function rating_to_categorical(rating)\n", + " # Clamp rating to valid range and round to nearest 0.5\n", + " clamped_rating = clamp(rating, 0.0, 5.0)\n", + " rounded_rating = round(clamped_rating * 2) / 2 ## Round to nearest 0.5\n", + " return string(rounded_rating)\n", + "end\n", + "\n", + "# Apply the transformation\n", + "df.RatingCategory = categorical([rating_to_categorical(r) for r in df.Rating])\n", + "\n", + "# Check the distribution of categorical rating labels\n", + "println(\"Distribution of categorical rating labels:\")\n", + "println(sort(countmap(df.RatingCategory)))\n", + "println(\"\\nUnique rating categories: $(sort(unique(df.RatingCategory)))\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Type Coercion for MLJ\n", + "\n", + "MLJ requires explicit type coercion to understand which columns are categorical vs continuous.\n", + "This step is crucial for the `EntityEmbedder` to identify which features need embedding layers." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Coerce types for MLJ compatibility\n", + "df = coerce(df,\n", + " :Category => Multiclass,\n", + " :Reviews => Continuous,\n", + " :Size => Continuous,\n", + " :Installs => Continuous,\n", + " :Type => Multiclass,\n", + " :Price => Continuous,\n", + " Symbol(\"Content Rating\") => Multiclass,\n", + " :Genres => Multiclass,\n", + " Symbol(\"Android Ver\") => Multiclass,\n", + " :Rating => Continuous, ## Keep original for reference\n", + " :RatingCategory => Multiclass, ## New categorical target\n", + ")\n", + "schema(df)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Data Splitting\n", + "\n", + "We'll split our data into training and testing sets using stratified sampling to ensure balanced representation of rating categories." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Split into features and target\n", + "y = df[!, :RatingCategory] ## Use categorical rating as target\n", + "X = select(df, Not([:Rating, :RatingCategory])) ## Exclude both rating columns from features\n", + "\n", + "# Split the data with stratification\n", + "(X_train, X_test), (y_train, y_test) = partition(\n", + " (X, y),\n", + " 0.8,\n", + " multi = true,\n", + " shuffle = true,\n", + " stratify = y,\n", + " rng = Random.Xoshiro(41),\n", + ");\n", + "\n", + "using MLJFlux" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Building the EntityEmbedder Model\n", + "\n", + "The `EntityEmbedder` works by wrapping a supervised learning model that will learn embeddings as part of its training process.\n", + "\n", + "### Key Components:\n", + "1. **Base Model**: A neural network classifier that learns to predict our target\n", + "2. **Embedding Dimensions**: We specify how many dimensions each categorical feature should be embedded into\n", + "3. **Architecture**: The embeddings are learned jointly with the prediction task\n", + "\n", + "### Why Entity Embeddings Work:\n", + "- Similar categories get mapped to similar vectors in the embedding space\n", + "- The embedding captures semantic relationships between categories\n", + "- Dimensionality reduction helps with the curse of dimensionality\n", + "- Learned representations often generalize better than one-hot encoding" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load the neural network classifier\n", + "NeuralNetworkClassifier = @load NeuralNetworkClassifier pkg = MLJFlux" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Configuring the Base Neural Network\n", + "\n", + "We'll create a neural network classifier with custom embedding dimensions for each categorical feature.\n", + "Setting smaller embedding dimensions (like 2D) makes it easier to visualize the learned representations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create the underlying supervised model that will learn the embeddings\n", + "base_clf = NeuralNetworkClassifier(\n", + " builder = MLJFlux.Short(n_hidden = 14),\n", + " optimiser = Optimisers.Adam(10e-2),\n", + " batch_size = 20,\n", + " epochs = 5,\n", + " acceleration = CUDALibs(),\n", + " embedding_dims = Dict(\n", + " :Category => 2,\n", + " :Type => 2,\n", + " Symbol(\"Content Rating\") => 2,\n", + " :Genres => 2,\n", + " Symbol(\"Android Ver\") => 2,\n", + " ),\n", + " rng = 39,\n", + ")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Creating the EntityEmbedder\n", + "\n", + "The `EntityEmbedder` wraps our neural network and can be used as a transformer in MLJ pipelines.\n", + "By default, it uses `min(n_categories - 1, 10)` dimensions for any categorical feature not explicitly specified." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create the EntityEmbedder using the neural network\n", + "embedder = EntityEmbedder(base_clf)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Training the EntityEmbedder\n", + "\n", + "Now we'll train the embedder on our training data. The model learns to predict app ratings while simultaneously learning meaningful embeddings for categorical features.\n", + "\n", + "### What Happens During Training:\n", + "1. Each categorical value gets mapped to a learnable embedding vector\n", + "2. The neural network learns to predict ratings using these embeddings + continuous features\n", + "3. Similar categories that lead to similar predictions get similar embedding vectors\n", + "4. The embeddings capture semantic relationships in the data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create and train the machine\n", + "mach = machine(embedder, X_train, y_train)\n", + "MLJ.fit!(mach, force = true, verbosity = 1)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Transforming Data with Learned Embeddings\n", + "\n", + "After training, we can use the embedder as a transformer to convert categorical features into their learned embedding representations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Transform the data using the learned embeddings\n", + "X_train_embedded = MLJFlux.transform(mach, X_train)\n", + "X_test_embedded = MLJFlux.transform(mach, X_test)\n", + "\n", + "# Check the schema transformation\n", + "println(\"Original schema:\")\n", + "schema(X_train)\n", + "println(\"\\nEmbedded schema:\")\n", + "schema(X_train_embedded)\n", + "X_train_embedded" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Using Embeddings in ML Pipelines\n", + "\n", + "One of the key advantages of entity embeddings is that they can be used as features in any downstream machine learning model.\n", + "Let's create a pipeline that combines our `EntityEmbedder` with a k-nearest neighbors classifier.\n", + "\n", + "### Pipeline Benefits:\n", + "- **Modular**: Easy to swap out different downstream models\n", + "- **Reusable**: Embeddings learned once can be used with multiple models\n", + "- **Interpretable**: Can analyze embedding spaces separately from final predictions" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load KNN classifier\n", + "KNNClassifier = @load KNNClassifier pkg = NearestNeighborModels\n", + "\n", + "# Create a pipeline: EntityEmbedder -> KNNClassifier\n", + "pipe = embedder |> KNNClassifier(K = 5)\n", + "\n", + "# Train the pipeline\n", + "pipe_mach = machine(pipe, X_train, y_train)\n", + "MLJ.fit!(pipe_mach, verbosity = 0)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the Learned Embedding Spaces\n", + "\n", + "One of the most powerful aspects of entity embeddings is their interpretability. Since we used 2D embeddings, we can visualize how the model has organized different categories in the embedding space.\n", + "\n", + "### What to Look For:\n", + "- **Clustering**: Similar categories should be close together\n", + "- **Separation**: Different types of categories should be well-separated\n", + "- **Meaningful patterns**: The spatial arrangement should reflect semantic relationships" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Extract the learned embedding matrices from the fitted model\n", + "mapping_matrices = fitted_params(mach)[4]" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Creating Embedding Visualization Function\n", + "\n", + "We'll create a helper function to plot the 2D embedding space for each categorical feature.\n", + "Each point represents a category, and its position shows how the model learned to represent it." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Function to create and display scatter plot for categorical embeddings\n", + "function plot_categorical_embeddings(feature_name, feature_categories, embedding_matrix)\n", + " # Create scatter plot for this feature's embeddings\n", + " p = scatter(embedding_matrix[1, :], embedding_matrix[2, :],\n", + " title = \"$(feature_name) Embeddings\",\n", + " xlabel = \"Dimension 1\",\n", + " ylabel = \"Dimension 2\",\n", + " label = \"$(feature_name)\",\n", + " legend = :topright,\n", + " markersize = 8,\n", + " size = (1200, 600))\n", + "\n", + " # Annotate each point with the actual category name\n", + " for (i, col) in enumerate(eachcol(embedding_matrix))\n", + " if i <= length(feature_categories)\n", + " cat_name = string(feature_categories[i])\n", + " # Truncate long category names for readability\n", + " display_name = length(cat_name) > 10 ? cat_name[1:10] * \"...\" : cat_name\n", + " annotate!(p, col[1] + 0.02, col[2] + 0.02, text(display_name, :black, 5))\n", + " end\n", + " end\n", + "\n", + " # Display the plot\n", + " display(p)\n", + " println(\"Displayed embedding plot for: $(feature_name)\")\n", + " return p\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Generating Embedding Plots for Each Categorical Feature\n", + "\n", + "Let's visualize the embedding space for each of our categorical features to understand what patterns the model learned." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create separate plots for each categorical feature's embeddings\n", + "\n", + "# Plot 1: Category embeddings\n", + "if haskey(mapping_matrices, :Category)\n", + " plot_categorical_embeddings(\n", + " :Category,\n", + " category_names[:Category],\n", + " mapping_matrices[:Category],\n", + " )\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Notice that pairs such as social and entertainment, shopping and finance, and comics and art are closer together than others." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Plot 2: Content Rating embeddings\n", + "if haskey(mapping_matrices, Symbol(\"Content Rating\"))\n", + " plot_categorical_embeddings(\n", + " Symbol(\"Content Rating\"),\n", + " category_names[Symbol(\"Content Rating\")],\n", + " mapping_matrices[Symbol(\"Content Rating\")],\n", + " )\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The `Everyone` category is positioned far from all others." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Plot 3: Genres embeddings\n", + "if haskey(mapping_matrices, :Genres)\n", + " plot_categorical_embeddings(:Genres, category_names[:Genres], mapping_matrices[:Genres])\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Here the results may be less interpretable; the idea is that for purposes of indetifying the rating, the model considered categories closer together as more similar." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Plot 4: Android Ver embeddings\n", + "if haskey(mapping_matrices, Symbol(\"Android Ver\"))\n", + " plot_categorical_embeddings(\n", + " Symbol(\"Android Ver\"),\n", + " category_names[Symbol(\"Android Ver\")],\n", + " mapping_matrices[Symbol(\"Android Ver\")],\n", + " )\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Clear patterns like close proximity between (7.1 and up) and, 7.0-7.1" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Plot 5: Type embeddings (if it exists in the mapping)\n", + "if haskey(mapping_matrices, :Type)\n", + " plot_categorical_embeddings(:Type, sort(unique(df.Type)), mapping_matrices[:Type])\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Indeed, `Free` and `Paid` are too dissimilar." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This demonstrates the power of entity embeddings as a modern approach to categorical feature encoding that goes beyond traditional methods like one-hot encoding or label encoding." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.5" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.5", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/tutorials/standardization/Manifest.toml b/docs/src/tutorials/standardization/Manifest.toml new file mode 100644 index 0000000..fcf931d --- /dev/null +++ b/docs/src/tutorials/standardization/Manifest.toml @@ -0,0 +1,2140 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.5" +manifest_format = "2.0" +project_hash = "9fd732bb479236aafdb742cc294bee6c413f7d0d" + +[[deps.ADTypes]] +git-tree-sha1 = "be7ae030256b8ef14a441726c4c37766b90b93a3" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.15.0" + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + + [deps.ADTypes.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + +[[deps.ARFFFiles]] +deps = ["CategoricalArrays", "Dates", "Parsers", "Tables"] +git-tree-sha1 = "678eb18590a8bc6674363da4d5faa4ac09c40a18" +uuid = "da404889-ca92-49ff-9e8b-0aa6b4d38dc8" +version = "1.5.0" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgCheck]] +git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.5.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "9606d7832795cbef89e06a550475be300364a8aa" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.19.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + 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" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "b5bb4dc6248fde467be2a863eb8452993e74d402" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.1" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.BangBang]] +deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"] +git-tree-sha1 = "26f41e1df02c330c4fa1e98d4aa2168fdafc9b1f" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.4.4" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTablesExt = "Tables" + 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" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.BitBasis]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "89dc08420d4f593ff30f02611d136b475a5eb43d" +uuid = "50ba71b6-fa0f-514d-ae9a-0916efc90dcf" +version = "0.9.10" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.15" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.5+0" + +[[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.CategoricalDistributions]] +deps = ["CategoricalArrays", "Distributions", "Missings", "OrderedCollections", "Random", "ScientificTypes"] +git-tree-sha1 = "926862f549a82d6c3a7145bc7f1adff2a91a39f0" +uuid = "af321ab8-2d2e-40a6-b165-3d674595d28e" +version = "0.1.15" + + [deps.CategoricalDistributions.extensions] + UnivariateFiniteDisplayExt = "UnicodePlots" + + [deps.CategoricalDistributions.weakdeps] + UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "06ee8d1aa558d2833aa799f6f0b31b30cada405f" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.2" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.29.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.1" + +[[deps.Combinatorics]] +git-tree-sha1 = "8010b6bb3388abe68d95743dcbea77650bb2eddf" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.3" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "3a3dfb30697e96a440e4149c8c51bf32f818c0f3" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.17.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.5.0" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ContextVariablesX]] +deps = ["Compat", "Logging", "UUIDs"] +git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" +uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" +version = "0.1.3" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.7.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[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" +version = "1.11.0" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.16.2+0" + +[[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.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "210933c93f39f832d92f9efbbe69a49c453db36d" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.7.1" + + [deps.DifferentiationInterface.extensions] + DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" + DifferentiationInterfaceDiffractorExt = "Diffractor" + DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] + DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" + DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" + DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" + DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore" + DifferentiationInterfaceGTPSAExt = "GTPSA" + DifferentiationInterfaceMooncakeExt = "Mooncake" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] + DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] + DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" + DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" + DifferentiationInterfaceStaticArraysExt = "StaticArrays" + DifferentiationInterfaceSymbolicsExt = "Symbolics" + DifferentiationInterfaceTrackerExt = "Tracker" + DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] + + [deps.DifferentiationInterface.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" + Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "3e6d038b77f22791b8e3472b7c633acea1ecac06" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.120" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarlyStopping]] +deps = ["Dates", "Statistics"] +git-tree-sha1 = "98fdf08b707aaf69f524a6cd0a67858cefe0cfb6" +uuid = "792122b4-ca99-40de-a6bc-6742525f08b6" +version = "0.3.0" + +[[deps.EnumX]] +git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.5" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+1" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.5+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FLoops]] +deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] +git-tree-sha1 = "0a2e5873e9a5f54abb06418d57a8df689336a660" +uuid = "cc61a311-1640-44b5-9fba-1b764f453329" +version = "0.2.2" + +[[deps.FLoopsBase]] +deps = ["ContextVariablesX"] +git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" +uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" +version = "0.1.1" + +[[deps.FeatureSelection]] +deps = ["MLJModelInterface", "ScientificTypesBase", "Tables"] +git-tree-sha1 = "d78c565b6296e161193eb0f053bbcb3f1a82091d" +uuid = "33837fe5-dbff-4c9e-8c2f-c5612fe2b8b6" +version = "0.2.2" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.17.0" +weakdeps = ["HTTP"] + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] +git-tree-sha1 = "f089ab1f834470c525562030c8cfde4025d5e915" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.27.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffSparseArraysExt = "SparseArrays" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.16.0+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.0.1" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+2" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "1828eb7275491981fa5f1752a5e126e8f26f8741" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.17" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "27299071cc29e409488ada41ec7643e0ab19091f" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.17+0" + +[[deps.GettextRuntime_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] +git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" +uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" +version = "0.22.4+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "35fbd0cefb04a516104b8e183ce0df11b70a3f1a" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.84.3+0" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.15+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "ed5e9c58612c4e081aecdb6e1a479e18462e041e" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.17" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.1+0" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.28" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InlineStrings]] +git-tree-sha1 = "8594fac023c5ce1ef78260f24d1ad18b4327b420" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.4" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.IterationControl]] +deps = ["EarlyStopping", "InteractiveUtils"] +git-tree-sha1 = "e663925ebc3d93c1150a7570d114f9ea2f664726" +uuid = "b3c1a2ee-3fec-4384-bf48-272ea71de57c" +version = "0.5.4" + +[[deps.IterativeSolvers]] +deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] +git-tree-sha1 = "59545b0a2b27208b0650df0a46b8e3019f85055b" +uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" +version = "0.9.4" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["REPL", "Random", "fzf_jll"] +git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.11" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.1+0" + +[[deps.JuliaVariables]] +deps = ["MLStyle", "NameResolution"] +git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" +uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" +version = "0.2.4" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "4efa9cec6f308e0f492ea635421638bff81cf6f8" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.36" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LIBLINEAR]] +deps = ["Libdl", "SparseArrays", "liblinear_jll"] +git-tree-sha1 = "2cd424d3bf9b36098009df5b1f399614c12b2ee4" +uuid = "2d691ee1-e668-5016-a719-b2531b85e0f5" +version = "0.7.1" + +[[deps.LIBSVM]] +deps = ["LIBLINEAR", "LinearAlgebra", "ScikitLearnBase", "SparseArrays", "libsvm_jll"] +git-tree-sha1 = "9016c6032aac779b13bbd1b3ce997606a6eb7a2b" +uuid = "b1bec4e5-fd48-53fe-b0cb-9723c09d164b" +version = "0.8.1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.8+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "4f34eaabe49ecb3fb0d58d6015e32fd31a733199" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.8" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + TectonicExt = "tectonic_jll" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + tectonic_jll = "d7dd28d6-a5e6-559c-9131-7eb760cdacc5" + +[[deps.LatinHypercubeSampling]] +deps = ["Random", "StableRNGs", "StatsBase", "Test"] +git-tree-sha1 = "825289d43c753c7f1bf9bed334c253e9913997f8" +uuid = "a5e1c1ea-c99a-51d3-a14d-a9a37257b02d" +version = "1.9.0" + +[[deps.LearnAPI]] +git-tree-sha1 = "c276ed13346953f3035a6d35519ec816b820cd44" +uuid = "92ad9a40-7767-427a-9ee6-6e577f1266cb" +version = "1.0.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.4.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.1+1" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.41.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.1+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.41.0+0" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "4adee99b7262ad2a1a4bbbc59d993d24e55ea96f" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.4.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LinearMaps]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "7f6be2e4cdaaf558623d93113d6ddade7b916209" +uuid = "7a12625a-238d-50fd-b39a-03d52299707e" +version = "3.11.4" +weakdeps = ["ChainRulesCore", "SparseArrays", "Statistics"] + + [deps.LinearMaps.extensions] + LinearMapsChainRulesCoreExt = "ChainRulesCore" + LinearMapsSparseArraysExt = "SparseArrays" + LinearMapsStatisticsExt = "Statistics" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [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" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.MLCore]] +deps = ["DataAPI", "SimpleTraits", "Tables"] +git-tree-sha1 = "73907695f35bc7ffd9f11f6c4f2ee8c1302084be" +uuid = "c2834f40-e789-41da-a90e-33b280584a8c" +version = "1.0.0" + +[[deps.MLFlowClient]] +deps = ["Dates", "FilePathsBase", "HTTP", "JSON", "ShowCases", "URIs", "UUIDs"] +git-tree-sha1 = "9abb12b62debc27261c008daa13627255bf79967" +uuid = "64a0f543-368b-4a9a-827a-e71edb2a0b83" +version = "0.5.1" + +[[deps.MLJ]] +deps = ["CategoricalArrays", "ComputationalResources", "Distributed", "Distributions", "FeatureSelection", "LinearAlgebra", "MLJBalancing", "MLJBase", "MLJEnsembles", "MLJFlow", "MLJIteration", "MLJModels", "MLJTuning", "OpenML", "Pkg", "ProgressMeter", "Random", "Reexport", "ScientificTypes", "StatisticalMeasures", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "65f2031dbd48117062c23931f243a0f8666535a1" +uuid = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +version = "0.20.8" + +[[deps.MLJBalancing]] +deps = ["MLJBase", "MLJModelInterface", "MLUtils", "OrderedCollections", "Random", "StatsBase"] +git-tree-sha1 = "f707a01a92d664479522313907c07afa5d81df19" +uuid = "45f359ea-796d-4f51-95a5-deb1a414c586" +version = "0.1.5" + +[[deps.MLJBase]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Dates", "DelimitedFiles", "Distributed", "Distributions", "InteractiveUtils", "InvertedIndices", "LearnAPI", "LinearAlgebra", "MLJModelInterface", "Missings", "OrderedCollections", "Parameters", "PrettyTables", "ProgressMeter", "Random", "RecipesBase", "Reexport", "ScientificTypes", "Serialization", "StatisticalMeasuresBase", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "05b91197e791cd1410aad3e421e9e47b27e9ce31" +uuid = "a7f614a8-145f-11e9-1d2a-a57a1082229d" +version = "1.8.1" +weakdeps = ["StatisticalMeasures"] + + [deps.MLJBase.extensions] + DefaultMeasuresExt = "StatisticalMeasures" + +[[deps.MLJEnsembles]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Distributed", "Distributions", "MLJModelInterface", "ProgressMeter", "Random", "ScientificTypesBase", "StatisticalMeasuresBase", "StatsBase"] +git-tree-sha1 = "84a5be55a364bb6b6dc7780bbd64317ebdd3ad1e" +uuid = "50ed68f4-41fd-4504-931a-ed422449fee0" +version = "0.4.3" + +[[deps.MLJFlow]] +deps = ["MLFlowClient", "MLJBase", "MLJModelInterface"] +git-tree-sha1 = "508bff8071d7d1902d6f1b9d1e868d58821f1cfe" +uuid = "7b7b8358-b45c-48ea-a8ef-7ca328ad328f" +version = "0.5.0" + +[[deps.MLJIteration]] +deps = ["IterationControl", "MLJBase", "Random", "Serialization"] +git-tree-sha1 = "ad16cfd261e28204847f509d1221a581286448ae" +uuid = "614be32b-d00c-4edb-bd02-1eb411ab5e55" +version = "0.6.3" + +[[deps.MLJLinearModels]] +deps = ["DocStringExtensions", "IterativeSolvers", "LinearAlgebra", "LinearMaps", "MLJModelInterface", "Optim", "Parameters"] +git-tree-sha1 = "d23c53a454f01c03780621477000f03bae487a9a" +uuid = "6ee0df7b-362f-4a72-a706-9e79364fb692" +version = "0.10.1" + +[[deps.MLJModelInterface]] +deps = ["REPL", "Random", "ScientificTypesBase", "StatisticalTraits"] +git-tree-sha1 = "66626f80d5807921045d539b4f7153b1d47c5f8a" +uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" +version = "1.11.1" + +[[deps.MLJModels]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Combinatorics", "Dates", "Distances", "Distributions", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "Markdown", "OrderedCollections", "Parameters", "Pkg", "PrettyPrinting", "REPL", "Random", "RelocatableFolders", "ScientificTypes", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "09381923be5ed34416ed77badbc26e1adf295492" +uuid = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +version = "0.17.9" + +[[deps.MLJTransforms]] +deps = ["BitBasis", "CategoricalArrays", "Combinatorics", "Dates", "Distributions", "LinearAlgebra", "MLJModelInterface", "OrderedCollections", "Parameters", "ScientificTypes", "Statistics", "StatsBase", "TableOperations", "Tables"] +git-tree-sha1 = "d7236b02f979b4bdfff5866eaaecec2be8907b63" +uuid = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" +version = "0.1.0" + +[[deps.MLJTuning]] +deps = ["ComputationalResources", "Distributed", "Distributions", "LatinHypercubeSampling", "MLJBase", "ProgressMeter", "Random", "RecipesBase", "StatisticalMeasuresBase"] +git-tree-sha1 = "38aab60b1274ce7d6da784808e3be69e585dbbf6" +uuid = "03970b2e-30c4-11ea-3135-d1576263f10f" +version = "0.8.8" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MLUtils]] +deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "MLCore", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"] +git-tree-sha1 = "a772d8d1987433538a5c226f79393324b55f7846" +uuid = "f1d291b0-491e-4a28-83b9-f70985020b54" +version = "0.4.8" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.MicroCollections]] +deps = ["Accessors", "BangBang", "InitialValues"] +git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.2.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.Mocking]] +deps = ["Compat", "ExprTools"] +git-tree-sha1 = "2c140d60d7cb82badf06d8783800d0bcd1a7daa2" +uuid = "78c3b35d-d492-501b-9361-3d52fe80e533" +version = "0.8.1" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.NLSolversBase]] +deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "25a6638571a902ecfb1ae2a18fc1575f86b1d4df" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.10.0" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "ScopedValues", "Statistics"] +git-tree-sha1 = "4abc63cdd8dd9dd925d8e879cda280bedc8013ca" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.30" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + NNlibSpecialFunctionsExt = "SpecialFunctions" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NameResolution]] +deps = ["PrettyPrint"] +git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" +uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" +version = "0.1.5" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenML]] +deps = ["ARFFFiles", "HTTP", "JSON", "Markdown", "Pkg", "Scratch"] +git-tree-sha1 = "63603b2b367107e87dbceda4e33c67aed17e50e0" +uuid = "8b6db2d4-7670-4922-a472-f9537c81ab66" +version = "0.3.2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "f1a7e086c677df53e064e0fdd2c9d0b0833e3f6e" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.5.0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "9216a80ff3682833ac4b733caa8c00390620ba5d" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.0+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Optim]] +deps = ["Compat", "EnumX", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "61942645c38dd2b5b78e2082c9b51ab315315d10" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.13.2" + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + + [deps.Optim.weakdeps] + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "f07c06228a1c670ae4c87d1276b92c7c597fdda0" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.35" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "275a9a6d85dc86c24d03d1837a0010226a96f540" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.56.3+0" + +[[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 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.3" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.44.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.3.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.3" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "28ea788b78009c695eb0d637587c81d26bdf0e36" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.14" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyPrint]] +git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" +uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" +version = "0.2.0" + +[[deps.PrettyPrinting]] +git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e" +uuid = "54e16d92-306c-5ea0-a30b-337be88ac337" +version = "0.4.2" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "13c5103482a8ed1536a54c08d0e742ae3dca2d42" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.4" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "eb38d376097f47316fe089fc62cb7c6d85383a52" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.8.2+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "da7adf145cce0d44e892626e647f9dcbe9cb3e10" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.8.2+1" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "9eca9fc3fe515d619ce004c83c31ffd3f85c7ccf" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.8.2+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "e1d5e16d0f65762396f9ca4644a5f4ddab8d452b" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.8.2+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.RData]] +deps = ["CategoricalArrays", "CodecZlib", "DataFrames", "Dates", "FileIO", "Requires", "TimeZones", "Unicode"] +git-tree-sha1 = "19e47a495dfb7240eb44dc6971d660f7e4244a72" +uuid = "df47a6cb-8c03-5eed-afd8-b6050d6c41da" +version = "0.8.3" + +[[deps.RDatasets]] +deps = ["CSV", "CodecZlib", "DataFrames", "FileIO", "Printf", "RData", "Reexport"] +git-tree-sha1 = "2720e6f6afb3e562ccb70a6b62f8f308ff810333" +uuid = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +version = "0.7.7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.ScientificTypes]] +deps = ["CategoricalArrays", "ColorTypes", "Dates", "Distributions", "PrettyTables", "Reexport", "ScientificTypesBase", "StatisticalTraits", "Tables"] +git-tree-sha1 = "4d083ffec53dbd5097a6723b0699b175be2b61fb" +uuid = "321657f4-b219-11e9-178b-2701a2544e81" +version = "3.1.0" + +[[deps.ScientificTypesBase]] +git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b" +uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" +version = "3.0.0" + +[[deps.ScikitLearnBase]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "7877e55c1523a4b336b433da39c8e8c08d2f221f" +uuid = "6e75b9c4-186b-50bd-896f-2d2496a4843e" +version = "0.5.0" + +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "1147f140b4c8ddab224c94efa9569fc23d63ab44" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.3.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.8" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.ShowCases]] +git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5" +uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" +version = "0.1.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.15" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.3" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.13" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.StatisticalMeasures]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Distributions", "LearnAPI", "LinearAlgebra", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "StatisticalMeasuresBase", "Statistics", "StatsBase"] +git-tree-sha1 = "d15f71761dce0a2833d458824e6b60edbfd4f138" +uuid = "a19d573c-0a75-4610-95b3-7071388c7541" +version = "0.2.1" + + [deps.StatisticalMeasures.extensions] + LossFunctionsExt = "LossFunctions" + ScientificTypesExt = "ScientificTypes" + + [deps.StatisticalMeasures.weakdeps] + LossFunctions = "30fc2ffe-d236-52d8-8643-a9d8f7c094a7" + ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" + +[[deps.StatisticalMeasuresBase]] +deps = ["CategoricalArrays", "InteractiveUtils", "MLUtils", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "Statistics"] +git-tree-sha1 = "e4f508cf3b3253f3eb357274fe36fb3332ca9896" +uuid = "c062fc1d-0d66-479b-b6ac-8b44719de4cc" +version = "0.1.2" + +[[deps.StatisticalTraits]] +deps = ["ScientificTypesBase"] +git-tree-sha1 = "542d979f6e756f13f862aa00b224f04f9e445f11" +uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" +version = "3.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.1" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.5" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "8e45cecc66f3b42633b8ce14d431e8e57a3e242e" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TZJData]] +deps = ["Artifacts"] +git-tree-sha1 = "72df96b3a595b7aab1e101eb07d2a435963a97e2" +uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" +version = "1.5.0+2025b" + +[[deps.TableOperations]] +deps = ["SentinelArrays", "Tables", "Test"] +git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" +uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" +version = "1.2.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TimeZones]] +deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"] +git-tree-sha1 = "2c705e96825b66c4a3f25031a683c06518256dd3" +uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" +version = "1.21.3" +weakdeps = ["RecipesBase"] + + [deps.TimeZones.extensions] + TimeZonesRecipesBaseExt = "RecipesBase" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Transducers]] +deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] +git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.84" + + [deps.Transducers.extensions] + TransducersAdaptExt = "Adapt" + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + TransducersReferenceablesExt = "Referenceables" + + [deps.Transducers.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + 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.URIs]] +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.6.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "d2282232f8a4d71f79e85dc4dd45e5b12a6297fb" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.23.1" +weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "Printf"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + ForwardDiffExt = "ForwardDiff" + InverseFunctionsUnitfulExt = "InverseFunctions" + PrintfExt = "Printf" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "af305cc62419f9bd61b6644d19170a4d258c7967" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.7.0" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + + [deps.UnsafeAtomics.weakdeps] + LLVM = "929cbde3-209d-540e-8aea-75f648917ca0" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "XML2_jll"] +git-tree-sha1 = "53ab3e9c94f4343c68d5905565be63002e13ec8c" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.23.1+1" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WorkerUtilities]] +git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" +uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" +version = "1.6.1" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.6+1" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.8.1+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.2+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.6+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.12+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.13+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.4+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.6+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.7+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "9caba99d38404b285db8801d5c45ef4f4f425a6d" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.1+0" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.8.3+0" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] +git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.6+0" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.5+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.12+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.1+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.3+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "c5bf2dad6a03dfef57ea0a170a1fe493601603f2" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.5+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"] +git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.10+0" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.2+0" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.7+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.44.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c3b0e6196d50eab0c5ed34021aaa0bb463489510" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.14+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.61.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.11.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "56d643b57b188d30cccc25e331d416d3d358e557" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.13.4+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "91d05d7f4a9f67205bd6cf395e488009fe85b499" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.28.1+0" + +[[deps.liblinear_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7f5f1953394b74739eaebd345f4515515a022a5b" +uuid = "275f1f90-abd2-5ca1-9ad8-abd4e3d66eb7" +version = "2.47.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "cd155272a3738da6db765745b89e466fa64d0830" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.49+0" + +[[deps.libsvm_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl", "Pkg"] +git-tree-sha1 = "7625dde5e9eab416c1cb791627f065ce55297eff" +uuid = "08558c22-525a-5d2a-acf6-0ac6658ffce4" +version = "3.25.0+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b4d631fd51f2e9cdd93724ae25b2efc198b059b1" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.7+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "fbf139bce07a534df0e699dbb5f5cc9346f95cc1" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.9.2+0" diff --git a/docs/src/tutorials/standardization/Project.toml b/docs/src/tutorials/standardization/Project.toml new file mode 100644 index 0000000..4c61eb9 --- /dev/null +++ b/docs/src/tutorials/standardization/Project.toml @@ -0,0 +1,9 @@ +[deps] +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +LIBSVM = "b1bec4e5-fd48-53fe-b0cb-9723c09d164b" +MLJ = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +MLJLinearModels = "6ee0df7b-362f-4a72-a706-9e79364fb692" +MLJModels = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +MLJTransforms = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" diff --git a/docs/src/tutorials/standardization/generate.jl b/docs/src/tutorials/standardization/generate.jl new file mode 100644 index 0000000..8f1b8f8 --- /dev/null +++ b/docs/src/tutorials/standardization/generate.jl @@ -0,0 +1,2 @@ +joinpath(@__DIR__, "..", "..", "generate.jl") |> include +generate(@__DIR__, execute=true) diff --git a/docs/src/tutorials/standardization/notebook.ipynb b/docs/src/tutorials/standardization/notebook.ipynb new file mode 100644 index 0000000..21b6390 --- /dev/null +++ b/docs/src/tutorials/standardization/notebook.ipynb @@ -0,0 +1,471 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Effects of Feature Standardization on Model Performance\n", + "\n", + "Welcome to this tutorial on feature standardization in machine learning!\n", + "In this tutorial, we'll explore how standardizing features can significantly\n", + "impact the performance of different machine learning models.\n", + "\n", + "We'll compare Logistic Regression and Support Vector Machine (SVM) models,\n", + "both with and without feature standardization. This will help us understand\n", + "when and why preprocessing is important for model performance." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Setup\n", + "\n", + "First, let's make sure we're using a compatible Julia version. This code was tested with Julia 1.10.\n", + "Let's import all the packages we'll need for this tutorial." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load the necessary packages\n", + "using MLJ # Core MLJ framework\n", + "using LIBSVM # For Support Vector Machine\n", + "using DataFrames # For displaying results\n", + "using RDatasets # To load sample datasets\n", + "using Random # For reproducibility\n", + "using ScientificTypes # For proper data typing\n", + "using Plots # For visualizations\n", + "using MLJLinearModels # For Logistic Regression" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Data Preparation\n", + "\n", + "Let's load the Pima Indians Diabetes Dataset. This is a classic dataset for\n", + "binary classification, where we predict diabetes status based on various health metrics.\n", + "\n", + "The interesting thing about this dataset is that different features have very different scales.\n", + "We'll artificially exaggerate this by adding a large constant to the glucose values." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load the dataset and modify it to have extreme scale differences\n", + "df = RDatasets.dataset(\"MASS\", \"Pima.tr\")\n", + "df.Glu .+= 10000.0; # Artificially increase the scale of glucose values" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "Let's examine the first few rows of our dataset:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "\u001b[1m5Γ—8 DataFrame\u001b[0m\n\u001b[1m Row \u001b[0mβ”‚\u001b[1m NPreg \u001b[0m\u001b[1m Glu \u001b[0m\u001b[1m BP \u001b[0m\u001b[1m Skin \u001b[0m\u001b[1m BMI \u001b[0m\u001b[1m Ped \u001b[0m\u001b[1m Age \u001b[0m\u001b[1m Type \u001b[0m\n β”‚\u001b[90m Int32 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Int32 \u001b[0m\u001b[90m Int32 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Int32 \u001b[0m\u001b[90m Cat… \u001b[0m\n─────┼─────────────────────────────────────────────────────────────\n 1 β”‚ 5 10086.0 68 28 30.2 0.364 24 No\n 2 β”‚ 7 10195.0 70 33 25.1 0.163 55 Yes\n 3 β”‚ 5 10077.0 82 41 35.8 0.156 35 No\n 4 β”‚ 0 10165.0 76 43 47.9 0.259 26 No\n 5 β”‚ 0 10107.0 60 25 26.4 0.133 23 No", + "text/html": [ + "
5Γ—8 DataFrame
RowNPregGluBPSkinBMIPedAgeType
Int32Float64Int32Int32Float64Float64Int32Cat…
1510086.0682830.20.36424No
2710195.0703325.10.16355Yes
3510077.0824135.80.15635No
4010165.0764347.90.25926No
5010107.0602526.40.13323No
" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ], + "cell_type": "code", + "source": [ + "first(df, 5)" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "### Data Type Conversion\n", + "\n", + "In MLJ, it's important to ensure that our data has the correct scientific types.\n", + "This helps the framework understand how to properly handle each column.\n", + "\n", + "We'll convert our columns to their appropriate types:\n", + "- `Count` for discrete count data\n", + "- `Continuous` for continuous numerical data\n", + "- `Multiclass` for our target variable" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Coerce columns to the right scientific types\n", + "df = coerce(df,\n", + " :NPreg => Count, # Number of pregnancies is a count\n", + " :Glu => Continuous, # Glucose level is continuous\n", + " :BP => Continuous, # Blood pressure is continuous\n", + " :Skin => Continuous, # Skin thickness is continuous\n", + " :BMI => Continuous, # Body mass index is continuous\n", + " :Ped => Continuous, # Diabetes pedigree is continuous\n", + " :Age => Continuous, # Age is continuous\n", + " :Type => Multiclass, # Diabetes status is our target (Yes/No)\n", + ");" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "Let's verify that our schema looks correct:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "β”Œβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”\nβ”‚\u001b[22m names \u001b[0mβ”‚\u001b[22m scitypes \u001b[0mβ”‚\u001b[22m types \u001b[0mβ”‚\nβ”œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\nβ”‚ NPreg β”‚ Count β”‚ Int32 β”‚\nβ”‚ Glu β”‚ Continuous β”‚ Float64 β”‚\nβ”‚ BP β”‚ Continuous β”‚ Float64 β”‚\nβ”‚ Skin β”‚ Continuous β”‚ Float64 β”‚\nβ”‚ BMI β”‚ Continuous β”‚ Float64 β”‚\nβ”‚ Ped β”‚ Continuous β”‚ Float64 β”‚\nβ”‚ Age β”‚ Continuous β”‚ Float64 β”‚\nβ”‚ Type β”‚ Multiclass{2} β”‚ CategoricalValue{String, UInt8} β”‚\nβ””β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n" + }, + "metadata": {}, + "execution_count": 5 + } + ], + "cell_type": "code", + "source": [ + "ScientificTypes.schema(df)" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "## Feature Extraction and Data Splitting\n", + "\n", + "Now we'll separate our features from our target variable.\n", + "In MLJ, this is done with the `unpack` function." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Unpack features (X) and target (y)\n", + "y, X = unpack(df, ==(:Type); rng = 123);" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "Next, we'll split our data into training and testing sets.\n", + "We'll use 70% for training and 30% for testing." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Split data into train and test sets\n", + "train, test = partition(eachindex(y), 0.7, shuffle = true, rng = 123);" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "## Model Setup\n", + "\n", + "We'll compare two different models:\n", + "1. Logistic Regression: A linear model good for binary classification\n", + "2. Support Vector Machine (SVM): A powerful non-linear classifier\n", + "\n", + "For each model, we'll create two versions:\n", + "- One without standardization\n", + "- One with standardization\n", + "\n", + "The `Standardizer` transformer will rescale our features to have mean 0 and standard deviation 1." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ Info: For silent loading, specify `verbosity=0`. \n", + "import MLJLinearModels βœ”\n", + "[ Info: For silent loading, specify `verbosity=0`. \n", + "import MLJLIBSVMInterface βœ”\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": "DeterministicPipeline(\n standardizer = Standardizer(\n features = Symbol[], \n ignore = false, \n ordered_factor = false, \n count = false), \n svc = SVC(\n kernel = LIBSVM.Kernel.RadialBasis, \n gamma = 0.0, \n cost = 1.0, \n cachesize = 200.0, \n degree = 3, \n coef0 = 0.0, \n tolerance = 0.001, \n shrinking = true), \n cache = true)" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "cell_type": "code", + "source": [ + "# Load our models from their respective packages\n", + "logreg = @load LogisticClassifier pkg = MLJLinearModels\n", + "svm = @load SVC pkg = LIBSVM\n", + "stand = Standardizer() # This is our standardization transformer\n", + "\n", + "# Create pipelines for each model variant\n", + "logreg_pipe = logreg() # Plain logistic regression\n", + "logreg_std_pipe = Pipeline(stand, logreg()) # Logistic regression with standardization\n", + "svm_pipe = svm() # Plain SVM\n", + "svm_std_pipe = Pipeline(stand, svm()) # SVM with standardization" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "## Model Evaluation\n", + "\n", + "Let's set up a vector of our models so we can evaluate them all using the same process.\n", + "For each model, we'll store its name and the corresponding pipeline." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "4-element Vector{Tuple{String, MLJModelInterface.Supervised}}:\n (\"Logistic Regression\", LogisticClassifier(lambda = 2.220446049250313e-16, …))\n (\"Logistic Regression (standardized)\", ProbabilisticPipeline(standardizer = Standardizer(features = Symbol[], …), …))\n (\"SVM\", SVC(kernel = RadialBasis, …))\n (\"SVM (standardized)\", DeterministicPipeline(standardizer = Standardizer(features = Symbol[], …), …))" + }, + "metadata": {}, + "execution_count": 9 + } + ], + "cell_type": "code", + "source": [ + "# Create a list of models to evaluate\n", + "models = [\n", + " (\"Logistic Regression\", logreg_pipe),\n", + " (\"Logistic Regression (standardized)\", logreg_std_pipe),\n", + " (\"SVM\", svm_pipe),\n", + " (\"SVM (standardized)\", svm_std_pipe),\n", + "]" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "Now we'll loop through each model, train it, make predictions, and calculate accuracy.\n", + "This will help us compare how standardization affects each model's performance." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "β”Œ Warning: The number and/or types of data arguments do not match what the specified model\n", + "β”‚ supports. Suppress this type check by specifying `scitype_check_level=0`.\n", + "β”‚ \n", + "β”‚ Run `@doc MLJLinearModels.LogisticClassifier` to learn more about your model's requirements.\n", + "β”‚ \n", + "β”‚ Commonly, but non exclusively, supervised models are constructed using the syntax\n", + "β”‚ `machine(model, X, y)` or `machine(model, X, y, w)` while most other models are\n", + "β”‚ constructed with `machine(model, X)`. Here `X` are features, `y` a target, and `w`\n", + "β”‚ sample or class weights.\n", + "β”‚ \n", + "β”‚ In general, data in `machine(model, data...)` is expected to satisfy\n", + "β”‚ \n", + "β”‚ scitype(data) <: MLJ.fit_data_scitype(model)\n", + "β”‚ \n", + "β”‚ In the present case:\n", + "β”‚ \n", + "β”‚ scitype(data) = Tuple{ScientificTypesBase.Table{Union{AbstractVector{ScientificTypesBase.Continuous}, AbstractVector{ScientificTypesBase.Count}}}, AbstractVector{ScientificTypesBase.Multiclass{2}}}\n", + "β”‚ \n", + "β”‚ fit_data_scitype(model) = Tuple{ScientificTypesBase.Table{<:AbstractVector{<:ScientificTypesBase.Continuous}}, AbstractVector{<:ScientificTypesBase.Finite}}\n", + "β”” @ MLJBase ~/.julia/packages/MLJBase/7nGJF/src/machines.jl:237\n", + "[ Info: Training machine(LogisticClassifier(lambda = 2.220446049250313e-16, …), …).\n", + "β”Œ Info: Solver: MLJLinearModels.LBFGS{Optim.Options{Float64, Nothing}, @NamedTuple{}}\n", + "β”‚ optim_options: Optim.Options{Float64, Nothing}\n", + "β”” lbfgs_options: @NamedTuple{} NamedTuple()\n", + "[ Info: Training machine(ProbabilisticPipeline(standardizer = Standardizer(features = Symbol[], …), …), …).\n", + "[ Info: Training machine(:standardizer, …).\n", + "[ Info: Training machine(:logistic_classifier, …).\n", + "β”Œ Info: Solver: MLJLinearModels.LBFGS{Optim.Options{Float64, Nothing}, @NamedTuple{}}\n", + "β”‚ optim_options: Optim.Options{Float64, Nothing}\n", + "β”” lbfgs_options: @NamedTuple{} NamedTuple()\n", + "β”Œ Warning: The number and/or types of data arguments do not match what the specified model\n", + "β”‚ supports. Suppress this type check by specifying `scitype_check_level=0`.\n", + "β”‚ \n", + "β”‚ Run `@doc LIBSVM.SVC` to learn more about your model's requirements.\n", + "β”‚ \n", + "β”‚ Commonly, but non exclusively, supervised models are constructed using the syntax\n", + "β”‚ `machine(model, X, y)` or `machine(model, X, y, w)` while most other models are\n", + "β”‚ constructed with `machine(model, X)`. Here `X` are features, `y` a target, and `w`\n", + "β”‚ sample or class weights.\n", + "β”‚ \n", + "β”‚ In general, data in `machine(model, data...)` is expected to satisfy\n", + "β”‚ \n", + "β”‚ scitype(data) <: MLJ.fit_data_scitype(model)\n", + "β”‚ \n", + "β”‚ In the present case:\n", + "β”‚ \n", + "β”‚ scitype(data) = Tuple{ScientificTypesBase.Table{Union{AbstractVector{ScientificTypesBase.Continuous}, AbstractVector{ScientificTypesBase.Count}}}, AbstractVector{ScientificTypesBase.Multiclass{2}}}\n", + "β”‚ \n", + "β”‚ fit_data_scitype(model) = Union{Tuple{ScientificTypesBase.Table{<:AbstractVector{<:ScientificTypesBase.Continuous}}, AbstractVector{<:ScientificTypesBase.Finite}}, Tuple{ScientificTypesBase.Table{<:AbstractVector{<:ScientificTypesBase.Continuous}}, AbstractVector{<:ScientificTypesBase.Finite}, Any}}\n", + "β”” @ MLJBase ~/.julia/packages/MLJBase/7nGJF/src/machines.jl:237\n", + "[ Info: Training machine(SVC(kernel = RadialBasis, …), …).\n", + "[ Info: Training machine(DeterministicPipeline(standardizer = Standardizer(features = Symbol[], …), …), …).\n", + "[ Info: Training machine(:standardizer, …).\n", + "[ Info: Training machine(:svc, …).\n" + ] + } + ], + "cell_type": "code", + "source": [ + "# Train and evaluate each model\n", + "results = DataFrame(model = String[], accuracy = Float64[])\n", + "for (name, model) in models\n", + " # Create a machine learning model\n", + " mach = machine(model, X, y)\n", + "\n", + " # Train the model on the training data\n", + " MLJ.fit!(mach, rows = train)\n", + "\n", + " # Make predictions on the test data\n", + " # Note: Logistic regression returns probabilities, so we need to get the mode\n", + " yhat =\n", + " occursin(\"Logistic Regression\", name) ?\n", + " MLJ.predict_mode(mach, rows = test) : # Get most likely class for logistic regression\n", + " MLJ.predict(mach, rows = test) # SVM directly predicts the class\n", + "\n", + " # Calculate accuracy\n", + " acc = accuracy(yhat, y[test])\n", + "\n", + " # Store the results\n", + " push!(results, (name, acc))\n", + "end" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "## Results Visualization\n", + "\n", + "Finally, let's visualize our results to see the impact of standardization.\n", + "We'll create a bar chart comparing the accuracy of each model." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create a bar chart of model performance\n", + "p = bar(\n", + " results.model,\n", + " results.accuracy,\n", + " xlabel = \"Model\",\n", + " ylabel = \"Accuracy\",\n", + " title = \"Model Accuracy Comparison\",\n", + " legend = false,\n", + " bar_width = 0.6,\n", + " ylims = (0.5, 0.7),\n", + " xrotation = 17,\n", + ");" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "Save the plot" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "savefig(p, \"standardization_results.png\"); #hide" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "## Conclusion\n", + "\n", + "From this tutorial, we can clearly see that standardization has a dramatic impact on model performance.\n", + "\n", + "Looking at the results:\n", + "\n", + "- **Logistic Regression**: Without standardization, it achieves only ~57% accuracy. With standardization,\n", + " its performance jumps dramatically to ~68% accuracy – the best performance among all models.\n", + "\n", + "- **SVM**: The baseline SVM achieves ~62% accuracy. When standardized, it improves to ~65% accuracy,\n", + " which is a significant boost but not as dramatic as what we see with logistic regression.\n", + "\n", + "Try this approach with other datasets and models to further explore the effects of standardization!" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.5" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.5", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/tutorials/standardization/notebook.jl b/docs/src/tutorials/standardization/notebook.jl new file mode 100644 index 0000000..a5f34ea --- /dev/null +++ b/docs/src/tutorials/standardization/notebook.jl @@ -0,0 +1,195 @@ +# # Effects of Feature Standardization on Model Performance +# +# Welcome to this tutorial on feature standardization in machine learning! +# In this tutorial, we'll explore how standardizing features can significantly +# impact the performance of different machine learning models. +# +# We'll compare Logistic Regression and Support Vector Machine (SVM) models, +# both with and without feature standardization. This will help us understand +# when and why preprocessing is important for model performance. + +# This demonstration is available as a Jupyter notebook or julia script +# [here](https://github.com/essamwise/MLJTransforms.jl/tree/main/docs/src/tutorials/standardization). +# + +using Pkg #md +Pkg.activate(@__DIR__); #md +Pkg.instantiate(); #md + +# ## Setup +# +# First, let's make sure we're using a compatible Julia version. This code was tested with Julia 1.10. +# Let's import all the packages we'll need for this tutorial. + +## Load the necessary packages +using MLJ # Core MLJ framework +using LIBSVM # For Support Vector Machine +using DataFrames # For displaying results +using RDatasets # To load sample datasets +using Random # For reproducibility +using ScientificTypes # For proper data typing +using Plots # For visualizations +using MLJLinearModels # For Logistic Regression + +# ## Data Preparation +# +# Let's load the Pima Indians Diabetes Dataset. This is a classic dataset for +# binary classification, where we predict diabetes status based on various health metrics. +# +# The interesting thing about this dataset is that different features have very different scales. +# We'll artificially exaggerate this by adding a large constant to the glucose values. + +## Load the dataset and modify it to have extreme scale differences +df = RDatasets.dataset("MASS", "Pima.tr") +df.Glu .+= 10000.0; # Artificially increase the scale of glucose values + +# Let's examine the first few rows of our dataset: +first(df, 5) + +# ### Data Type Conversion +# +# In MLJ, it's important to ensure that our data has the correct scientific types. +# This helps the framework understand how to properly handle each column. +# +# We'll convert our columns to their appropriate types: +# - `Count` for discrete count data +# - `Continuous` for continuous numerical data +# - `Multiclass` for our target variable + +## Coerce columns to the right scientific types +df = coerce(df, + :NPreg => Count, # Number of pregnancies is a count + :Glu => Continuous, # Glucose level is continuous + :BP => Continuous, # Blood pressure is continuous + :Skin => Continuous, # Skin thickness is continuous + :BMI => Continuous, # Body mass index is continuous + :Ped => Continuous, # Diabetes pedigree is continuous + :Age => Continuous, # Age is continuous + :Type => Multiclass, # Diabetes status is our target (Yes/No) +); + +# Let's verify that our schema looks correct: +ScientificTypes.schema(df) + +# ## Feature Extraction and Data Splitting +# +# Now we'll separate our features from our target variable. +# In MLJ, this is done with the `unpack` function. + +## Unpack features (X) and target (y) +y, X = unpack(df, ==(:Type); rng = 123); + +# Next, we'll split our data into training and testing sets. +# We'll use 70% for training and 30% for testing. + +## Split data into train and test sets +train, test = partition(eachindex(y), 0.7, shuffle = true, rng = 123); + +# ## Model Setup +# +# We'll compare two different models: +# 1. Logistic Regression: A linear model good for binary classification +# 2. Support Vector Machine (SVM): A powerful non-linear classifier +# +# For each model, we'll create two versions: +# - One without standardization +# - One with standardization +# +# The `Standardizer` transformer will rescale our features to have mean 0 and standard deviation 1. + +## Load our models from their respective packages +logreg = @load LogisticClassifier pkg = MLJLinearModels +svm = @load SVC pkg = LIBSVM +stand = Standardizer() # This is our standardization transformer + +## Create pipelines for each model variant +logreg_pipe = logreg() # Plain logistic regression +logreg_std_pipe = stand |> logreg() # Logistic regression with standardization +svm_pipe = svm() # Plain SVM +svm_std_pipe = stand |> svm() # SVM with standardization + +# ## Model Evaluation +# +# Let's set up a vector of our models so we can evaluate them all using the same process. +# For each model, we'll store its name and the corresponding pipeline. + +## Create a list of models to evaluate +models = [ + ("Logistic Regression", logreg_pipe), + ("Logistic Regression (standardized)", logreg_std_pipe), + ("SVM", svm_pipe), + ("SVM (standardized)", svm_std_pipe), +] + +# Now we'll loop through each model, train it, make predictions, and calculate accuracy. +# This will help us compare how standardization affects each model's performance. +# +# Note: As an alternative to the explicit fit!/predict workflow below, we could use: +# evaluate(model, X, y, resampling=[(train, test),], measure=accuracy) +# This shortcut handles the training, prediction, and evaluation in one step. + +## Train and evaluate each model +results = DataFrame(model = String[], accuracy = Float64[]) +for (name, model) in models + ## Create a machine learning model + mach = machine(model, X, y) + + ## Train the model on the training data + MLJ.fit!(mach, rows = train) + + ## Make predictions on the test data + ## Note: Logistic regression returns probabilities, so we need to get the mode + yhat = + occursin("Logistic Regression", name) ? + MLJ.predict_mode(mach, rows = test) : # Get most likely class for logistic regression + MLJ.predict(mach, rows = test) # SVM directly predicts the class + + ## Calculate accuracy + acc = accuracy(yhat, y[test]) + + ## Store the results + push!(results, (name, acc)) +end + +# ## Results Visualization +# +# Finally, let's visualize our results to see the impact of standardization. +# We'll create a bar chart comparing the accuracy of each model. + +## Create a bar chart of model performance +p = bar( + results.model, + results.accuracy, + xlabel = "Model", + ylabel = "Accuracy", + title = "Model Accuracy Comparison", + legend = false, + bar_width = 0.6, + ylims = (0.5, 0.7), + xrotation = 17, +); + +# Save the plot +savefig(p, "standardization_results.png"); #hide + +#md # ![Model Accuracy Comparison](standardization_results.png) + +# ## Conclusion +# +# From this tutorial, we can clearly see that standardization has a dramatic impact on model performance. +# +# Looking at the results: +# +# - **Logistic Regression**: Without standardization, it achieves only ~57% accuracy. With standardization, +# its performance jumps dramatically to ~68% accuracy – the best performance among all models. +# +# - **SVM**: The baseline SVM achieves ~62% accuracy. When standardized, it improves to ~65% accuracy, +# which is a significant boost but not as dramatic as what we see with logistic regression. +# +# Try this approach with other datasets and models to further explore the effects of standardization! +# +#md # ## Further Resources +#md # +#md # * [MLJTransforms Documentation](@__REPO_ROOT_URL__) +#md # * [Scientific Types in MLJ](https://alan-turing-institute.github.io/ScientificTypes.jl/dev/) +#md # * [Feature Preprocessing in MLJ](https://alan-turing-institute.github.io/MLJ.jl/dev/transformers/) diff --git a/docs/src/tutorials/standardization/notebook.md b/docs/src/tutorials/standardization/notebook.md new file mode 100644 index 0000000..44e1835 --- /dev/null +++ b/docs/src/tutorials/standardization/notebook.md @@ -0,0 +1,386 @@ +```@meta +EditURL = "notebook.jl" +``` + +# Effects of Feature Standardization on Model Performance + +Welcome to this tutorial on feature standardization in machine learning! +In this tutorial, we'll explore how standardizing features can significantly +impact the performance of different machine learning models. + +We'll compare Logistic Regression and Support Vector Machine (SVM) models, +both with and without feature standardization. This will help us understand +when and why preprocessing is important for model performance. + +This demonstration is available as a Jupyter notebook or julia script +[here](https://github.com/essamwise/MLJTransforms.jl/tree/main/docs/src/tutorials/standardization). + +````julia +using Pkg +Pkg.activate(@__DIR__); +Pkg.instantiate(); +```` + +```` + Activating project at `~/Documents/GitHub/MLJTransforms/docs/src/tutorials/standardization` + +```` + +## Setup + +First, let's make sure we're using a compatible Julia version. This code was tested with Julia 1.10. +Let's import all the packages we'll need for this tutorial. + +````julia +# Load the necessary packages +using MLJ # Core MLJ framework +using LIBSVM # For Support Vector Machine +using DataFrames # For displaying results +using RDatasets # To load sample datasets +using Random # For reproducibility +using ScientificTypes # For proper data typing +using Plots # For visualizations +using MLJLinearModels # For Logistic Regression +```` + +```` +Precompiling LIBSVM... + 922.3 ms βœ“ liblinear_jll + 919.7 ms βœ“ libsvm_jll + 837.3 ms βœ“ LIBLINEAR + 1393.2 ms βœ“ LIBSVM + 4 dependencies successfully precompiled in 3 seconds. 33 already precompiled. +Precompiling RDatasets... + 3340.2 ms βœ“ TimeZones + 3632.3 ms βœ“ RData + 2434.4 ms βœ“ RDatasets + 3 dependencies successfully precompiled in 10 seconds. 67 already precompiled. +Precompiling FileIOExt... + 1067.6 ms βœ“ FileIO β†’ HTTPExt + 2541.2 ms βœ“ Plots β†’ FileIOExt + 2 dependencies successfully precompiled in 3 seconds. 182 already precompiled. +Precompiling TimeZonesRecipesBaseExt... + 470.1 ms βœ“ TimeZones β†’ TimeZonesRecipesBaseExt + 1 dependency successfully precompiled in 1 seconds. 27 already precompiled. +Precompiling MLJLinearModels... + 437.0 ms βœ“ OpenSpecFun_jll + 1694.4 ms βœ“ SpecialFunctions + 2526.4 ms βœ“ ForwardDiff + 972.1 ms βœ“ DifferentiationInterface β†’ DifferentiationInterfaceForwardDiffExt + 966.6 ms βœ“ NLSolversBase + 1396.3 ms βœ“ LineSearches + 2234.5 ms βœ“ Optim + 2572.4 ms βœ“ MLJLinearModels + 8 dependencies successfully precompiled in 13 seconds. 73 already precompiled. + 2 dependencies precompiled but different versions are currently loaded. Restart julia to access the new versions. Otherwise, loading dependents of these packages may trigger further precompilation to work with the unexpected versions. +Precompiling DifferentiationInterfaceStaticArraysExt... + 581.9 ms βœ“ DifferentiationInterface β†’ DifferentiationInterfaceStaticArraysExt + 1 dependency successfully precompiled in 1 seconds. 10 already precompiled. +Precompiling FiniteDiffStaticArraysExt... + 573.6 ms βœ“ FiniteDiff β†’ FiniteDiffStaticArraysExt + 586.8 ms βœ“ ConstructionBase β†’ ConstructionBaseStaticArraysExt + 2 dependencies successfully precompiled in 1 seconds. 20 already precompiled. + 1 dependency precompiled but a different version is currently loaded. Restart julia to access the new version. Otherwise, loading dependents of this package may trigger further precompilation to work with the unexpected version. +Precompiling NNlibForwardDiffExt... + 630.6 ms βœ“ KernelAbstractions β†’ LinearAlgebraExt + 703.5 ms βœ“ ForwardDiff β†’ ForwardDiffStaticArraysExt + 1217.8 ms βœ“ NNlib β†’ NNlibForwardDiffExt + 3 dependencies successfully precompiled in 2 seconds. 46 already precompiled. + 1 dependency precompiled but a different version is currently loaded. Restart julia to access the new version. Otherwise, loading dependents of this package may trigger further precompilation to work with the unexpected version. + +```` + +## Data Preparation + +Let's load the Pima Indians Diabetes Dataset. This is a classic dataset for +binary classification, where we predict diabetes status based on various health metrics. + +The interesting thing about this dataset is that different features have very different scales. +We'll artificially exaggerate this by adding a large constant to the glucose values. + +````julia +# Load the dataset and modify it to have extreme scale differences +df = RDatasets.dataset("MASS", "Pima.tr") +df.Glu .+= 10000.0; # Artificially increase the scale of glucose values +```` + +Let's examine the first few rows of our dataset: + +````julia +first(df, 5) +```` + +```@raw html +
5Γ—8 DataFrame
RowNPregGluBPSkinBMIPedAgeType
Int32Float64Int32Int32Float64Float64Int32Cat…
1510086.0682830.20.36424No
2710195.0703325.10.16355Yes
3510077.0824135.80.15635No
4010165.0764347.90.25926No
5010107.0602526.40.13323No
+``` + +### Data Type Conversion + +In MLJ, it's important to ensure that our data has the correct scientific types. +This helps the framework understand how to properly handle each column. + +We'll convert our columns to their appropriate types: +- `Count` for discrete count data +- `Continuous` for continuous numerical data +- `Multiclass` for our target variable + +````julia +# Coerce columns to the right scientific types +df = coerce(df, + :NPreg => Count, # Number of pregnancies is a count + :Glu => Continuous, # Glucose level is continuous + :BP => Continuous, # Blood pressure is continuous + :Skin => Continuous, # Skin thickness is continuous + :BMI => Continuous, # Body mass index is continuous + :Ped => Continuous, # Diabetes pedigree is continuous + :Age => Continuous, # Age is continuous + :Type => Multiclass, # Diabetes status is our target (Yes/No) +); +```` + +Let's verify that our schema looks correct: + +````julia +ScientificTypes.schema(df) +```` + +```` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ names β”‚ scitypes β”‚ types β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ NPreg β”‚ Count β”‚ Int32 β”‚ +β”‚ Glu β”‚ Continuous β”‚ Float64 β”‚ +β”‚ BP β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Skin β”‚ Continuous β”‚ Float64 β”‚ +β”‚ BMI β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Ped β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Age β”‚ Continuous β”‚ Float64 β”‚ +β”‚ Type β”‚ Multiclass{2} β”‚ CategoricalValue{String, UInt8} β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +```` + +## Feature Extraction and Data Splitting + +Now we'll separate our features from our target variable. +In MLJ, this is done with the `unpack` function. + +````julia +# Unpack features (X) and target (y) +y, X = unpack(df, ==(:Type); rng = 123); +```` + +Next, we'll split our data into training and testing sets. +We'll use 70% for training and 30% for testing. + +````julia +# Split data into train and test sets +train, test = partition(eachindex(y), 0.7, shuffle = true, rng = 123); +```` + +## Model Setup + +We'll compare two different models: +1. Logistic Regression: A linear model good for binary classification +2. Support Vector Machine (SVM): A powerful non-linear classifier + +For each model, we'll create two versions: +- One without standardization +- One with standardization + +The `Standardizer` transformer will rescale our features to have mean 0 and standard deviation 1. + +````julia +# Load our models from their respective packages +logreg = @load LogisticClassifier pkg = MLJLinearModels +svm = @load SVC pkg = LIBSVM +stand = Standardizer() # This is our standardization transformer + +# Create pipelines for each model variant +logreg_pipe = logreg() # Plain logistic regression +logreg_std_pipe = stand |> logreg() # Logistic regression with standardization +svm_pipe = svm() # Plain SVM +svm_std_pipe = stand |> svm() # SVM with standardization +```` + +```` +DeterministicPipeline( + standardizer = Standardizer( + features = Symbol[], + ignore = false, + ordered_factor = false, + count = false), + svc = SVC( + kernel = LIBSVM.Kernel.RadialBasis, + gamma = 0.0, + cost = 1.0, + cachesize = 200.0, + degree = 3, + coef0 = 0.0, + tolerance = 0.001, + shrinking = true), + cache = true) +```` + +## Model Evaluation + +Let's set up a vector of our models so we can evaluate them all using the same process. +For each model, we'll store its name and the corresponding pipeline. + +````julia +# Create a list of models to evaluate +models = [ + ("Logistic Regression", logreg_pipe), + ("Logistic Regression (standardized)", logreg_std_pipe), + ("SVM", svm_pipe), + ("SVM (standardized)", svm_std_pipe), +] +```` + +```` +4-element Vector{Tuple{String, MLJModelInterface.Supervised}}: + ("Logistic Regression", LogisticClassifier(lambda = 2.220446049250313e-16, …)) + ("Logistic Regression (standardized)", ProbabilisticPipeline(standardizer = Standardizer(features = Symbol[], …), …)) + ("SVM", SVC(kernel = RadialBasis, …)) + ("SVM (standardized)", DeterministicPipeline(standardizer = Standardizer(features = Symbol[], …), …)) +```` + +Now we'll loop through each model, train it, make predictions, and calculate accuracy. +This will help us compare how standardization affects each model's performance. + +Note: As an alternative to the explicit fit!/predict workflow below, we could use: +evaluate(model, X, y, resampling=[(train, test),], measure=accuracy) +This shortcut handles the training, prediction, and evaluation in one step. + +````julia +# Train and evaluate each model +results = DataFrame(model = String[], accuracy = Float64[]) +for (name, model) in models + # Create a machine learning model + mach = machine(model, X, y) + + # Train the model on the training data + MLJ.fit!(mach, rows = train) + + # Make predictions on the test data + # Note: Logistic regression returns probabilities, so we need to get the mode + yhat = + occursin("Logistic Regression", name) ? + MLJ.predict_mode(mach, rows = test) : # Get most likely class for logistic regression + MLJ.predict(mach, rows = test) # SVM directly predicts the class + + # Calculate accuracy + acc = accuracy(yhat, y[test]) + + # Store the results + push!(results, (name, acc)) +end +```` + +```` +β”Œ Warning: The number and/or types of data arguments do not match what the specified model +β”‚ supports. Suppress this type check by specifying `scitype_check_level=0`. +β”‚ +β”‚ Run `@doc MLJLinearModels.LogisticClassifier` to learn more about your model's requirements. +β”‚ +β”‚ Commonly, but non exclusively, supervised models are constructed using the syntax +β”‚ `machine(model, X, y)` or `machine(model, X, y, w)` while most other models are +β”‚ constructed with `machine(model, X)`. Here `X` are features, `y` a target, and `w` +β”‚ sample or class weights. +β”‚ +β”‚ In general, data in `machine(model, data...)` is expected to satisfy +β”‚ +β”‚ scitype(data) <: MLJ.fit_data_scitype(model) +β”‚ +β”‚ In the present case: +β”‚ +β”‚ scitype(data) = Tuple{ScientificTypesBase.Table{Union{AbstractVector{ScientificTypesBase.Continuous}, AbstractVector{ScientificTypesBase.Count}}}, AbstractVector{ScientificTypesBase.Multiclass{2}}} +β”‚ +β”‚ fit_data_scitype(model) = Tuple{ScientificTypesBase.Table{<:AbstractVector{<:ScientificTypesBase.Continuous}}, AbstractVector{<:ScientificTypesBase.Finite}} +β”” @ MLJBase ~/.julia/packages/MLJBase/7nGJF/src/machines.jl:237 +[ Info: Training machine(LogisticClassifier(lambda = 2.220446049250313e-16, …), …). +β”Œ Info: Solver: MLJLinearModels.LBFGS{Optim.Options{Float64, Nothing}, @NamedTuple{}} +β”‚ optim_options: Optim.Options{Float64, Nothing} +β”” lbfgs_options: @NamedTuple{} NamedTuple() +[ Info: Training machine(ProbabilisticPipeline(standardizer = Standardizer(features = Symbol[], …), …), …). +[ Info: Training machine(:standardizer, …). +[ Info: Training machine(:logistic_classifier, …). +β”Œ Info: Solver: MLJLinearModels.LBFGS{Optim.Options{Float64, Nothing}, @NamedTuple{}} +β”‚ optim_options: Optim.Options{Float64, Nothing} +β”” lbfgs_options: @NamedTuple{} NamedTuple() +β”Œ Warning: The number and/or types of data arguments do not match what the specified model +β”‚ supports. Suppress this type check by specifying `scitype_check_level=0`. +β”‚ +β”‚ Run `@doc LIBSVM.SVC` to learn more about your model's requirements. +β”‚ +β”‚ Commonly, but non exclusively, supervised models are constructed using the syntax +β”‚ `machine(model, X, y)` or `machine(model, X, y, w)` while most other models are +β”‚ constructed with `machine(model, X)`. Here `X` are features, `y` a target, and `w` +β”‚ sample or class weights. +β”‚ +β”‚ In general, data in `machine(model, data...)` is expected to satisfy +β”‚ +β”‚ scitype(data) <: MLJ.fit_data_scitype(model) +β”‚ +β”‚ In the present case: +β”‚ +β”‚ scitype(data) = Tuple{ScientificTypesBase.Table{Union{AbstractVector{ScientificTypesBase.Continuous}, AbstractVector{ScientificTypesBase.Count}}}, AbstractVector{ScientificTypesBase.Multiclass{2}}} +β”‚ +β”‚ fit_data_scitype(model) = Union{Tuple{ScientificTypesBase.Table{<:AbstractVector{<:ScientificTypesBase.Continuous}}, AbstractVector{<:ScientificTypesBase.Finite}}, Tuple{ScientificTypesBase.Table{<:AbstractVector{<:ScientificTypesBase.Continuous}}, AbstractVector{<:ScientificTypesBase.Finite}, Any}} +β”” @ MLJBase ~/.julia/packages/MLJBase/7nGJF/src/machines.jl:237 +[ Info: Training machine(SVC(kernel = RadialBasis, …), …). +[ Info: Training machine(DeterministicPipeline(standardizer = Standardizer(features = Symbol[], …), …), …). +[ Info: Training machine(:standardizer, …). +[ Info: Training machine(:svc, …). + +```` + +## Results Visualization + +Finally, let's visualize our results to see the impact of standardization. +We'll create a bar chart comparing the accuracy of each model. + +````julia +# Create a bar chart of model performance +p = bar( + results.model, + results.accuracy, + xlabel = "Model", + ylabel = "Accuracy", + title = "Model Accuracy Comparison", + legend = false, + bar_width = 0.6, + ylims = (0.5, 0.7), + xrotation = 17, +); +```` + +Save the plot + + +![Model Accuracy Comparison](standardization_results.png) + +## Conclusion + +From this tutorial, we can clearly see that standardization has a dramatic impact on model performance. + +Looking at the results: + +- **Logistic Regression**: Without standardization, it achieves only ~57% accuracy. With standardization, + its performance jumps dramatically to ~68% accuracy – the best performance among all models. + +- **SVM**: The baseline SVM achieves ~62% accuracy. When standardized, it improves to ~65% accuracy, + which is a significant boost but not as dramatic as what we see with logistic regression. + +Try this approach with other datasets and models to further explore the effects of standardization! + +## Further Resources + +* [MLJTransforms Documentation]() +* [Scientific Types in MLJ](https://alan-turing-institute.github.io/ScientificTypes.jl/dev/) +* [Feature Preprocessing in MLJ](https://alan-turing-institute.github.io/MLJ.jl/dev/transformers/) + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/tutorials/standardization/notebook.unexecuted.ipynb b/docs/src/tutorials/standardization/notebook.unexecuted.ipynb new file mode 100644 index 0000000..1f950da --- /dev/null +++ b/docs/src/tutorials/standardization/notebook.unexecuted.ipynb @@ -0,0 +1,361 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Effects of Feature Standardization on Model Performance\n", + "\n", + "Welcome to this tutorial on feature standardization in machine learning!\n", + "In this tutorial, we'll explore how standardizing features can significantly\n", + "impact the performance of different machine learning models.\n", + "\n", + "We'll compare Logistic Regression and Support Vector Machine (SVM) models,\n", + "both with and without feature standardization. This will help us understand\n", + "when and why preprocessing is important for model performance." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Setup\n", + "\n", + "First, let's make sure we're using a compatible Julia version. This code was tested with Julia 1.10.\n", + "Let's import all the packages we'll need for this tutorial." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load the necessary packages\n", + "using MLJ # Core MLJ framework\n", + "using LIBSVM # For Support Vector Machine\n", + "using DataFrames # For displaying results\n", + "using RDatasets # To load sample datasets\n", + "using Random # For reproducibility\n", + "using ScientificTypes # For proper data typing\n", + "using Plots # For visualizations\n", + "using MLJLinearModels # For Logistic Regression" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Data Preparation\n", + "\n", + "Let's load the Pima Indians Diabetes Dataset. This is a classic dataset for\n", + "binary classification, where we predict diabetes status based on various health metrics.\n", + "\n", + "The interesting thing about this dataset is that different features have very different scales.\n", + "We'll artificially exaggerate this by adding a large constant to the glucose values." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load the dataset and modify it to have extreme scale differences\n", + "df = RDatasets.dataset(\"MASS\", \"Pima.tr\")\n", + "df.Glu .+= 10000.0; # Artificially increase the scale of glucose values" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Let's examine the first few rows of our dataset:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "first(df, 5)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Data Type Conversion\n", + "\n", + "In MLJ, it's important to ensure that our data has the correct scientific types.\n", + "This helps the framework understand how to properly handle each column.\n", + "\n", + "We'll convert our columns to their appropriate types:\n", + "- `Count` for discrete count data\n", + "- `Continuous` for continuous numerical data\n", + "- `Multiclass` for our target variable" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Coerce columns to the right scientific types\n", + "df = coerce(df,\n", + " :NPreg => Count, # Number of pregnancies is a count\n", + " :Glu => Continuous, # Glucose level is continuous\n", + " :BP => Continuous, # Blood pressure is continuous\n", + " :Skin => Continuous, # Skin thickness is continuous\n", + " :BMI => Continuous, # Body mass index is continuous\n", + " :Ped => Continuous, # Diabetes pedigree is continuous\n", + " :Age => Continuous, # Age is continuous\n", + " :Type => Multiclass, # Diabetes status is our target (Yes/No)\n", + ");" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Let's verify that our schema looks correct:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "ScientificTypes.schema(df)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Feature Extraction and Data Splitting\n", + "\n", + "Now we'll separate our features from our target variable.\n", + "In MLJ, this is done with the `unpack` function." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Unpack features (X) and target (y)\n", + "y, X = unpack(df, ==(:Type); rng = 123);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we'll split our data into training and testing sets.\n", + "We'll use 70% for training and 30% for testing." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Split data into train and test sets\n", + "train, test = partition(eachindex(y), 0.7, shuffle = true, rng = 123);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Model Setup\n", + "\n", + "We'll compare two different models:\n", + "1. Logistic Regression: A linear model good for binary classification\n", + "2. Support Vector Machine (SVM): A powerful non-linear classifier\n", + "\n", + "For each model, we'll create two versions:\n", + "- One without standardization\n", + "- One with standardization\n", + "\n", + "The `Standardizer` transformer will rescale our features to have mean 0 and standard deviation 1." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Load our models from their respective packages\n", + "logreg = @load LogisticClassifier pkg = MLJLinearModels\n", + "svm = @load SVC pkg = LIBSVM\n", + "stand = Standardizer() # This is our standardization transformer\n", + "\n", + "# Create pipelines for each model variant\n", + "logreg_pipe = logreg() # Plain logistic regression\n", + "logreg_std_pipe = Pipeline(stand, logreg()) # Logistic regression with standardization\n", + "svm_pipe = svm() # Plain SVM\n", + "svm_std_pipe = Pipeline(stand, svm()) # SVM with standardization" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Model Evaluation\n", + "\n", + "Let's set up a vector of our models so we can evaluate them all using the same process.\n", + "For each model, we'll store its name and the corresponding pipeline." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create a list of models to evaluate\n", + "models = [\n", + " (\"Logistic Regression\", logreg_pipe),\n", + " (\"Logistic Regression (standardized)\", logreg_std_pipe),\n", + " (\"SVM\", svm_pipe),\n", + " (\"SVM (standardized)\", svm_std_pipe),\n", + "]" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now we'll loop through each model, train it, make predictions, and calculate accuracy.\n", + "This will help us compare how standardization affects each model's performance." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Train and evaluate each model\n", + "results = DataFrame(model = String[], accuracy = Float64[])\n", + "for (name, model) in models\n", + " # Create a machine learning model\n", + " mach = machine(model, X, y)\n", + "\n", + " # Train the model on the training data\n", + " MLJ.fit!(mach, rows = train)\n", + "\n", + " # Make predictions on the test data\n", + " # Note: Logistic regression returns probabilities, so we need to get the mode\n", + " yhat =\n", + " occursin(\"Logistic Regression\", name) ?\n", + " MLJ.predict_mode(mach, rows = test) : # Get most likely class for logistic regression\n", + " MLJ.predict(mach, rows = test) # SVM directly predicts the class\n", + "\n", + " # Calculate accuracy\n", + " acc = accuracy(yhat, y[test])\n", + "\n", + " # Store the results\n", + " push!(results, (name, acc))\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Results Visualization\n", + "\n", + "Finally, let's visualize our results to see the impact of standardization.\n", + "We'll create a bar chart comparing the accuracy of each model." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create a bar chart of model performance\n", + "p = bar(\n", + " results.model,\n", + " results.accuracy,\n", + " xlabel = \"Model\",\n", + " ylabel = \"Accuracy\",\n", + " title = \"Model Accuracy Comparison\",\n", + " legend = false,\n", + " bar_width = 0.6,\n", + " ylims = (0.5, 0.7),\n", + " xrotation = 17,\n", + ");" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Save the plot" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "savefig(p, \"standardization_results.png\"); #hide" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Conclusion\n", + "\n", + "From this tutorial, we can clearly see that standardization has a dramatic impact on model performance.\n", + "\n", + "Looking at the results:\n", + "\n", + "- **Logistic Regression**: Without standardization, it achieves only ~57% accuracy. With standardization,\n", + " its performance jumps dramatically to ~68% accuracy – the best performance among all models.\n", + "\n", + "- **SVM**: The baseline SVM achieves ~62% accuracy. When standardized, it improves to ~65% accuracy,\n", + " which is a significant boost but not as dramatic as what we see with logistic regression.\n", + "\n", + "Try this approach with other datasets and models to further explore the effects of standardization!" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.5" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.5", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/tutorials/standardization/standardization_results.png b/docs/src/tutorials/standardization/standardization_results.png new file mode 100644 index 0000000..1db8b27 Binary files /dev/null and b/docs/src/tutorials/standardization/standardization_results.png differ diff --git a/src/common_docs.jl b/src/common_docs.jl index 1a3a401..8c4b4d5 100644 --- a/src/common_docs.jl +++ b/src/common_docs.jl @@ -15,13 +15,13 @@ const features_doc = """ included/excluded. """ const ignore_doc = """ -- ignore=true: Whether to exclude or include the features given in `features` +- `ignore=true`: Whether to exclude or include the features given in `features` """ const ordered_factor_doc = """ -- ordered_factor=false: Whether to encode `OrderedFactor` or ignore them +- `ordered_factor=false`: Whether to encode `OrderedFactor` or ignore them """ const encoded_features_doc = """ -- encoded_features: The subset of the categorical features of `X` that were encoded +- `encoded_features`: The subset of the categorical features of `X` that were encoded """ const cache_doc = """ - `cache`: The output of `contrast_encoder_fit` diff --git a/src/encoders/frequency_encoding/frequency_encoding.jl b/src/encoders/frequency_encoding/frequency_encoding.jl index 936542c..1b3916a 100644 --- a/src/encoders/frequency_encoding/frequency_encoding.jl +++ b/src/encoders/frequency_encoding/frequency_encoding.jl @@ -31,7 +31,7 @@ function frequency_encoder_fit( frequency_map = (!normalize) ? countmap(col) : proportionmap(col) feat_levels = levels(col) statistic_given_feat_val = Dict{eltype(feat_levels), output_type}( - level => frequency_map[level] for level in feat_levels + level => get(frequency_map, level, 0) for level in feat_levels ) return statistic_given_feat_val end diff --git a/src/encoders/frequency_encoding/interface_mlj.jl b/src/encoders/frequency_encoding/interface_mlj.jl index 83c002f..a00b672 100644 --- a/src/encoders/frequency_encoding/interface_mlj.jl +++ b/src/encoders/frequency_encoding/interface_mlj.jl @@ -100,7 +100,7 @@ $ordered_factor_doc # Operations -- `transform(mach, Xnew)`: Apply frequency encoding to selected `Multiclass` or `OrderedFactor features of `Xnew` specified by hyper-parameters, and +- `transform(mach, Xnew)`: Apply frequency encoding to selected `Multiclass` or `OrderedFactor` features of `Xnew` specified by hyper-parameters, and return the new table. Features that are neither `Multiclass` nor `OrderedFactor` are always left unchanged. diff --git a/src/encoders/ordinal_encoding/interface_mlj.jl b/src/encoders/ordinal_encoding/interface_mlj.jl index 146b86c..7b9a30c 100644 --- a/src/encoders/ordinal_encoding/interface_mlj.jl +++ b/src/encoders/ordinal_encoding/interface_mlj.jl @@ -95,7 +95,7 @@ $ordered_factor_doc # Operations -- `transform(mach, Xnew)`: Apply ordinal encoding to selected `Multiclass` or `OrderedFactor features of `Xnew` specified by hyper-parameters, and +- `transform(mach, Xnew)`: Apply ordinal encoding to selected `Multiclass` or `OrderedFactor` features of `Xnew` specified by hyper-parameters, and return the new table. Features that are neither `Multiclass` nor `OrderedFactor` are always left unchanged. diff --git a/src/encoders/target_encoding/interface_mlj.jl b/src/encoders/target_encoding/interface_mlj.jl index 36e9b82..145e787 100644 --- a/src/encoders/target_encoding/interface_mlj.jl +++ b/src/encoders/target_encoding/interface_mlj.jl @@ -1,7 +1,7 @@ ### TargetEncoding with MLJ Interface # 1. Interface Struct -mutable struct TargetEncoder{R1 <: Real, R2 <: Real, A <: Any} <: +mutable struct TargetEncoder{R1 <: Real, R2 <: Union{Real,Symbol}, A <: Any} <: Unsupervised features::A ignore::Bool @@ -27,7 +27,7 @@ end; # 3. Hyperparameter checks function MMI.clean!(t::TargetEncoder) message = "" - if t.m < 0 + if isa(t.m, Real) && t.m < 0 throw( ArgumentError(NON_NEGATIVE_m(t.m)), ) diff --git a/src/encoders/target_encoding/target_encoding.jl b/src/encoders/target_encoding/target_encoding.jl index bb13a42..e99ec6f 100644 --- a/src/encoders/target_encoding/target_encoding.jl +++ b/src/encoders/target_encoding/target_encoding.jl @@ -135,7 +135,7 @@ function target_encoder_fit( ignore::Bool = true, ordered_factor::Bool = false, lambda::Real = 1.0, - m::Real = 0, + m = 0, ) # 1. Figure out task (classification or regression) y_scitype = elscitype(y) diff --git a/src/generic.jl b/src/generic.jl index a283d7d..60b46fe 100644 --- a/src/generic.jl +++ b/src/generic.jl @@ -1,28 +1,43 @@ # generic functions go here; such function can be used throughout multiple methods """ -**Private method.** +```julia +generic_fit(X, + features = Symbol[], + args...; + ignore::Bool = true, + ordered_factor::Bool = false, + feature_mapper, + kwargs..., +) +``` + +Given a `feature_mapper` (see definition below), this method applies + `feature_mapper` across a specified subset of categorical columns in X and returns a dictionary + whose keys are the feature names, and each value is the corresponding + level‑to‑value mapping produced by `feature_mapper`. + +In essence, it spares effort of looping over each column and applying the `feature_mapper` function manually as well as handling the feature selection logic. -A generic function to fit a class of transformers where its convenient to define a single `feature_mapper` function that -takes the column as a vector and potentially other arguments (as passed in ...args and ...kwargs) and returns -a dictionary that maps each level of the categorical feature to a scalar or vector -according to the transformation logic. In other words, the `feature_mapper` simply answers the question "For level n of -the current categorical feature c, what should the new value or vector (multiple features) be as defined by the transformation -logic?" # Arguments - $X_doc - $features_doc - $ignore_doc - $ordered_factor_doc - - feature_mapper: Defined above. +$X_doc +$features_doc +$ignore_doc +$ordered_factor_doc +- feature_mapper: function that, for a given vector (eg, corresponding to a categorical column from the dataset `X`), + produces a mapping from each category level name in this vector to a scalar or vector according to specified transformation logic. -# Returns +# Note + +- Any additional arguments (whether keyword or not) provided to this function are passed to the `feature_mapper` function which + is helpful when `feature_mapper` requires additional arguments to compute the mapping (eg, hyperparameters). - - mapping_per_feat_level: Maps each level for each feature in a subset of the categorical features of - X into a scalar or a vector. - $encoded_features_doc +# Returns +- `mapping_per_feat_level`: Maps each level for each feature in a subset of the categorical features of + X into a scalar or a vector. +$encoded_features_doc """ function generic_fit(X, features = Symbol[], @@ -116,25 +131,47 @@ end """ -**Private method.** +```julia +generic_transform( + X, + mapping_per_feat_level; + single_feat::Bool = true, + ignore_unknown::Bool = false, + use_levelnames::Bool = false, + custom_levels = nothing, + ensure_categorical::Bool = false, +) +``` + + +Apply a per‐level feature mapping to selected categorical columns in `X`, returning a new table of the same type. + +# Arguments + +$X_doc +- `mapping_per_feat_level::Dict{Symbol,Dict}`: + A dict whose keys are feature names (`Symbol`) and values are themselves dictionaries + mapping each observed level to either a scalar (if `single_feat=true`) or a fixed‐length vector + (if `single_feat=false`). Only columns whose names appear in `mapping_per_feat_level` are + transformed; others pass through unchanged. +- `single_feat::Bool=true`: + If `true`, each input level is mapped to a single scalar feature; if `false`, + each input level is mapped to a length‑`k` vector, producing `k` output columns. +- `ignore_unknown::Bool=false`: + If `false`, novel levels in `X` (not seen during fit) will raise an error; + if `true`, novel levels will be left unchanged (identity mapping). +- `use_levelnames::Bool=false`: + When `single_feat=false`, controls naming of the expanded columns: `true`: use actual level names (e.g. `:color_red`, `:color_blue`), + `false`: use numeric indices (e.g. `:color_1`, `:color_2`). +- `custom_levels::Union{Nothing,Vector}`: + If not `nothing`, overrides the names of levels used to generate feature names when `single_feat=false`. +- `ensure_categorical::Bool=false`: + Only when `single_feat=true` and if `true`, preserves the categorical type of the column after + recoding (eg, feature should still be recognized as `Multiclass` after transformation) + +# Returns -Given a table `X` and a dictionary `mapping_per_feat_level` which maps each level for each column in -a subset of categorical features of X into a scalar or a vector (as specified in `single_feat`) - - - transforms each value (some level) in each column in `X` using the function in `mapping_per_feat_level` - into a scalar (`single_feat=true`) - - - transforms each value (some level) in each column in `X` using the function in `mapping_per_feat_level` - into a set of `k` features where `k` is the length of the vector (`single_feat=false`) - - In both cases it attempts to preserve the type of the table. - - In the latter case, it assumes that all levels under the same category are mapped to vectors of the same length. Such - assumption is necessary because any column in X must correspond to a constant number of features - in the output table (which is equal to k). - - Features not in the dictionary are mapped to themselves (i.e., not changed). - - Levels not in the nested dictionary are mapped to themselves if `identity_map_unknown` is true else raise an error. - - use_levelnames: if true, the new feature names are generated using the level names when the transform generates multiple features; - else they are generated using the indices of the levels. - - custom_levels: if not `nothing`, then the levels of the categorical features are replaced by the custom_levels +A new table of potentially similar to `X` but with categorical columns transformed according to `mapping_per_feat_level`. """ function generic_transform( X,