diff --git a/Project.toml b/Project.toml index 2e7e38e..a98320c 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "RadonKA" uuid = "86de8297-835b-47df-b249-c04e8db91db5" authors = ["Felix Wechsler (roflmaostc) "] -version = "0.6.0" +version = "0.6.1" [deps] Atomix = "a9b6321e-bd34-4604-b9c9-b65b8de01458" diff --git a/README.md b/README.md index a11334c..e213452 100644 --- a/README.md +++ b/README.md @@ -76,13 +76,19 @@ The following examples show case the ability of this package: # Citation This package was created as part of scientific work. Please consider citing it :) ```bibtex -@misc{wechsler2024wave, - title={Wave optical model for tomographic volumetric additive manufacturing}, - author={Felix Wechsler and Carlo Gigli and Jorge Madrid-Wolff and Christophe Moser}, - year={2024}, - eprint={2402.06283}, - archivePrefix={arXiv}, - primaryClass={physics.optics} +@article{Wechsler:24, +author = {Felix Wechsler and Carlo Gigli and Jorge Madrid-Wolff and Christophe Moser}, +journal = {Opt. Express}, +keywords = {3D printing; Computed tomography; Liquid crystal displays; Material properties; Ray tracing; Refractive index}, +number = {8}, +pages = {14705--14712}, +publisher = {Optica Publishing Group}, +title = {Wave optical model for tomographic volumetric additive manufacturing}, +volume = {32}, +month = {Apr}, +year = {2024}, +url = {https://opg.optica.org/oe/abstract.cfm?URI=oe-32-8-14705}, +doi = {10.1364/OE.521322}, } ``` diff --git a/docs/src/assets/mu_spatially.png b/docs/src/assets/mu_spatially.png new file mode 100644 index 0000000..2414d82 Binary files /dev/null and b/docs/src/assets/mu_spatially.png differ diff --git a/docs/src/assets/mu_spatially_backprojected.png b/docs/src/assets/mu_spatially_backprojected.png new file mode 100644 index 0000000..ceade9d Binary files /dev/null and b/docs/src/assets/mu_spatially_backprojected.png differ diff --git a/docs/src/geometries.md b/docs/src/geometries.md index 79c0fe4..72a9c19 100644 --- a/docs/src/geometries.md +++ b/docs/src/geometries.md @@ -92,3 +92,23 @@ simshow(projected_exp) ![](../assets/parallel_geometry_mu.png) +### Spatially Varying Absorption + +The ray gets some attenuation with `exp(-μ*x)` where `μ` varies spatially. +To represent this spatial variation, we can simply use an array for μ. + +```julia +μ = 0.5 .* box((N, N), (2, 50)); + +simshow(μ) +``` +![](../assets/mu_spatially.png) + + +```julia +projected_1 = backproject(sinogram, angles, μ=μ); +projected_2 = backproject(sinogram, angles .+ π / 4, μ=μ); + +[simshow(projected_1) simshow(projected_2)] +``` +![](../assets/mu_spatially_backprojected.png) diff --git a/examples/3_spatially_varying_absorption.jl b/examples/3_spatially_varying_absorption.jl new file mode 100644 index 0000000..23946e0 --- /dev/null +++ b/examples/3_spatially_varying_absorption.jl @@ -0,0 +1,194 @@ +### A Pluto.jl notebook ### +# v0.19.40 + +using Markdown +using InteractiveUtils + +# ╔═╡ 009ad239-5f90-4c9e-9d3c-23d58cb5f4af +begin + using Pkg + Pkg.activate(".") + Pkg.instantiate() + using Revise +end + +# ╔═╡ aa5e0f2d-8b11-447d-be55-c84a1421cafd +using Zygote, Optim, RadonKA, TestImages, ImageShow, Noise, Plots,PlutoUI,Statistics + +# ╔═╡ 7cfebbbc-e36f-474c-879d-dc0a8e360f6d +using IndexFunArrays + +# ╔═╡ 059f357a-b1fc-4f6d-af5f-72ffd47cb64c +using Optimization, OptimizationOptimisers, OptimizationOptimJL + +# ╔═╡ 3e7e2e30-cb85-4eb8-b4f5-b8b19ecade8c +md"# Load packages +On the first run, Julia is going to install some packages automatically. So start this notebook and give it some minutes to install all packages. +No worries, any future runs will be much faster to start! +" + +# ╔═╡ 8abe2914-922f-4ea5-8d85-b435a22c897f +TableOfContents() + +# ╔═╡ dad29ebd-c69b-42ed-aef4-6bfc76d59a32 +md"# 1. Load Image" + +# ╔═╡ 604ed50d-616c-4fc9-8adc-d2e29595c504 +img = Float32.(testimage("resolution_test_512"))[200:421, 200:421]; + +# ╔═╡ a4e4eb4e-da5f-4f91-bbf9-73b983968c16 +simshow(img) + +# ╔═╡ 490f4bb3-6ab5-47be-b2cc-f30f13cc2721 +md"# 2. Specify Absorption map +This is a ring of high absorption. + +Hence, a sample in the inner part of the absorption can not be measured well. +" + +# ╔═╡ a89bbe2a-341c-4005-8243-f2c0cdcbd722 +μ = ((rr(img) .< 60) .- (rr(img) .< 59)) * 1; + +# ╔═╡ b1b301d4-abab-4d07-9c00-3782db4a5ee4 +simshow(μ) + +# ╔═╡ 7e2d4d16-2ac5-4d44-b5f5-67f9343e59e0 +md"# 3. Create Sinogram" + +# ╔═╡ f82bfaa5-b394-4159-99d4-9cc859f12f32 +angles = range(0, 2π, 200) + +# ╔═╡ e9a404d0-e9bb-468c-9490-ec2d12039f20 +sinogram = radon(img, angles, μ=μ) + +# ╔═╡ 0bbef52a-e191-46c7-8aa0-ce105d07b54b +simshow(sinogram) + +# ╔═╡ 32fa73fa-726d-4b03-bae1-f8094b7c4a5c +md"# 4. Backproject" + +# ╔═╡ 32b2b1ca-aa80-4931-9d03-9f19340c1ca8 +img_b = backproject(sinogram, angles, μ=μ); + +# ╔═╡ 4e5e1bb1-eeb9-43f7-91a8-ba7b8b76dccd +simshow(img_b) + +# ╔═╡ b7892246-8fe0-437c-a224-f1ca4661ef33 +md"# 5. Try with Optimization.jl +The optimization is able to take this into account and can reconstruct a decent image. +" + +# ╔═╡ 8a8e536a-c6a3-412b-b986-f33f2620429a +measurement = (sinogram); + +# ╔═╡ d8edea79-7775-4718-9637-127df8b68715 +opt_f(x, p) = sum(abs2, radon(x, angles, μ=μ) .- measurement) + +# ╔═╡ 83c920b7-e932-4deb-ab4c-08ec4412f0c9 +opt_fun = OptimizationFunction(opt_f, AutoZygote()) + +# ╔═╡ 06680604-1426-4f2f-963d-412b73f31c33 +init0 = zeros(size(img)); + +# ╔═╡ 26af8e6e-4afa-4d73-9bbc-630e07bd6694 +opt_f(init0, angles) + +# ╔═╡ fd3a4f13-27c8-4766-9e58-07050aa1db2f +problem = OptimizationProblem(opt_fun, init0, angles); + +# ╔═╡ 26015d23-e708-4ebc-b718-18bd5104000b +@time res6 = solve(problem, OptimizationOptimJL.LBFGS(), maxiters=20) + +# ╔═╡ 5f5fb511-4b55-43bb-b8ac-f520e8b3bbc7 +simshow(res6) + +# ╔═╡ e6b5f0b8-e4c4-425a-905d-3678396d4dcc +md"# 6 Scratch" + +# ╔═╡ 370d11ad-3b75-4013-8a1d-9439f1bf69b2 +angles2 = [0] + +# ╔═╡ 8909b583-1674-49eb-a17e-efe01cfb2154 +N = 200 + +# ╔═╡ cc8c8da2-18a8-406e-9b22-b8bfa4b76c48 +sinogram2 = zeros((N - 1, length(angles2))) + +# ╔═╡ 775543bb-7c6d-46d5-91e1-cbcd980d22d5 +sinogram2[1:5:end] .= 1 + +# ╔═╡ a97b5c18-921c-422c-a632-58b883f2e89c +geometry_parallel = RadonParallelCircle(N, -(N-1)÷2:(N-1)÷2) + +# ╔═╡ 950f65be-8d23-4b97-ae39-821c48d86ea5 +projection_parallel = backproject(sinogram2, angles2; geometry=geometry_parallel); + +# ╔═╡ b63b4b08-0a57-4685-83d6-b0edf0192c28 +simshow(projection_parallel) + +# ╔═╡ 2ad8b60a-fa22-4bb2-9e2f-fb819436b229 +geometry_extreme = RadonFlexibleCircle(N, -(N-1)÷2:(N-1)÷2, zeros((199,))) + +# ╔═╡ 5addb1be-736c-4d6e-83ed-12e61908acdb +μ2 = 0.5 .* box((N, N), (2, 50)); + +# ╔═╡ 3cddcaf4-972e-4e6c-967d-a7ed66c70133 +simshow(μ2) + +# ╔═╡ 643831ed-7266-4f1c-ba71-44ebcc44701b +begin + projected_1 = backproject(sinogram2, angles2, μ=μ2); + projected_2 = backproject(sinogram2, angles2 .+ π / 4, μ=μ2); + + [simshow(projected_1) simshow(projected_2)] +end + +# ╔═╡ e33dc483-bd00-4806-b319-139ce0df0756 +begin + projected_exp2 = backproject(sinogram2, angles2, μ=0.04); + + simshow(projected_exp2) +end + +# ╔═╡ Cell order: +# ╠═3e7e2e30-cb85-4eb8-b4f5-b8b19ecade8c +# ╠═8abe2914-922f-4ea5-8d85-b435a22c897f +# ╠═009ad239-5f90-4c9e-9d3c-23d58cb5f4af +# ╠═aa5e0f2d-8b11-447d-be55-c84a1421cafd +# ╠═7cfebbbc-e36f-474c-879d-dc0a8e360f6d +# ╟─dad29ebd-c69b-42ed-aef4-6bfc76d59a32 +# ╠═604ed50d-616c-4fc9-8adc-d2e29595c504 +# ╠═a4e4eb4e-da5f-4f91-bbf9-73b983968c16 +# ╟─490f4bb3-6ab5-47be-b2cc-f30f13cc2721 +# ╠═a89bbe2a-341c-4005-8243-f2c0cdcbd722 +# ╠═b1b301d4-abab-4d07-9c00-3782db4a5ee4 +# ╟─7e2d4d16-2ac5-4d44-b5f5-67f9343e59e0 +# ╠═f82bfaa5-b394-4159-99d4-9cc859f12f32 +# ╠═e9a404d0-e9bb-468c-9490-ec2d12039f20 +# ╠═0bbef52a-e191-46c7-8aa0-ce105d07b54b +# ╟─32fa73fa-726d-4b03-bae1-f8094b7c4a5c +# ╠═32b2b1ca-aa80-4931-9d03-9f19340c1ca8 +# ╠═4e5e1bb1-eeb9-43f7-91a8-ba7b8b76dccd +# ╟─b7892246-8fe0-437c-a224-f1ca4661ef33 +# ╠═059f357a-b1fc-4f6d-af5f-72ffd47cb64c +# ╠═8a8e536a-c6a3-412b-b986-f33f2620429a +# ╠═d8edea79-7775-4718-9637-127df8b68715 +# ╠═83c920b7-e932-4deb-ab4c-08ec4412f0c9 +# ╠═26af8e6e-4afa-4d73-9bbc-630e07bd6694 +# ╠═06680604-1426-4f2f-963d-412b73f31c33 +# ╠═fd3a4f13-27c8-4766-9e58-07050aa1db2f +# ╠═26015d23-e708-4ebc-b718-18bd5104000b +# ╠═5f5fb511-4b55-43bb-b8ac-f520e8b3bbc7 +# ╠═e6b5f0b8-e4c4-425a-905d-3678396d4dcc +# ╠═370d11ad-3b75-4013-8a1d-9439f1bf69b2 +# ╠═8909b583-1674-49eb-a17e-efe01cfb2154 +# ╠═cc8c8da2-18a8-406e-9b22-b8bfa4b76c48 +# ╠═775543bb-7c6d-46d5-91e1-cbcd980d22d5 +# ╠═a97b5c18-921c-422c-a632-58b883f2e89c +# ╠═950f65be-8d23-4b97-ae39-821c48d86ea5 +# ╠═b63b4b08-0a57-4685-83d6-b0edf0192c28 +# ╠═2ad8b60a-fa22-4bb2-9e2f-fb819436b229 +# ╠═5addb1be-736c-4d6e-83ed-12e61908acdb +# ╠═3cddcaf4-972e-4e6c-967d-a7ed66c70133 +# ╠═643831ed-7266-4f1c-ba71-44ebcc44701b +# ╠═e33dc483-bd00-4806-b319-139ce0df0756 diff --git a/examples/Manifest.toml b/examples/Manifest.toml index ca29abc..2d8b83e 100644 --- a/examples/Manifest.toml +++ b/examples/Manifest.toml @@ -1,13 +1,13 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.0" +julia_version = "1.10.2" manifest_format = "2.0" project_hash = "ba21296ff49d3ce1d48865df6c57170e38033bac" [[deps.ADTypes]] -git-tree-sha1 = "41c37aa88889c171f1300ceac1313c06e891d245" +git-tree-sha1 = "016833eb52ba2d6bea9fcb50ca295980e728ee24" uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" -version = "0.2.6" +version = "0.2.7" [[deps.AMD]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] @@ -28,20 +28,41 @@ weakdeps = ["ChainRulesCore", "Test"] [[deps.AbstractPlutoDingetjes]] deps = ["Pkg"] -git-tree-sha1 = "c278dfab760520b8bb7e9511b968bf4ba38b7acc" +git-tree-sha1 = "0f748c81756f2e5e6854298f11ad8b2dfae6911a" uuid = "6e696c72-6542-2067-7265-42206c756150" -version = "1.2.3" +version = "1.3.0" [[deps.AbstractTrees]] -git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c" +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.4.4" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"] +git-tree-sha1 = "c0d491ef0b135fd7d63cbc6404286bc633329425" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.36" + + [deps.Accessors.extensions] + AccessorsAxisKeysExt = "AxisKeys" + AccessorsIntervalSetsExt = "IntervalSets" + AccessorsStaticArraysExt = "StaticArrays" + AccessorsStructArraysExt = "StructArrays" + AccessorsUnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "0fb305e0253fd4e833d486914367a2ee2c2e78d0" +git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.0.1" +version = "4.0.4" weakdeps = ["StaticArrays"] [deps.Adapt.extensions] @@ -57,16 +78,18 @@ uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" version = "1.1.1" [[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "bbec08a37f8722786d87bedf84eae19c020c4efa" +deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "44691067188f6bd1b2289552a23e4b7572f4528d" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.7.0" +version = "7.9.0" [deps.ArrayInterface.extensions] ArrayInterfaceBandedMatricesExt = "BandedMatrices" ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceChainRulesExt = "ChainRules" ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" ArrayInterfaceTrackerExt = "Tracker" @@ -74,7 +97,9 @@ version = "7.7.0" BandedMatrices = "aae01518-5342-5314-be14-df237901396f" BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" @@ -101,9 +126,9 @@ version = "0.4.7" [[deps.BFloat16s]] deps = ["LinearAlgebra", "Printf", "Random", "Test"] -git-tree-sha1 = "dbf84058d0a8cbbadee18d25cf606934b22d7c66" +git-tree-sha1 = "2c7cc21e8678eff479978a0a2ef5ce2f51b63dff" uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" -version = "0.4.2" +version = "0.5.0" [[deps.BangBang]] deps = ["Compat", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires", "Setfield", "Tables"] @@ -135,9 +160,9 @@ version = "0.1.1" [[deps.BenchmarkTools]] deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] -git-tree-sha1 = "f1f03a9fa24271160ed7e73051fba3c1a759b53f" +git-tree-sha1 = "f1dff6729bc61f4d49e140da1af55dcd1ac97b2f" uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" -version = "1.4.0" +version = "1.5.0" [[deps.BitFlags]] git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" @@ -169,9 +194,9 @@ version = "0.2.4" [[deps.CUDA]] deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "DataFrames", "ExprTools", "GPUArrays", "GPUCompiler", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "StaticArrays", "Statistics"] -git-tree-sha1 = "baa8ea7a1ea63316fa3feb454635215773c9c845" +git-tree-sha1 = "3dcab8a2c18ca319ea15a41d90e9528b8e93894a" uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" -version = "5.2.0" +version = "5.3.0" weakdeps = ["ChainRulesCore", "SpecialFunctions"] [deps.CUDA.extensions] @@ -180,39 +205,39 @@ weakdeps = ["ChainRulesCore", "SpecialFunctions"] [[deps.CUDA_Driver_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] -git-tree-sha1 = "d01bfc999768f0a31ed36f5d22a76161fc63079c" +git-tree-sha1 = "dc172b558adbf17952001e15cf0d6364e6d78c2f" uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" -version = "0.7.0+1" +version = "0.8.1+0" [[deps.CUDA_Runtime_Discovery]] deps = ["Libdl"] -git-tree-sha1 = "2cb12f6b2209f40a4b8967697689a47c50485490" +git-tree-sha1 = "38f830504358e9972d2a0c3e5d51cb865e0733df" uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" -version = "0.2.3" +version = "0.2.4" [[deps.CUDA_Runtime_jll]] deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "8e25c009d2bf16c2c31a70a6e9e8939f7325cc84" +git-tree-sha1 = "4ca7d6d92075906c2ce871ea8bba971fff20d00c" uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" -version = "0.11.1+0" +version = "0.12.1+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", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "a4c43f59baa34011e303e76f5c8c91bf58415aaf" uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.16.1+1" +version = "1.18.0+1" [[deps.ChainRules]] deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] -git-tree-sha1 = "213f001d1233fd3b8ef007f50c8cab29061917d8" +git-tree-sha1 = "4e42872be98fa3343c4f8458cbda8c5c6a6fa97c" uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" -version = "1.61.0" +version = "1.63.0" [[deps.ChainRulesCore]] deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "1287e3872d646eed95198457873249bd9f0caed2" +git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.20.1" +version = "1.23.0" weakdeps = ["SparseArrays"] [deps.ChainRulesCore.extensions] @@ -224,12 +249,6 @@ git-tree-sha1 = "c0216e792f518b39b22212127d4a84dc31e4e386" uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" version = "1.3.5" -[[deps.CodecBzip2]] -deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] -git-tree-sha1 = "9b1ca1aa6ce3f71b3d1840c538a8210a043625eb" -uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" -version = "0.8.2" - [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" @@ -244,19 +263,15 @@ version = "3.24.0" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.4" +version = "0.11.5" [[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "600cc5508d66b78aae350f7accdb58763ac18589" uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.10.0" -weakdeps = ["SpecialFunctions"] - - [deps.ColorVectorSpace.extensions] - SpecialFunctionsExt = "SpecialFunctions" +version = "0.9.10" [[deps.Colors]] deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] @@ -277,9 +292,9 @@ version = "0.3.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "75bd5b6fc5089df449b5d35fa501c846c9b6549b" +git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.12.0" +version = "4.14.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -288,24 +303,22 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+1" +version = "1.1.0+0" [[deps.CompositionsBase]] git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" version = "0.1.2" +weakdeps = ["InverseFunctions"] [deps.CompositionsBase.extensions] CompositionsBaseInverseFunctionsExt = "InverseFunctions" - [deps.CompositionsBase.weakdeps] - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - [[deps.ConcurrentUtilities]] deps = ["Serialization", "Sockets"] -git-tree-sha1 = "8cfa272e8bdedfa88b6aefbbca7c19f1befac519" +git-tree-sha1 = "6cbbd4d241d7e6579ab354737f4dd95ca43946e1" uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.3.0" +version = "2.4.1" [[deps.Configurations]] deps = ["ExproniconLite", "OrderedCollections", "TOML"] @@ -321,9 +334,9 @@ version = "0.1.2" [[deps.ConstructionBase]] deps = ["LinearAlgebra"] -git-tree-sha1 = "c53fc348ca4d40d7b371e71fd52251839080cbc9" +git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2" uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.5.4" +version = "1.5.5" weakdeps = ["IntervalSets", "StaticArrays"] [deps.ConstructionBase.extensions] @@ -337,9 +350,9 @@ uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" version = "0.1.3" [[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.CpuId]] deps = ["Markdown"] @@ -365,9 +378,9 @@ version = "1.6.1" [[deps.DataStructures]] deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "ac67408d9ddf207de5cfa9a97e114352430f01ed" +git-tree-sha1 = "97d79461925cdb635ee32116978fc735b9463a39" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.16" +version = "0.18.19" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -456,14 +469,14 @@ uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" version = "0.1.10" [[deps.ExpressionExplorer]] -git-tree-sha1 = "bce17cd0180a75eec637d6e3f8153011b8bdb25a" +git-tree-sha1 = "0da78bef32ca71276337442389a3d1962a1ee0da" uuid = "21656369-7473-754a-2065-74616d696c43" -version = "1.0.0" +version = "1.0.2" [[deps.ExproniconLite]] -git-tree-sha1 = "fbc390c2f896031db5484bc152a7e805ecdfb01f" +git-tree-sha1 = "5552cf384e4577c5dd2db57d7086a4a41747dbb9" uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" -version = "0.10.5" +version = "0.10.6" [[deps.FFMPEG]] deps = ["FFMPEG_jll"] @@ -472,10 +485,10 @@ uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" version = "0.4.1" [[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", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.2+2" +version = "4.4.4+1" [[deps.FFTW]] deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] @@ -508,18 +521,18 @@ version = "0.3.2" [[deps.FileIO]] deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "c5c28c245101bd59154f649e19b038d15901b5dc" +git-tree-sha1 = "82d8afa92ecf4b52d78d869f038ebfb881267322" uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.16.2" +version = "1.16.3" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" [[deps.FillArrays]] -deps = ["LinearAlgebra", "Random"] -git-tree-sha1 = "5b93957f6dcd33fc343044af3d48c215be2562f1" +deps = ["LinearAlgebra"] +git-tree-sha1 = "bfe82a708416cf00b73a3198db0859c82f741558" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.9.3" +version = "1.10.0" [deps.FillArrays.extensions] FillArraysPDMatsExt = "PDMats" @@ -533,9 +546,9 @@ version = "1.9.3" [[deps.FiniteDiff]] deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] -git-tree-sha1 = "73d1214fec245096717847c62d389a5d2ac86504" +git-tree-sha1 = "bc0c5092d6caaea112d3c8e3b238d61563c58d5f" uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.22.0" +version = "2.23.0" [deps.FiniteDiff.extensions] FiniteDiffBandedMatricesExt = "BandedMatrices" @@ -559,11 +572,10 @@ git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" version = "2.13.93+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.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] @@ -600,9 +612,9 @@ version = "0.1.3" [[deps.Functors]] deps = ["LinearAlgebra"] -git-tree-sha1 = "9a68d75d466ccc1218d0552a8e1631151c569545" +git-tree-sha1 = "d3e63d9fa13f8eaa2f06f64949e2afc593ff52c2" uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" -version = "0.4.5" +version = "0.4.10" [[deps.Future]] deps = ["Random"] @@ -610,9 +622,9 @@ uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" [[deps.FuzzyCompletions]] deps = ["REPL"] -git-tree-sha1 = "c8d37d615586bea181063613dccc555499feb298" +git-tree-sha1 = "40ec72c57559a4473961bbcd12c96bcd4c2aaab4" uuid = "fb4132e2-a121-4a70-b8a1-d5b831dcdcc2" -version = "0.5.3" +version = "0.5.4" [[deps.GLFW_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] @@ -622,9 +634,9 @@ version = "3.3.9+0" [[deps.GPUArrays]] deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] -git-tree-sha1 = "47e4686ec18a9620850bad110b79966132f14283" +git-tree-sha1 = "68e8ff56a4a355a85d2784b94614491f8c900cde" uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" -version = "10.0.2" +version = "10.1.0" [[deps.GPUArraysCore]] deps = ["Adapt"] @@ -634,21 +646,21 @@ version = "0.1.6" [[deps.GPUCompiler]] deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "TimerOutputs", "UUIDs"] -git-tree-sha1 = "a846f297ce9d09ccba02ead0cae70690e072a119" +git-tree-sha1 = "1600477fba37c9fc067b9be21f5e8101f24a8865" uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "0.25.0" +version = "0.26.4" [[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 = "8e2d86e06ceb4580110d9e716be26658effc5bfd" +git-tree-sha1 = "3437ade7073682993e092ca570ad68a2aba26983" uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.72.8" +version = "0.73.3" [[deps.GR_jll]] -deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "da121cbdc95b065da07fbb93638367737969693f" +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 = "a96d5c713e6aa28c242b0d25c1347e258d6541ab" uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.72.8+0" +version = "0.73.3+0" [[deps.Gettext_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] @@ -656,11 +668,23 @@ git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" version = "0.21.0+0" +[[deps.Ghostscript_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "43ba3d3c82c18d88471cfd2924931658838c9d8f" +uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" +version = "9.55.0+4" + [[deps.Glib_jll]] deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "e94c92c7bf4819685eb80186d51c43e71d4afa17" +git-tree-sha1 = "359a1ba2e320790ddbe4ee8b4d54a305c0ea2aff" uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.76.5+0" +version = "2.80.0+0" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" [[deps.Graphite2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -675,9 +699,9 @@ 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 = "abbbb9ec3afd783a7cbd82ef01dcd088ea051398" +git-tree-sha1 = "8e59b47b9dc525b70550ca082ce85bcd7f5477cd" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.1" +version = "1.10.5" [[deps.HarfBuzz_jll]] deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] @@ -728,15 +752,15 @@ version = "0.6.11" [[deps.ImageBase]] deps = ["ImageCore", "Reexport"] -git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835" uuid = "c817782e-172a-44cc-b673-b171935fbb9e" -version = "0.1.7" +version = "0.1.5" [[deps.ImageCore]] -deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] -git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] +git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" -version = "0.10.2" +version = "0.9.4" [[deps.ImageIO]] deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] @@ -745,16 +769,16 @@ uuid = "82e4d734-157c-48bb-816b-45c225c6df19" version = "0.6.7" [[deps.ImageMagick]] -deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils"] -git-tree-sha1 = "b0b765ff0b4c3ee20ce6740d843be8dfce48487c" +deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils", "Libdl", "Pkg", "Random"] +git-tree-sha1 = "5bc1cb62e0c5f1005868358db0692c994c3a13c6" uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" -version = "1.3.0" +version = "1.2.1" [[deps.ImageMagick_jll]] -deps = ["JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "1c0a2295cca535fabaf2029062912591e9b61987" +deps = ["Artifacts", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "OpenJpeg_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "d65554bad8b16d9562050c67e7223abf91eaba2f" uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" -version = "6.9.10-12+3" +version = "6.9.13+0" [[deps.ImageMetadata]] deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] @@ -822,15 +846,26 @@ weakdeps = ["Unitful"] InterpolationsUnitfulExt = "Unitful" [[deps.IntervalSets]] -deps = ["Dates", "Random"] -git-tree-sha1 = "3d8866c029dd6b16e69e0d4a939c4dfcb98fac47" +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.8" -weakdeps = ["Statistics"] +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" IntervalSetsStatisticsExt = "Statistics" +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "896385798a8d49a255c398bd49162062e4a4c435" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.13" +weakdeps = ["Dates"] + + [deps.InverseFunctions.extensions] + DatesExt = "Dates" + [[deps.InvertedIndices]] git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038" uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" @@ -848,9 +883,9 @@ version = "1.10.0" [[deps.IterativeSolvers]] deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] -git-tree-sha1 = "b435d190ef8369cf4d79cc9dd5fba88ba0165307" +git-tree-sha1 = "59545b0a2b27208b0650df0a46b8e3019f85055b" uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" -version = "0.9.3" +version = "0.9.4" [[deps.IteratorInterfaceExtensions]] git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" @@ -883,15 +918,15 @@ version = "0.1.5" [[deps.JpegTurbo_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "60b1194df0a3298f460063de985eae7b01bc011a" +git-tree-sha1 = "3336abae9a713d2210bb57ab484b1e065edd7d23" uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.0.1+0" +version = "3.0.2+0" [[deps.JuliaInterpreter]] deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] -git-tree-sha1 = "04663b9e1eb0d0eabf76a6d0752e0dac83d53b36" +git-tree-sha1 = "e9648d90370e2d0317f9518c9c6e0841db54a90b" uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" -version = "0.9.28" +version = "0.9.31" [[deps.JuliaNVTXCallbacks_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -907,9 +942,9 @@ version = "0.2.4" [[deps.KernelAbstractions]] deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "PrecompileTools", "Requires", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] -git-tree-sha1 = "4e0cb2f5aad44dcfdc91088e85dee4ecb22c791c" +git-tree-sha1 = "ed7167240f40e62d97c1f5f7735dea6de3cc5c49" uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.9.16" +version = "0.9.18" [deps.KernelAbstractions.extensions] EnzymeExt = "EnzymeCore" @@ -937,9 +972,9 @@ version = "3.0.0+1" [[deps.LLVM]] deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"] -git-tree-sha1 = "cb4619f7353fc62a1a22ffa3d7ed9791cfb47ad8" +git-tree-sha1 = "839c82932db86740ae729779e610f07a1640be9a" uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "6.4.2" +version = "6.6.3" weakdeps = ["BFloat16s"] [deps.LLVM.extensions] @@ -947,9 +982,9 @@ weakdeps = ["BFloat16s"] [[deps.LLVMExtra_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "98eaee04d96d973e79c25d49167668c5c8fb50e2" +git-tree-sha1 = "88b916503aac4fb7f701bb625cd84ca5dd1677bc" uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.27+1" +version = "0.0.29+0" [[deps.LLVMLoopInfo]] git-tree-sha1 = "2e5c102cfc41f48ae4740c7eca7743cc7e7b75ea" @@ -974,10 +1009,10 @@ uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" version = "1.3.1" [[deps.Latexify]] -deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] -git-tree-sha1 = "f428ae552340899a935973270b8d98e5a31c49fe" +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "cad560042a7cc108f5a4c24ea1431a9221f22c1b" uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.16.1" +version = "0.16.2" [deps.Latexify.extensions] DataFramesExt = "DataFrames" @@ -998,12 +1033,6 @@ git-tree-sha1 = "8f7f3cabab0fd1800699663533b6d5cb3fc0e612" uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" version = "1.2.2" -[[deps.Lazy]] -deps = ["MacroTools"] -git-tree-sha1 = "1370f8202dac30758f3c345f9909b97f53d87d3f" -uuid = "50d2b5c4-7a5e-59d5-8109-a42b560f39c0" -version = "0.15.1" - [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" @@ -1077,22 +1106,22 @@ uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" version = "1.17.0+0" [[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "dae976433497a2f841baadea93d27e68f1a12a97" uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.35.0+0" +version = "2.39.3+0" [[deps.Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.4.0+0" +version = "4.5.1+1" [[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0a04a1318df1bf510beb2562cf90fb0c386f58c4" uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.36.0+0" +version = "2.39.3+1" [[deps.LineSearches]] deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] @@ -1124,9 +1153,9 @@ version = "0.11.0" [[deps.LinearOperatorCollection]] deps = ["InteractiveUtils", "LinearAlgebra", "LinearOperators", "Random", "Reexport", "SparseArrays"] -git-tree-sha1 = "886aaaf98aba69e407aa86058259ce128d9b1f2f" +git-tree-sha1 = "9bec337396ad9c46fa9f662606718755dbcda5eb" uuid = "a4a2c56f-fead-462a-a3ab-85921a5f2575" -version = "1.1.2" +version = "1.2.1" [deps.LinearOperatorCollection.extensions] LinearOperatorFFTWExt = "FFTW" @@ -1140,19 +1169,25 @@ version = "1.1.2" [[deps.LinearOperators]] deps = ["FastClosures", "LDLFactorizations", "LinearAlgebra", "Printf", "Requires", "SparseArrays", "TimerOutputs"] -git-tree-sha1 = "58e2ca62646a62e18f86253b9c2a2d821c2d934b" +git-tree-sha1 = "f06df3a46255879cbccae1b5b6dcb16994c31be7" uuid = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125" -version = "2.6.0" +version = "2.7.0" weakdeps = ["ChainRulesCore"] [deps.LinearOperators.extensions] LinearOperatorsChainRulesCoreExt = "ChainRulesCore" +[[deps.LittleCMS_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll"] +git-tree-sha1 = "08ed30575ffc5651a50d3291beaf94c3e7996e55" +uuid = "d3a379c0-f9a3-5b72-a4c0-6bf4d2e8af0f" +version = "2.15.0+0" + [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "7d6dd4e9212aebaeed356de34ccf262a3cd415aa" +git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.26" +version = "0.3.27" [deps.LogExpFunctions.extensions] LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" @@ -1175,9 +1210,9 @@ version = "1.0.3" [[deps.LoweredCodeUtils]] deps = ["JuliaInterpreter"] -git-tree-sha1 = "20ce1091ba18bcdae71ad9b71ee2367796ba6c48" +git-tree-sha1 = "31e27f0b0bf0df3e3e951bfcc43fe8c730a219f6" uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" -version = "2.4.4" +version = "2.4.5" [[deps.MIMEs]] git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" @@ -1221,12 +1256,6 @@ version = "0.4.2" deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -[[deps.MathOptInterface]] -deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"] -git-tree-sha1 = "8b40681684df46785a0012d352982e22ac3be59e" -uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -version = "1.25.2" - [[deps.MbedTLS]] deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" @@ -1251,9 +1280,9 @@ version = "0.1.4" [[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" @@ -1274,17 +1303,11 @@ git-tree-sha1 = "f5db02ae992c260e4826fe78c942954b48e1d9c2" uuid = "99f44e22-a591-53d1-9472-aa23ef4bd671" version = "1.2.1" -[[deps.MutableArithmetics]] -deps = ["LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "806eea990fb41f9b36f1253e5697aa645bf6a9f8" -uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" -version = "1.4.0" - [[deps.NDTools]] deps = ["LinearAlgebra", "OffsetArrays", "PaddedViews", "Random", "Statistics"] -git-tree-sha1 = "4d5fc006e0a006875f57be883c81d9c4a5d56bc6" +git-tree-sha1 = "3e87b9a00ad1d7b0322150b1acba91f7e48792b5" uuid = "98581153-e998-4eef-8d0d-5ec2c052313d" -version = "0.5.3" +version = "0.6.0" [[deps.NLSolversBase]] deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] @@ -1350,7 +1373,7 @@ version = "1.3.5+1" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+2" +version = "0.3.23+4" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] @@ -1364,6 +1387,12 @@ git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" version = "3.1.4+0" +[[deps.OpenJpeg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libtiff_jll", "LittleCMS_jll", "libpng_jll"] +git-tree-sha1 = "8d4c87ffaf09dbdd82bcf8c939843e94dd424df2" +uuid = "643b3616-a352-519d-856d-80112ee9badc" +version = "2.5.0+0" + [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" @@ -1371,15 +1400,15 @@ version = "0.8.1+2" [[deps.OpenSSL]] deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "51901a49222b09e3743c65b8847687ae5fc78eb2" +git-tree-sha1 = "af81a32750ebc831ee28bdaaba6e1067decef51e" uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.4.1" +version = "1.4.2" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a12e56c72edee3ce6b96667745e6cbbe5498f200" +git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "1.1.23+0" +version = "3.0.13+1" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] @@ -1388,24 +1417,36 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.5+0" [[deps.Optim]] -deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "MathOptInterface", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] -git-tree-sha1 = "47fea72de134f75b105a5d4a1abe5c6aec89d390" +deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89" uuid = "429524aa-4258-5aef-a3af-852621145aeb" -version = "1.9.1" +version = "1.9.4" + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + + [deps.Optim.weakdeps] + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" [[deps.Optimisers]] deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "34205b1204cc83c43cd9cfe53ffbd3b310f6e8c5" +git-tree-sha1 = "6572fe0c5b74431aaeb0b18a4aa5ef03c84678be" uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" -version = "0.3.1" +version = "0.3.3" [[deps.Optimization]] -deps = ["ADTypes", "ArrayInterface", "ConsoleProgressMonitor", "DocStringExtensions", "LinearAlgebra", "Logging", "LoggingExtras", "Pkg", "Printf", "ProgressLogging", "Reexport", "SciMLBase", "SparseArrays", "TerminalLoggers"] -git-tree-sha1 = "145baedf71770d84bf590d307b4686a9ea619c4b" +deps = ["ADTypes", "ArrayInterface", "ConsoleProgressMonitor", "DocStringExtensions", "LinearAlgebra", "Logging", "LoggingExtras", "OptimizationBase", "Pkg", "Printf", "ProgressLogging", "Reexport", "SciMLBase", "SparseArrays", "TerminalLoggers"] +git-tree-sha1 = "bc659730e7efff07c95218f24ed4c6f472054938" uuid = "7f7a1694-90dd-40f0-9382-eb1efda571ba" -version = "3.22.0" +version = "3.24.3" + +[[deps.OptimizationBase]] +deps = ["ADTypes", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "Reexport", "Requires", "SciMLBase", "SparseArrays"] +git-tree-sha1 = "6266f3365980f0a6a39426316595bc1254df239c" +uuid = "bca83a33-5cc9-4baa-983d-23429ab6bcbb" +version = "0.0.5" - [deps.Optimization.extensions] + [deps.OptimizationBase.extensions] OptimizationEnzymeExt = "Enzyme" OptimizationFiniteDiffExt = "FiniteDiff" OptimizationForwardDiffExt = "ForwardDiff" @@ -1415,7 +1456,7 @@ version = "3.22.0" OptimizationTrackerExt = "Tracker" OptimizationZygoteExt = "Zygote" - [deps.Optimization.weakdeps] + [deps.OptimizationBase.weakdeps] Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" @@ -1428,9 +1469,9 @@ version = "3.22.0" [[deps.OptimizationOptimJL]] deps = ["Optim", "Optimization", "Reexport", "SparseArrays"] -git-tree-sha1 = "6cdc08135141c153b49372de47416ac15fed42de" +git-tree-sha1 = "4747c78bea226ac7876ae72e5e2521c43a5c927c" uuid = "36348300-93cb-4f02-beb5-3c3902f8871e" -version = "0.2.2" +version = "0.2.3" [[deps.OptimizationOptimisers]] deps = ["Optimisers", "Optimization", "Printf", "ProgressLogging", "Reexport"] @@ -1508,15 +1549,15 @@ version = "3.1.0" [[deps.PlotUtils]] deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "862942baf5663da528f66d24996eb6da85218e76" +git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.0" +version = "1.4.1" [[deps.Plots]] deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] -git-tree-sha1 = "38a748946dca52a622e79eea6ed35c6737499109" +git-tree-sha1 = "442e1e7ac27dd5ff8825c3fa62fbd1e86397974b" uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.40.0" +version = "1.40.4" [deps.Plots.extensions] FileIOExt = "FileIO" @@ -1533,10 +1574,16 @@ version = "1.40.0" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [[deps.Pluto]] -deps = ["Base64", "Configurations", "Dates", "Downloads", "ExpressionExplorer", "FileWatching", "FuzzyCompletions", "HTTP", "HypertextLiteral", "InteractiveUtils", "Logging", "LoggingExtras", "MIMEs", "Malt", "Markdown", "MsgPack", "Pkg", "PrecompileSignatures", "PrecompileTools", "REPL", "RegistryInstances", "RelocatableFolders", "Scratch", "Sockets", "TOML", "Tables", "URIs", "UUIDs"] -git-tree-sha1 = "449f468cbb80c3eec6e6d8443a0913d8bbad4d0d" +deps = ["Base64", "Configurations", "Dates", "Downloads", "ExpressionExplorer", "FileWatching", "FuzzyCompletions", "HTTP", "HypertextLiteral", "InteractiveUtils", "Logging", "LoggingExtras", "MIMEs", "Malt", "Markdown", "MsgPack", "Pkg", "PlutoDependencyExplorer", "PrecompileSignatures", "PrecompileTools", "REPL", "RegistryInstances", "RelocatableFolders", "Scratch", "Sockets", "TOML", "Tables", "URIs", "UUIDs"] +git-tree-sha1 = "35280d2e6b2211bc5f9e913460c263ac89ef56f0" uuid = "c3e4b0f8-55cb-11ea-2926-15256bba5781" -version = "0.19.38" +version = "0.19.40" + +[[deps.PlutoDependencyExplorer]] +deps = ["ExpressionExplorer", "InteractiveUtils", "Markdown"] +git-tree-sha1 = "4bc5284f77d731196d3e97f23abb732ad6f2a6e4" +uuid = "72656b73-756c-7461-726b-72656b6b696b" +version = "1.0.4" [[deps.PlutoTest]] deps = ["HypertextLiteral", "InteractiveUtils", "Markdown", "Test"] @@ -1546,9 +1593,9 @@ version = "0.2.2" [[deps.PlutoUI]] deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] -git-tree-sha1 = "68723afdb616445c6caaef6255067a8339f91325" +git-tree-sha1 = "71a22244e352aa8c5f0f2adde4150f62368a3f2e" uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" -version = "0.7.55" +version = "0.7.58" [[deps.PoissonRandom]] deps = ["Random"] @@ -1575,15 +1622,15 @@ version = "3.0.3" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.0" +version = "1.2.1" [[deps.Preferences]] deps = ["TOML"] -git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e" +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.1" +version = "1.4.3" [[deps.PrettyPrint]] git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" @@ -1612,9 +1659,9 @@ version = "0.1.4" [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] -git-tree-sha1 = "00099623ffee15972c16111bcf84c58a0051257c" +git-tree-sha1 = "763a8ceb07833dd51bb9e3bbca372de32c0605ad" uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.9.0" +version = "1.10.0" [[deps.QOI]] deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] @@ -1622,11 +1669,11 @@ git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" version = "1.0.0" -[[deps.Qt5Base_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] -git-tree-sha1 = "0c03844e2231e12fda4d0086fd7cbe4098ee8dc5" -uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" -version = "5.15.3+2" +[[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 = "37b7bb7aabf9a085e0044307e1717436117f2b3b" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.5.3+1" [[deps.REPL]] deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] @@ -1636,7 +1683,7 @@ uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" deps = ["Atomix", "ChainRulesCore", "FFTW", "IndexFunArrays", "KernelAbstractions", "PrecompileTools"] path = ".." uuid = "86de8297-835b-47df-b249-c04e8db91db5" -version = "0.3.1" +version = "0.6.1" [[deps.Random]] deps = ["SHA"] @@ -1644,9 +1691,9 @@ uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [[deps.Random123]] deps = ["Random", "RandomNumbers"] -git-tree-sha1 = "c860e84651f58ce240dd79e5d9e055d55234c35a" +git-tree-sha1 = "4743b43e5a9c4a2ede372de7061eed81795b12e7" uuid = "74087812-796a-5b5d-8853-05524746bad3" -version = "1.6.2" +version = "1.7.0" [[deps.RandomNumbers]] deps = ["Random", "Requires"] @@ -1689,9 +1736,9 @@ version = "0.6.12" [[deps.RecursiveArrayTools]] deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "SparseArrays", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] -git-tree-sha1 = "2bd309f5171a628efdf5309361cd8a779b9e63a9" +git-tree-sha1 = "d8f131090f2e44b145084928856a561c83f43b27" uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "3.8.0" +version = "3.13.0" [deps.RecursiveArrayTools.extensions] RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" @@ -1742,9 +1789,9 @@ version = "1.3.0" [[deps.Revise]] deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] -git-tree-sha1 = "3fe4e5b9cdbb9bbc851c57b149e516acc07f8f72" +git-tree-sha1 = "12aa2d7593df490c407a3bbd8b86b8b515017f3e" uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" -version = "3.5.13" +version = "3.5.14" [[deps.RuntimeGeneratedFunctions]] deps = ["ExprTools", "SHA", "Serialization"] @@ -1762,13 +1809,14 @@ uuid = "94e857df-77ce-4151-89e5-788b33177be4" version = "0.1.0" [[deps.SciMLBase]] -deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FillArrays", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables", "TruncatedStacktraces"] -git-tree-sha1 = "75bae786dc8b07ec3c2159d578886691823bcb42" +deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "8aed4375fa906e0248b422b71c059a2a57d882ae" uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -version = "2.23.1" +version = "2.32.0" [deps.SciMLBase.extensions] SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseMakieExt = "Makie" SciMLBasePartialFunctionsExt = "PartialFunctions" SciMLBasePyCallExt = "PyCall" SciMLBasePythonCallExt = "PythonCall" @@ -1778,6 +1826,7 @@ version = "2.23.1" [deps.SciMLBase.weakdeps] ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" @@ -1785,10 +1834,15 @@ version = "2.23.1" Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" [[deps.SciMLOperators]] -deps = ["ArrayInterface", "DocStringExtensions", "Lazy", "LinearAlgebra", "Setfield", "SparseArrays", "StaticArraysCore", "Tricks"] -git-tree-sha1 = "51ae235ff058a64815e0a2c34b1db7578a06813d" +deps = ["ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools", "Setfield", "SparseArrays", "StaticArraysCore"] +git-tree-sha1 = "10499f619ef6e890f3f4a38914481cc868689cd5" uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" -version = "0.3.7" +version = "0.3.8" + +[[deps.SciMLStructures]] +git-tree-sha1 = "5833c10ce83d690c124beedfe5f621b50b02ba4d" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.1.0" [[deps.Scratch]] deps = ["Dates"] @@ -1882,9 +1936,9 @@ version = "0.1.1" [[deps.Static]] deps = ["IfElse"] -git-tree-sha1 = "f295e0a1da4ca425659c57441bcb59abb035a4bc" +git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.8.8" +version = "0.8.10" [[deps.StaticArrayInterface]] deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] @@ -1899,9 +1953,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "7b0e9c14c624e435076d19aea1e5cbdec2b9ca37" +git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.2" +version = "1.9.3" weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] @@ -1926,15 +1980,15 @@ version = "1.7.0" [[deps.StatsBase]] deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf" +git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.2" +version = "0.34.3" [[deps.StringDistances]] deps = ["Distances", "StatsAPI"] -git-tree-sha1 = "ceeef74797d961aee825aabf71446d6aba898acb" +git-tree-sha1 = "5b2ca70b099f91e54d98064d5caf5cc9b541ad06" uuid = "88034a9c-02f8-509d-84a9-84ec65e18404" -version = "0.11.2" +version = "0.11.3" [[deps.StringManipulation]] deps = ["PrecompileTools"] @@ -1943,10 +1997,17 @@ uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" version = "0.3.4" [[deps.StructArrays]] -deps = ["Adapt", "ConstructionBase", "DataAPI", "GPUArraysCore", "StaticArraysCore", "Tables"] -git-tree-sha1 = "1b0b1205a56dc288b71b1961d48e351520702e24" +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.17" +version = "0.6.18" +weakdeps = ["Adapt", "GPUArraysCore", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = "GPUArraysCore" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" [[deps.SuiteSparse]] deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] @@ -1958,9 +2019,10 @@ uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" version = "7.2.1+1" [[deps.SymbolicIndexingInterface]] -git-tree-sha1 = "b3103f4f50a3843e66297a2456921377c78f5e31" +deps = ["Accessors", "ArrayInterface", "MacroTools", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "4b7f4c80449d8baae8857d55535033981862619c" uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" -version = "0.3.5" +version = "0.3.15" [[deps.TOML]] deps = ["Dates"] @@ -2019,9 +2081,9 @@ uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" version = "0.5.23" [[deps.TranscodingStreams]] -git-tree-sha1 = "54194d92959d8ebaa8e26227dbe3cdefcdcd594f" +git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349" uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.10.3" +version = "0.10.7" weakdeps = ["Random", "Test"] [deps.TranscodingStreams.extensions] @@ -2052,12 +2114,6 @@ git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" version = "0.1.8" -[[deps.TruncatedStacktraces]] -deps = ["InteractiveUtils", "MacroTools", "Preferences"] -git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" -uuid = "781d530d-4396-4725-bb49-402e4bee1e77" -version = "1.4.0" - [[deps.Tullio]] deps = ["DiffRules", "LinearAlgebra", "Requires"] git-tree-sha1 = "6d476962ba4e435d7f4101a403b1d3d72afe72f3" @@ -2104,15 +2160,12 @@ deps = ["Dates", "LinearAlgebra", "Random"] git-tree-sha1 = "3c793be6df9dd77a0cf49d80984ef9ff996948fa" uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" version = "1.19.0" +weakdeps = ["ConstructionBase", "InverseFunctions"] [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" @@ -2141,6 +2194,12 @@ git-tree-sha1 = "7209df901e6ed7489fe9b7aa3e46fb788e15db85" uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" version = "0.21.65" +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + [[deps.Wayland_jll]] deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" @@ -2161,9 +2220,9 @@ version = "1.0.0" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "801cbe47eae69adc50f36c3caec4758d2650741b" +git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.12.2+0" +version = "2.12.6+0" [[deps.XSLT_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] @@ -2171,6 +2230,24 @@ git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" uuid = "aed1982a-8fda-507f-9586-7b0439959a61" version = "1.1.34+0" +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Libdl", "Pkg"] +git-tree-sha1 = "e5becd4411063bdcac16be8b66fc2f9f6f1e8fe5" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.0.10+1" + +[[deps.Xorg_libSM_jll]] +deps = ["Libdl", "Pkg", "Xorg_libICE_jll"] +git-tree-sha1 = "4a9d9e4c180e1e8119b5ffc224a7b59d3a7f7e18" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.3+0" + [[deps.Xorg_libX11_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" @@ -2249,6 +2326,12 @@ git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" version = "1.1.2+0" +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + [[deps.Xorg_xcb_util_image_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" @@ -2304,9 +2387,9 @@ version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.5+0" +version = "1.5.6+0" [[deps.Zygote]] deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] @@ -2330,12 +2413,24 @@ git-tree-sha1 = "27798139afc0a2afa7b1824c206d5e87ea587a00" uuid = "700de1a5-db45-46bc-99cf-38207098b444" version = "0.2.5" +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + [[deps.fzf_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "a68c9655fbe6dfcab3d972808f1aafec151ce3f8" uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" version = "0.43.0+0" +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+0" + [[deps.libaom_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" @@ -2353,17 +2448,29 @@ deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" version = "5.8.0+1" +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + [[deps.libfdk_aac_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" version = "2.0.2+0" +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + [[deps.libpng_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "93284c28274d9e75218a416c65ec49d0e0fcdf3d" +git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.40+0" +version = "1.6.43+1" [[deps.libsixel_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] @@ -2377,6 +2484,12 @@ git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" version = "1.3.7+1" +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" diff --git a/examples/benchmarks/benchmark_REPL.jl b/examples/benchmarks/benchmark_REPL.jl index 7886f10..6ea0c1d 100644 --- a/examples/benchmarks/benchmark_REPL.jl +++ b/examples/benchmarks/benchmark_REPL.jl @@ -3,7 +3,7 @@ using RadonKA, CUDA, BenchmarkTools -for sz in [(512,512,100), (1920, 1920)] +for sz in [(1920, 1920), (512,512,100)] for d in [Array, CuArray] @show d, sz angles = d(range(0f0, 2π, 500)) diff --git a/src/backproject.jl b/src/backproject.jl index 1049f66..c3b5778 100644 --- a/src/backproject.jl +++ b/src/backproject.jl @@ -53,7 +53,8 @@ function backproject(sinogram::AbstractArray{T, 3}, angles_T::AbstractVector; end -function _backproject(sinogram::AbstractArray{T, 3}, angles_T::AbstractVector, geometry::Union{RadonParallelCircle, RadonFlexibleCircle}, μ) where T +function _backproject(sinogram::AbstractArray{T, 3}, angles_T::AbstractVector, + geometry::Union{RadonParallelCircle, RadonFlexibleCircle}, μ) where T @assert size(sinogram, 2) == length(angles_T) "size of angles does not match sinogram size" @assert size(sinogram, 1) == size(geometry.in_height, 1) if geometry isa RadonFlexibleCircle @@ -95,16 +96,22 @@ function _backproject(sinogram::AbstractArray{T, 3}, angles_T::AbstractVector, g # create an absorption function, maps just to 1 in case isnothing(μ) absorb_f = make_absorption_f(μ, T) + μ_array = _get_μ_array(μ) + # of the kernel goes kernel! = backproject_kernel2!(backend) - kernel!(img, sinogram, weights, in_height, out_height, angles, mid, radius, absorb_f, + kernel!(img, sinogram, weights, in_height, out_height, angles, + mid, radius, absorb_f, μ_array, ndrange=(size(sinogram, 1), N_angles, size(img, 3))) KernelAbstractions.synchronize(backend) return img end -@kernel function backproject_kernel2!(img::AbstractArray{T}, @Const(sinogram), @Const(weights), @Const(in_height), - @Const(out_height), @Const(angles), mid, radius, absorb_f) where {T} + + +@kernel function backproject_kernel2!(img::AbstractArray{T}, @Const(sinogram), + @Const(weights), @Const(in_height), @Const(out_height), @Const(angles), + mid, radius, absorb_f, μ_array) where {T} i, iangle, i_z = @index(Global, NTuple) @inbounds sinα, cosα = sincos(angles[iangle]) @@ -133,6 +140,7 @@ end tmp = zero(T) + ray_intensity = one(T) # we store old_direction # if the sign of old_direction changes, we have to stop tracing # because then we hit the end point @@ -148,11 +156,21 @@ end # switch of i and j intentional to keep it consistent with existing code icell, jcell = find_cell(xnew, ynew, xold, yold) - # calculate intersection distance - distance = sqrt((xnew - xold)^2 + (ynew - yold) ^2) + + # there is two different cases. + # - one μ_array which is nothing in case the absorption is constant, then we use + # the simple absorption function absorb_f + # - one μ_array which is not nothing, then we use the absorption array + # and calculate the absorption with the ray_intensity iteratively + # based on the previous value of the ray_intensity. Slightly more inaccurate + # but the only option if μ is not constant in space + @inbounds value_in = sinogram[i, iangle, i_z] + value, ray_intensity = calc_deposit_value(value_in, weight, sinogram, i, + iangle, i_z, icell, jcell, xnew, ynew, + x_dist_rot, y_dist_rot, absorb_f, + xold, yold, ray_intensity, μ_array) # add value to ray, potentially attenuate by attenuated exp factor - @inbounds Atomix.@atomic img[icell, jcell, i_z] += weight * distance * - sinogram[i, iangle, i_z] * absorb_f(xnew, ynew, x_dist_rot, y_dist_rot) + @inbounds Atomix.@atomic img[icell, jcell, i_z] += value xold, yold = xnew, ynew end end diff --git a/src/radon.jl b/src/radon.jl index d51a5f0..483e5e2 100644 --- a/src/radon.jl +++ b/src/radon.jl @@ -1,15 +1,23 @@ export radon +_get_μ_array(μ::Nothing) = nothing +_get_μ_array(μ::Number) = nothing +_get_μ_array(μ::AbstractArray) = μ + + + + function make_absorption_f(μ, ::Type{T}) where T - if isnothing(μ) - @inline (x, y, x_start, y_start) -> one(T) - else - @inline (x, y, x_start, y_start) -> exp(-T(μ) * sqrt((x - x_start)^2 + (y - y_start)^2)) - end + @inline (i, j, iz, x, y, x_start, y_start) -> one(T) +end + +function make_absorption_f(μ::Number, ::Type{T}) where T + @inline (i, j, iz, x, y, x_start, y_start) -> exp(-T(μ) * sqrt((x - x_start)^2 + (y - y_start)^2)) end + # handle 2D function radon(img::AbstractArray{T, 2}, angles::AbstractArray{T2, 1}; geometry=RadonParallelCircle(size(img, 1), -(size(img,1)-1)÷2:(size(img,1)-1)÷2), μ=nothing) where {T, T2} @@ -41,6 +49,9 @@ is the distance to the circular boundary of the field of view. `μ` is in units of pixel length. So `μ=1` corresponds to an attenuation of `exp(-1)` if propagated through one pixel. If `isnothing(μ)`, then the rays are not attenuated. +`μ` can be also an array of the same size as `I` which allows for spatially varying attenuation. For example, `μ=0.01` and `μ = ones(size(I)) * 0.01` are equivalent. +In practice there is a slight difference because we calculate the attenuation differently. + ## `geometry = RadonParallelCircle(-(size(img,1)-1)÷2:(size(img,1)-1)÷2)` This corresponds to a parallel Radon transform. See `?RadonGeometries` for a full list of geometries. There is also the very flexible `RadonFlexibleCircle`. @@ -165,11 +176,13 @@ function _radon(img::AbstractArray{T, 3}, angles_T::AbstractVector, # create an absorption function, maps just to 1 in case isnothing(μ) absorb_f = make_absorption_f(μ, T) + + μ_array = _get_μ_array(μ) # of the kernel goes kernel! = radon_kernel!(backend) kernel!(sinogram::AbstractArray{T}, img, weights, in_height, - out_height, angles, mid, radius, absorb_f, + out_height, angles, mid, radius, absorb_f, μ_array, ndrange=size(sinogram)) KernelAbstractions.synchronize(backend) return sinogram::typeof(img) @@ -178,8 +191,9 @@ end @inline inside_circ(ii, jj, mid, radius) = (ii - mid)^2 + (jj - mid)^2 ≤ radius ^2 @kernel function radon_kernel!(sinogram::AbstractArray{T}, @Const(img), - @Const(weights), @Const(in_height), @Const(out_height), @Const(angles), mid, - radius, absorb_f) where {T} + @Const(weights), @Const(in_height), + @Const(out_height), @Const(angles), mid, + radius, absorb_f, μ_array) where {T} i, iangle, i_z = @index(Global, NTuple) @inbounds sinα, cosα = sincos(angles[iangle]) @@ -205,6 +219,7 @@ end tmp = zero(T) + ray_intensity = one(T) # we store old_direction # if the sign of old_direction changes, we have to stop tracing # because then we hit the end point @@ -220,16 +235,44 @@ end # switch of i and j intentional to keep it consistent with existing code icell, jcell = find_cell(xnew, ynew, xold, yold) - # calculate intersection distance - distance = sqrt((xnew - xold)^2 + (ynew - yold) ^2) + @inbounds value_in = img[icell, jcell, i_z] + value, ray_intensity = calc_deposit_value(value_in, weight, sinogram, i, + iangle, i_z, icell, jcell, xnew, ynew, + x_dist_rot, y_dist_rot, absorb_f, + xold, yold, ray_intensity, μ_array) # add value to ray, potentially attenuate by attenuated exp factor - @inbounds tmp += weight * distance * - img[icell, jcell, i_z] * absorb_f(xnew, ynew, x_dist_rot, y_dist_rot) + @inbounds tmp += value xold, yold = xnew, ynew end @inbounds sinogram[i, iangle, i_z] = tmp end +# we have two different cases +# - one μ_array which is nothing in case the absorption is constant, then we use +# the simple absorption function absorb_f +# - one μ_array which is not nothing, then we use the absorption array +# +# the function returns the value and the new ray_intensity +# so we can reuse the whole code but whether if μ is an array or not, we do +# two different things +@inline function calc_deposit_value(value_in, weight, sinogram, i, iangle, i_z, icell, jcell, xnew, ynew, x_dist_rot, y_dist_rot, absorb_f, xold, yold, ray_intensity, μ_array::Nothing) + # calculate intersection distance + distance = sqrt((xnew - xold)^2 + (ynew - yold) ^2) + value = weight * distance * value_in * absorb_f(icell, jcell, i_z, xnew, ynew, x_dist_rot, y_dist_rot) + return value, ray_intensity +end + +@inline function calc_deposit_value(value_in, weight, sinogram, i, iangle, i_z, icell, jcell, xnew, ynew, x_dist_rot, y_dist_rot, absorb_f, xold, yold, ray_intensity, μ_array) + distance = sqrt((xnew - xold)^2 + (ynew - yold) ^2) + + + @inbounds f = exp(-distance * μ_array[icell, jcell, i_z]) + ray_intensity *= f + value = value_in * weight * distance * ray_intensity + return value, ray_intensity +end + + # define adjoint rules diff --git a/test/runtests.jl b/test/runtests.jl index 1d6a0d7..231e100 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -71,6 +71,22 @@ using Zygote @test exp.(-(1:1:8).* 0.1) ≈ arr[begin+1:end-1, 6][:] end + @testset "Compare with array absorption" begin + sinogram = zeros(Float64, (9, 10)) + sinogram[5, :] .= 1 + angles = range(0, 2π, 10) + arr1 = backproject(sinogram, angles, μ=0.1) + arr2 = backproject(sinogram, angles, μ=0.1 * ones((10, 10))) + @test all(.≈(arr1, arr2, rtol=0.001)) + + + array = zeros((16, 16,1)) + arr1 = radon(array, angles, μ=0.1) + arr2 = radon(array, angles, μ=0.1 * ones((16, 16))) + @test all(.≈(arr1, arr2, rtol=0.001)) + + end + @testset "Compare with theoretical radon" begin @@ -136,11 +152,14 @@ using Zygote geometry1 = RadonFlexibleCircle(size(x, 1), -(size(x,1)-1)÷2:(size(x,1)-1)÷2, 0 .* (-(size(x,1)-1)÷2:(size(x,1)-1)÷2), (-(size(x,1)-1)÷2:(size(x,1)-1)÷2)) for geometry in [geometry, geometry1] test_rrule(RadonKA._radon, x, [0, π/4, π/2, 2π, 0.1, 0.00001] ⊢ ChainRulesTestUtils.NoTangent(), geometry ⊢ ChainRulesTestUtils.NoTangent(), nothing ⊢ ChainRulesTestUtils.NoTangent()) + test_rrule(RadonKA._radon, x, [0, π/4, π/2, 2π, 0.1, 0.00001] ⊢ ChainRulesTestUtils.NoTangent(), geometry ⊢ ChainRulesTestUtils.NoTangent(), randn(size(x)...) ⊢ ChainRulesTestUtils.NoTangent()) + y = radon(x, [0, π/4, π/2, 2π, 0.1, 0.00001]) test_rrule(RadonKA._backproject, y, [0, π/4, π/2, 2π, 0.1, 0.00001] ⊢ ChainRulesTestUtils.NoTangent(), geometry ⊢ ChainRulesTestUtils.NoTangent(), nothing ⊢ ChainRulesTestUtils.NoTangent()) test_rrule(RadonKA._radon, x, [0, π/4, π/2, 2π, 0.1, 0.00001] ⊢ ChainRulesTestUtils.NoTangent(), geometry ⊢ ChainRulesTestUtils.NoTangent(), 0.1⊢ ChainRulesTestUtils.NoTangent()) y = radon(x, [0, π/4, π/2, 2π, 0.1, 0.00001]) + test_rrule(RadonKA._backproject, y, [0, π/4, π/2, 2π, 0.1, 0.00001] ⊢ ChainRulesTestUtils.NoTangent(), geometry ⊢ ChainRulesTestUtils.NoTangent(), randn(size(x)...) ⊢ ChainRulesTestUtils.NoTangent()) test_rrule(RadonKA._backproject, y, [0, π/4, π/2, 2π, 0.1, 0.00001] ⊢ ChainRulesTestUtils.NoTangent(), geometry ⊢ ChainRulesTestUtils.NoTangent(), 0.1 ⊢ ChainRulesTestUtils.NoTangent()) end end