diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index af638bc..6b121be 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -5,12 +5,14 @@ on: push: paths: # run CI/CD when the tests change, the dependencies change, or the version changes - src/* + - ext/* - test/* - Project.toml tags: "*" pull_request: # run when pull requests are made paths: - src/* + - ext/* - test/* - Manifest.toml - Project.toml @@ -22,37 +24,43 @@ jobs: fail-fast: false matrix: version: - - "1.11" - "1.12" os: - ubuntu-latest - macOS-latest - - windows-latest arch: - x64 + exclude: + - os: macOS-latest + arch: x64 + include: + - os: macOS-latest + arch: aarch64 + version: '1.12' steps: - - uses: actions/checkout@v2 - - uses: julia-actions/setup-julia@v1 + - uses: actions/checkout@v4 + - uses: julia-actions/setup-julia@v2 with: version: ${{ matrix.version }} arch: ${{ matrix.arch }} - uses: actions/cache@v4 - env: - cache-name: cache-artifacts - JULIA_IN_GITHUB_ACTION: true - JULIA_IN_GITHUB_ACTION_ON_MAC: ${{matrix.os}} with: - path: ~/.julia/artifacts - key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + path: ~/.julia/packages + key: ${{ runner.os }}-julia-${{ hashFiles('**/Project.toml') }} restore-keys: | - ${{ runner.os }}-test-${{ env.cache-name }}- - ${{ runner.os }}-test- - ${{ runner.os }}- + ${{ runner.os }}-julia- - uses: julia-actions/julia-buildpkg@v1 + + - name: Add CUDA stack (Linux only) + if: runner.os == 'Linux' + run: julia --project=. -e 'using Pkg; Pkg.add(["CUDA", "cuFFT"])' + - name: Add Metal (macOS only) + if: runner.os == 'macOS' + run: julia --project=. -e 'using Pkg; Pkg.add("Metal")' - uses: julia-actions/julia-runtest@v1 - with: - annotate: true + env: + GROUP: ${{ runner.os == 'Linux' && 'CUDA' || runner.os == 'macOS' && 'Metal' || 'CPU' }} - uses: julia-actions/julia-processcoverage@v1 - - uses: codecov/codecov-action@v1 + - uses: codecov/codecov-action@v4 with: file: lcov.info diff --git a/.github/workflows/docsBuild.yml b/.github/workflows/docsBuild.yml index 8fb4825..239b15b 100644 --- a/.github/workflows/docsBuild.yml +++ b/.github/workflows/docsBuild.yml @@ -5,22 +5,25 @@ on: paths: # rebuild the docs when the version changes or the docs change - docs/* - Project.toml + - src/* pull_request: # run when pull requests are made paths: - docs/* - Project.toml + - src/* jobs: docs: name: Documentation runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: julia-actions/setup-julia@latest + - uses: actions/checkout@v4 + - uses: julia-actions/setup-julia@v2 with: - version: '1.7' + version: '1.12' - name: Install dependencies run: | - sudo apt install libxt6 libxrender1 libxext6 libqt5widgets5 + sudo apt-get update + sudo apt-get install -y --fix-missing libxt6 libxrender1 libxext6 libqt5widgets5 - name: Instantiate env: PYTHON: "" @@ -38,4 +41,4 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: julia --project=docs --code-coverage=user docs/make.jl - uses: julia-actions/julia-processcoverage@v1 - - uses: codecov/codecov-action@v1 + - uses: codecov/codecov-action@v6 diff --git a/Project.toml b/Project.toml index 144a62e..956660e 100644 --- a/Project.toml +++ b/Project.toml @@ -5,6 +5,7 @@ version = "1.2.0" [deps] AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c" +Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" @@ -14,24 +15,30 @@ Wavelets = "29a6e085-ba6d-5f35-a997-948ac2efa89a" [weakdeps] CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" +cuFFT = "533571aa-0936-420e-b4be-9c66f5f626ca" +Metal = "dde4c033-4e86-420c-a63e-0dd931031962" [extensions] -CUDAExt = "CUDA" +CUDAExt = ["CUDA", "cuFFT"] +MetalExt = "Metal" [compat] -AbstractFFTs = "1.0" -CUDA = "4, 5, 6" +AbstractFFTs = "1.5.0" +Adapt = "4.7.0" +CUDA = "6.1" +cuFFT = "6.1" Documenter = "0.27, 1" FFTW = "1.4" Interpolations = "0.13, 0.14, 0.15, 0.16" +julia = "1.12" LinearAlgebra = "1" +Metal = "1.10" SpecialFunctions = "1.3, 2" Wavelets = "0.9, 0.10" -julia = "1.9" + [extras] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" -CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" @@ -42,5 +49,4 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" Wavelets = "29a6e085-ba6d-5f35-a997-948ac2efa89a" [targets] -test = ["Test", "FFTW", "Wavelets", "Interpolations", "LinearAlgebra", - "Logging", "Random", "Documenter", "CUDA", "BenchmarkTools"] +test = ["Test", "FFTW", "Wavelets", "Interpolations", "LinearAlgebra", "Logging", "Random", "Documenter", "BenchmarkTools"] diff --git a/README.md b/README.md index e27074e..6f697b2 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ julia> res = cwt(f, c) And now we make a scalogram to actually visualize these entries: ```julia -freqs = getMeanFreq(computeWavelets(n, c)[1]) +freqs = getMeanFreq(n, c) freqs[1] = 0 p2 = heatmap(t, freqs, log.(abs.(res).^2)', xlabel= "time (s)", ylabel="frequency (Hz)", colorbar=false, c=cgrad(:viridis, scale=:log10)) l = @layout [a{.3h};b{.7h}] diff --git a/docs/Manifest.toml b/docs/Manifest.toml index ef69261..b3135e2 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.9.3" +julia_version = "1.12.6" manifest_format = "2.0" -project_hash = "5aef91bcf4fe55571b4eae3be68597c23c363fbb" +project_hash = "d8cbfbeb3d08aaa07a3caaaba1d1f36fd61df7cf" [[deps.ANSIColoredPrinters]] git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" @@ -21,77 +21,99 @@ weakdeps = ["ChainRulesCore", "Test"] AbstractFFTsTestExt = "Test" [[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "76289dc51920fdc6e0013c872ba9551d54961c24" +deps = ["LinearAlgebra"] +git-tree-sha1 = "daa72978cd7a624246e894a4f4f067706d4e17e2" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "3.6.2" -weakdeps = ["StaticArrays"] +version = "4.7.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.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.1" +version = "1.1.2" [[deps.Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" [[deps.AxisAlgorithms]] deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] -git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" -version = "1.0.1" +version = "1.1.0" [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Bessels]] +git-tree-sha1 = "4435559dc39793d53a9e3d278e185e920b4619ef" +uuid = "0e736298-9ec6-45e8-9647-e4fc86a2fe38" +version = "0.2.8" [[deps.BitFlags]] -git-tree-sha1 = "43b1a4a8f797c1cddadf60499a8a077d4af2cd2d" +git-tree-sha1 = "bbe1079eecf9c9fbb52765193ad2bae27ae09bc8" uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" -version = "0.1.7" +version = "0.1.10" [[deps.Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.8+0" +version = "1.0.9+0" [[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "1fa950ebc3e37eccd51c6a8fe1f92f7d86263522" uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.16.1+1" +version = "1.18.7+0" [[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "e30f2f4e20f7f186dc36529910beaedc60cfa644" +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "12177ad6b3cad7fd50c8b3825ce24a99ad61c18f" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.16.0" +version = "1.26.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "02aa26a4cf76381be7f66e020a3eddeb27b0a092" +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.2" +version = "0.7.8" [[deps.ColorSchemes]] deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" +git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.24.0" +version = "3.31.0" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.4" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" [[deps.ColorVectorSpace]] deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.10.0" +version = "0.11.0" weakdeps = ["SpecialFunctions"] [deps.ColorVectorSpace.extensions] @@ -99,15 +121,15 @@ weakdeps = ["SpecialFunctions"] [[deps.Colors]] deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.10" +version = "0.13.1" [[deps.Compat]] -deps = ["UUIDs"] -git-tree-sha1 = "8a62af3e248a8c4bad6b32cbbe663ae02275e32c" +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.10.0" +version = "4.18.1" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -116,65 +138,83 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+0" +version = "1.3.0+1" [[deps.ConcurrentUtilities]] deps = ["Serialization", "Sockets"] -git-tree-sha1 = "5372dbbf8f0bdb8c700db5367132925c0771ef7e" +git-tree-sha1 = "21d088c496ea22914fe80906eb5bce65755e5ec8" uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.2.1" +version = "2.5.1" [[deps.Conda]] deps = ["Downloads", "JSON", "VersionParsing"] -git-tree-sha1 = "8c86e48c0db1564a1d49548d3515ced5d604c408" +git-tree-sha1 = "8f06b0cfa4c514c7b9546756dbae91fcfbc92dc9" uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d" -version = "1.9.1" +version = "1.10.3" [[deps.ConstructionBase]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "c53fc348ca4d40d7b371e71fd52251839080cbc9" +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.5.4" +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.ContinuousWavelets]] deps = ["AbstractFFTs", "Documenter", "FFTW", "Interpolations", "LinearAlgebra", "SpecialFunctions", "Wavelets"] path = ".." uuid = "96eb917e-2868-4417-9cb6-27e7ff17528f" -version = "1.1.3" +version = "1.1.8" + + [deps.ContinuousWavelets.extensions] + CUDAExt = "CUDA" + + [deps.ContinuousWavelets.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" [[deps.Contour]] -git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.2" +version = "0.6.3" [[deps.DSP]] -deps = ["Compat", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "f7f4319567fe769debfcf7f8c03d8da1dd4e2fb0" +deps = ["Bessels", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "d335b2929e1b6067951a1250df247cc5fab7d40e" uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2" -version = "0.7.9" +version = "0.8.5" +weakdeps = ["OffsetArrays"] + + [deps.DSP.extensions] + OffsetArraysExt = "OffsetArrays" [[deps.DataAPI]] -git-tree-sha1 = "8da84edb865b0b5b0100c0666a9bc9a0b71c553c" +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.15.0" +version = "1.16.0" [[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "3dbd312d370723b6bb43ba9d02fc36abade4518d" +deps = ["OrderedCollections"] +git-tree-sha1 = "6fb53a69613a0b2b68a0d12671717d307ab8b24e" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.15" +version = "0.19.5" [[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.DelimitedFiles]] deps = ["Mmap"] @@ -185,12 +225,12 @@ version = "1.9.1" [[deps.Distributed]] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" [[deps.DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.3" +version = "0.9.5" [[deps.Documenter]] deps = ["ANSIColoredPrinters", "Base64", "Dates", "DocStringExtensions", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] @@ -201,122 +241,135 @@ version = "0.27.25" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" +version = "1.7.0" [[deps.EpollShim_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" -version = "0.0.20230411+0" +version = "0.0.20230411+1" [[deps.ExceptionUnwrapping]] deps = ["Test"] -git-tree-sha1 = "e90caa41f5a86296e014e148ee061bd6c3edec96" +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" -version = "0.1.9" +version = "0.1.11" [[deps.Expat_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c" +git-tree-sha1 = "e6c4a6407a949e79a9d3f249bf49e6987c80e01f" uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.5.0+0" +version = "2.8.2+0" [[deps.FFMPEG]] deps = ["FFMPEG_jll"] -git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +git-tree-sha1 = "95ecf07c2eea562b5adbd0696af6db62c0f52560" uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.1" +version = "0.4.5" [[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +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", "libva_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "7a58e45171b63ed4782f2d36fdee8713a469e6e0" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.2+2" +version = "8.1.2+0" [[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "b4fbdd20c889804969571cc589900803edda16b7" +deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969" uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.7.1" +version = "1.10.0" [[deps.FFTW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6866aec60ef98e3164cd8d6855225684207e9dff" uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" -version = "3.3.10+0" +version = "3.3.12+0" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" [[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +deps = ["Random", "Statistics"] +git-tree-sha1 = "59af96b98217c6ef4ae0dfe065ac7c20831d1a84" uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.4" +version = "0.8.6" [[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.13.93+0" +version = "2.17.1+0" -[[deps.Formatting]] -deps = ["Printf"] -git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" -uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" -version = "0.4.2" +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" [[deps.FreeType2_jll]] deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" +git-tree-sha1 = "70329abc09b886fd2c5d94ad2d9527639c421e3e" uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.1+0" +version = "2.14.3+1" [[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.10+0" +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", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] -git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +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 = "9e0fb9e54594c47f278d75063980e43066e26e20" uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.3.8+0" +version = "3.4.1+1" [[deps.GR]] -deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "UUIDs", "p7zip_jll"] -git-tree-sha1 = "27442171f28c952804dede8ff72828a96f2bfc1f" +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 = "f954322d5de03ec630d177cda203dcd92b6be399" uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.72.10" +version = "0.73.26" + + [deps.GR.extensions] + IJuliaExt = "IJulia" + + [deps.GR.weakdeps] + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" [[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 = "025d171a2847f616becc0f84c8dc62fe18f0f6dd" +git-tree-sha1 = "6fada551286ab6ea4ca1628cb2de9f166a2ec966" uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.72.10+0" +version = "0.73.26+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.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.Ghostscript_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Zlib_jll"] +git-tree-sha1 = "38044a04637976140074d0b0621c1edf0eb531fd" +uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" +version = "9.55.1+0" [[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "e94c92c7bf4819685eb80186d51c43e71d4afa17" +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "24f6def62397474a297bfcec22384101609142ed" uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.76.5+0" +version = "2.86.3+0" [[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "69ffb934a5c5b7e086a0b4fee3427db2556fba6e" uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.14+0" +version = "1.3.16+0" [[deps.Grisu]] git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" @@ -324,60 +377,69 @@ 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 = "5eab648309e2e060198b45820af1a37182de3cce" +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "51059d23c8bb67911a2e6fd5130229113735fc7e" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.0" +version = "1.11.0" [[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] -git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +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 = "2.8.1+1" +version = "8.5.1+0" [[deps.IOCapture]] deps = ["Logging", "Random"] -git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" +git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "0.2.3" +version = "0.2.5" [[deps.IntelOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ad37c091f7d7daf900963171600d7c1c5c3ede32" +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2023.2.0+0" +version = "2025.2.0+0" [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" [[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "721ec2cf720536ad005cb38f50dbba7b02419a15" +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "48922d06068130f87e43edef52382e6a94305ae6" uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.14.7" +version = "0.16.3" + + [deps.Interpolations.extensions] + InterpolationsForwardDiffExt = "ForwardDiff" + InterpolationsUnitfulExt = "Unitful" + + [deps.Interpolations.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [[deps.IrrationalConstants]] -git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.2" +version = "0.2.6" [[deps.IterTools]] -git-tree-sha1 = "4ced6667f9974fc5c5943fa5e2ef1ca43ea9e450" +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.8.0" +version = "1.10.0" [[deps.JLFzf]] -deps = ["Pipe", "REPL", "Random", "fzf_jll"] -git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +deps = ["REPL", "Random", "fzf_jll"] +git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b" uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" -version = "0.1.5" +version = "0.1.11" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +git-tree-sha1 = "7204148362dafe5fe6a273f855b8ccbe4df8173e" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" +version = "1.8.0" [[deps.JSON]] deps = ["Dates", "Mmap", "Parsers", "Unicode"] @@ -387,136 +449,136 @@ version = "0.21.4" [[deps.JpegTurbo_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6f2675ef130a300a112286de91973805fcc5ffbc" +git-tree-sha1 = "1dae3057da6f2b9c857afef03177bbdc7c4afe92" uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "2.1.91+0" +version = "3.2.0+0" + +[[deps.JuliaSyntaxHighlighting]] +deps = ["StyledStrings"] +uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" +version = "1.12.0" [[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.1+0" +version = "3.100.3+0" [[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "17b94ecafcfa45e8360a4fc9ca6b583b049e4e37" uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "3.0.0+1" +version = "4.1.0+0" [[deps.LLVMOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f689897ccbe049adb19a065c495e75f372ecd42b" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b7970cef8ae1c990ba0c09cd8bdc1145e006632f" uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "15.0.4+0" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.1+0" +version = "22.1.7+0" [[deps.LaTeXStrings]] -git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.3.0" +version = "1.4.0" [[deps.Latexify]] -deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] -git-tree-sha1 = "f428ae552340899a935973270b8d98e5a31c49fe" +deps = ["Format", "Ghostscript_jll", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "44f93c47f9cd6c7e431f2f2091fcba8f01cd7e8f" uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.16.1" +version = "0.16.10" [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.LazyArtifacts]] deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.3" +version = "0.6.4" [[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "7.84.0+0" +version = "8.15.0+0" [[deps.LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.9.0+0" [[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +deps = ["Artifacts", "Libdl", "OpenSSL_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.10.2+0" +version = "1.11.3+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" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.2.2+1" - -[[deps.Libgcrypt_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] -git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" -uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" -version = "1.8.7+0" +version = "3.4.7+0" [[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.6.0+0" - -[[deps.Libgpg_error_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" -uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" -version = "1.42.0+0" +version = "1.7.1+1" [[deps.Libiconv_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.17.0+0" +version = "1.18.0+0" [[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "cc3ad4faf30015a3e8094c9b5b7f19e85bdf2386" uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.35.0+0" +version = "2.42.0+0" [[deps.Libtiff_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" +git-tree-sha1 = "aebd334d06cee9f24cea70bd19a39749daf73881" uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.5.1+1" +version = "4.7.3+0" [[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d620582b1f0cbe2c72dd1d5bd195a9ce73370ab1" uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.36.0+0" +version = "2.42.0+0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.12.0" [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "7d6dd4e9212aebaeed356de34ccf262a3cd415aa" +git-tree-sha1 = "bba2d9aa057d8f126415de240573e86a8f39d2a1" uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.26" +version = "1.0.1" [deps.LogExpFunctions.extensions] LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" @@ -530,163 +592,173 @@ version = "0.3.26" [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" [[deps.LoggingExtras]] deps = ["Dates", "Logging"] -git-tree-sha1 = "0d097476b6c381ab7906460ef1ef1638fbce1d91" +git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575" uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.0.2" +version = "1.2.0" [[deps.MKL_jll]] -deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] -git-tree-sha1 = "eb006abbd7041c28e0d16260e50a24f8f9104913" +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2023.2.0+0" +version = "2025.2.0+0" [[deps.MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "9ee1618cbf5240e6d4e0371d6f24065083f60c48" +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.11" +version = "0.5.16" [[deps.Markdown]] -deps = ["Base64"] +deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" [[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] -git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "8785729fa736197687541f7053f6d8ab7fc44f92" uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.1.7" +version = "1.1.10" [[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ff69a2b1330bcb730b9ac1ab7dd680176f5896b8" uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+0" +version = "2.28.1010+0" [[deps.Measures]] -git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +git-tree-sha1 = "b513cedd20d9c914783d8ad83d08120702bf2c77" uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" -version = "0.3.2" +version = "0.3.3" [[deps.Missings]] deps = ["DataAPI"] -git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.1.0" +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 = "2022.10.11" +version = "2025.11.4" [[deps.NaNMath]] deps = ["OpenLibm_jll"] -git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +git-tree-sha1 = "dbd2e8cd2c1c27f0b584f6661b4309609c5a685e" uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.0.2" +version = "1.1.4" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" +version = "1.3.0" [[deps.OffsetArrays]] -deps = ["Adapt"] -git-tree-sha1 = "2ac17d29c523ce1cd38e27785a7d23024853a4bb" +git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.12.10" +version = "1.17.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" [[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" +version = "1.3.6+0" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.21+4" +version = "0.3.29+0" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+0" +version = "0.8.7+0" [[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "51901a49222b09e3743c65b8847687ae5fc78eb2" +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "1d1aaa7d449b58415f97d2839c318b70ffb525a0" uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.4.1" +version = "1.6.1" [[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a12e56c72edee3ce6b96667745e6cbbe5498f200" +deps = ["Artifacts", "Libdl"] uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "1.1.23+0" +version = "3.5.4+0" [[deps.OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.5+0" +version = "0.5.6+0" [[deps.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e2bb57a313a74b8104064b7efd01406c0a50d2ff" uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.2+0" +version = "1.6.1+0" [[deps.OrderedCollections]] -git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3" +git-tree-sha1 = "94ba93778373a53bfd5a0caaf7d809c445292ff4" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.6.2" +version = "1.8.2" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+0" +version = "10.44.0+1" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58e5ed5e386e156bd93e86b305ebd21ac63d2d04" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.57.1+0" [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" +git-tree-sha1 = "32a4e09c5f29402573d673901778a0e03b0807b9" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.7.2" - -[[deps.Pipe]] -git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" -uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" -version = "1.3.0" +version = "2.8.6" [[deps.Pixman_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] -git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" +git-tree-sha1 = "e4a6721aa89e62e5d4217c0b21bd714263779dda" uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.42.2+0" +version = "0.46.4+0" [[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +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.9.2" +version = "1.12.1" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" [[deps.PlotThemes]] deps = ["PlotUtils", "Statistics"] -git-tree-sha1 = "1f03a2d339f42dca4a4da149c7e15e9b896ad899" +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" -version = "3.1.0" +version = "3.3.0" [[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "f92e1315dadf8c46561fb9396e525f7200cdc227" +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.3.5" +version = "1.4.4" [[deps.Plots]] -deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Preferences", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] -git-tree-sha1 = "ccee59c6e48e6f2edf8a5b64dc817b6729f99eb5" +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", "Unzip"] +git-tree-sha1 = "cb20a4eacda080e517e4deb9cfb6c7c518131265" uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.39.0" +version = "1.41.6" [deps.Plots.extensions] FileIOExt = "FileIO" @@ -703,64 +775,98 @@ version = "1.39.0" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [[deps.Polynomials]] -deps = ["LinearAlgebra", "RecipesBase", "Setfield", "SparseArrays"] -git-tree-sha1 = "ea78a2764f31715093de7ab495e12c0187f231d1" +deps = ["LinearAlgebra", "OrderedCollections", "Setfield", "SparseArrays"] +git-tree-sha1 = "2d99b4c8a7845ab1342921733fa29366dae28b24" uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" -version = "4.0.4" +version = "4.1.1" [deps.Polynomials.extensions] PolynomialsChainRulesCoreExt = "ChainRulesCore" PolynomialsFFTWExt = "FFTW" - PolynomialsMakieCoreExt = "MakieCore" + PolynomialsMakieExt = "Makie" PolynomialsMutableArithmeticsExt = "MutableArithmetics" + PolynomialsRecipesBaseExt = "RecipesBase" [deps.Polynomials.weakdeps] ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" - MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +git-tree-sha1 = "edbeefc7a4889f528644251bdb5fc9ab5348bc2c" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.0" +version = "1.3.4" [[deps.Preferences]] deps = ["TOML"] -git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e" +git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4" uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.1" +version = "1.5.2" [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.PtrArrays]] +git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.4.0" [[deps.PyCall]] deps = ["Conda", "Dates", "Libdl", "LinearAlgebra", "MacroTools", "Serialization", "VersionParsing"] -git-tree-sha1 = "43d304ac6f0354755f1d60730ece8c499980f7ba" +git-tree-sha1 = "9816a3826b0ebf49ab4926e2b18842ad8b5c8f04" uuid = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" -version = "1.96.1" +version = "1.96.4" [[deps.PyPlot]] deps = ["Colors", "LaTeXStrings", "PyCall", "Sockets", "Test", "VersionParsing"] -git-tree-sha1 = "9220a9dae0369f431168d60adab635f88aca7857" +git-tree-sha1 = "d2c2b8627bbada1ba00af2951946fb8ce6012c05" uuid = "d330b81b-6aea-500a-939a-2ce795aea3ee" -version = "2.11.2" +version = "2.11.6" [[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 = "7c29f0e8c575428bd84dc3c72ece5178caa67336" +git-tree-sha1 = "144895f6166994730ee7ff8113b981fc360638f1" uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" -version = "6.5.2+2" +version = "6.10.2+2" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll", "Qt6Svg_jll"] +git-tree-sha1 = "159d253ab126d5b29230cf53521899bea4ef4648" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.10.2+2" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "4d85eedf69d875982c46643f6b4f66919d7e157b" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.10.2+1" + +[[deps.Qt6Svg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "81587ff5ff25a4e1115ce191e36285ede0334c9d" +uuid = "6de9746b-f93d-5813-b365-ba18ad4a9cf3" +version = "6.10.2+0" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "672c938b4b4e3e0169a07a5f227029d4905456f2" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.10.2+1" [[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" [[deps.Random]] -deps = ["SHA", "Serialization"] +deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" [[deps.Ratios]] deps = ["Requires"] @@ -791,15 +897,15 @@ version = "1.2.2" [[deps.RelocatableFolders]] deps = ["SHA", "Scratch"] -git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.0" +version = "1.0.1" [[deps.Requires]] deps = ["UUIDs"] -git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.0" +version = "1.3.1" [[deps.SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" @@ -807,22 +913,24 @@ version = "0.7.0" [[deps.Scratch]] deps = ["Dates"] -git-tree-sha1 = "30449ee12237627992a99d5e30ae63e4d78cd24a" +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.2.0" +version = "1.3.0" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" [[deps.Setfield]] deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] -git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "1.1.1" +version = "1.1.2" [[deps.SharedArrays]] deps = ["Distributed", "Mmap", "Random", "Serialization"] uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +version = "1.11.0" [[deps.Showoff]] deps = ["Dates", "Grisu"] @@ -831,69 +939,87 @@ uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" version = "1.0.3" [[deps.SimpleBufferStream]] -git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" -version = "1.1.0" +version = "1.2.0" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" [[deps.SortingAlgorithms]] deps = ["DataStructures"] -git-tree-sha1 = "c60ec5c62180f27efea3ba2908480f8055e17cee" +git-tree-sha1 = "13cd91cc9be159e3f4d95b857fa2aa383b53772a" uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.1.1" +version = "1.2.3" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.12.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +git-tree-sha1 = "6547cbdd8ce32efba0d21c5a40fa96d1a3548f9f" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.3.1" +version = "2.8.0" weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.4" + [[deps.StaticArrays]] -deps = ["LinearAlgebra", "Random", "StaticArraysCore"] -git-tree-sha1 = "0adf069a2a490c47273727e029371b31d44b72b2" +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.6.5" -weakdeps = ["Statistics"] +version = "1.9.18" +weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" StaticArraysStatisticsExt = "Statistics" [[deps.StaticArraysCore]] -git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.2" +version = "1.4.4" [[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.9.0" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] [[deps.StatsAPI]] deps = ["LinearAlgebra"] -git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.0" +version = "1.8.0" [[deps.StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf" +deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "e4d7a1a0edc20af42689ea6f4f3587a2175d50ee" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.2" +version = "0.34.12" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" [[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "5.10.1+6" +version = "7.8.3+2" [[deps.TOML]] deps = ["Dates"] @@ -914,24 +1040,26 @@ version = "0.1.1" [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" [[deps.TranscodingStreams]] -deps = ["Random", "Test"] -git-tree-sha1 = "9a6ae7ed916312b41236fcef7e0af564ef934769" +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.9.13" +version = "0.11.3" [[deps.URIs]] -git-tree-sha1 = "b7a5e99f24892b6824a954199a45e9ffcc1c70f0" +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.5.0" +version = "1.6.1" [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" [[deps.UnicodeFun]] deps = ["REPL"] @@ -939,26 +1067,6 @@ git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" version = "0.4.1" -[[deps.Unitful]] -deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "a72d22c7e13fe2de562feda8645aa134712a87ee" -uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.17.0" - - [deps.Unitful.extensions] - ConstructionBaseUnitfulExt = "ConstructionBase" - InverseFunctionsUnitfulExt = "InverseFunctions" - - [deps.Unitful.weakdeps] - ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.UnitfulLatexify]] -deps = ["LaTeXStrings", "Latexify", "Unitful"] -git-tree-sha1 = "e2d817cc500e960fdbafcf988ac8436ba3208bfd" -uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" -version = "1.6.3" - [[deps.Unzip]] git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" @@ -977,296 +1085,296 @@ version = "1.3.243+0" [[deps.Wavelets]] deps = ["DSP", "FFTW", "LinearAlgebra", "Reexport", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "f514f9b16f6a15552c6aad7b03afc7b9a8478ef4" +git-tree-sha1 = "d0ec97a100abbe47a5e9a02361841da49cce6029" uuid = "29a6e085-ba6d-5f35-a997-948ac2efa89a" -version = "0.10.0" +version = "0.10.1" [[deps.Wayland_jll]] -deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "96478df35bbc2f3e1e791bc7a3d0eeee559e60e9" uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.21.0+1" - -[[deps.Wayland_protocols_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" -uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" -version = "1.25.0+0" +version = "1.24.0+0" [[deps.WoodburyMatrices]] deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7" uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "0.5.5" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "24b81b59bd35b3c42ab84fa589086e19be919916" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.11.5+0" - -[[deps.XSLT_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] -git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" -uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.34+0" +version = "1.1.0" [[deps.XZ_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "cf2c7de82431ca6f39250d2fc4aacd0daa1675c0" +git-tree-sha1 = "b29c22e245d092b8b4e8d3c09ad7baa586d9f573" uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.4.4+0" +version = "5.8.3+0" [[deps.Xorg_libICE_jll]] -deps = ["Libdl", "Pkg"] -git-tree-sha1 = "e5becd4411063bdcac16be8b66fc2f9f6f1e8fe5" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668" uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" -version = "1.0.10+1" +version = "1.1.2+0" [[deps.Xorg_libSM_jll]] -deps = ["Libdl", "Pkg", "Xorg_libICE_jll"] -git-tree-sha1 = "4a9d9e4c180e1e8119b5ffc224a7b59d3a7f7e18" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588" uuid = "c834827a-8449-5923-a945-d239c165b7dd" -version = "1.2.3+0" +version = "1.2.6+0" [[deps.Xorg_libX11_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +git-tree-sha1 = "808090ede1d41644447dd5cbafced4731c56bd2f" uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.6+0" +version = "1.8.13+0" [[deps.Xorg_libXau_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.11+0" +version = "1.0.13+0" [[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.0+4" +version = "1.2.4+0" [[deps.Xorg_libXdmcp_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.4+0" +version = "1.1.6+0" [[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "1a4a26870bf1e5d26cd585e38038d399d7e65706" uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.4+4" +version = "1.3.8+0" [[deps.Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef" uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "5.0.3+4" +version = "6.0.2+0" [[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.7.10+4" +version = "1.8.3+0" [[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] -git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] +git-tree-sha1 = "0ba01bc7396896a4ace8aab67db31403c71628f4" uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.4+4" +version = "1.1.7+0" [[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "6c174ef70c96c76f4c3f4d3cfbe09d018bcd1b53" uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.2+4" +version = "1.5.6+0" [[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.10+4" +version = "0.9.12+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_libpciaccess_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "58972370b81423fc546c56a60ed1a009450177c3" +uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e" +version = "0.19.0+0" [[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] -git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.15.0+0" +version = "1.17.1+0" [[deps.Xorg_libxkbfile_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +git-tree-sha1 = "ed756a03e95fff88d8f738ebc2849431bdd4fd1a" uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.2+0" +version = "1.2.0+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" +git-tree-sha1 = "9750dc53819eba4e9a20be42349a6d3b86c7cdf8" uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" -version = "0.1.4+0" +version = "0.1.6+0" [[deps.Xorg_xcb_util_image_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b" uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" -version = "0.4.0+1" +version = "0.4.1+0" [[deps.Xorg_xcb_util_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] -git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"] +git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97" uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" -version = "0.4.0+1" +version = "0.4.1+0" [[deps.Xorg_xcb_util_keysyms_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4" uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" -version = "0.4.0+1" +version = "0.4.1+0" [[deps.Xorg_xcb_util_renderutil_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0" uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" -version = "0.3.9+1" +version = "0.3.10+0" [[deps.Xorg_xcb_util_wm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763" uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" -version = "0.4.1+1" +version = "0.4.2+0" [[deps.Xorg_xkbcomp_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.6+0" +version = "1.4.7+0" [[deps.Xorg_xkeyboard_config_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +git-tree-sha1 = "2e59214e017a55cb87474a00fa76035c82ac0e17" uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.39.0+0" +version = "2.47.0+2" [[deps.Xorg_xtrans_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.5.0+0" +version = "1.6.0+0" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+0" +version = "1.3.1+2" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.5+0" +version = "1.5.7+1" [[deps.eudev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] -git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c3b0e6196d50eab0c5ed34021aaa0bb463489510" uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" -version = "3.2.9+0" +version = "3.2.14+0" [[deps.fzf_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631" uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" -version = "0.29.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" +version = "0.61.1+0" [[deps.libaom_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "850b06095ee71f0135d644ffd8a52850699581ed" uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.4.0+0" +version = "3.13.3+0" [[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.1+0" +version = "0.17.4+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+0" +version = "5.15.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.libdrm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "63aac0bcb0b582e11bad965cef4a689905456c03" +uuid = "8e53e030-5e6c-5a89-a30b-be5b7263a166" +version = "2.4.125+1" [[deps.libevdev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "56d643b57b188d30cccc25e331d416d3d358e557" uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" -version = "1.11.0+0" +version = "1.13.4+0" [[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.2+0" +version = "2.0.4+0" [[deps.libinput_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] -git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +deps = ["Artifacts", "JLLWrappers", "Libdl", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "91d05d7f4a9f67205bd6cf395e488009fe85b499" uuid = "36db933b-70db-51c0-b978-0f229ee0e533" -version = "1.18.0+0" +version = "1.28.1+0" [[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e51150d5ab85cee6fc36726850f0e627ad2e4aba" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.38+0" +version = "1.6.58+0" + +[[deps.libva_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "libdrm_jll"] +git-tree-sha1 = "7dbf96baae3310fe2fa0df0ccbb3c6288d5816c9" +uuid = "9a156e7d-b971-5f62-b2c9-67348b8fb97c" +version = "2.23.0+0" [[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] +git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+1" +version = "1.3.8+0" [[deps.mtdev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b4d631fd51f2e9cdd93724ae25b2efc198b059b1" uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" -version = "1.1.6+0" +version = "1.1.7+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.48.0+0" +version = "1.64.0+1" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "da8c1f6eee04831f14edcfa5dae611d309807e57" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2022.3.0+0" [[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+0" +version = "17.7.0+0" [[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" +version = "10164.0.1+0" [[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" +version = "4.1.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" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "a1fc6507a40bf504527d0d4067d718f8e179b2b8" uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "1.4.1+1" +version = "1.13.0+0" diff --git a/docs/allInOne.jl b/docs/allInOne.jl index 41ff541..8a14dc6 100644 --- a/docs/allInOne.jl +++ b/docs/allInOne.jl @@ -8,7 +8,7 @@ p1 = plot(t, f, legend = false, title = "Doppler", xticks = false, linewidth = 2 c = wavelet(Morlet(π), β = 2); res = cwt(f, c) # plotting -freqs = getMeanFreq(computeWavelets(n, c)[1]) +freqs = getMeanFreq(n, c) freqs[1] = 0 p2 = heatmap(t, freqs, diff --git a/docs/make.jl b/docs/make.jl index b52675f..d562930 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -9,6 +9,7 @@ makedocs(sitename = "ContinuousWavelets.jl", authors = "David Weber", clean = true, checkdocs = :none, + doctestfilters = [r"@ ContinuousWavelets .*\.jl:\d+"], pages = [ "basic usage" => "index.md", "Install" => "installation.md", diff --git a/docs/src/README.md b/docs/src/README.md index 28715d9..866c02a 100644 --- a/docs/src/README.md +++ b/docs/src/README.md @@ -93,7 +93,7 @@ round.(dropped,sigdigits=12) # output ┌ Warning: the canonical dual frame is off by 3.81e6, consider using one of the delta dual frames -└ @ ContinuousWavelets ~/work/ContinuousWavelets.jl/ContinuousWavelets.jl/src/sanityChecks.jl:41 +└ @ ContinuousWavelets ~/work/ContinuousWavelets.jl/ContinuousWavelets.jl/src/sanityChecks.jl:42 2047-element Vector{Float64}: 0.0069417253841 0.00694223965946 @@ -124,11 +124,11 @@ julia> res = circshift(cwt(exs, c), (0, 1, 0)) 2.64275e-6 0.0019801 4.37922e-6 3.47586e-6 [:, :, 2] = - 1.82235e-17 0.022676 0.00955726 … 3.2542e-18 - -1.73557e-18 0.0226846 0.0095044 -4.77282e-18 + 1.12812e-17 0.022676 0.00955726 … 4.33893e-18 + 1.73557e-18 0.0226846 0.0095044 -2.60336e-18 ⋮ ⋱ - 1.53669e-18 0.0341524 0.0108042 … 6.05043e-19 - 7.9713e-18 0.0342169 0.0107732 7.14045e-19 + -7.0861e-18 0.0341524 0.0108042 … -2.69398e-18 + 3.12753e-18 0.0342169 0.0107732 -1.20514e-18 [:, :, 3] = -4.25348e-7 0.00596895 … 4.4713e-8 1.86785e-8 diff --git a/ext/CUDAExt.jl b/ext/CUDAExt.jl index d9a3790..b3f9569 100644 --- a/ext/CUDAExt.jl +++ b/ext/CUDAExt.jl @@ -1,20 +1,5 @@ module CUDAExt -using ContinuousWavelets: ZPBoundary, SymBoundary -using ContinuousWavelets, CUDA - -function ContinuousWavelets.reflect(Y::CuArray, bt) - n1 = size(Y, 1) - if typeof(bt) <: ZPBoundary - base2 = ceil(Int, log2(n1)) - padding = fill!(similar(Y, 2^(base2) - n1, size(Y)[2:end]...), 0) - x = cat(Y, padding, dims = 1) - elseif typeof(bt) <: SymBoundary - x = cat(Y, reverse(Y, dims = 1), dims = 1) - else - x = Y - end - return x -end +using ContinuousWavelets, CUDA, cuFFT end \ No newline at end of file diff --git a/ext/MetalExt.jl b/ext/MetalExt.jl new file mode 100644 index 0000000..9383816 --- /dev/null +++ b/ext/MetalExt.jl @@ -0,0 +1,9 @@ +module MetalExt + +using ContinuousWavelets, Metal + +function ContinuousWavelets.cwt(Y::MtlArray{<:Union{Float64,ComplexF64}}, args...; kwargs...) + error("Metal does not support Float64 — pass Float32 (or ComplexF32) data instead.") +end + +end \ No newline at end of file diff --git a/src/CWTConstruction.jl b/src/CWTConstruction.jl index 39b0b22..88bd70d 100644 --- a/src/CWTConstruction.jl +++ b/src/CWTConstruction.jl @@ -33,7 +33,8 @@ struct CWT{B,S,W<:ContWaveClass,N,isAn} <: ContWave{B,S} # wavelets as the scale changes. The conjugate # p-norm is preserved for the signal. Should be # larger than 1 - fsample::S + fsample::S # the sampling frequency of the signal. This is used to determine the frequencies of the wavelets. + J::Union{Nothing,Int} # Geometric number of scales to use. If nothing, then the number of scales is determined by the signal length and the wavelet parameters. end # aliased = ((:Q,:s,:scalingFactor), (:β,:decreasing), (:p, :normalization)) @@ -70,6 +71,7 @@ function CWT(wave::WC, β = 4; extraOctaves = 0, fsample=2000, + J = nothing, kwargs...) where {WC<:ContWaveClass,A<:Average,B<:WaveletBoundary,N<:Real} Q, β, p = processKeywordArgs(Q, β, p; kwargs...) # some names are redundant @assert β > 0 @@ -97,7 +99,8 @@ function CWT(wave::WC, averagingType, S(frameBound), S(p), - S(fsample)) + S(fsample), + J) end @@ -157,7 +160,7 @@ end function Base.show(io::IO, cf::CWT{W,S,WT,N}) where {W,S,WT,N} print(io, "CWT{$(cf.waveType), $(cf.averagingType), Q=$(cf.Q), β=$(cf.β)," * "aveLen=$(cf.averagingLength), frame=$(cf.frameBound), norm=$(cf.p), " * - "extraOctaves=$(cf.extraOctaves), fsample=$(cf.fsample)}") + "extraOctaves=$(cf.extraOctaves), fsample=$(cf.fsample)}, J=$(cf.J)}") end @@ -176,6 +179,7 @@ function wavelet(wave::WC; p::N = Inf, β = 4, fsample=2000, + J = nothing, kwargs...) where {WC<:ContWaveClass,A<:Average,T<:WaveletBoundary,N<:Real} return CWT(wave, Q, @@ -186,5 +190,6 @@ function wavelet(wave::WC; p, β; fsample=fsample, + J=J, kwargs...) end diff --git a/src/ContinuousWavelets.jl b/src/ContinuousWavelets.jl index b9ee79c..e1e93c9 100644 --- a/src/ContinuousWavelets.jl +++ b/src/ContinuousWavelets.jl @@ -6,6 +6,7 @@ using AbstractFFTs using FFTW using LinearAlgebra using SpecialFunctions +using Adapt: adapt import Wavelets.wavelet import Wavelets.WT.name, Wavelets.WT.class, Wavelets.WT.vanishingmoments diff --git a/src/apply.jl b/src/apply.jl index cd3c569..76a2822 100644 --- a/src/apply.jl +++ b/src/apply.jl @@ -21,6 +21,7 @@ """ function cwt(Y::AbstractArray{T,N}, cWav::CWT, daughters, fftPlans = 1) where {N,T} @assert typeof(N) <: Integer + _checkMatchingDevice(Y, daughters) # vectors behave a bit strangely, so we reshape them if N == 1 Y = reshape(Y, (length(Y), 1)) @@ -138,8 +139,8 @@ function analyticTransformReal!(wave, daughters, x̂, fftPlan, ::Union{Father,Di # the averaging function isn't analytic, so we need to do both positive and # negative frequencies @views tmpWave = x̂ .* daughters[:, 1] - @views wave[(n1+1):end, outer..., 1] .= reverse(conj.(tmpWave[2:negFreqEnd, - outer...]), dims = 1) + @views wave[(n1+1):end, outer..., 1] .= _reverseDim1(conj.(tmpWave[2:negFreqEnd, + outer...])) @views wave[1:n1, outer..., 1] .= tmpWave @views wave[:, outer..., 1] .= fftPlan \ copy(wave[:, outer..., 1]) # averaging for j = 2:size(daughters, 2) @@ -159,7 +160,7 @@ function analyticTransformComplex!(wave, daughters, x̂, fftPlan, ::Union{Father # negative frequencies @views positiveFreqs = x̂[1:n1, outer...] .* daughters[:, 1] @views negativeFreqs = x̂[negFreqStart:end, outer...] .* - reverse(conj.(daughters[2:end, 1])) + _reverseDim1(conj.(daughters[2:end, 1])) @views wave[negFreqStart:end, outer..., 1] .= negativeFreqs @views wave[1:n1, outer..., 1] .= positiveFreqs @views wave[:, outer..., 1] .= fftPlan \ copy(wave[:, outer..., 1]) # averaging @@ -218,7 +219,7 @@ function otherwiseTransform!(wave::AbstractArray{<:Complex}, for j = 1:size(daughters, 2) @views wave[1:n1, outer..., j] .= x̂[1:n1, outer...] .* daughters[:, j] @views wave[negStart:end, outer..., j] .= x̂[negStart:end, outer...] .* - reverse(conj.(daughters[2:end, j])) + _reverseDim1(conj.(daughters[2:end, j])) @views wave[:, outer..., j] .= fromPlan \ copy(wave[:, outer..., j]) # wavelet transform end end @@ -227,20 +228,24 @@ function reflect(Y, bt) n1 = size(Y, 1) if typeof(bt) <: ZPBoundary base2 = ceil(Int, log2(n1)) # power of 2 nearest to N - # x = cat(Y, zeros(2^(base2) - n1, size(Y)[2:end]...), dims = 1) x = cat(Y, zeros(eltype(Y), 2^(base2) - n1, size(Y)[2:end]...), dims = 1) elseif typeof(bt) <: SymBoundary - x = cat(Y, reverse(Y, dims = 1), dims = 1) + x = cat(Y, _reverseDim1(Y), dims = 1) else x = Y end return x end -function cwt(Y::AbstractArray{T}, - c::CWT{W}; - varArgs...) where {T<:Number,W<:WaveletBoundary} +_matchPrecision(reference::AbstractArray, x::AbstractArray) = + eltype(x) <: Complex ? Complex{real(eltype(reference))}.(x) : real(eltype(reference)).(x) + +_matchDevice(reference::AbstractArray, x::AbstractArray) = adapt(_backend(reference), x) + +function cwt(Y::AbstractArray{T}, c::CWT{W}; varArgs...) where {T<:Number,W<:WaveletBoundary} daughters, ω = computeWavelets(size(Y, 1), c; varArgs...) + daughters = _matchPrecision(Y, daughters) + daughters = _matchDevice(Y, daughters) return cwt(Y, c, daughters) end @@ -254,6 +259,20 @@ struct DualFrames <: InverseType end struct NaiveDelta <: InverseType end struct PenroseDelta <: InverseType end +_backend(x::AbstractArray) = Base.typename(typeof(x)).wrapper + +function _checkMatchingDevice(Y::AbstractArray, daughters::AbstractArray) + _backend(Y) === _backend(daughters) || + error("cwt: signal is a $(_backend(Y)) but daughters is a " * + "$(_backend(daughters)) -- move daughters onto the same " * + "device as the signal before calling cwt, e.g. " * + "CuArray(daughters) or MtlArray(daughters).") + return nothing +end + +_reverseDim1(A::AbstractVector) = A[length(A):-1:1] +_reverseDim1(A::AbstractArray) = A[size(A, 1):-1:1, ntuple(_ -> Colon(), ndims(A) - 1)...] + """ icwt(res::AbstractArray, cWav::CWT, inverseStyle::InverseType=PenroseDelta()) Compute the inverse wavelet transform using one of three dual frames. The default uses delta functions with weights chosen via a least squares method, the `PenroseDelta()` below. This is chosen as a default because the Morlet wavelets tend to fail catastrophically using the canonical dual frame (the `dualFrames()` type). @@ -269,30 +288,39 @@ Return the inverse continuous wavelet transform, computed using the canonical du """ function icwt(res::AbstractArray, cWav::CWT, ::PenroseDelta) - Ŵ = computeWavelets(size(res, 1), cWav)[1] - β = computeDualWeights(Ŵ, cWav) - testDualCoverage(β, Ŵ) + Ŵ = computeWavelets(size(res, 1), cWav)[1] + Ŵ = _matchPrecision(res, Ŵ) + β = computeDualWeights(Ŵ, cWav) + β = _matchPrecision(res, β) + testDualCoverage(β, Ŵ) + β = _matchDevice(res, β) compXRecon = sum(res .* β, dims = 2) - imagXRecon = irfft(im * rfft(imag.(compXRecon), 1), size(compXRecon, 1)) # turns out the dual frame for the imaginary part is rather gross in the time domain + imagXRecon = irfft(im * rfft(imag.(compXRecon), 1), size(compXRecon, 1)) return imagXRecon + real.(compXRecon) end function icwt(res::AbstractArray, cWav::CWT, ::NaiveDelta) - Ŵ = computeWavelets(size(res, 1), cWav)[1] - β = computeNaiveDualWeights(Ŵ, cWav, size(res, 1)) - testDualCoverage(β, Ŵ) + Ŵ = computeWavelets(size(res, 1), cWav)[1] + Ŵ = _matchPrecision(res, Ŵ) + β = computeNaiveDualWeights(Ŵ, cWav, size(res, 1)) + β = _matchPrecision(res, β) + testDualCoverage(β, Ŵ) + β = _matchDevice(res, β) compXRecon = sum(res .* β, dims = 2) - imagXRecon = irfft(im * rfft(imag.(compXRecon), 1), size(compXRecon, 1)) # turns out the dual frame for the imaginary part is rather gross in the time domain + imagXRecon = irfft(im * rfft(imag.(compXRecon), 1), size(compXRecon, 1)) return imagXRecon + real.(compXRecon) end function icwt(res::AbstractArray, cWav::CWT, ::DualFrames) - Ŵ = computeWavelets(size(res, 1), cWav)[1] - canonDualFrames = explicitConstruction(Ŵ) + Ŵ = computeWavelets(size(res, 1), cWav)[1] + Ŵ = _matchPrecision(res, Ŵ) + canonDualFrames = explicitConstruction(Ŵ) + canonDualFrames = _matchPrecision(res, canonDualFrames) testDualCoverage(canonDualFrames) + canonDualFrames = _matchDevice(res, canonDualFrames) convolved = cwt(res, cWav, canonDualFrames) ax = axes(convolved) - @views xRecon = sum(convolved[:, i, i, ax[4:end]...] for i = 1:size(Ŵ, 2)) + @views xRecon = sum(convolved[:, i, i, ax[4:end]...] for i = 1:size(Ŵ, 2)) return xRecon end @@ -301,4 +329,4 @@ function icwt(Y::AbstractArray, w::ContWaveClass; varargs...) end icwt(Y::AbstractArray; varargs...) = icwt(Y, Morlet(), PenroseDelta(); varargs...) -# CWT (continuous wavelet transform directly) TODO: direct if sufficiently small +# CWT (continuous wavelet transform directly) TODO: direct if sufficiently small \ No newline at end of file diff --git a/src/createWavelets.jl b/src/createWavelets.jl index efe5fb4..56680c3 100644 --- a/src/createWavelets.jl +++ b/src/createWavelets.jl @@ -160,32 +160,23 @@ function father(c::CWT{<:WaveletBoundary,T}, ω, averagingType::Dirac, sWidth) w averaging[abs.(ω).<=upperBound] .= 1 return averaging end -#= -function father(c::CWT{W,T,<:Morse}, - ω, - averagingType::ContinuousWavelets.Father, - sWidth) where {W,T} - s = 2^(getMinScaling(c) + c.averagingLength - 1) - s0, ω_shift = locationShift(c, s, ω, sWidth) - averaging = adjust(c) .* mother(c, s0, sWidth, ω_shift) - return averaging -end -=# + +# >1 → narrower in time (less dispersion); <1 → wider. π gives wavelet numbers close to Morlet. +const MORSE_FATHER_WIDTH_FACTOR = Ref(Float64(π)) function father(c::CWT{W,T,<:Morse}, ω, averagingType::Father, sWidth) where {W,T} s = 2^(getMinScaling(c) + c.averagingLength) averaging = zeros(T, size(ω)) - upperBound = getUpperBound(c, s) + upperBound = getUpperBound(c, s) * MORSE_FATHER_WIDTH_FACTOR[] for (i, w) in enumerate(ω) - if abs(w) <= upperBound * 0.8 - averaging[i] = 1 - elseif abs(w) <= upperBound - t = (abs(w) - 0.8*upperBound) / (0.2*upperBound) - averaging[i] = 0.5 * (1 + cos(π * t)) + aw = abs(w) + if aw <= upperBound + averaging[i] = 1 - aw / upperBound end end return averaging end + @doc """ computeWavelets(n1::Integer, c::CWT{B,CT,W}; T = Float64, space = false) where {B<:WaveletBoundary,W,CT} -> daughters, ω Precomputes the wavelets used by transform. For details, see cwt. diff --git a/src/utils.jl b/src/utils.jl index e6bd58f..0f7b782 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -34,6 +34,17 @@ function getNWavelets(n1, c::CWT) nOctaves = getNOctaves(n1, c) n, nSpace = setn(n1, c) isAve = !(typeof(c.averagingType) <: NoAve) + + if c.J !== nothing + J = c.J + Q = c.Q + j = 0:J + sRange = reverse(2.0 .^ (((J .- j) ./ Q))) + sWidth = ones(length(sRange)) + totalWavelets = round(Int, length(sRange) + isAve) + return nOctaves, totalWavelets, sRange, sWidth + end + if nOctaves ≤ c.averagingLength + getMinScaling(c) # there isn't enough space for anything but averaging. totalWavelets = isAve sRanges = [1.0] @@ -55,29 +66,24 @@ getNOctaves(n1, c::CWT{W,T,M,N}) where {W,T,N,M} = log2(n1 >> 1 + 1) + c.extraOc # choose the number of octaves so the last mean, which is at s*σ[1] # is 3 standard devations away from the end function getNOctaves(n1, c::CWT{W,T,Morlet,N}) where {W,T,N} - # log2((n1 >> 1 + 1) / (c.σ[1] + 3)) + c.extraOctaves - log2((n1 >> 1 + 1) / (c.σ[1] + 3) * (c.fsample/2000)) + c.extraOctaves + log2((n1 >> 1 + 1) / (c.σ[1] + 3)) + c.extraOctaves end function getNOctaves(n1, c::CWT{W,T,<:Paul,N}) where {W,T,N} - # log2((n1 >> 1 + 1) / (2c.α + 5)) + c.extraOctaves - log2((n1 >> 1 + 1) / (2c.α + 5) * (c.fsample/2000)) + c.extraOctaves + log2((n1 >> 1 + 1) / (2c.α + 5)) + c.extraOctaves end # choose the number of octaves so the last mean is 5 standard deviations from the end function getNOctaves(n1, c::CWT{W,T,<:Dog,N}) where {W,T,N} μ = getMean(c) σ = getStd(c) - # log2(n1 >> 1 / (μ + 5σ)) + c.extraOctaves - log2(n1 >> 1 / (μ + 5σ) * (c.fsample/2000)) + c.extraOctaves + log2(n1 >> 1 / (μ + 5σ)) + c.extraOctaves end # choose the number of octaves so the smallest support is twice the qmf function getNOctaves(n1, c::CWT{W,T,<:ContOrtho,N}) where {W,T,N} log2(n1) - 2 - log2(length(qmf(c.waveType))) + c.extraOctaves end function getNOctaves(n1, c::CWT{W,T,Morse,N}) where {W,T,N} - # log2((n1 >> 1 + 1) / (morsefreq(c) + 1)) + c.extraOctaves - log2((n1 >> 1 + 1) / (morsefreq(c) + 1) * (c.fsample/2000)) + c.extraOctaves + log2((n1 >> 1 + 1) / (morsefreq(c) + 1)) + c.extraOctaves end -# getNOctaves(n1,c::CWT{W,T, Morse, N}) where {W, T, N} = 4 + c.extraOctaves """ As with the last octave, different wavelet families have different space decay rates, and in the case of symmetric or zero padding we don't want wavelets that bleed across the boundary from the center. @@ -196,9 +202,7 @@ function locationShift(c::CWT{W,T,<:Dog,N}, s, ω, sWidth) where {W,T,N} end function locationShift(c::CWT{W,T,<:Morse,N}, s, ω, sWidth) where {W,T,N} - # s0 = c.waveType.cf * s * sWidth s0 = morsefreq(c) * s * sWidth - # ω_shift = ω .+ c.waveType.cf * s0 ω_shift = ω .+ s0 return (s0, ω_shift) end @@ -215,7 +219,6 @@ function getMean(c::CWT{W,T,<:Morlet}, s = 1) where {W,T} return s * c.σ[1] end function getMean(c::CWT{W,T,<:Morse}, s = 1) where {W,T} - #return s*c.waveType.cf return s * morsefreq(c) end @@ -254,19 +257,28 @@ end """ getMeanFreq(Ŵ, fsample=2000) -> arrayOfFreqs + #getMeanFreq(Ŵ, ω, fsample, n1) -> arrayOfFreqs -Calculate each of the mean frequencies of a collection of analytic or real wavelets `Ŵ`, using the power spectral density. -The default sampling rate `fsample=2kHz`, so the maximum frequency is 1kHz. +Calculate each of the mean frequencies of a collection of analytic or real wavelets `Ŵ`, using the power spectral density. +`ω` is the raw (fsample-independent) frequency axis used to construct `Ŵ`, and `n1` is the original signal length — +both are needed to correctly convert `Ŵ`'s row-index axis into real Hz for the given `fsample`. """ function getMeanFreq(Ŵ::Array, fsample = 2000) eachNorm = [norm(w, 2)^2 for w in eachcol(Ŵ)] freqs = range(0, fsample / 2, length = size(Ŵ, 1)) return map(ŵ -> sum(abs2.(ŵ) .* freqs), eachcol(Ŵ)) ./ eachNorm -end +end +#= +function getMeanFreq(Ŵ::Array, ω, fsample, n1) + eachNorm = [norm(w, 2)^2 for w in eachcol(Ŵ)] + freqsHz = ω .* (fsample / 2) ./ (n1 >> 1 + 1) + return map(ŵ -> sum(abs2.(ŵ) .* freqsHz), eachcol(Ŵ)) ./ eachNorm +end=# function getMeanFreq(n1, cw::CWT) Ŵ, ω = computeWavelets(n1, cw) getMeanFreq(Ŵ, cw.fsample) + #getMeanFreq(Ŵ, ω, cw.fsample, n1) end @@ -326,10 +338,10 @@ Compute the weight given to each wavelet so that in the Fourier domain, the sum wavelets is as close to 1 at every frequency below the peak of the last wavelet (that is `β' .*abs.(Ŵ[1:lastFreq,:]) ≈ ones(lastFreq)` in an ℓ^2 sense). """ -function computeDualWeights(Ŵ, wav) - @views lastReasonableFreq = computeLastFreq(Ŵ[:, end], wav) - Wdag = pinv(Ŵ[1:lastReasonableFreq, :]) - β = conj.(Wdag * ones(size(Wdag, 2)))' +function computeDualWeights(Ŵ, wav) + @views lastReasonableFreq = computeLastFreq(Ŵ[:, end], wav) + Wdag = pinv(Ŵ[1:lastReasonableFreq, :]) + β = conj.(Wdag * ones(eltype(Wdag), size(Wdag, 2)))' return β end # function computeDualWeights(Ŵ, wav::CWT{W,T,<:ContOrtho,N}, n,naive=true) where {W,T,N} @@ -427,12 +439,13 @@ function caveats(n1, c::CWT; coiTolerance = exp(-2)) # Fourier equivalent frequencies Ŵ, ω = computeWavelets(n1, c) freqs = getMeanFreq(Ŵ, c.fsample) + #freqs = getMeanFreq(Ŵ, ω, c.fsample, n1) coi = directCoiComputation(n1, c; coiTolerance = coiTolerance) return sRange, freqs, coi end -function caveats(Y::AbstractArray{T}, w::ContWaveClass) where {T<:Number} - caveats(size(Y, 1), CWT(w), J1 = J1) +function caveats(Y::AbstractArray{T}, w::ContWaveClass; kwargs...) where {T<:Number} + caveats(size(Y, 1), CWT(w); kwargs...) end """ @@ -481,19 +494,19 @@ julia> Xspec = crossSpectrum(X, Y, c); size(Xspec) julia> Xspec[:,:,1,1] 2053×29 Matrix{ComplexF64}: - -4.14517e-5+5.06982e-21im … 1.19877e-5-7.07214e-15im - -4.14157e-5-3.15271e-20im 1.19896e-5-7.06562e-15im - ⋮ ⋱ - 0.000119144+1.44173e-20im 1.70054e-5+1.85809e-15im - 0.000119178+3.753e-20im 1.69993e-5+1.85979e-15im + 0.000124405-3.92911e-20im … 2.45608e-5-6.01357e-15im + 0.000124424+1.67907e-20im 2.45647e-5-6.00802e-15im + ⋮ ⋱ + -0.000128995+1.4952e-20im 1.65638e-5-5.64595e-15im + -0.000129036+8.56547e-21im 1.65673e-5-5.65117e-15im julia> Xspec[:,:,1,2] 2053×29 Matrix{ComplexF64}: - 5.42995e-5-1.68994e-21im … 2.649e-6-1.22869e-6im - 5.4303e-5-6.79029e-21im 2.6479e-6-1.23329e-6im + 0.000173079-1.09846e-20im … 6.18352e-6+7.87934e-6im + 0.000172983+3.55108e-20im 6.18669e-6+7.87862e-6im ⋮ ⋱ - -3.17457e-5-4.40894e-21im 4.71683e-6+3.72814e-6im - -3.17719e-5-3.26772e-21im 4.71417e-6+3.7279e-6im + 1.6972e-5-4.88944e-21im -3.22811e-7+8.19937e-6im + 1.70173e-5+1.28385e-20im -3.24362e-7+8.20477e-6im ``` """ @@ -522,19 +535,19 @@ julia> wCo = waveletCoherence(X, Y, c); julia> wCo[:,:,1,1] 2053×29 Matrix{Float64}: - 0.688432 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 - 0.687333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 0.972612 0.999992 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 + 0.97261 0.999992 1.0 1.0 1.0 1.0 1.0 1.0 1.0 ⋮ ⋱ ⋮ - 0.952408 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 - 0.952626 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 0.927149 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 0.92733 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 julia> wCo[:,:,1,2] 2053×29 Matrix{Float64}: - 0.995092 0.984109 0.952974 … 0.128329 0.0335945 - 0.995082 0.984082 0.952852 0.128308 0.0336075 + 0.832432 0.994307 0.97702 … 0.0086047 0.311523 + 0.831971 0.994289 0.976954 0.00859959 0.311415 ⋮ ⋱ - 0.652498 0.994972 0.992932 0.19849 0.0902301 - 0.653111 0.994978 0.992951 0.198585 0.0902469 + 0.162232 0.999238 0.831951 0.0169301 0.178859 + 0.163151 0.999241 0.832198 0.0169412 0.179088 ``` """ @@ -560,7 +573,7 @@ function sharedCrossSpectrum(X, Y, c) c.frameBound, c.p, c.β; - fsample=c.fsample) + fsample=c.fsample, J=c.J) else cAve = c end diff --git a/test/CUDATests.jl b/test/CUDATests.jl new file mode 100644 index 0000000..3315b67 --- /dev/null +++ b/test/CUDATests.jl @@ -0,0 +1,126 @@ +using BenchmarkTools + +@testset "GPU vs CPU (CUDA)" begin + cuda_available = @isdefined(CUDA) && CUDA.functional() + if cuda_available + @testset "reflect - CUDA" begin + boundaries = (PerBoundary(), SymBoundary(), ZPBoundary()) + ns = (37, 200, 256) # 200 is not a power of 2; 256 already is (padding = 0) + @testset "n1=$n1, boundary=$bt" for n1 in ns, bt in boundaries + x_cpu = randn(Float32, n1, 3) # extra trailing dim: reflect must handle N > 1 + x_gpu = CuArray(x_cpu) + + r_cpu = reflect(x_cpu, bt) + r_gpu = reflect(x_gpu, bt) + + @test r_gpu isa CuArray + @test eltype(r_gpu) == eltype(x_gpu) + @test size(r_gpu) == size(r_cpu) + @test Array(r_gpu) ≈ r_cpu + end + end + + waveTypes = (morl, dog2, paul2, Morse(3, 20, 1)) + β = 2 + boundaries = (PerBoundary(), SymBoundary(), ZPBoundary()) + averagingLength = 2 + extraOctaves = 0 + xSizes = (2048, 8192, 32768) + + @testset "xSz=$xSize, boundary=$boundary, wave=$wave" for xSize in xSizes, + boundary in boundaries, + wave in waveTypes + + wfc = wavelet(wave, β = β, boundary = boundary, + averagingLength = averagingLength, + extraOctaves = extraOctaves) + + # CPU arrays: + xr_cpu = randn(Float32, xSize) + xc_cpu = randn(ComplexF32, xSize) + + # GPU arrays: + xr_gpu = CuArray(xr_cpu) + xc_gpu = CuArray(xc_cpu) + + # Compute daughters on CPU, then move to GPU: + daughters_cpu, ω = with_logger(ConsoleLogger(stderr, Logging.Error)) do + computeWavelets(xSize, wfc) + end + daughters_gpu = CuArray(Float32.(daughters_cpu)) + + # CPU transforms: + yr_cpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(xr_cpu, wfc, Float32.(daughters_cpu)) + end + yc_cpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(xc_cpu, wfc, copy(Float32.(daughters_cpu))) + end + + # GPU transforms: + yr_gpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(xr_gpu, wfc, daughters_gpu) + end + yc_gpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(xc_gpu, wfc, CuArray(Float32.(daughters_cpu))) + end + + # Correctness: Check that the GPU result matches the CPU result. + @test Array(yr_gpu) ≈ convert.(eltype(yr_gpu), yr_cpu) + @test Array(yc_gpu) ≈ convert.(eltype(yc_gpu), yc_cpu) + + # Make sure that element types are preserved. + @test eltype(Array(yr_gpu)) <: Union{Float32,ComplexF32} + @test eltype(Array(yc_gpu)) <: Union{Float32,ComplexF32} + @test eltype(yr_cpu) <: Union{Float32,ComplexF32} + @test eltype(yc_cpu) <: Union{Float32,ComplexF32} + + # Compare the speed: + daughters_cpu_bench = Float32.(daughters_cpu) + t_cpu = @belapsed cwt($xr_cpu, $wfc, copy($daughters_cpu_bench)) + t_gpu = @belapsed begin + cwt($xr_gpu, $wfc, copy($daughters_gpu)) + CUDA.synchronize() + end + + @info "CWT speed: wave=$(wave), xSize=$(xSize), boundary=$(boundary)" cpu_time=t_cpu gpu_time=t_gpu speedup=t_cpu/t_gpu + end + + #= Confirmed against real hardware: _checkMatchingDevice fires + cleanly (a plain ErrorException with a clear message, not the + opaque KernelError this used to throw), and the icwt fix (once + pasted in -- see chat) resolves the PenroseDelta/NaiveDelta/ + DualFrames KernelErrors the same way. =# + @testset "device mismatch handling" begin + xSize = 512 + wfc = wavelet(morl, β = 2) + x_cpu = randn(Float32, xSize) + x_gpu = CuArray(x_cpu) + + daughters_cpu, _ = with_logger(ConsoleLogger(stderr, Logging.Error)) do + computeWavelets(xSize, wfc) + end + daughters_cpu = Float32.(daughters_cpu) + daughters_gpu = CuArray(daughters_cpu) + + # cwt with a GPU signal but CPU daughters (an easy mistake: forgot + # to move `daughters` over) should fail fast with a clear message, + # not the opaque GPU-kernel-compilation KernelError this used to + # produce. + @test_throws "signal is a" cwt(x_gpu, wfc, daughters_cpu) + + # icwt on a fully-GPU forward transform should now work + # transparently for all three InverseType variants: β/ + # canonDualFrames are built in res's precision and adapted onto + # res's device before being combined with it. + y_gpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(x_gpu, wfc, daughters_gpu) + end + @test Array(icwt(y_gpu, wfc, PenroseDelta())) ≈ icwt(Array(y_gpu), wfc, PenroseDelta()) + @test Array(icwt(y_gpu, wfc, NaiveDelta())) ≈ icwt(Array(y_gpu), wfc, NaiveDelta()) + @test Array(icwt(y_gpu, wfc, DualFrames())) ≈ icwt(Array(y_gpu), wfc, DualFrames()) + end + else + @warn "CUDA not available or not functional, skipping GPU tests" + end +end \ No newline at end of file diff --git a/test/MetalTests.jl b/test/MetalTests.jl new file mode 100644 index 0000000..4679480 --- /dev/null +++ b/test/MetalTests.jl @@ -0,0 +1,121 @@ +using BenchmarkTools + +@testset "GPU vs CPU (Metal)" begin + metal_available = @isdefined(Metal) && Metal.functional() + if metal_available + @testset "reflect - Metal" begin + boundaries = (PerBoundary(), SymBoundary(), ZPBoundary()) + ns = (37, 200, 256) # 200 is not a power of 2; 256 already is (padding = 0) + @testset "n1=$n1, boundary=$bt" for n1 in ns, bt in boundaries + x_cpu = randn(Float32, n1, 3) # extra trailing dim: reflect must handle N > 1 + x_mtl = MtlArray(x_cpu) + + r_cpu = reflect(x_cpu, bt) + r_mtl = reflect(x_mtl, bt) + + @test r_mtl isa MtlArray + @test eltype(r_mtl) == eltype(x_mtl) + @test size(r_mtl) == size(r_cpu) + @test Array(r_mtl) ≈ r_cpu + end + end + + waveTypes = (morl, dog2, paul2, Morse(3, 20, 1)) + β = 2 + boundaries = (PerBoundary(), SymBoundary(), ZPBoundary()) + averagingLength = 2 + extraOctaves = 0 + xSizes = (2048, 8192, 32768) + + @testset "xSz=$xSize, boundary=$boundary, wave=$wave" for xSize in xSizes, + boundary in boundaries, + wave in waveTypes + + wfc = wavelet(wave, β = β, boundary = boundary, + averagingLength = averagingLength, + extraOctaves = extraOctaves) + + # CPU arrays: + xr_cpu = randn(Float32, xSize) + xc_cpu = randn(ComplexF32, xSize) + + # Metal arrays: + xr_mtl = MtlArray(xr_cpu) + xc_mtl = MtlArray(xc_cpu) + + # Compute daughters on CPU, then move to Metal: + daughters_cpu, ω = with_logger(ConsoleLogger(stderr, Logging.Error)) do + computeWavelets(xSize, wfc) + end + daughters_mtl = MtlArray(Float32.(daughters_cpu)) + + # CPU transforms: + yr_cpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(xr_cpu, wfc, Float32.(daughters_cpu)) + end + yc_cpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(xc_cpu, wfc, copy(Float32.(daughters_cpu))) + end + + # Metal transforms: + yr_mtl = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(xr_mtl, wfc, daughters_mtl) + end + yc_mtl = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(xc_mtl, wfc, MtlArray(Float32.(daughters_cpu))) + end + + # Correctness: Check that the Metal result matches the CPU result. + @test Array(yr_mtl) ≈ convert.(eltype(yr_mtl), yr_cpu) + @test Array(yc_mtl) ≈ convert.(eltype(yc_mtl), yc_cpu) + + # Make sure that element types are preserved. + @test eltype(Array(yr_mtl)) <: Union{Float32,ComplexF32} + @test eltype(Array(yc_mtl)) <: Union{Float32,ComplexF32} + @test eltype(yr_cpu) <: Union{Float32,ComplexF32} + @test eltype(yc_cpu) <: Union{Float32,ComplexF32} + + # Compare the speed: + daughters_cpu_bench = Float32.(daughters_cpu) + t_cpu = @belapsed cwt($xr_cpu, $wfc, copy($daughters_cpu_bench)) + t_mtl = @belapsed begin + cwt($xr_mtl, $wfc, copy($daughters_mtl)) + Metal.synchronize() + end + + @info "CWT speed: wave=$(wave), xSize=$(xSize), boundary=$(boundary)" cpu_time=t_cpu mtl_time=t_mtl speedup=t_cpu/t_mtl + end + + @testset "device mismatch handling" begin + xSize = 512 + wfc = wavelet(morl, β = 2) + x_cpu = randn(Float32, xSize) + x_mtl = MtlArray(x_cpu) + + daughters_cpu, _ = with_logger(ConsoleLogger(stderr, Logging.Error)) do + computeWavelets(xSize, wfc) + end + daughters_cpu = Float32.(daughters_cpu) + daughters_mtl = MtlArray(daughters_cpu) + + @test_throws "signal is a" cwt(x_mtl, wfc, daughters_cpu) + + y_mtl = with_logger(ConsoleLogger(stderr, Logging.Error)) do + cwt(x_mtl, wfc, daughters_mtl) + end + @test Array(icwt(y_mtl, wfc, PenroseDelta())) ≈ + icwt(Array(y_mtl), wfc, PenroseDelta()) + @test Array(icwt(y_mtl, wfc, NaiveDelta())) ≈ + icwt(Array(y_mtl), wfc, NaiveDelta()) + @test Array(icwt(y_mtl, wfc, DualFrames())) ≈ + icwt(Array(y_mtl), wfc, DualFrames()) + end + + @testset "Float64 rejection" begin + wfc = wavelet(morl, β = 2) + @test_throws Exception cwt(MtlArray(randn(Float64, 256)), wfc) + end + else + @warn "Metal not available or not functional, skipping GPU tests" + end +end \ No newline at end of file diff --git a/test/gpu_tests.jl b/test/gpu_tests.jl deleted file mode 100644 index 4bdca55..0000000 --- a/test/gpu_tests.jl +++ /dev/null @@ -1,77 +0,0 @@ -using BenchmarkTools - -@testset "GPU vs CPU" begin - cuda_available = @isdefined(CUDA) && CUDA.functional() - if cuda_available - - waveTypes = (morl, dog2, paul2, Morse(3,20,1)) - β = 2 - boundaries = (PerBoundary(), SymBoundary()) - averagingLength = 2 - extraOctaves = 0 - xSizes = (512, 2048, 8192) - - @testset "xSz=$xSize, boundary=$boundary, wave=$wave" for xSize in xSizes, - boundary in boundaries, - wave in waveTypes - - wfc = wavelet(wave, β = β, boundary = boundary, - averagingLength = averagingLength, - extraOctaves = extraOctaves) - - # CPU arrays: - xr_cpu = randn(Float32, xSize) - xc_cpu = randn(ComplexF32, xSize) - - # GPU arrays: - xr_gpu = CuArray(xr_cpu) - xc_gpu = CuArray(xc_cpu) - - - # Compute daughters on CPU, then move to GPU: - daughters_cpu, ω = with_logger(ConsoleLogger(stderr, Logging.Error)) do - computeWavelets(xSize, wfc) - end - daughters_gpu = CuArray(Float32.(daughters_cpu)) - - # CPU transforms: - yr_cpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do - cwt(xr_cpu, wfc, Float32.(daughters_cpu)) - end - yc_cpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do - cwt(xc_cpu, wfc, copy(Float32.(daughters_cpu))) - end - - # GPU transforms: - yr_gpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do - cwt(xr_gpu, wfc, daughters_gpu) - end - yc_gpu = with_logger(ConsoleLogger(stderr, Logging.Error)) do - cwt(xc_gpu, wfc, CuArray(Float32.(daughters_cpu))) - end - - - # Correctness: Check that the GPU result matches the CPU result. - @test Array(yr_gpu) ≈ convert.(eltype(yr_gpu), yr_cpu) rtol=1e-3 - @test Array(yc_gpu) ≈ convert.(eltype(yc_gpu), yc_cpu) rtol=1e-3 - - # Make sure that element types are preserved. - @test eltype(Array(yr_gpu)) <: Union{Float32, ComplexF32} - @test eltype(Array(yc_gpu)) <: Union{Float32, ComplexF32} - @test eltype(yr_cpu) <: Union{Float32, ComplexF32} - @test eltype(yc_cpu) <: Union{Float32, ComplexF32} - - # Compare the speed: - daughters_cpu_bench = Float32.(daughters_cpu) - t_cpu = @belapsed cwt($xr_cpu, $wfc, copy($daughters_cpu_bench)) - t_gpu = @belapsed begin - cwt($xr_gpu, $wfc, copy($daughters_gpu)) - CUDA.synchronize() - end - - @info "CWT speed: wave=$(wave), xSize=$(xSize), boundary=$(boundary)" cpu_time=t_cpu gpu_time=t_gpu speedup=t_cpu/t_gpu - end - else - @warn "CUDA not available or not functional, skipping GPU tests" - end -end \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 819dc8e..6fecc90 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -3,17 +3,13 @@ using Test, Documenter using FFTW using Logging, Random -try - using CUDA - using BenchmarkTools -catch -end - inGithubAction = get(() -> "", ENV, "JULIA_IN_GITHUB_ACTION") == "true" inGithubActionOnMac = get(() -> "", ENV, "JULIA_IN_GITHUB_ACTION_ON_MAC") == "macOS-latest" -# these make sure that the printing width/length is kept to a reasonable amout for actually reading the docs ENV["LINES"] = "9" ENV["COLUMNS"] = "60" + +const GROUP = get(ENV, "GROUP", "All") + @testset "ContinuousWavelets.jl" begin if (inGithubAction && !inGithubActionOnMac) doctest(ContinuousWavelets) @@ -24,11 +20,25 @@ ENV["COLUMNS"] = "60" include("defaultProperties.jl") include("inversionTests.jl") - if Base.@isdefined(CUDA) && CUDA.functional() - include("gpu_tests.jl") + if GROUP in ("All", "CUDA") + try + using CUDA, BenchmarkTools + include("CUDATests.jl") + catch e + @info "CUDA not available in this environment -- skipping CUDATests.jl" exception=e + end + end + + if GROUP in ("All", "Metal") + try + using Metal, BenchmarkTools + include("MetalTests.jl") + catch e + @info "Metal not available in this environment -- skipping MetalTests.jl" exception=e + end end end # TODO: # test averaging types # various extra dimensions -# inverse is actually functional +# inverse is actually functional \ No newline at end of file