# HG changeset patch
# User Tuomo Valkonen
# Date 1739818493 18000
# Node ID f0e8704d3f0ed05b5ffbbea02f529ae9f90c57f0
# Parent 6105b5cd8d890de5c6fdf4ab1dc369267896eb61# Parent 0693cc9ba9f0c97d440179bd22f808ccea6a49d2
Merge dev to default
diff -r 6105b5cd8d89 -r f0e8704d3f0e .cargo/config.toml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.cargo/config.toml Mon Feb 17 13:54:53 2025 -0500
@@ -0,0 +1,2 @@
+[target.'cfg(all(target_os = "macos"))']
+rustflags = ["-L", "/opt/homebrew/include"]
diff -r 6105b5cd8d89 -r f0e8704d3f0e Cargo.lock
--- a/Cargo.lock Tue Aug 01 10:25:09 2023 +0300
+++ b/Cargo.lock Mon Feb 17 13:54:53 2025 -0500
@@ -1,12 +1,12 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
-version = 3
+version = 4
[[package]]
name = "GSL"
-version = "6.0.0"
+version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9becaf6d7d1ba36a457288e661fa6a0472e8328629276f45369eafcd48ef1ce"
+checksum = "db3943d5a15b5c46e991124abee6a1bc89c7c9ffb25dbb8aeb4eab926fd9b307"
dependencies = [
"GSL-sys",
"paste",
@@ -23,24 +23,19 @@
]
[[package]]
-name = "adler"
-version = "1.0.2"
+name = "aho-corasick"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
-[[package]]
-name = "aho-corasick"
-version = "0.7.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "alg_tools"
-version = "0.1.0"
+version = "0.3.0"
dependencies = [
+ "anyhow",
"colored",
"cpu-time",
"csv",
@@ -52,10 +47,16 @@
"rayon",
"serde",
"serde_json",
- "trait-set",
+ "simba",
]
[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
name = "android_system_properties"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -65,6 +66,61 @@
]
[[package]]
+name = "anstream"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
+
+[[package]]
name = "approx"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -74,69 +130,43 @@
]
[[package]]
-name = "atty"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
-dependencies = [
- "hermit-abi 0.1.19",
- "libc",
- "winapi",
-]
-
-[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
-name = "bit_field"
-version = "0.10.1"
+name = "base64"
+version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bstr"
-version = "0.2.17"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
-dependencies = [
- "lazy_static",
- "memchr",
- "regex-automata",
- "serde",
-]
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
[[package]]
name = "bumpalo"
-version = "3.11.1"
+version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "bytemuck"
-version = "1.12.3"
+version = "1.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f"
-
-[[package]]
-name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"
[[package]]
name = "cc"
-version = "1.0.77"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4"
+checksum = "1aeb932158bd710538c73702db6945cb68a8fb08c519e6e12706b94263b36db8"
+dependencies = [
+ "shlex",
+]
[[package]]
name = "cfg-if"
@@ -146,33 +176,39 @@
[[package]]
name = "chrono"
-version = "0.4.23"
+version = "0.4.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
dependencies = [
+ "android-tzdata",
"iana-time-zone",
"js-sys",
- "num-integer",
"num-traits",
"serde",
- "time",
"wasm-bindgen",
- "winapi",
+ "windows-targets 0.52.6",
]
[[package]]
name = "clap"
-version = "4.0.27"
+version = "4.5.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0acbd8d28a0a60d7108d7ae850af6ba34cf2d1257fc646980e5f97ce14275966"
+checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84"
dependencies = [
- "bitflags",
+ "clap_builder",
"clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.5.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838"
+dependencies = [
+ "anstream",
+ "anstyle",
"clap_lex",
- "is-terminal",
- "once_cell",
"strsim",
- "termcolor",
"terminal_size",
"unicase",
"unicode-width",
@@ -180,67 +216,43 @@
[[package]]
name = "clap_derive"
-version = "4.0.21"
+version = "4.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014"
+checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
dependencies = [
"heck",
- "proc-macro-error",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.93",
]
[[package]]
name = "clap_lex"
-version = "0.3.0"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
-dependencies = [
- "os_str_bytes",
-]
+checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
[[package]]
-name = "codespan-reporting"
-version = "0.11.1"
+name = "colorchoice"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
-dependencies = [
- "termcolor",
- "unicode-width",
-]
-
-[[package]]
-name = "color_quant"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
-
-[[package]]
-name = "colorbrewer"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525be5012d97bc222e124ded87f18601e6fbd24a406761bcb1664475663919a6"
-dependencies = [
- "rgb",
-]
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]]
name = "colored"
-version = "2.0.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"
+checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8"
dependencies = [
- "atty",
"lazy_static",
- "winapi",
+ "windows-sys 0.48.0",
]
[[package]]
name = "core-foundation-sys"
-version = "0.8.3"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpu-time"
@@ -253,179 +265,116 @@
]
[[package]]
-name = "crc32fast"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.5.6"
+name = "crossbeam-deque"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
dependencies = [
- "cfg-if",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
-dependencies = [
- "cfg-if",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
-version = "0.9.13"
+version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
- "autocfg",
- "cfg-if",
"crossbeam-utils",
- "memoffset",
- "scopeguard",
]
[[package]]
name = "crossbeam-utils"
-version = "0.8.14"
+version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "crunchy"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "csv"
-version = "1.1.6"
+version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1"
+checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf"
dependencies = [
- "bstr",
"csv-core",
- "itoa 0.4.8",
+ "itoa",
"ryu",
"serde",
]
[[package]]
name = "csv-core"
-version = "0.1.10"
+version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
+checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
dependencies = [
"memchr",
]
[[package]]
-name = "cxx"
-version = "1.0.82"
+name = "darling"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4a41a86530d0fe7f5d9ea779916b7cadd2d4f9add748b99c2c029cbbdfaf453"
+checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
dependencies = [
- "cc",
- "cxxbridge-flags",
- "cxxbridge-macro",
- "link-cplusplus",
+ "darling_core",
+ "darling_macro",
]
[[package]]
-name = "cxx-build"
-version = "1.0.82"
+name = "darling_core"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06416d667ff3e3ad2df1cd8cd8afae5da26cf9cec4d0825040f88b5ca659a2f0"
+checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
dependencies = [
- "cc",
- "codespan-reporting",
- "once_cell",
+ "fnv",
+ "ident_case",
"proc-macro2",
"quote",
- "scratch",
- "syn",
+ "strsim",
+ "syn 2.0.93",
]
[[package]]
-name = "cxxbridge-flags"
-version = "1.0.82"
+name = "darling_macro"
+version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "820a9a2af1669deeef27cb271f476ffd196a2c4b6731336011e0ba63e2c7cf71"
+checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn 2.0.93",
+]
[[package]]
-name = "cxxbridge-macro"
-version = "1.0.82"
+name = "deranged"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a08a6e2fcc370a089ad3b4aaf54db3b1b4cee38ddabce5896b33eb693275f470"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "powerfmt",
+ "serde",
]
[[package]]
name = "either"
-version = "1.8.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
-version = "0.2.8"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860"
dependencies = [
- "errno-dragonfly",
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
-dependencies = [
- "cc",
"libc",
-]
-
-[[package]]
-name = "exr"
-version = "1.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eb5f255b5980bb0c8cf676b675d1a99be40f316881444f44e0462eaf5df5ded"
-dependencies = [
- "bit_field",
- "flume",
- "half",
- "lebe",
- "miniz_oxide",
- "smallvec",
- "threadpool",
-]
-
-[[package]]
-name = "flate2"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
-dependencies = [
- "crc32fast",
- "miniz_oxide",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -438,193 +387,125 @@
]
[[package]]
-name = "flume"
-version = "0.10.14"
+name = "fnv"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
-dependencies = [
- "futures-core",
- "futures-sink",
- "nanorand",
- "pin-project",
- "spin",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac"
-
-[[package]]
-name = "futures-sink"
-version = "0.3.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "getrandom"
-version = "0.2.8"
+version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
dependencies = [
"cfg-if",
- "js-sys",
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "wasm-bindgen",
+ "wasi",
]
[[package]]
-name = "gif"
-version = "0.11.4"
+name = "hashbrown"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06"
-dependencies = [
- "color_quant",
- "weezl",
-]
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
-name = "half"
-version = "2.1.0"
+name = "hashbrown"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad6a9459c9c30b177b925162351f97e7d967c7ea8bab3b8352805327daf45554"
-dependencies = [
- "crunchy",
-]
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
[[package]]
name = "heck"
-version = "0.4.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
-name = "hermit-abi"
-version = "0.1.19"
+name = "hex"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
-dependencies = [
- "libc",
-]
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "iana-time-zone"
-version = "0.1.53"
+version = "0.1.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
- "winapi",
+ "windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca"
-dependencies = [
- "cxx",
- "cxx-build",
-]
-
-[[package]]
-name = "image"
-version = "0.24.5"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69b7ea949b537b0fd0af141fff8c77690f2ce96f4f41f042ccb6c69c6c965945"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
- "bytemuck",
- "byteorder",
- "color_quant",
- "exr",
- "gif",
- "jpeg-decoder",
- "num-rational",
- "num-traits",
- "png",
- "scoped_threadpool",
- "tiff",
+ "cc",
]
[[package]]
-name = "io-lifetimes"
-version = "0.7.5"
+name = "ident_case"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
-name = "io-lifetimes"
-version = "1.0.2"
+name = "indexmap"
+version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e394faa0efb47f9f227f1cd89978f854542b318a6f64fa695489c9c993056656"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
- "libc",
- "windows-sys",
+ "autocfg",
+ "hashbrown 0.12.3",
+ "serde",
]
[[package]]
-name = "is-terminal"
-version = "0.4.0"
+name = "indexmap"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aae5bc6e2eb41c9def29a3e0f1306382807764b9b53112030eff57435667352d"
+checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
dependencies = [
- "hermit-abi 0.2.6",
- "io-lifetimes 1.0.2",
- "rustix 0.36.3",
- "windows-sys",
+ "equivalent",
+ "hashbrown 0.15.2",
+ "serde",
]
[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+
+[[package]]
name = "itertools"
-version = "0.10.5"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
[[package]]
name = "itoa"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
-
-[[package]]
-name = "itoa"
-version = "1.0.4"
+version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
-
-[[package]]
-name = "jpeg-decoder"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
-dependencies = [
- "rayon",
-]
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]]
name = "js-sys"
-version = "0.3.60"
+version = "0.3.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47"
+checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7"
dependencies = [
+ "once_cell",
"wasm-bindgen",
]
@@ -635,101 +516,50 @@
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
-name = "lebe"
-version = "0.5.2"
+name = "libc"
+version = "0.2.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
-
-[[package]]
-name = "libc"
-version = "0.2.137"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
+checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
[[package]]
name = "libm"
-version = "0.2.6"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb"
-
-[[package]]
-name = "link-cplusplus"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369"
-dependencies = [
- "cc",
-]
+checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
[[package]]
name = "linux-raw-sys"
-version = "0.0.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.1.3"
+version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f9f08d8963a6c613f4b1a78f4f4a4dbfadf8e6545b2d72861731e4858b8b47f"
-
-[[package]]
-name = "lock_api"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
-dependencies = [
- "autocfg",
- "scopeguard",
-]
+checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
[[package]]
name = "log"
-version = "0.4.17"
+version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
-dependencies = [
- "cfg-if",
-]
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "matrixmultiply"
-version = "0.3.2"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84"
+checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2"
dependencies = [
+ "autocfg",
"rawpointer",
]
[[package]]
name = "memchr"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
-
-[[package]]
-name = "memoffset"
-version = "0.7.1"
+version = "2.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "miniz_oxide"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
-dependencies = [
- "adler",
-]
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
[[package]]
name = "nalgebra"
-version = "0.31.4"
+version = "0.33.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20bd243ab3dbb395b39ee730402d2e5405e448c75133ec49cc977762c4cba3d1"
+checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b"
dependencies = [
"approx",
"matrixmultiply",
@@ -744,29 +574,20 @@
[[package]]
name = "nalgebra-macros"
-version = "0.1.0"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218"
+checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc"
dependencies = [
"proc-macro2",
"quote",
- "syn",
-]
-
-[[package]]
-name = "nanorand"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3"
-dependencies = [
- "getrandom",
+ "syn 2.0.93",
]
[[package]]
name = "num"
-version = "0.4.0"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
+checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41"
dependencies = [
"num-bigint",
"num-complex",
@@ -778,39 +599,43 @@
[[package]]
name = "num-bigint"
-version = "0.4.3"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
- "autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-complex"
-version = "0.4.2"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19"
+checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
dependencies = [
"num-traits",
]
[[package]]
-name = "num-integer"
-version = "0.1.45"
+name = "num-conv"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
dependencies = [
- "autocfg",
"num-traits",
]
[[package]]
name = "num-iter"
-version = "0.1.43"
+version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
dependencies = [
"autocfg",
"num-integer",
@@ -831,124 +656,71 @@
[[package]]
name = "num-traits"
-version = "0.2.15"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
"libm",
]
[[package]]
-name = "num_cpus"
-version = "1.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5"
-dependencies = [
- "hermit-abi 0.1.19",
- "libc",
-]
-
-[[package]]
name = "numeric_literals"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "095aa67b0b9f2081746998f4f17106bdb51d56dc8c211afca5531b92b83bf98a"
dependencies = [
"quote",
- "syn",
+ "syn 1.0.109",
]
[[package]]
name = "once_cell"
-version = "1.16.0"
+version = "1.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
-
-[[package]]
-name = "os_str_bytes"
-version = "6.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
[[package]]
name = "paste"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1"
-
-[[package]]
-name = "pin-project"
-version = "1.0.12"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
+checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
[[package]]
name = "pkg-config"
-version = "0.3.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
-
-[[package]]
-name = "png"
-version = "0.17.7"
+version = "0.3.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638"
-dependencies = [
- "bitflags",
- "crc32fast",
- "flate2",
- "miniz_oxide",
-]
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
[[package]]
name = "pointsource_algs"
-version = "1.0.1"
+version = "2.0.0-pre"
dependencies = [
"GSL",
"alg_tools",
+ "anyhow",
"chrono",
"clap",
- "colorbrewer",
"colored",
"cpu-time",
"float_extras",
- "image",
"itertools",
"nalgebra",
"num-traits",
"numeric_literals",
- "poloto",
"rand",
"rand_distr",
"regex",
- "rgb",
"serde",
"serde_json",
+ "serde_with",
]
[[package]]
-name = "poloto"
-version = "3.13.1"
+name = "powerfmt"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2541c28c0622b297e342444bd8b1d87b02c8478dd3ed0ecc3eee47dc4d13282"
-dependencies = [
- "tagger",
-]
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
@@ -957,43 +729,19 @@
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
+name = "proc-macro2"
+version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.47"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
+checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
-version = "1.0.21"
+version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
+checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
dependencies = [
"proc-macro2",
]
@@ -1046,32 +794,41 @@
[[package]]
name = "rayon"
-version = "1.6.0"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e060280438193c554f654141c9ea9417886713b7acd75974c85b18a69a88e0b"
+checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
- "crossbeam-deque",
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
-version = "1.10.1"
+version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3"
+checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
- "crossbeam-channel",
"crossbeam-deque",
"crossbeam-utils",
- "num_cpus",
]
[[package]]
name = "regex"
-version = "1.7.0"
+version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
+checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
@@ -1079,123 +836,111 @@
]
[[package]]
-name = "regex-automata"
-version = "0.1.10"
+name = "regex-syntax"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
-name = "regex-syntax"
-version = "0.6.28"
+name = "rustix"
+version = "0.38.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed"
+dependencies = [
+ "bitflags",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
[[package]]
-name = "rgb"
-version = "0.8.34"
+name = "ryu"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3603b7d71ca82644f79b5a06d1220e9a58ede60bd32255f698cb1af8838b8db3"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "safe_arch"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354"
dependencies = [
"bytemuck",
]
[[package]]
-name = "rustix"
-version = "0.35.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9"
-dependencies = [
- "bitflags",
- "errno",
- "io-lifetimes 0.7.5",
- "libc",
- "linux-raw-sys 0.0.46",
- "windows-sys",
-]
-
-[[package]]
-name = "rustix"
-version = "0.36.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b1fbb4dfc4eb1d390c02df47760bb19a84bb80b301ecc947ab5406394d8223e"
-dependencies = [
- "bitflags",
- "errno",
- "io-lifetimes 1.0.2",
- "libc",
- "linux-raw-sys 0.1.3",
- "windows-sys",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.11"
+name = "serde"
+version = "1.0.189"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
-
-[[package]]
-name = "safe_arch"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529"
-dependencies = [
- "bytemuck",
-]
-
-[[package]]
-name = "scoped_threadpool"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
-
-[[package]]
-name = "scopeguard"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-
-[[package]]
-name = "scratch"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898"
-
-[[package]]
-name = "serde"
-version = "1.0.148"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc"
+checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.148"
+version = "1.0.189"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c"
+checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.93",
]
[[package]]
name = "serde_json"
-version = "1.0.89"
+version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db"
+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
dependencies = [
- "itoa 1.0.4",
+ "itoa",
"ryu",
"serde",
]
[[package]]
+name = "serde_with"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa"
+dependencies = [
+ "base64",
+ "chrono",
+ "hex",
+ "indexmap 1.9.3",
+ "indexmap 2.7.0",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "serde_with_macros",
+ "time",
+]
+
+[[package]]
+name = "serde_with_macros"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.93",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
name = "simba"
-version = "0.7.3"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f3fd720c48c53cace224ae62bef1bbff363a70c68c4802a78b5cc6159618176"
+checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa"
dependencies = [
"approx",
"num-complex",
@@ -1205,31 +950,27 @@
]
[[package]]
-name = "smallvec"
-version = "1.10.0"
+name = "strsim"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
-name = "spin"
-version = "0.9.4"
+name = "syn"
+version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
- "lock_api",
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
]
[[package]]
-name = "strsim"
-version = "0.10.0"
+name = "syn"
+version = "2.0.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
-[[package]]
-name = "syn"
-version = "1.0.104"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ae548ec36cf198c0ef7710d3c230987c2d6d7bd98ad6edc0274462724c585ce"
+checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058"
dependencies = [
"proc-macro2",
"quote",
@@ -1237,98 +978,78 @@
]
[[package]]
-name = "tagger"
-version = "4.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6aaa6f5d645d1dae4cd0286e9f8bf15b75a31656348e5e106eb1a940abd34b63"
-
-[[package]]
-name = "termcolor"
-version = "1.1.3"
+name = "terminal_size"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "terminal_size"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ca90c434fd12083d1a6bdcbe9f92a14f96c8a1ba600ba451734ac334521f7a"
+checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9"
dependencies = [
- "rustix 0.35.13",
- "windows-sys",
-]
-
-[[package]]
-name = "threadpool"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa"
-dependencies = [
- "num_cpus",
-]
-
-[[package]]
-name = "tiff"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f17def29300a156c19ae30814710d9c63cd50288a49c6fd3a10ccfbe4cf886fd"
-dependencies = [
- "flate2",
- "jpeg-decoder",
- "weezl",
+ "rustix",
+ "windows-sys 0.59.0",
]
[[package]]
name = "time"
-version = "0.1.45"
+version = "0.3.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21"
dependencies = [
- "libc",
- "wasi 0.10.0+wasi-snapshot-preview1",
- "winapi",
+ "deranged",
+ "itoa",
+ "num-conv",
+ "powerfmt",
+ "serde",
+ "time-core",
+ "time-macros",
]
[[package]]
-name = "trait-set"
-version = "0.2.0"
+name = "time-core"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "875c4c873cc824e362fa9a9419ffa59807244824275a44ad06fec9684fff08f2"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+
+[[package]]
+name = "time-macros"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de"
dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "num-conv",
+ "time-core",
]
[[package]]
name = "typenum"
-version = "1.15.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "unicase"
-version = "2.6.0"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
dependencies = [
"version_check",
]
[[package]]
name = "unicode-ident"
-version = "1.0.5"
+version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "unicode-width"
-version = "0.1.10"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "version_check"
@@ -1338,46 +1059,40 @@
[[package]]
name = "wasi"
-version = "0.10.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
-
-[[package]]
-name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.83"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268"
+checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396"
dependencies = [
"cfg-if",
+ "once_cell",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.83"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142"
+checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79"
dependencies = [
"bumpalo",
"log",
- "once_cell",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.93",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.83"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
+checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -1385,34 +1100,28 @@
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.83"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
+checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.93",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.83"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"
-
-[[package]]
-name = "weezl"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
+checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
[[package]]
name = "wide"
-version = "0.7.5"
+version = "0.7.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae41ecad2489a1655c8ef8489444b0b113c0a0c795944a3572a0931cf7d2525c"
+checksum = "ebecebefc38ff1860b4bc47550bbfa63af5746061cf0d29fcd7fa63171602598"
dependencies = [
"bytemuck",
"safe_arch",
@@ -1435,73 +1144,155 @@
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
-name = "winapi-util"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
-dependencies = [
- "winapi",
-]
-
-[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
name = "windows-sys"
-version = "0.42.0"
+version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
]
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.42.0"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.42.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
-version = "0.42.0"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
-version = "0.42.0"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.42.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.42.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.42.0"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
diff -r 6105b5cd8d89 -r f0e8704d3f0e Cargo.toml
--- a/Cargo.toml Tue Aug 01 10:25:09 2023 +0300
+++ b/Cargo.toml Mon Feb 17 13:54:53 2025 -0500
@@ -1,8 +1,8 @@
[package]
name = "pointsource_algs"
-version = "1.0.1"
+version = "2.0.0-pre"
edition = "2021"
-rust-version = "1.67"
+rust-version = "1.85"
authors = ["Tuomo Valkonen "]
description = "Algorithms for point source localisation"
homepage = "https://tuomov.iki.fi/software/pointsource_algs/"
@@ -21,29 +21,32 @@
]
categories = ["mathematics", "science", "computer-vision"]
+[dependencies.alg_tools]
+version = "~0.3.0-dev"
+path = "../alg_tools"
+default-features = false
+features = ["nightly"]
+
[dependencies]
-alg_tools = { version = "~0.1.0", path = "../alg_tools", default-features = false }
serde = { version = "1.0", features = ["derive"] }
num-traits = { version = "~0.2.14", features = ["std"] }
rand = "~0.8.5"
-colored = "~2.0.0"
+colored = "~2.1.0"
rand_distr = "~0.4.3"
-nalgebra = { version = "~0.31.0", features = ["rand-no-std"] }
-itertools = "~0.10.3"
+nalgebra = { version = "~0.33.0", features = ["rand-no-std"] }
+itertools = "~0.13.0"
numeric_literals = "~0.2.0"
-poloto = "~3.13.1"
-GSL = "~6.0.0"
+GSL = "~7.0.0"
float_extras = "~0.1.6"
-clap = { version = "~4.0.27", features = ["derive", "unicode", "wrap_help"] }
-image = "~0.24.3"
+clap = { version = "~4.5.0", features = ["derive", "unicode", "wrap_help"] }
cpu-time = "~1.0.0"
-colorbrewer = "~0.2.0"
-rgb = "~0.8.33"
serde_json = "~1.0.85"
chrono = { version = "~0.4.23", features = ["alloc", "std", "serde"] }
+anyhow = "1.0.95"
+serde_with = { version = "3.11.0", features = ["macros"] }
[build-dependencies]
-regex = "~1.7.0"
+regex = "~1.11.0"
[profile.release]
debug = true
diff -r 6105b5cd8d89 -r f0e8704d3f0e README.md
--- a/README.md Tue Aug 01 10:25:09 2023 +0300
+++ b/README.md Mon Feb 17 13:54:53 2025 -0500
@@ -1,19 +1,19 @@
# Proximal methods for point source localisation: the implementation
-This package contains [Rust] codes for the manuscript “_Proximal methods for
-point source localisation_” ([arXiv:2212.02991]) by Tuomo Valkonen
-⟨tuomov@iki.fi⟩. It concerns solution of problems of the type
+This package contains the [Rust] codes for the numerical experiments in the articles
+* T. Valkonen, “_Proximal methods for
+point source localisation_”, Journal of Nonsmooth Analysis and Optimization 4 (2023), 10433, [doi:10.46298/jnsao-2023-10433] ([arXiv:2212.02991])
+* T. Valkonen, “_Point source localisation with unbalanced optimal transport_” (2025), submitted.
+
+It concerns solution of problems of the type
$$
\min_{μ ∈ ℳ(Ω)}~ F(μ) + λ \|μ\|_{ℳ(Ω)} + δ_{≥ 0}(μ),
$$
where $F$ is a data term, and $ℳ(Ω)$ is the space of Radon measures on the
(rectangular) domain $Ω ⊂ ℝ^n$. Implemented are $F(μ)=\frac12\|Aμ-b\|_2^2$ and
$F(μ)=\|Aμ-b\|_1$ for the forward operator $A \in 𝕃(ℳ(Ω); ℝ^m)$ modelling a
-simple sensor grid. For the 2-norm-squared data term implemented are the
-algorithms μFB, μFISTA, and μPDPS from the aforementioned manuscript along with
-comparison relaxed and fully corrective conditional gradient methods from the
-literature. For the 1-norm data term only the μPDPS is applicable.
+simple sensor grid.
## Installation and usage
@@ -36,8 +36,8 @@
brew install gsl
```
For other operating systems, suggestions are available in the [rust-GSL]
- crate documentation. On Windows, you will likely need to pass extra
- `RUSTFLAGS` options to Cargo in the following steps to locate the library.
+ crate documentation. You may need to pass extra `RUSTFLAGS` options to
+ Cargo in the following steps to locate the library.
4. Download [alg_tools] and unpack it under the same directory as this
package.
@@ -49,38 +49,33 @@
[rust-GSL]: https://docs.rs/GSL/6.0.0/rgsl/
[Homebrew]: https://brew.sh
[arXiv:2212.02991]: https://arxiv.org/abs/2212.02991
+ [doi:10.46298/jnsao-2023-10433]: http://doi.org/10.46298/jnsao-2023-10433
### Building and running the experiments
-To compile the code and run the experiments in the manuscript, use
+To compile and install the program, use
+```console
+cargo install --path=.
+```
+When doing this for the first time, several dependencies will be downloaded.
+Now you can run the default set of experiments with
+```
+pointsource_algs -o results
+```
+The `-o results` option tells `pointsource_algs` to write results in the
+`results` directory. The option is required.
+
+Alternatively, you may build and run the program without installing with
```console
cargo run --release -- -o results
```
-When doing this for the first time, several dependencies will be downloaded.
-The double-dash (`--`) separates the arguments of Cargo and this software,
-`pointsource_algs`. The `--release` option to Cargo is required for `rustc` to
-build optimised high performance code. Without that flag the performance will
-be significantly worse. The `-o results` option tells `pointsource_algs` to
-write results in the `results` directory. The option is required.
-
-Alternatively, you may build the executable with
-```console
-cargo build --release
-```
-and then run it with
-```
-target/release/pointsource_algs -o results
-```
+The double-dash separates the options for the Cargo build system
+and `pointsource_algs`.
### Documentation
Use the `--help` option to get an extensive listing of command line options to
-customise algorithm parameters and the experiments performed. As above with
-`-o`, if using `cargo` to run the executable, you have to pass any arguments
-to `pointsource_algs` after a double-dash:
-```console
-cargo run --release -- --help
-```
+customise algorithm parameters and the experiments performed.
## Internals
diff -r 6105b5cd8d89 -r f0e8704d3f0e src/dataterm.rs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dataterm.rs Mon Feb 17 13:54:53 2025 -0500
@@ -0,0 +1,94 @@
+/*!
+Basid definitions for data terms
+*/
+
+use numeric_literals::replace_float_literals;
+
+use alg_tools::euclidean::Euclidean;
+use alg_tools::linops::GEMV;
+pub use alg_tools::norms::L1;
+use alg_tools::norms::Norm;
+use alg_tools::instance::{Instance, Space};
+
+use crate::types::*;
+pub use crate::types::L2Squared;
+use crate::measures::RNDM;
+
+/// Calculates the residual $Aμ-b$.
+#[replace_float_literals(F::cast_from(literal))]
+pub(crate) fn calculate_residual<
+ X : Space,
+ I : Instance,
+ F : Float,
+ V : Euclidean + Clone,
+ A : GEMV,
+>(
+ μ : I,
+ opA : &A,
+ b : &V
+) -> V {
+ let mut r = b.clone();
+ opA.gemv(&mut r, 1.0, μ, -1.0);
+ r
+}
+
+/// Calculates the residual $A(μ+μ_delta)-b$.
+#[replace_float_literals(F::cast_from(literal))]
+pub(crate) fn calculate_residual2<
+ F : Float,
+ X : Space,
+ I : Instance,
+ J : Instance,
+ V : Euclidean + Clone,
+ A : GEMV,
+>(
+ μ : I,
+ μ_delta : J,
+ opA : &A,
+ b : &V
+) -> V {
+ let mut r = b.clone();
+ opA.gemv(&mut r, 1.0, μ, -1.0);
+ opA.gemv(&mut r, 1.0, μ_delta, 1.0);
+ r
+}
+
+
+/// Trait for data terms
+#[replace_float_literals(F::cast_from(literal))]
+pub trait DataTerm {
+ /// Calculates $F(y)$, where $F$ is the data fidelity.
+ fn calculate_fit(&self, _residual : &V) -> F;
+
+ /// Calculates $F(Aμ-b)$, where $F$ is the data fidelity.
+ fn calculate_fit_op, Codomain = V>>(
+ &self,
+ μ : I,
+ opA : &A,
+ b : &V
+ ) -> F
+ where
+ V : Euclidean + Clone,
+ I : Instance>,
+ {
+ let r = calculate_residual(μ, opA, b);
+ self.calculate_fit(&r)
+ }
+}
+
+impl, const N : usize>
+DataTerm
+for L2Squared {
+ fn calculate_fit(&self, residual : &V) -> F {
+ residual.norm2_squared_div2()
+ }
+}
+
+
+impl + Norm, const N : usize>
+DataTerm
+for L1 {
+ fn calculate_fit(&self, residual : &V) -> F {
+ residual.norm(L1)
+ }
+}
diff -r 6105b5cd8d89 -r f0e8704d3f0e src/experiments.rs
--- a/src/experiments.rs Tue Aug 01 10:25:09 2023 +0300
+++ b/src/experiments.rs Mon Feb 17 13:54:53 2025 -0500
@@ -13,21 +13,24 @@
use alg_tools::error::DynResult;
use alg_tools::norms::Linfinity;
-use crate::ExperimentOverrides;
+use crate::{ExperimentOverrides, AlgorithmOverrides};
use crate::kernels::*;
-use crate::kernels::{SupportProductFirst as Prod};
-use crate::pdps::PDPSConfig;
+use crate::kernels::SupportProductFirst as Prod;
use crate::types::*;
use crate::run::{
RunnableExperiment,
ExperimentV2,
+ ExperimentBiased,
Named,
DefaultAlgorithm,
- AlgorithmConfig
};
//use crate::fb::FBGenericConfig;
use crate::rand_distr::{SerializableNormal, SaltAndPepper};
use crate::regularisation::Regularisation;
+use alg_tools::euclidean::Euclidean;
+use alg_tools::instance::Instance;
+use alg_tools::mapping::Mapping;
+use alg_tools::operator_arithmetic::{MappingSum, Weighted};
/// Experiments shorthands, to be used with the command line parser
@@ -58,6 +61,12 @@
/// Two dimensions, “fast” spread, 1-norm data fidelity
#[clap(name = "2d_l1_fast")]
Experiment2D_L1_Fast,
+ /// One dimension, “fast” spread, 2-norm-squared data fidelity with extra TV-regularised bias
+ #[clap(name = "1d_tv_fast")]
+ Experiment1D_TV_Fast,
+ /// Two dimensions, “fast” spread, 2-norm-squared data fidelity with extra TV-regularised bias
+ #[clap(name = "2d_tv_fast")]
+ Experiment2D_TV_Fast,
}
macro_rules! make_float_constant {
@@ -92,6 +101,25 @@
([0.30, 0.70], 5.0)
];
+/// The $\{0,1\}$-valued characteristic function of a ball as a [`Mapping`].
+#[derive(Debug,Copy,Clone,Serialize,PartialEq)]
+struct BallCharacteristic {
+ pub center : Loc,
+ pub radius : F,
+}
+
+impl Mapping> for BallCharacteristic {
+ type Codomain =F;
+
+ fn apply>>(&self, i : I) -> F {
+ if self.center.dist2(i) <= self.radius {
+ F::ONE
+ } else {
+ F::ZERO
+ }
+ }
+}
+
//#[replace_float_literals(F::cast_from(literal))]
impl DefaultExperiment {
/// Convert the experiment shorthand into a runnable experiment configuration.
@@ -115,23 +143,70 @@
make_float_constant!(Variance1 = 0.05.powi(2));
make_float_constant!(CutOff1 = 0.15);
make_float_constant!(Hat1 = 0.16);
+ make_float_constant!(HatBias = 0.05);
// We use a different step length for PDPS in 2D experiments
- let pdps_2d = || {
- let τ0 = 3.0;
- PDPSConfig {
- τ0,
- σ0 : 0.99 / τ0,
+ // let pdps_2d = (DefaultAlgorithm::PDPS,
+ // AlgorithmOverrides {
+ // tau0 : Some(3.0),
+ // sigma0 : Some(0.99 / 3.0),
+ // .. Default::default()
+ // }
+ // );
+ // let radon_pdps_2d = (DefaultAlgorithm::RadonPDPS,
+ // AlgorithmOverrides {
+ // tau0 : Some(3.0),
+ // sigma0 : Some(0.99 / 3.0),
+ // .. Default::default()
+ // }
+ // );
+ let sliding_fb_cut_gaussian = (DefaultAlgorithm::SlidingFB,
+ AlgorithmOverrides {
+ theta0 : Some(0.3),
.. Default::default()
}
- };
-
+ );
+ // let higher_cpos = |alg| (alg,
+ // AlgorithmOverrides {
+ // transport_tolerance_pos : Some(1000.0),
+ // .. Default::default()
+ // }
+ // );
+ let higher_cpos_merging = |alg| (alg,
+ AlgorithmOverrides {
+ transport_tolerance_pos : Some(1000.0),
+ merge : Some(true),
+ fitness_merging : Some(true),
+ .. Default::default()
+ }
+ );
+ let higher_cpos_merging_steptune = |alg| (alg,
+ AlgorithmOverrides {
+ transport_tolerance_pos : Some(1000.0),
+ theta0 : Some(0.3),
+ merge : Some(true),
+ fitness_merging : Some(true),
+ .. Default::default()
+ }
+ );
+ let much_higher_cpos_merging_steptune = |alg| (alg,
+ AlgorithmOverrides {
+ transport_tolerance_pos : Some(10000.0),
+ sigma0 : Some(0.15),
+ theta0 : Some(0.3),
+ merge : Some(true),
+ fitness_merging : Some(true),
+ .. Default::default()
+ }
+ );
// We add a hash of the experiment name to the configured
// noise seed to not use the same noise for different experiments.
let mut h = DefaultHasher::new();
name.hash(&mut h);
let noise_seed = cli.noise_seed.unwrap_or(BASE_SEED) + h.finish();
+ let default_merge_radius = 0.01;
+
use DefaultExperiment::*;
Ok(match self {
Experiment1D => {
@@ -140,7 +215,7 @@
Box::new(Named { name, data : ExperimentV2 {
domain : [[0.0, 1.0]].into(),
sensor_count : [N_SENSORS_1D],
- regularisation : Regularisation::NonnegRadon(cli.alpha.unwrap_or(0.09)),
+ regularisation : Regularisation::NonnegRadon(cli.alpha.unwrap_or(0.08)),
noise_distr : SerializableNormal::new(0.0, cli.variance.unwrap_or(0.2))?,
dataterm : DataTerm::L2Squared,
μ_hat : MU_TRUE_1D_BASIC.into(),
@@ -149,7 +224,12 @@
kernel : Prod(AutoConvolution(spread_cutoff), base_spread),
kernel_plot_width,
noise_seed,
- algorithm_defaults: HashMap::new(),
+ default_merge_radius,
+ algorithm_overrides: HashMap::from([
+ sliding_fb_cut_gaussian,
+ higher_cpos_merging(DefaultAlgorithm::RadonFB),
+ higher_cpos_merging(DefaultAlgorithm::RadonSlidingFB),
+ ]),
}})
},
Experiment1DFast => {
@@ -166,7 +246,11 @@
kernel : base_spread,
kernel_plot_width,
noise_seed,
- algorithm_defaults: HashMap::new(),
+ default_merge_radius,
+ algorithm_overrides: HashMap::from([
+ higher_cpos_merging(DefaultAlgorithm::RadonFB),
+ higher_cpos_merging(DefaultAlgorithm::RadonSlidingFB),
+ ]),
}})
},
Experiment2D => {
@@ -184,8 +268,11 @@
kernel : Prod(AutoConvolution(spread_cutoff), base_spread),
kernel_plot_width,
noise_seed,
- algorithm_defaults: HashMap::from([
- (DefaultAlgorithm::PDPS, AlgorithmConfig::PDPS(pdps_2d()))
+ default_merge_radius,
+ algorithm_overrides: HashMap::from([
+ sliding_fb_cut_gaussian,
+ higher_cpos_merging(DefaultAlgorithm::RadonFB),
+ higher_cpos_merging(DefaultAlgorithm::RadonSlidingFB),
]),
}})
},
@@ -203,8 +290,10 @@
kernel : base_spread,
kernel_plot_width,
noise_seed,
- algorithm_defaults: HashMap::from([
- (DefaultAlgorithm::PDPS, AlgorithmConfig::PDPS(pdps_2d()))
+ default_merge_radius,
+ algorithm_overrides: HashMap::from([
+ higher_cpos_merging(DefaultAlgorithm::RadonFB),
+ higher_cpos_merging(DefaultAlgorithm::RadonSlidingFB),
]),
}})
},
@@ -226,7 +315,8 @@
kernel : Prod(AutoConvolution(spread_cutoff), base_spread),
kernel_plot_width,
noise_seed,
- algorithm_defaults: HashMap::new(),
+ default_merge_radius,
+ algorithm_overrides: HashMap::new(),
}})
},
Experiment1D_L1_Fast => {
@@ -246,7 +336,8 @@
kernel : base_spread,
kernel_plot_width,
noise_seed,
- algorithm_defaults: HashMap::new(),
+ default_merge_radius,
+ algorithm_overrides: HashMap::new(),
}})
},
Experiment2D_L1 => {
@@ -267,8 +358,8 @@
kernel : Prod(AutoConvolution(spread_cutoff), base_spread),
kernel_plot_width,
noise_seed,
- algorithm_defaults: HashMap::from([
- (DefaultAlgorithm::PDPS, AlgorithmConfig::PDPS(pdps_2d()))
+ default_merge_radius,
+ algorithm_overrides: HashMap::from([
]),
}})
},
@@ -289,9 +380,65 @@
kernel : base_spread,
kernel_plot_width,
noise_seed,
- algorithm_defaults: HashMap::from([
- (DefaultAlgorithm::PDPS, AlgorithmConfig::PDPS(pdps_2d()))
+ default_merge_radius,
+ algorithm_overrides: HashMap::from([
+ ]),
+ }})
+ },
+ Experiment1D_TV_Fast => {
+ let base_spread = HatConv { radius : HatBias };
+ Box::new(Named { name, data : ExperimentBiased {
+ λ : 0.02,
+ bias : MappingSum::new([
+ Weighted::new(1.0, BallCharacteristic{ center : 0.3.into(), radius : 0.2 }),
+ Weighted::new(0.5, BallCharacteristic{ center : 0.6.into(), radius : 0.3 }),
]),
+ base : ExperimentV2 {
+ domain : [[0.0, 1.0]].into(),
+ sensor_count : [N_SENSORS_1D],
+ regularisation : Regularisation::NonnegRadon(cli.alpha.unwrap_or(0.2)),
+ noise_distr : SerializableNormal::new(0.0, cli.variance.unwrap_or(0.1))?,
+ dataterm : DataTerm::L2Squared,
+ μ_hat : MU_TRUE_1D_BASIC.into(),
+ sensor : BallIndicator { r : SensorWidth1D, exponent : Linfinity },
+ spread : base_spread,
+ kernel : base_spread,
+ kernel_plot_width,
+ noise_seed,
+ default_merge_radius,
+ algorithm_overrides: HashMap::from([
+ higher_cpos_merging_steptune(DefaultAlgorithm::RadonForwardPDPS),
+ higher_cpos_merging_steptune(DefaultAlgorithm::RadonSlidingPDPS),
+ ]),
+ },
+ }})
+ },
+ Experiment2D_TV_Fast => {
+ let base_spread = HatConv { radius : Hat1 };
+ Box::new(Named { name, data : ExperimentBiased {
+ λ : 0.005,
+ bias : MappingSum::new([
+ Weighted::new(1.0, BallCharacteristic{ center : [0.3, 0.3].into(), radius : 0.2 }),
+ Weighted::new(0.5, BallCharacteristic{ center : [0.6, 0.6].into(), radius : 0.3 }),
+ ]),
+ base : ExperimentV2 {
+ domain : [[0.0, 1.0]; 2].into(),
+ sensor_count : [N_SENSORS_2D; 2],
+ regularisation : Regularisation::NonnegRadon(cli.alpha.unwrap_or(0.06)),
+ noise_distr : SerializableNormal::new(0.0, cli.variance.unwrap_or(0.15))?, //0.25
+ dataterm : DataTerm::L2Squared,
+ μ_hat : MU_TRUE_2D_BASIC.into(),
+ sensor : BallIndicator { r : SensorWidth2D, exponent : Linfinity },
+ spread : base_spread,
+ kernel : base_spread,
+ kernel_plot_width,
+ noise_seed,
+ default_merge_radius,
+ algorithm_overrides: HashMap::from([
+ much_higher_cpos_merging_steptune(DefaultAlgorithm::RadonForwardPDPS),
+ much_higher_cpos_merging_steptune(DefaultAlgorithm::RadonSlidingPDPS),
+ ]),
+ },
}})
},
})
diff -r 6105b5cd8d89 -r f0e8704d3f0e src/fb.rs
--- a/src/fb.rs Tue Aug 01 10:25:09 2023 +0300
+++ b/src/fb.rs Mon Feb 17 13:54:53 2025 -0500
@@ -6,10 +6,7 @@
* Valkonen T. - _Proximal methods for point source localisation_,
[arXiv:2212.02991](https://arxiv.org/abs/2212.02991).
-The main routine is [`pointsource_fb_reg`]. It is based on [`generic_pointsource_fb_reg`], which is
-also used by our [primal-dual proximal splitting][crate::pdps] implementation.
-
-FISTA-type inertia can also be enabled through [`FBConfig::meta`].
+The main routine is [`pointsource_fb_reg`].
## Problem
@@ -76,650 +73,94 @@
$$
-We solve this with either SSN or FB via [`quadratic_nonneg`] as determined by
-[`InnerSettings`] in [`FBGenericConfig::inner`].
+We solve this with either SSN or FB as determined by
+[`crate::subproblem::InnerSettings`] in [`FBGenericConfig::inner`].
*/
+use colored::Colorize;
use numeric_literals::replace_float_literals;
-use serde::{Serialize, Deserialize};
-use colored::Colorize;
-use nalgebra::{DVector, DMatrix};
+use serde::{Deserialize, Serialize};
-use alg_tools::iterate::{
- AlgIteratorFactory,
- AlgIteratorState,
-};
use alg_tools::euclidean::Euclidean;
-use alg_tools::linops::Apply;
-use alg_tools::sets::Cube;
-use alg_tools::loc::Loc;
-use alg_tools::mapping::Mapping;
-use alg_tools::bisection_tree::{
- BTFN,
- PreBTFN,
- Bounds,
- BTNodeLookup,
- BTNode,
- BTSearch,
- P2Minimise,
- SupportGenerator,
- LocalAnalysis,
- Bounded,
-};
+use alg_tools::instance::Instance;
+use alg_tools::iterate::AlgIteratorFactory;
+use alg_tools::linops::{Mapping, GEMV};
use alg_tools::mapping::RealMapping;
use alg_tools::nalgebra_support::ToNalgebraRealField;
+use crate::dataterm::{calculate_residual, DataTerm, L2Squared};
+use crate::forward_model::{AdjointProductBoundedBy, ForwardModel};
+use crate::measures::merging::SpikeMerging;
+use crate::measures::{DiscreteMeasure, RNDM};
+use crate::plot::{PlotLookup, Plotting, SeqPlotter};
+pub use crate::prox_penalty::{FBGenericConfig, ProxPenalty};
+use crate::regularisation::RegTerm;
use crate::types::*;
-use crate::measures::{
- DiscreteMeasure,
- DeltaMeasure,
-};
-use crate::measures::merging::{
- SpikeMergingMethod,
- SpikeMerging,
-};
-use crate::forward_model::ForwardModel;
-use crate::seminorms::{
- DiscreteMeasureOp, Lipschitz
-};
-use crate::subproblem::{
- nonneg::quadratic_nonneg,
- unconstrained::quadratic_unconstrained,
- InnerSettings,
- InnerMethod,
-};
-use crate::tolerance::Tolerance;
-use crate::plot::{
- SeqPlotter,
- Plotting,
- PlotLookup
-};
-use crate::regularisation::{
- NonnegRadonRegTerm,
- RadonRegTerm,
-};
-
-/// Method for constructing $μ$ on each iteration
-#[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)]
-#[allow(dead_code)]
-pub enum InsertionStyle {
- /// Resuse previous $μ$ from previous iteration, optimising weights
- /// before inserting new spikes.
- Reuse,
- /// Start each iteration with $μ=0$.
- Zero,
-}
-
-/// Meta-algorithm type
-#[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)]
-#[allow(dead_code)]
-pub enum FBMetaAlgorithm {
- /// No meta-algorithm
- None,
- /// FISTA-style inertia
- InertiaFISTA,
-}
/// Settings for [`pointsource_fb_reg`].
#[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)]
#[serde(default)]
-pub struct FBConfig {
+pub struct FBConfig {
/// Step length scaling
- pub τ0 : F,
- /// Meta-algorithm to apply
- pub meta : FBMetaAlgorithm,
+ pub τ0: F,
/// Generic parameters
- pub insertion : FBGenericConfig,
-}
-
-/// Settings for the solution of the stepwise optimality condition in algorithms based on
-/// [`generic_pointsource_fb_reg`].
-#[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)]
-#[serde(default)]
-pub struct FBGenericConfig {
- /// Method for constructing $μ$ on each iteration; see [`InsertionStyle`].
- pub insertion_style : InsertionStyle,
- /// Tolerance for point insertion.
- pub tolerance : Tolerance,
- /// Stop looking for predual maximum (where to isert a new point) below
- /// `tolerance` multiplied by this factor.
- pub insertion_cutoff_factor : F,
- /// Settings for branch and bound refinement when looking for predual maxima
- pub refinement : RefinementSettings,
- /// Maximum insertions within each outer iteration
- pub max_insertions : usize,
- /// Pair `(n, m)` for maximum insertions `m` on first `n` iterations.
- pub bootstrap_insertions : Option<(usize, usize)>,
- /// Inner method settings
- pub inner : InnerSettings,
- /// Spike merging method
- pub merging : SpikeMergingMethod,
- /// Tolerance multiplier for merges
- pub merge_tolerance_mult : F,
- /// Spike merging method after the last step
- pub final_merging : SpikeMergingMethod,
- /// Iterations between merging heuristic tries
- pub merge_every : usize,
- /// Save $μ$ for postprocessing optimisation
- pub postprocessing : bool
+ pub generic: FBGenericConfig,
}
#[replace_float_literals(F::cast_from(literal))]
-impl Default for FBConfig {
+impl Default for FBConfig {
fn default() -> Self {
FBConfig {
- τ0 : 0.99,
- meta : FBMetaAlgorithm::None,
- insertion : Default::default()
- }
- }
-}
-
-#[replace_float_literals(F::cast_from(literal))]
-impl Default for FBGenericConfig {
- fn default() -> Self {
- FBGenericConfig {
- insertion_style : InsertionStyle::Reuse,
- tolerance : Default::default(),
- insertion_cutoff_factor : 1.0,
- refinement : Default::default(),
- max_insertions : 100,
- //bootstrap_insertions : None,
- bootstrap_insertions : Some((10, 1)),
- inner : InnerSettings {
- method : InnerMethod::SSN,
- .. Default::default()
- },
- merging : SpikeMergingMethod::None,
- //merging : Default::default(),
- final_merging : Default::default(),
- merge_every : 10,
- merge_tolerance_mult : 2.0,
- postprocessing : false,
+ τ0: 0.99,
+ generic: Default::default(),
}
}
}
-/// Trait for specialisation of [`generic_pointsource_fb_reg`] to basic FB, FISTA.
-///
-/// The idea is that the residual $Aμ - b$ in the forward step can be replaced by an arbitrary
-/// value. For example, to implement [primal-dual proximal splitting][crate::pdps] we replace it
-/// with the dual variable $y$. We can then also implement alternative data terms, as the
-/// (pre)differential of $F(μ)=F\_0(Aμ-b)$ is $F\'(μ) = A\_*F\_0\'(Aμ-b)$. In the case of the
-/// quadratic fidelity $F_0(y)=\frac{1}{2}\\|y\\|_2^2$ in a Hilbert space, of course,
-/// $F\_0\'(Aμ-b)=Aμ-b$ is the residual.
-pub trait FBSpecialisation, const N : usize> : Sized {
- /// Updates the residual and does any necessary pruning of `μ`.
- ///
- /// Returns the new residual and possibly a new step length.
- ///
- /// The measure `μ` may also be modified to apply, e.g., inertia to it.
- /// The updated residual should correspond to the residual at `μ`.
- /// See the [trait documentation][FBSpecialisation] for the use and meaning of the residual.
- ///
- /// The parameter `μ_base` is the base point of the iteration, typically the previous iterate,
- /// but for, e.g., FISTA has inertia applied to it.
- fn update(
- &mut self,
- μ : &mut DiscreteMeasure, F>,
- μ_base : &DiscreteMeasure, F>,
- ) -> (Observable, Option);
-
- /// Calculates the data term value corresponding to iterate `μ` and available residual.
- ///
- /// Inertia and other modifications, as deemed, necessary, should be applied to `μ`.
- ///
- /// The blanket implementation correspondsn to the 2-norm-squared data fidelity
- /// $\\|\text{residual}\\|\_2^2/2$.
- fn calculate_fit(
- &self,
- _μ : &DiscreteMeasure, F>,
- residual : &Observable
- ) -> F {
- residual.norm2_squared_div2()
- }
-
- /// Calculates the data term value at $μ$.
- ///
- /// Unlike [`Self::calculate_fit`], no inertia, etc., should be applied to `μ`.
- fn calculate_fit_simple(
- &self,
- μ : &DiscreteMeasure, F>,
- ) -> F;
-
- /// Returns the final iterate after any necessary postprocess pruning, merging, etc.
- fn postprocess(self, mut μ : DiscreteMeasure, F>, merging : SpikeMergingMethod)
- -> DiscreteMeasure, F>
- where DiscreteMeasure, F> : SpikeMerging {
- μ.merge_spikes_fitness(merging,
- |μ̃| self.calculate_fit_simple(μ̃),
- |&v| v);
- μ.prune();
- μ
- }
-
- /// Returns measure to be used for value calculations, which may differ from μ.
- fn value_μ<'c, 'b : 'c>(&'b self, μ : &'c DiscreteMeasure, F>)
- -> &'c DiscreteMeasure, F> {
- μ
- }
-}
-
-/// Specialisation of [`generic_pointsource_fb_reg`] to basic μFB.
-struct BasicFB<
- 'a,
- F : Float + ToNalgebraRealField,
- A : ForwardModel, F>,
- const N : usize
-> {
- /// The data
- b : &'a A::Observable,
- /// The forward operator
- opA : &'a A,
-}
-
-/// Implementation of [`FBSpecialisation`] for basic μFB forward-backward splitting.
-#[replace_float_literals(F::cast_from(literal))]
-impl<'a, F : Float + ToNalgebraRealField , A : ForwardModel, F>, const N : usize>
-FBSpecialisation for BasicFB<'a, F, A, N> {
- fn update(
- &mut self,
- μ : &mut DiscreteMeasure, F>,
- _μ_base : &DiscreteMeasure, F>
- ) -> (A::Observable, Option) {
- μ.prune();
- //*residual = self.opA.apply(μ) - self.b;
- let mut residual = self.b.clone();
- self.opA.gemv(&mut residual, 1.0, μ, -1.0);
- (residual, None)
- }
-
- fn calculate_fit_simple(
- &self,
- μ : &DiscreteMeasure, F>,
- ) -> F {
- let mut residual = self.b.clone();
- self.opA.gemv(&mut residual, 1.0, μ, -1.0);
- residual.norm2_squared_div2()
- }
-}
-
-/// Specialisation of [`generic_pointsource_fb_reg`] to FISTA.
-struct FISTA<
- 'a,
- F : Float + ToNalgebraRealField,
- A : ForwardModel, F>,
- const N : usize
-> {
- /// The data
- b : &'a A::Observable,
- /// The forward operator
- opA : &'a A,
- /// Current inertial parameter
- λ : F,
- /// Previous iterate without inertia applied.
- /// We need to store this here because `μ_base` passed to [`FBSpecialisation::update`] will
- /// have inertia applied to it, so is not useful to use.
- μ_prev : DiscreteMeasure, F>,
-}
-
-/// Implementation of [`FBSpecialisation`] for μFISTA inertial forward-backward splitting.
-#[replace_float_literals(F::cast_from(literal))]
-impl<'a, F : Float + ToNalgebraRealField, A : ForwardModel, F>, const N : usize>
-FBSpecialisation for FISTA<'a, F, A, N> {
- fn update(
- &mut self,
- μ : &mut DiscreteMeasure, F>,
- _μ_base : &DiscreteMeasure, F>
- ) -> (A::Observable, Option) {
- // Update inertial parameters
- let λ_prev = self.λ;
- self.λ = 2.0 * λ_prev / ( λ_prev + (4.0 + λ_prev * λ_prev).sqrt() );
- let θ = self.λ / λ_prev - self.λ;
- // Perform inertial update on μ.
- // This computes μ ← (1 + θ) * μ - θ * μ_prev, pruning spikes where both μ
- // and μ_prev have zero weight. Since both have weights from the finite-dimensional
- // subproblem with a proximal projection step, this is likely to happen when the
- // spike is not needed. A copy of the pruned μ without artithmetic performed is
- // stored in μ_prev.
- μ.pruning_sub(1.0 + θ, θ, &mut self.μ_prev);
-
- //*residual = self.opA.apply(μ) - self.b;
- let mut residual = self.b.clone();
- self.opA.gemv(&mut residual, 1.0, μ, -1.0);
- (residual, None)
- }
-
- fn calculate_fit_simple(
- &self,
- μ : &DiscreteMeasure, F>,
- ) -> F {
- let mut residual = self.b.clone();
- self.opA.gemv(&mut residual, 1.0, μ, -1.0);
- residual.norm2_squared_div2()
- }
-
- fn calculate_fit(
- &self,
- _μ : &DiscreteMeasure, F>,
- _residual : &A::Observable
- ) -> F {
- self.calculate_fit_simple(&self.μ_prev)
- }
-
- // For FISTA we need to do a final pruning as well, due to the limited
- // pruning that can be done on each step.
- fn postprocess(mut self, μ_base : DiscreteMeasure, F>, merging : SpikeMergingMethod)
- -> DiscreteMeasure, F>
- where DiscreteMeasure, F> : SpikeMerging {
- let mut μ = self.μ_prev;
- self.μ_prev = μ_base;
- μ.merge_spikes_fitness(merging,
- |μ̃| self.calculate_fit_simple(μ̃),
- |&v| v);
- μ.prune();
- μ
- }
-
- fn value_μ<'c, 'b : 'c>(&'c self, _μ : &'c DiscreteMeasure, F>)
- -> &'c DiscreteMeasure, F> {
- &self.μ_prev
- }
-}
-
-
-/// Abstraction of regularisation terms for [`generic_pointsource_fb_reg`].
-pub trait RegTerm
-: for<'a> Apply<&'a DiscreteMeasure, F>, Output = F> {
- /// Approximately solve the problem
- /// $$
- /// \min_{x ∈ ℝ^n} \frac{1}{2} x^⊤Ax - g^⊤ x + τ G(x)
- /// $$
- /// for $G$ depending on the trait implementation.
- ///
- /// The parameter `mA` is $A$. An estimate for its opeator norm should be provided in
- /// `mA_normest`. The initial iterate and output is `x`. The current main tolerance is `ε`.
- ///
- /// Returns the number of iterations taken.
- fn solve_findim(
- &self,
- mA : &DMatrix,
- g : &DVector,
- τ : F,
- x : &mut DVector,
- mA_normest : F,
- ε : F,
- config : &FBGenericConfig
- ) -> usize;
-
- /// Find a point where `d` may violate the tolerance `ε`.
- ///
- /// If `skip_by_rough_check` is set, do not find the point if a rough check indicates that we
- /// are in bounds. `ε` is the current main tolerance and `τ` a scaling factor for the
- /// regulariser.
- ///
- /// Returns `None` if `d` is in bounds either based on the rough check, or a more precise check
- /// terminating early. Otherwise returns a possibly violating point, the value of `d` there,
- /// and a boolean indicating whether the found point is in bounds.
- fn find_tolerance_violation(
- &self,
- d : &mut BTFN,
- τ : F,
- ε : F,
- skip_by_rough_check : bool,
- config : &FBGenericConfig,
- ) -> Option<(Loc, F, bool)>
- where BT : BTSearch>,
- G : SupportGenerator,
- G::SupportType : Mapping,Codomain=F>
- + LocalAnalysis, N>;
-
- /// Verify that `d` is in bounds `ε` for a merge candidate `μ`
- ///
- /// `ε` is the current main tolerance and `τ` a scaling factor for the regulariser.
- fn verify_merge_candidate(
- &self,
- d : &mut BTFN,
- μ : &DiscreteMeasure, F>,
- τ : F,
- ε : F,
- config : &FBGenericConfig,
- ) -> bool
- where BT : BTSearch>,
- G : SupportGenerator,
- G::SupportType : Mapping,Codomain=F>
- + LocalAnalysis, N>;
-
- fn target_bounds(&self, τ : F, ε : F) -> Option>;
-
- /// Returns a scaling factor for the tolerance sequence.
- ///
- /// Typically this is the regularisation parameter.
- fn tolerance_scaling(&self) -> F;
+pub(crate) fn prune_with_stats(μ: &mut RNDM) -> usize {
+ let n_before_prune = μ.len();
+ μ.prune();
+ debug_assert!(μ.len() <= n_before_prune);
+ n_before_prune - μ.len()
}
#[replace_float_literals(F::cast_from(literal))]
-impl RegTerm for NonnegRadonRegTerm
-where Cube : P2Minimise, F> {
- fn solve_findim(
- &self,
- mA : &DMatrix,
- g : &DVector,
- τ : F,
- x : &mut DVector,
- mA_normest : F,
- ε : F,
- config : &FBGenericConfig
- ) -> usize {
- let inner_tolerance = ε * config.inner.tolerance_mult;
- let inner_it = config.inner.iterator_options.stop_target(inner_tolerance);
- let inner_τ = config.inner.τ0 / mA_normest;
- quadratic_nonneg(config.inner.method, mA, g, τ * self.α(), x,
- inner_τ, inner_it)
- }
-
- #[inline]
- fn find_tolerance_violation(
- &self,
- d : &mut BTFN,
- τ : F,
- ε : F,
- skip_by_rough_check : bool,
- config : &FBGenericConfig,
- ) -> Option<(Loc, F, bool)>
- where BT : BTSearch>,
- G : SupportGenerator,
- G::SupportType : Mapping,Codomain=F>
- + LocalAnalysis, N> {
- let τα = τ * self.α();
- let keep_below = τα + ε;
- let maximise_above = τα + ε * config.insertion_cutoff_factor;
- let refinement_tolerance = ε * config.refinement.tolerance_mult;
-
- // If preliminary check indicates that we are in bonds, and if it otherwise matches
- // the insertion strategy, skip insertion.
- if skip_by_rough_check && d.bounds().upper() <= keep_below {
- None
- } else {
- // If the rough check didn't indicate no insertion needed, find maximising point.
- d.maximise_above(maximise_above, refinement_tolerance, config.refinement.max_steps)
- .map(|(ξ, v_ξ)| (ξ, v_ξ, v_ξ <= keep_below))
- }
- }
-
- fn verify_merge_candidate(
- &self,
- d : &mut BTFN,
- μ : &DiscreteMeasure, F>,
- τ : F,
- ε : F,
- config : &FBGenericConfig,
- ) -> bool
- where BT : BTSearch>,
- G : SupportGenerator,
- G::SupportType : Mapping,Codomain=F>
- + LocalAnalysis, N> {
- let τα = τ * self.α();
- let refinement_tolerance = ε * config.refinement.tolerance_mult;
- let merge_tolerance = config.merge_tolerance_mult * ε;
- let keep_below = τα + merge_tolerance;
- let keep_supp_above = τα - merge_tolerance;
- let bnd = d.bounds();
-
- return (
- bnd.lower() >= keep_supp_above
- ||
- μ.iter_spikes().map(|&DeltaMeasure{ α : β, ref x }| {
- (β == 0.0) || d.apply(x) >= keep_supp_above
- }).all(std::convert::identity)
- ) && (
- bnd.upper() <= keep_below
- ||
- d.has_upper_bound(keep_below, refinement_tolerance, config.refinement.max_steps)
- )
- }
-
- fn target_bounds(&self, τ : F, ε : F) -> Option> {
- let τα = τ * self.α();
- Some(Bounds(τα - ε, τα + ε))
- }
-
- fn tolerance_scaling(&self) -> F {
- self.α()
- }
+pub(crate) fn postprocess<
+ F: Float,
+ V: Euclidean + Clone,
+ A: GEMV, Codomain = V>,
+ D: DataTerm,
+ const N: usize,
+>(
+ mut μ: RNDM,
+ config: &FBGenericConfig,
+ dataterm: D,
+ opA: &A,
+ b: &V,
+) -> RNDM
+where
+ RNDM: SpikeMerging,
+ for<'a> &'a RNDM: Instance>,
+{
+ μ.merge_spikes_fitness(
+ config.final_merging_method(),
+ |μ̃| dataterm.calculate_fit_op(μ̃, opA, b),
+ |&v| v,
+ );
+ μ.prune();
+ μ
}
-#[replace_float_literals(F::cast_from(literal))]
-impl RegTerm for RadonRegTerm
-where Cube : P2Minimise, F> {
- fn solve_findim(
- &self,
- mA : &DMatrix,
- g : &DVector,
- τ : F,
- x : &mut DVector,
- mA_normest: F,
- ε : F,
- config : &FBGenericConfig
- ) -> usize {
- let inner_tolerance = ε * config.inner.tolerance_mult;
- let inner_it = config.inner.iterator_options.stop_target(inner_tolerance);
- let inner_τ = config.inner.τ0 / mA_normest;
- quadratic_unconstrained(config.inner.method, mA, g, τ * self.α(), x,
- inner_τ, inner_it)
- }
-
- fn find_tolerance_violation(
- &self,
- d : &mut BTFN,
- τ : F,
- ε : F,
- skip_by_rough_check : bool,
- config : &FBGenericConfig,
- ) -> Option<(Loc, F, bool)>
- where BT : BTSearch>,
- G : SupportGenerator,
- G::SupportType : Mapping,Codomain=F>
- + LocalAnalysis, N> {
- let τα = τ * self.α();
- let keep_below = τα + ε;
- let keep_above = -τα - ε;
- let maximise_above = τα + ε * config.insertion_cutoff_factor;
- let minimise_below = -τα - ε * config.insertion_cutoff_factor;
- let refinement_tolerance = ε * config.refinement.tolerance_mult;
-
- // If preliminary check indicates that we are in bonds, and if it otherwise matches
- // the insertion strategy, skip insertion.
- if skip_by_rough_check && Bounds(keep_above, keep_below).superset(&d.bounds()) {
- None
- } else {
- // If the rough check didn't indicate no insertion needed, find maximising point.
- let mx = d.maximise_above(maximise_above, refinement_tolerance,
- config.refinement.max_steps);
- let mi = d.minimise_below(minimise_below, refinement_tolerance,
- config.refinement.max_steps);
-
- match (mx, mi) {
- (None, None) => None,
- (Some((ξ, v_ξ)), None) => Some((ξ, v_ξ, keep_below >= v_ξ)),
- (None, Some((ζ, v_ζ))) => Some((ζ, v_ζ, keep_above <= v_ζ)),
- (Some((ξ, v_ξ)), Some((ζ, v_ζ))) => {
- if v_ξ - τα > τα - v_ζ {
- Some((ξ, v_ξ, keep_below >= v_ξ))
- } else {
- Some((ζ, v_ζ, keep_above <= v_ζ))
- }
- }
- }
- }
- }
-
- fn verify_merge_candidate(
- &self,
- d : &mut BTFN,
- μ : &DiscreteMeasure, F>,
- τ : F,
- ε : F,
- config : &FBGenericConfig,
- ) -> bool
- where BT : BTSearch>,
- G : SupportGenerator,
- G::SupportType : Mapping,Codomain=F>
- + LocalAnalysis, N> {
- let τα = τ * self.α();
- let refinement_tolerance = ε * config.refinement.tolerance_mult;
- let merge_tolerance = config.merge_tolerance_mult * ε;
- let keep_below = τα + merge_tolerance;
- let keep_above = -τα - merge_tolerance;
- let keep_supp_pos_above = τα - merge_tolerance;
- let keep_supp_neg_below = -τα + merge_tolerance;
- let bnd = d.bounds();
-
- return (
- (bnd.lower() >= keep_supp_pos_above && bnd.upper() <= keep_supp_neg_below)
- ||
- μ.iter_spikes().map(|&DeltaMeasure{ α : β, ref x }| {
- use std::cmp::Ordering::*;
- match β.partial_cmp(&0.0) {
- Some(Greater) => d.apply(x) >= keep_supp_pos_above,
- Some(Less) => d.apply(x) <= keep_supp_neg_below,
- _ => true,
- }
- }).all(std::convert::identity)
- ) && (
- bnd.upper() <= keep_below
- ||
- d.has_upper_bound(keep_below, refinement_tolerance,
- config.refinement.max_steps)
- ) && (
- bnd.lower() >= keep_above
- ||
- d.has_lower_bound(keep_above, refinement_tolerance,
- config.refinement.max_steps)
- )
- }
-
- fn target_bounds(&self, τ : F, ε : F) -> Option> {
- let τα = τ * self.α();
- Some(Bounds(-τα - ε, τα + ε))
- }
-
- fn tolerance_scaling(&self) -> F {
- self.α()
- }
-}
-
-
-/// Generic implementation of [`pointsource_fb_reg`].
+/// Iteratively solve the pointsource localisation problem using forward-backward splitting.
///
-/// The method can be specialised to even primal-dual proximal splitting through the
-/// [`FBSpecialisation`] parameter `specialisation`.
-/// The settings in `config` have their [respective documentation](FBGenericConfig). `opA` is the
+/// The settings in `config` have their [respective documentation](FBConfig). `opA` is the
/// forward operator $A$, $b$ the observable, and $\lambda$ the regularisation weight.
/// The operator `op𝒟` is used for forming the proximal term. Typically it is a convolution
/// operator. Finally, the `iterator` is an outer loop verbosity and iteration count control
/// as documented in [`alg_tools::iterate`].
///
+/// For details on the mathematical formulation, see the [module level](self) documentation.
+///
/// The implementation relies on [`alg_tools::bisection_tree::BTFN`] presentations of
/// sums of simple functions usign bisection trees, and the related
/// [`alg_tools::bisection_tree::Aggregator`]s, to efficiently search for component functions
@@ -729,233 +170,103 @@
///
/// Returns the final iterate.
#[replace_float_literals(F::cast_from(literal))]
-pub fn generic_pointsource_fb_reg<
- 'a, F, I, A, GA, 𝒟, BTA, G𝒟, S, K, Spec, Reg, const N : usize
->(
- opA : &'a A,
- reg : Reg,
- op𝒟 : &'a 𝒟,
- mut τ : F,
- config : &FBGenericConfig,
- iterator : I,
- mut plotter : SeqPlotter,
- mut residual : A::Observable,
- mut specialisation : Spec
-) -> DiscreteMeasure, F>
-where F : Float + ToNalgebraRealField,
- I : AlgIteratorFactory>,
- Spec : FBSpecialisation,
- A::Observable : std::ops::MulAssign,
- GA : SupportGenerator + Clone,
- A : ForwardModel, F, PreadjointCodomain = BTFN>
- + Lipschitz<𝒟, FloatType=F>,
- BTA : BTSearch>,
- G𝒟 : SupportGenerator + Clone,
- 𝒟 : DiscreteMeasureOp, F, PreCodomain = PreBTFN>,
- 𝒟::Codomain : RealMapping,
- S: RealMapping + LocalAnalysis, N>,
- K: RealMapping + LocalAnalysis, N>,
- BTNodeLookup: BTNode, N>,
- PlotLookup : Plotting,
- DiscreteMeasure, F> : SpikeMerging,
- Reg : RegTerm {
-
+pub fn pointsource_fb_reg(
+ opA: &A,
+ b: &A::Observable,
+ reg: Reg,
+ prox_penalty: &P,
+ fbconfig: &FBConfig,
+ iterator: I,
+ mut plotter: SeqPlotter,
+) -> RNDM
+where
+ F: Float + ToNalgebraRealField,
+ I: AlgIteratorFactory>,
+ for<'b> &'b A::Observable: std::ops::Neg