modified rotation and added new strict tv preserving predictor

Thu, 04 Jul 2024 03:09:56 +1000

author
Neil Dizon <neil.dizon@helsinki.fi>
date
Thu, 04 Jul 2024 03:09:56 +1000
changeset 66
dc69a0d234ae
parent 65
af90bfa6d978
child 67
afeaa6f6d1ae

modified rotation and added new strict tv preserving predictor

Manifest.toml file | annotate | diff | comparison | revisions
src/AlgorithmNew.jl file | annotate | diff | comparison | revisions
src/OpticalFlow.jl file | annotate | diff | comparison | revisions
src/PET/AlgorithmNew.jl file | annotate | diff | comparison | revisions
src/PET/PET.jl file | annotate | diff | comparison | revisions
src/PredictPDPS.jl file | annotate | diff | comparison | revisions
src/Stats.jl file | annotate | diff | comparison | revisions
--- a/Manifest.toml	Mon May 06 20:05:06 2024 -0500
+++ b/Manifest.toml	Thu Jul 04 03:09:56 2024 +1000
@@ -1,6 +1,6 @@
 # This file is machine-generated - editing it directly is not advised
 
-julia_version = "1.9.4"
+julia_version = "1.10.4"
 manifest_format = "2.0"
 project_hash = "c0c5825eaa12c336a17aa2ac87daddd209562cd7"
 
@@ -42,16 +42,19 @@
 version = "0.4.0"
 
 [[deps.ArrayInterface]]
-deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"]
-git-tree-sha1 = "c5aeb516a84459e0318a02507d2261edad97eb75"
+deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"]
+git-tree-sha1 = "ed2ec3c9b483842ae59cd273834e5b46206d6dda"
 uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
-version = "7.7.1"
+version = "7.11.0"
 
     [deps.ArrayInterface.extensions]
     ArrayInterfaceBandedMatricesExt = "BandedMatrices"
     ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices"
     ArrayInterfaceCUDAExt = "CUDA"
+    ArrayInterfaceCUDSSExt = "CUDSS"
+    ArrayInterfaceChainRulesExt = "ChainRules"
     ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore"
+    ArrayInterfaceReverseDiffExt = "ReverseDiff"
     ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore"
     ArrayInterfaceTrackerExt = "Tracker"
 
@@ -59,7 +62,10 @@
     BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
     BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0"
     CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+    CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e"
+    ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2"
     GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
+    ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
     StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
     Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
 
@@ -82,15 +88,15 @@
 uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
 
 [[deps.BitFlags]]
-git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b"
+git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d"
 uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35"
-version = "0.1.8"
+version = "0.1.9"
 
 [[deps.BitTwiddlingConvenienceFunctions]]
 deps = ["Static"]
-git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b"
+git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87"
 uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b"
-version = "0.1.5"
+version = "0.1.6"
 
 [[deps.BufferedStreams]]
 git-tree-sha1 = "4ae47f9a4b1dc19897d3743ff13685925c5202ec"
@@ -110,9 +116,9 @@
 
 [[deps.CPUSummary]]
 deps = ["CpuId", "IfElse", "PrecompileTools", "Static"]
-git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1"
+git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec"
 uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9"
-version = "0.2.4"
+version = "0.2.6"
 
 [[deps.CSV]]
 deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"]
@@ -122,9 +128,9 @@
 
 [[deps.Cairo_jll]]
 deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
-git-tree-sha1 = "a4c43f59baa34011e303e76f5c8c91bf58415aaf"
+git-tree-sha1 = "a2f1c8c668c8e3cb4cca4e57a8efdb09067bb3fd"
 uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
-version = "1.18.0+1"
+version = "1.18.0+2"
 
 [[deps.CatIndices]]
 deps = ["CustomUnitRanges", "OffsetArrays"]
@@ -134,9 +140,9 @@
 
 [[deps.ChainRulesCore]]
 deps = ["Compat", "LinearAlgebra"]
-git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b"
+git-tree-sha1 = "71acdbf594aab5bbb2cec89b208c41b4c411e49f"
 uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
-version = "1.23.0"
+version = "1.24.0"
 weakdeps = ["SparseArrays"]
 
     [deps.ChainRulesCore.extensions]
@@ -144,9 +150,9 @@
 
 [[deps.CloseOpenIntervals]]
 deps = ["Static", "StaticArrayInterface"]
-git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1"
+git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581"
 uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9"
-version = "0.1.12"
+version = "0.1.13"
 
 [[deps.Clustering]]
 deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"]
@@ -156,15 +162,15 @@
 
 [[deps.CodecZlib]]
 deps = ["TranscodingStreams", "Zlib_jll"]
-git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73"
+git-tree-sha1 = "b8fe8546d52ca154ac556809e10c75e6e7430ac8"
 uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
-version = "0.7.4"
+version = "0.7.5"
 
 [[deps.ColorSchemes]]
 deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"]
-git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129"
+git-tree-sha1 = "4b270d6465eb21ae89b732182c20dc165f8bf9f2"
 uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
-version = "3.24.0"
+version = "3.25.0"
 
 [[deps.ColorTypes]]
 deps = ["FixedPointNumbers", "Random"]
@@ -186,15 +192,20 @@
 
 [[deps.Colors]]
 deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
-git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a"
+git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0"
 uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
-version = "0.12.10"
+version = "0.12.11"
+
+[[deps.CommonWorldInvalidations]]
+git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0"
+uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8"
+version = "1.0.0"
 
 [[deps.Compat]]
 deps = ["TOML", "UUIDs"]
-git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80"
+git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248"
 uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
-version = "4.14.0"
+version = "4.15.0"
 weakdeps = ["Dates", "LinearAlgebra"]
 
     [deps.Compat.extensions]
@@ -203,7 +214,7 @@
 [[deps.CompilerSupportLibraries_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
-version = "1.0.5+0"
+version = "1.1.1+0"
 
 [[deps.ComputationalResources]]
 git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7"
@@ -366,9 +377,9 @@
 
 [[deps.FixedPointNumbers]]
 deps = ["Statistics"]
-git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc"
+git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172"
 uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
-version = "0.8.4"
+version = "0.8.5"
 
 [[deps.Fontconfig_jll]]
 deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"]
@@ -378,9 +389,9 @@
 
 [[deps.FreeType2_jll]]
 deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
-git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0"
+git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc"
 uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
-version = "2.13.1+0"
+version = "2.13.2+0"
 
 [[deps.FriBidi_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
@@ -393,10 +404,10 @@
 uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"
 
 [[deps.GLFW_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"]
-git-tree-sha1 = "ff38ba61beff76b8f4acad8ab0c97ef73bb670cb"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"]
+git-tree-sha1 = "3f74912a156096bd8fdbef211eff66ab446e7297"
 uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89"
-version = "3.3.9+0"
+version = "3.4.0+0"
 
 [[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"]
@@ -424,9 +435,9 @@
 
 [[deps.Glib_jll]]
 deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"]
-git-tree-sha1 = "359a1ba2e320790ddbe4ee8b4d54a305c0ea2aff"
+git-tree-sha1 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba"
 uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
-version = "2.80.0+0"
+version = "2.80.2+0"
 
 [[deps.Graphics]]
 deps = ["Colors", "LinearAlgebra", "NaNMath"]
@@ -442,9 +453,9 @@
 
 [[deps.Graphs]]
 deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
-git-tree-sha1 = "3863330da5466410782f2bffc64f3d505a6a8334"
+git-tree-sha1 = "ebd18c326fa6cee1efb7da9a3b45cf69da2ed4d9"
 uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
-version = "1.10.0"
+version = "1.11.2"
 
 [[deps.HDF5]]
 deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"]
@@ -466,9 +477,9 @@
 
 [[deps.HTTP]]
 deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
-git-tree-sha1 = "2c3ec1f90bb4a8f7beafb0cffea8a4c3f4e636ab"
+git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed"
 uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
-version = "1.10.6"
+version = "1.10.8"
 
 [[deps.HarfBuzz_jll]]
 deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"]
@@ -484,9 +495,9 @@
 
 [[deps.HostCPUFeatures]]
 deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"]
-git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2"
+git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293"
 uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0"
-version = "0.1.16"
+version = "0.1.17"
 
 [[deps.IfElse]]
 git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1"
@@ -543,9 +554,9 @@
 
 [[deps.ImageIO]]
 deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"]
-git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009"
+git-tree-sha1 = "437abb322a41d527c197fa800455f79d414f0a3c"
 uuid = "82e4d734-157c-48bb-816b-45c225c6df19"
-version = "0.6.7"
+version = "0.6.8"
 
 [[deps.ImageMagick]]
 deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils"]
@@ -619,15 +630,21 @@
 version = "1.0.0"
 
 [[deps.Inflate]]
-git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381"
+git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d"
 uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
-version = "0.1.4"
+version = "0.1.5"
 
 [[deps.InlineStrings]]
 deps = ["Parsers"]
-git-tree-sha1 = "9cc2baf75c6d09f9da536ddf58eb2f29dedaf461"
+git-tree-sha1 = "86356004f30f8e737eff143d57d41bd580e437aa"
 uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48"
-version = "1.4.0"
+version = "1.4.1"
+
+    [deps.InlineStrings.extensions]
+    ArrowTypesExt = "ArrowTypes"
+
+    [deps.InlineStrings.weakdeps]
+    ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
 
 [[deps.IntegralArrays]]
 deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"]
@@ -689,10 +706,10 @@
 version = "1.0.0"
 
 [[deps.JLD2]]
-deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"]
-git-tree-sha1 = "5ea6acdd53a51d897672edb694e3cc2912f3f8a7"
+deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Reexport", "Requires", "TranscodingStreams", "UUIDs", "Unicode"]
+git-tree-sha1 = "bdbe8222d2f5703ad6a7019277d149ec6d78c301"
 uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819"
-version = "0.4.46"
+version = "0.4.48"
 
 [[deps.JLLWrappers]]
 deps = ["Artifacts", "Preferences"]
@@ -714,9 +731,9 @@
 
 [[deps.JpegTurbo_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "3336abae9a713d2210bb57ab484b1e065edd7d23"
+git-tree-sha1 = "c84a835e1a09b289ffcd2271bf2a337bbdda6637"
 uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
-version = "3.0.2+0"
+version = "3.0.3+0"
 
 [[deps.LAME_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
@@ -749,9 +766,9 @@
 
 [[deps.LayoutPointers]]
 deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"]
-git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277"
+git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c"
 uuid = "10f19ff3-798f-405d-979b-55457f8fc047"
-version = "0.1.15"
+version = "0.1.17"
 
 [[deps.LazyArtifacts]]
 deps = ["Artifacts", "Pkg"]
@@ -773,9 +790,14 @@
 version = "8.4.0+0"
 
 [[deps.LibGit2]]
-deps = ["Base64", "NetworkOptions", "Printf", "SHA"]
+deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"]
 uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"
 
+[[deps.LibGit2_jll]]
+deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"]
+uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5"
+version = "1.6.4+0"
+
 [[deps.LibSSH2_jll]]
 deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
 uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"
@@ -803,10 +825,10 @@
 version = "1.6.0+0"
 
 [[deps.Libgpg_error_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed"
 uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8"
-version = "1.42.0+0"
+version = "1.49.0+0"
 
 [[deps.Libiconv_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
@@ -816,9 +838,9 @@
 
 [[deps.Libmount_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "4b683b19157282f50bfd5dcaa2efe5295814ea22"
+git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e"
 uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
-version = "2.40.0+0"
+version = "2.40.1+0"
 
 [[deps.Libtiff_jll]]
 deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"]
@@ -828,9 +850,9 @@
 
 [[deps.Libuuid_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "27fd5cc10be85658cacfe11bb81bee216af13eda"
+git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807"
 uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
-version = "2.40.0+0"
+version = "2.40.1+0"
 
 [[deps.LinearAlgebra]]
 deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
@@ -844,9 +866,9 @@
 
 [[deps.LogExpFunctions]]
 deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"]
-git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37"
+git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea"
 uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
-version = "0.3.27"
+version = "0.3.28"
 
     [deps.LogExpFunctions.extensions]
     LogExpFunctionsChainRulesCoreExt = "ChainRulesCore"
@@ -869,9 +891,9 @@
 
 [[deps.LoopVectorization]]
 deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"]
-git-tree-sha1 = "8f6786d8b2b3248d79db3ad359ce95382d5a6df8"
+git-tree-sha1 = "8084c25a250e00ae427a379a5b607e7aed96a2dd"
 uuid = "bdcacae8-1622-11e9-2a5c-532679323890"
-version = "0.12.170"
+version = "0.12.171"
 
     [deps.LoopVectorization.extensions]
     ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"]
@@ -884,9 +906,9 @@
 
 [[deps.MAT]]
 deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"]
-git-tree-sha1 = "ed1cf0a322d78cee07718bed5fd945e2218c35a1"
+git-tree-sha1 = "1d2dd9b186742b0f317f2530ddcbf00eebb18e96"
 uuid = "23992714-dd62-5051-b70f-ba57cb901cac"
-version = "0.10.6"
+version = "0.10.7"
 
 [[deps.MKL_jll]]
 deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"]
@@ -929,7 +951,7 @@
 [[deps.MbedTLS_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
-version = "2.28.2+0"
+version = "2.28.2+1"
 
 [[deps.MetaGraphs]]
 deps = ["Graphs", "JLD2", "Random"]
@@ -954,7 +976,7 @@
 
 [[deps.MozillaCACerts_jll]]
 uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
-version = "2022.10.11"
+version = "2023.1.10"
 
 [[deps.NaNMath]]
 deps = ["OpenLibm_jll"]
@@ -964,9 +986,9 @@
 
 [[deps.NearestNeighbors]]
 deps = ["Distances", "StaticArrays"]
-git-tree-sha1 = "ded64ff6d4fdd1cb68dfcbb818c69e144a5b2e4c"
+git-tree-sha1 = "91a67b4d73842da90b526011fa85c5c4c9343fe0"
 uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce"
-version = "0.4.16"
+version = "0.4.18"
 
 [[deps.Netpbm]]
 deps = ["FileIO", "ImageCore", "ImageMetadata"]
@@ -996,7 +1018,7 @@
 [[deps.OpenBLAS_jll]]
 deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
 uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
-version = "0.3.21+4"
+version = "0.3.23+4"
 
 [[deps.OpenEXR]]
 deps = ["Colors", "FileIO", "OpenEXR_jll"]
@@ -1019,7 +1041,7 @@
 [[deps.OpenLibm_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
-version = "0.8.1+0"
+version = "0.8.1+2"
 
 [[deps.OpenSSL]]
 deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
@@ -1047,7 +1069,7 @@
 [[deps.PCRE2_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15"
-version = "10.42.0+0"
+version = "10.42.0+1"
 
 [[deps.PNGFiles]]
 deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
@@ -1075,14 +1097,14 @@
 
 [[deps.Pixman_jll]]
 deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"]
-git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87"
+git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b"
 uuid = "30392449-352a-5448-841d-b1acce4e97dc"
-version = "0.42.2+0"
+version = "0.43.4+0"
 
 [[deps.Pkg]]
 deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
 uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
-version = "1.9.2"
+version = "1.10.0"
 
 [[deps.PkgVersion]]
 deps = ["Pkg"]
@@ -1098,9 +1120,9 @@
 
 [[deps.PolyesterWeave]]
 deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"]
-git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6"
+git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd"
 uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad"
-version = "0.2.1"
+version = "0.2.2"
 
 [[deps.Polynomials]]
 deps = ["LinearAlgebra", "RecipesBase"]
@@ -1138,9 +1160,9 @@
 
 [[deps.PrettyTables]]
 deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"]
-git-tree-sha1 = "88b895d13d53b5577fd53379d913b9ab9ac82660"
+git-tree-sha1 = "66b20dd35966a748321d3b2537c4584cf40387c7"
 uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
-version = "2.3.1"
+version = "2.3.2"
 
 [[deps.Printf]]
 deps = ["Unicode"]
@@ -1181,7 +1203,7 @@
 uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
 
 [[deps.Random]]
-deps = ["SHA", "Serialization"]
+deps = ["SHA"]
 uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
 
 [[deps.RangeArrays]]
@@ -1230,9 +1252,9 @@
 
 [[deps.Rotations]]
 deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"]
-git-tree-sha1 = "2a0a5d8569f481ff8840e3b7c84bbf188db6a3fe"
+git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e"
 uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc"
-version = "1.7.0"
+version = "1.7.1"
 weakdeps = ["RecipesBase"]
 
     [deps.Rotations.extensions]
@@ -1242,6 +1264,12 @@
 uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
 version = "0.7.0"
 
+[[deps.SIMD]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "2803cab51702db743f3fda07dd1745aadfbf43bd"
+uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
+version = "3.5.0"
+
 [[deps.SIMDTypes]]
 git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c"
 uuid = "94e857df-77ce-4151-89e5-788b33177be4"
@@ -1249,15 +1277,15 @@
 
 [[deps.SLEEFPirates]]
 deps = ["IfElse", "Static", "VectorizationBase"]
-git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf"
+git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0"
 uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa"
-version = "0.6.42"
+version = "0.6.43"
 
 [[deps.SentinelArrays]]
 deps = ["Dates", "Random"]
-git-tree-sha1 = "0e7508ff27ba32f26cd459474ca2ede1bc10991f"
+git-tree-sha1 = "90b4f68892337554d31cdcdbe19e48989f26c7e6"
 uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
-version = "1.4.1"
+version = "1.4.3"
 
 [[deps.Serialization]]
 uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
@@ -1307,6 +1335,7 @@
 [[deps.SparseArrays]]
 deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"]
 uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+version = "1.10.0"
 
 [[deps.StableRNGs]]
 deps = ["Random"]
@@ -1321,16 +1350,16 @@
 version = "0.1.1"
 
 [[deps.Static]]
-deps = ["IfElse"]
-git-tree-sha1 = "b366eb1eb68075745777d80861c6706c33f588ae"
+deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"]
+git-tree-sha1 = "0bbff21027dd8a107551847528127b62a35f7594"
 uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
-version = "0.8.9"
+version = "1.1.0"
 
 [[deps.StaticArrayInterface]]
 deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"]
-git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436"
+git-tree-sha1 = "8963e5a083c837531298fc41599182a759a87a6d"
 uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718"
-version = "1.5.0"
+version = "1.5.1"
 weakdeps = ["OffsetArrays", "StaticArrays"]
 
     [deps.StaticArrayInterface.extensions]
@@ -1339,9 +1368,9 @@
 
 [[deps.StaticArrays]]
 deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"]
-git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2"
+git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50"
 uuid = "90137ffa-7385-5640-81b9-e52037218182"
-version = "1.9.3"
+version = "1.9.7"
 weakdeps = ["ChainRulesCore", "Statistics"]
 
     [deps.StaticArrays.extensions]
@@ -1349,14 +1378,14 @@
     StaticArraysStatisticsExt = "Statistics"
 
 [[deps.StaticArraysCore]]
-git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d"
+git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682"
 uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
-version = "1.4.2"
+version = "1.4.3"
 
 [[deps.Statistics]]
 deps = ["LinearAlgebra", "SparseArrays"]
 uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
-version = "1.9.0"
+version = "1.10.0"
 
 [[deps.StatsAPI]]
 deps = ["LinearAlgebra"]
@@ -1387,9 +1416,9 @@
 uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
 
 [[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.2.1+1"
 
 [[deps.TOML]]
 deps = ["Dates"]
@@ -1436,10 +1465,10 @@
 version = "0.5.2"
 
 [[deps.TiffImages]]
-deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"]
-git-tree-sha1 = "34cc045dd0aaa59b8bbe86c644679bc57f1d5bd0"
+deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"]
+git-tree-sha1 = "bc7fd5c91041f44636b2c134041f7e5263ce58ae"
 uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
-version = "0.6.8"
+version = "0.10.0"
 
 [[deps.TiledIteration]]
 deps = ["OffsetArrays", "StaticArrayInterface"]
@@ -1448,9 +1477,9 @@
 version = "0.5.0"
 
 [[deps.TranscodingStreams]]
-git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349"
+git-tree-sha1 = "d73336d81cafdc277ff45558bb7eaa2b04a8e472"
 uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
-version = "0.10.7"
+version = "0.10.10"
 weakdeps = ["Random", "Test"]
 
     [deps.TranscodingStreams.extensions]
@@ -1475,9 +1504,9 @@
 
 [[deps.VectorizationBase]]
 deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"]
-git-tree-sha1 = "6129a4faf6242e7c3581116fbe3270f3ab17c90d"
+git-tree-sha1 = "e7f5b81c65eb858bed630fe006837b935518aca5"
 uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f"
-version = "0.21.67"
+version = "0.21.70"
 
 [[deps.Wayland_jll]]
 deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"]
@@ -1510,15 +1539,15 @@
 
 [[deps.XML2_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
-git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488"
+git-tree-sha1 = "d9717ce3518dc68a99e6b96300813760d887a01d"
 uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
-version = "2.12.6+0"
+version = "2.13.1+0"
 
 [[deps.XSLT_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"]
-git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"]
+git-tree-sha1 = "a54ee957f4c86b526460a720dbc882fa5edcbefc"
 uuid = "aed1982a-8fda-507f-9586-7b0439959a61"
-version = "1.1.34+0"
+version = "1.1.41+0"
 
 [[deps.Xorg_libX11_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
@@ -1588,9 +1617,9 @@
 
 [[deps.Xorg_libxcb_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"]
-git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d"
+git-tree-sha1 = "bcd466676fef0878338c61e655629fa7bbc69d8e"
 uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
-version = "1.15.0+0"
+version = "1.17.0+0"
 
 [[deps.Xorg_libxkbfile_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
@@ -1649,7 +1678,7 @@
 [[deps.Zlib_jll]]
 deps = ["Libdl"]
 uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
-version = "1.2.13+0"
+version = "1.2.13+1"
 
 [[deps.Zstd_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
@@ -1658,10 +1687,10 @@
 version = "1.5.6+0"
 
 [[deps.libaom_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d"
 uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b"
-version = "3.4.0+0"
+version = "3.9.0+0"
 
 [[deps.libass_jll]]
 deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
@@ -1672,7 +1701,7 @@
 [[deps.libblastrampoline_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "8e850b90-86db-534c-a0d3-1478176c7d93"
-version = "5.8.0+0"
+version = "5.8.0+1"
 
 [[deps.libfdk_aac_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -1712,7 +1741,7 @@
 [[deps.p7zip_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
-version = "17.4.0+0"
+version = "17.4.0+2"
 
 [[deps.x264_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
--- a/src/AlgorithmNew.jl	Mon May 06 20:05:06 2024 -0500
+++ b/src/AlgorithmNew.jl	Thu Jul 04 03:09:56 2024 +1000
@@ -92,7 +92,7 @@
         end
 
         if haskey(params, :predictor) && ~isnothing(params.predictor)
-            pdflow!(x, Δx, y, Δy, v_known, params.predictor)
+            pdflow!(x, Δx, y, Δy, v_known, params.predictor, α)
         end
 
         ############
--- a/src/OpticalFlow.jl	Mon May 06 20:05:06 2024 -0500
+++ b/src/OpticalFlow.jl	Thu Jul 04 03:09:56 2024 +1000
@@ -42,7 +42,7 @@
        HornSchunckData,
        filter_hs,
        petpdflow!,
-       DualScaling, Greedy, Rotation, ZeroDual, PrimalOnly, ActivatedDual,
+       DualScaling, Greedy, Rotation, ZeroDual, PrimalOnly, ActivatedDual, StrictGreedy,
        identifier
 
 ###############################################
@@ -73,6 +73,7 @@
 struct ZeroDual end
 struct PrimalOnly end
 struct ActivatedDual end
+struct StrictGreedy end
 
 function identifier(::DualScaling)
     "pdps_known_dualscaling"
@@ -98,6 +99,10 @@
     "pdps_known_activateddual"
 end
 
+function identifier(::StrictGreedy)
+    "pdps_known_strictgreedy"
+end
+
 #################################
 # Displacement field based flow
 #################################
@@ -147,7 +152,7 @@
 end
 
 # Additional method for Greedy
-function pdflow!(x, Δx, y, Δy, u, flow :: Greedy; threads=:none)
+function pdflow!(x, Δx, y, Δy, u, flow :: Greedy, α; threads=:none)
     @assert(size(u)==(2,))
     Δx .= x
     Δy .= y
@@ -163,7 +168,7 @@
 end
 
 # Additional method for Rotation
-function pdflow!(x, Δx, y, Δy, u, flow :: Rotation; threads=:none)
+function pdflow!(x, Δx, y, Δy, u, flow :: Rotation, α; threads=:none)
     @assert(size(u)==(2,))
     Δx .= x
     flow!(x, u; threads=(threads==:inner))
@@ -176,7 +181,7 @@
         for j=1:n
             ndx = @views sum(dx[:, i, j].^2)
             ndx_banana = @views sum(dx_banana[:, i, j].^2)
-            if ndx > 1e-4 && ndx_banana > 1e-4
+            if ndx > eps(1.0)
                 A = dx[:, i, j]
                 B = dx_banana[:, i, j]
                 theta = atan(B[1] * A[2] - B[2] * A[1], B[1] * A[1] + B[2] * A[2]) # Oriented angle from A to B
@@ -186,13 +191,17 @@
                 b = sin_theta * y[1, i, j] + cos_theta * y[2, i, j]
                 y[1, i, j] = a
                 y[2, i, j] = b
+            elseif ndx ≤ eps(1.0) && ndx_banana > eps(1.0)
+                y[:, i, j] .= α .* dx_banana[:, i, j] ./ sqrt(ndx_banana)
+            else
+                y[:, i, j] .= 0
             end
         end
     end
 end
 
 # Additional method for Dual Scaling
-function pdflow!(x, Δx, y, Δy, u, flow :: DualScaling; threads=:none)
+function pdflow!(x, Δx, y, Δy, u, flow :: DualScaling, α; threads=:none)
     @assert(size(u)==(2,))
     oldx = copy(x)
     flow!(x, u; threads=(threads==:inner))
@@ -205,6 +214,37 @@
     y .= C.*y
 end
 
+# Additional method for new strict TV preserving predictor a.k.a. Strict Greedy
+function pdflow!(x, Δx, y, Δy, u, flow :: StrictGreedy, α; threads=:none)
+    @assert(size(u)==(2,))
+    Δx .= x
+    flow!(x, u; threads=(threads==:inner))
+    (m,n) = size(x)
+    dx = similar(y)
+    dx_banana = similar(y)
+    ∇₂!(dx, Δx)
+    ∇₂!(dx_banana, x)
+    Δy .= y
+    for i=1:m
+        for j=1:n
+            ndx = @views sum(dx[:, i, j].^2)
+            ndx_banana = @views sum(dx_banana[:, i, j].^2)
+            if ndx > eps(1.0) && ndx_banana > eps(1.0)
+                A = dx[:, i, j]
+                B = Δy[:, i, j]
+                y[:, i, j] .= (dot(A,B)/(sqrt(ndx)*sqrt(ndx_banana))).* dx_banana[:, i, j]
+            elseif ndx ≤ eps(1.0) && ndx_banana > eps(1.0)
+                A = ones(size(dx[:, i, j])...)
+                ndx = sum(A.^2)
+                B = Δy[:, i, j]
+                y[:, i, j] .= (dot(A,B)/(sqrt(ndx)*sqrt(ndx_banana))).* dx_banana[:, i, j]
+            else
+                y[:, i, j] .= 0
+            end
+        end
+    end
+end
+
 function activation(x :: Real)
     return (1/(1 + exp(-1000(x - 0.05))))    # best for shepp logan
     #return -abs(x-1)^1/5 + 1                # best for lighthouse and brainphantom    
@@ -218,14 +258,13 @@
     # return 16*(x-0.5)^5 + 0.5
 end
 
-
-function pdflow!(x, Δx, y, Δy, u, :: ZeroDual; threads=:none)
+function pdflow!(x, Δx, y, Δy, u, :: ZeroDual, α; threads=:none)
     @assert(size(u)==(2,))
     flow!(x, u; threads=(threads==:inner))
     y .= 0.0
 end
 
-function pdflow!(x, Δx, y, Δy, u, :: PrimalOnly; threads=:none)
+function pdflow!(x, Δx, y, Δy, u, :: PrimalOnly, α; threads=:none)
     @assert(size(u)==(2,))
     flow!(x, u; threads=(threads==:inner))
 end
@@ -259,7 +298,7 @@
 end
 
 # Method for greedy predictor
-function petpdflow!(x, Δx, y, Δy, u, theta_known, flow :: Greedy; threads=:none)
+function petpdflow!(x, Δx, y, Δy, u, theta_known, flow :: Greedy, α; threads=:none)
     oldx = copy(x)
     center_point = center(x) .+ u
     tform = recenter(RotMatrix(theta_known[1]), center_point)
@@ -277,7 +316,7 @@
 end
 
 # Method for dual scaling predictor
-function petpdflow!(x, Δx, y, Δy, u, theta_known, flow :: DualScaling; threads=:none)
+function petpdflow!(x, Δx, y, Δy, u, theta_known, flow :: DualScaling, α; threads=:none)
     oldx = copy(x)
     center_point = center(x) .+ u
     tform = recenter(RotMatrix(theta_known[1]), center_point)
@@ -293,7 +332,7 @@
 end
 
 # Method for rotation prediction (exploiting property of inverse rotation)
-function petpdflow!(x, Δx, y, Δy, u, theta_known, flow :: Rotation; threads=:none)
+function petpdflow!(x, Δx, y, Δy, u, theta_known, flow :: Rotation, α; threads=:none)
     @backgroundif (threads==:outer) begin
         petflow!(x, Δx, u, theta_known; threads=(threads==:inner))
     end begin
@@ -302,12 +341,74 @@
     end
 end
 
-function petpdflow!(x, Δx, y, Δy, u, theta_known, :: ZeroDual; threads=:none)
+# Alternative method for rotation prediction 
+# function petpdflow!(x, Δx, y, Δy, u, theta_known, flow :: Rotation, α; threads=:none)
+#     Δx .= x
+#     petflow!(x, Δx, u, theta_known)
+#     (m,n) = size(x)
+#     dx = similar(y)
+#     dx_banana = similar(y)
+#     ∇₂!(dx, Δx)
+#     ∇₂!(dx_banana, x)
+#     for i=1:m
+#         for j=1:n
+#             ndx = @views sum(dx[:, i, j].^2)
+#             ndx_banana = @views sum(dx_banana[:, i, j].^2)
+#             if ndx > eps(1.0)
+#                 A = dx[:, i, j]
+#                 B = dx_banana[:, i, j]
+#                 theta = atan(B[1] * A[2] - B[2] * A[1], B[1] * A[1] + B[2] * A[2]) # Oriented angle from A to B
+#                 cos_theta = cos(theta)
+#                 sin_theta = sin(theta)
+#                 a = cos_theta * y[1, i, j] - sin_theta * y[2, i, j]
+#                 b = sin_theta * y[1, i, j] + cos_theta * y[2, i, j]
+#                 y[1, i, j] = a
+#                 y[2, i, j] = b
+#             elseif ndx ≤ eps(1.0)&& ndx_banana > eps(1.0)
+#                 y[:, i, j] = α .* dx_banana[:, i, j] ./ sqrt(ndx_banana)
+#             else
+#                 y[:, i, j] .= 0
+#             end
+#         end
+#     end
+# end
+
+# Additional method for new strict TV preserving predictor a.k.a. Strict Greedy
+function petpdflow!(x, Δx, y, Δy, u, theta_known, flow :: StrictGreedy, α; threads=:none)
+    Δx .= x
+    petflow!(x, Δx, u, theta_known)
+    (m,n) = size(x)
+    dx = similar(y)
+    dx_banana = similar(y)
+    ∇₂!(dx, Δx)
+    ∇₂!(dx_banana, x)
+    Δy .= y
+    for i=1:m
+        for j=1:n
+            ndx = @views sum(dx[:, i, j].^2)
+            ndx_banana = @views sum(dx_banana[:, i, j].^2)
+            if ndx > eps(1.0) && ndx_banana > eps(1.0)
+                A = dx[:, i, j]
+                B = Δy[:, i, j]
+                y[:, i, j] .= (dot(A,B)/(sqrt(ndx)*sqrt(ndx_banana))).* dx_banana[:, i, j]
+            elseif ndx ≤ eps(1.0) && ndx_banana > eps(1.0)
+                A = ones(size(dx[:, i, j])...)
+                ndx = sum(A.^2)
+                B = Δy[:, i, j]
+                y[:, i, j] .= (dot(A,B)/(sqrt(ndx)*sqrt(ndx_banana))).* dx_banana[:, i, j]
+            else
+                y[:, i, j] .= 0
+            end
+        end
+    end
+end
+
+function petpdflow!(x, Δx, y, Δy, u, theta_known, :: ZeroDual, α; threads=:none)
     petflow!(x, Δx, u, theta_known, threads=(threads==:inner))
     y .= 0.0
 end
 
-function petpdflow!(x, Δx, y, Δy, u, theta_known, :: PrimalOnly; threads=:none)
+function petpdflow!(x, Δx, y, Δy, u, theta_known, :: PrimalOnly, α; threads=:none)
     petflow!(x, Δx, u, theta_known, threads=(threads==:inner))
 end
 
--- a/src/PET/AlgorithmNew.jl	Mon May 06 20:05:06 2024 -0500
+++ b/src/PET/AlgorithmNew.jl	Thu Jul 04 03:09:56 2024 +1000
@@ -126,7 +126,7 @@
         ###################
     
         if haskey(params, :predictor) && ~isnothing(params.predictor)
-            petpdflow!(x, Δx, y, Δy, v_known, theta_known, params.predictor)
+            petpdflow!(x, Δx, y, Δy, v_known, theta_known, params.predictor, α)
         end
         
         if params.L_experiment
--- a/src/PET/PET.jl	Mon May 06 20:05:06 2024 -0500
+++ b/src/PET/PET.jl	Thu Jul 04 03:09:56 2024 +1000
@@ -46,9 +46,9 @@
 ##############
 
 export demo_petS1, demo_petS2, demo_petS3,
-       demo_petS4, demo_petS5, demo_petS6, demo_petS7,
+       demo_petS4, demo_petS5, demo_petS6, demo_petS7, demo_petS8,
        demo_petB1, demo_petB2, demo_petB3,
-       demo_petB4, demo_petB5, demo_petB6, demo_petB7,
+       demo_petB4, demo_petB5, demo_petB6, demo_petB7, demo_petB8,
        batchrun_shepplogan, batchrun_brainphantom, batchrun_pet
        #plot_pet
 
@@ -122,8 +122,8 @@
                p_known₀_pets ⬿ (predictor=Rotation(),)),
     Experiment(AlgorithmNew, DisplacementConstant, shepplogan,
                p_known₀_pets ⬿ (predictor=ZeroDual(),)),
-    # Experiment(AlgorithmNew, DisplacementConstant, shepplogan,
-    #            p_known₀_pets ⬿ (predictor=ActivatedDual(),)),
+    Experiment(AlgorithmNew, DisplacementConstant, shepplogan,
+                p_known₀_pets ⬿ (predictor=StrictGreedy(),)),
 )
 
 const brainphantom_experiments_pdps_known = (
@@ -141,8 +141,8 @@
                p_known₀_petb ⬿ (predictor=Rotation(),)),
     Experiment(AlgorithmNew, DisplacementConstant, brainphantom,
                p_known₀_petb ⬿ (predictor=ZeroDual(),)),
-    # Experiment(AlgorithmNew, DisplacementConstant, brainphantom,
-    #            p_known₀_petb ⬿ (predictor=ActivatedDual(),)),
+    Experiment(AlgorithmNew, DisplacementConstant, brainphantom,
+               p_known₀_petb ⬿ (predictor=StrictGreedy(),)),
 )
 
 
@@ -179,6 +179,7 @@
 demo_petS5 = () -> demo(shepplogan_experiments_pdps_known[5]) # Proximal (old)
 demo_petS6 = () -> demo(shepplogan_experiments_pdps_known[6]) # Rotation
 demo_petS7 = () -> demo(shepplogan_experiments_pdps_known[7]) # Zero dual
+demo_petS8 = () -> demo(shepplogan_experiments_pdps_known[8]) # StrictGreedy
 
 demo_petB1 = () -> demo(brainphantom_experiments_pdps_known[1]) # Dual scaling
 demo_petB2 = () -> demo(brainphantom_experiments_pdps_known[2]) # Greedy
@@ -187,6 +188,8 @@
 demo_petB5 = () -> demo(brainphantom_experiments_pdps_known[5]) # Proximal (old)
 demo_petB6 = () -> demo(brainphantom_experiments_pdps_known[6]) # Rotation
 demo_petB7 = () -> demo(brainphantom_experiments_pdps_known[7]) # Zero dual
+demo_petB8 = () -> demo(brainphantom_experiments_pdps_known[8]) # StrictGreedy
+
 
 
 function batchrun_shepplogan(;kwargs...)
--- a/src/PredictPDPS.jl	Mon May 06 20:05:06 2024 -0500
+++ b/src/PredictPDPS.jl	Thu Jul 04 03:09:56 2024 +1000
@@ -55,11 +55,11 @@
        batchrun_denoising,
        batchrun_predictors,
        demo_denoising1, demo_denoising2, demo_denoising3,
-       demo_denoising4, demo_denoising5, demo_denoising6, demo_denoising7, #demo_denoising8,
+       demo_denoising4, demo_denoising5, demo_denoising6, demo_denoising7, demo_denoising8,
        demo_petS1, demo_petS2, demo_petS3,
-       demo_petS4, demo_petS5, demo_petS6, demo_petS7,
+       demo_petS4, demo_petS5, demo_petS6, demo_petS7, demo_petS8,
        demo_petB1, demo_petB2, demo_petB3,
-       demo_petB4, demo_petB5, demo_petB6, demo_petB7,
+       demo_petB4, demo_petB5, demo_petB6, demo_petB7, demo_petB8,
        batchrun_shepplogan, batchrun_brainphantom, batchrun_pet,
        calculate_statistics
        #plot_denoising, plot_pet,
@@ -183,6 +183,8 @@
                p_known₀_denoising ⬿ (predictor=Rotation(),)),
     Experiment(AlgorithmNew, DisplacementConstant, lighthouse,
                p_known₀_denoising ⬿ (predictor=ZeroDual(),)),
+    Experiment(AlgorithmNew, DisplacementConstant, lighthouse,
+               p_known₀_denoising ⬿ (predictor=StrictGreedy(),)),
 )
 
 const denoising_experiments_all = Iterators.flatten((
@@ -220,6 +222,7 @@
 demo_denoising5 = () -> demo(denoising_experiments_pdps_known[5]) # Proximal (old)
 demo_denoising6 = () -> demo(denoising_experiments_pdps_known[6]) # Rotation
 demo_denoising7 = () -> demo(denoising_experiments_pdps_known[7]) # Zero dual
+demo_denoising8 = () -> demo(denoising_experiments_pdps_known[8]) # Strict Greedy
 
 
 function batchrun_article(kwargs...)
--- a/src/Stats.jl	Mon May 06 20:05:06 2024 -0500
+++ b/src/Stats.jl	Thu Jul 04 03:09:56 2024 +1000
@@ -42,7 +42,7 @@
 end
 
 const default_imnames = ("lighthouse200x300", "shepplogan256x256", "brainphantom256x256")
-const default_algnames = ("dualscaling", "greedy","noprediction","primalonly","proximal","rotation","zerodual","activateddual")
+const default_algnames = ("dualscaling", "greedy","noprediction","primalonly","proximal","rotation","zerodual","activateddual","strictgreedy")
 
 function calculate_statistics(;imnames=default_imnames,
                                algnames=default_algnames,

mercurial