From dc70dfd63f1a5d8da5220c60d52ddd1690e9bc4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lafage?= Date: Wed, 16 Oct 2024 10:02:59 +0200 Subject: [PATCH] Upgrade to PyO3 0.22 (#203) * Remove useless bounds on GroupFunc * Use the new Bound API * Refresh tuto * Use pyo3 0.22 * Use pyclass(eq, eq_int) and derive PartialEq * Use pyo3(signature=...) * Pin ndarray:0.15 * Finally commit Cargo.lock to pin ndarray 0.15 --- .gitignore | 5 +- Cargo.lock | 2385 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 9 +- doc/Egor_Tutorial.ipynb | 410 ++++++- ego/src/types.rs | 4 +- src/egor.rs | 7 +- src/sampling.rs | 6 +- src/types.rs | 24 +- 8 files changed, 2762 insertions(+), 88 deletions(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index 4b78df31..83f378b8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,8 @@ # will have compiled files and executables **/target/ -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock +# See https://blog.rust-lang.org/2023/08/29/committing-lockfiles.html +# Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..77037d2c --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2385 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "argmin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760a49d596b18b881d2fe6e9e6da4608fa64d4a7653ef5cd43bfaa4da018d596" +dependencies = [ + "anyhow", + "argmin-math", + "ctrlc", + "instant", + "num-traits", + "paste", + "rand", + "rand_xoshiro", + "serde", + "thiserror", +] + +[[package]] +name = "argmin-math" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93a0d0269b60bd1cd674de70314e3f0da97406cf8c1936ce760d2a46e0f13fe" +dependencies = [ + "anyhow", + "cfg-if", + "num-complex", + "num-integer", + "num-traits", + "rand", + "thiserror", +] + +[[package]] +name = "argmin-observer-slog" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d798c8ab61e6a55d161775f2ae8c42e56c15b746398878c36234575e6839aa" +dependencies = [ + "anyhow", + "argmin", + "slog", + "slog-async", + "slog-term", +] + +[[package]] +name = "argmin_testfunctions" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "866912833daca43599e91a630fd277afb92f77d5f7c641f0a5448b5c1b3efa00" +dependencies = [ + "num", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cauchy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff11ddd2af3b5e80dd0297fee6e56ac038d9bdc549573cdb51bd6d2efe7f05e" +dependencies = [ + "num-complex", + "num-traits", + "rand", + "serde", +] + +[[package]] +name = "cblas-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6feecd82cce51b0204cf063f0041d69f24ce83f680d87514b004248e7b0fa65" +dependencies = [ + "libc", +] + +[[package]] +name = "cc" +version = "1.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "cmake" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +dependencies = [ + "cc", +] + +[[package]] +name = "cobyla" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d2798ffc66a34e9a9358f384273831c9b893df4e724affff94c0095bfeb926" +dependencies = [ + "argmin", + "argmin-observer-slog", + "instant", + "libc", +] + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctrlc" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "egobox" +version = "0.23.0" +dependencies = [ + "anyhow", + "approx", + "argmin_testfunctions", + "criterion", + "ctrlc", + "egobox-doe", + "egobox-ego", + "egobox-gp", + "egobox-moe", + "env_logger", + "finitediff", + "libm", + "linfa", + "log", + "ndarray", + "ndarray-rand", + "numpy", + "pyo3", + "pyo3-log", + "rand_xoshiro", + "rayon", + "serde", + "serde_json", +] + +[[package]] +name = "egobox-doe" +version = "0.23.0" +dependencies = [ + "approx", + "criterion", + "linfa", + "ndarray", + "ndarray-rand", + "ndarray-stats", + "num-traits", + "rand_xoshiro", + "serde", + "serde_json", +] + +[[package]] +name = "egobox-ego" +version = "0.23.0" +dependencies = [ + "anyhow", + "approx", + "argmin", + "argmin_testfunctions", + "bincode", + "clap", + "cobyla", + "criterion", + "dyn-clonable", + "egobox-doe", + "egobox-gp", + "egobox-moe", + "env_logger", + "finitediff", + "libm", + "linfa", + "linfa-linalg", + "linfa-pls", + "log", + "ndarray", + "ndarray-linalg", + "ndarray-npy", + "ndarray-rand", + "ndarray-stats", + "nlopt", + "rand_xoshiro", + "rawpointer", + "rayon", + "serde", + "serde_json", + "serial_test", + "slsqp", + "thiserror", + "typetag", + "web-time", +] + +[[package]] +name = "egobox-gp" +version = "0.23.0" +dependencies = [ + "approx", + "argmin_testfunctions", + "cobyla", + "criterion", + "egobox-doe", + "finitediff", + "linfa", + "linfa-linalg", + "linfa-pls", + "log", + "ndarray", + "ndarray-linalg", + "ndarray-npy", + "ndarray-rand", + "ndarray-stats", + "ndarray_einsum_beta", + "nlopt", + "num-traits", + "paste", + "rand_xoshiro", + "rayon", + "serde", + "serde_json", + "thiserror", + "typetag", +] + +[[package]] +name = "egobox-moe" +version = "0.23.0" +dependencies = [ + "approx", + "argmin_testfunctions", + "bitflags", + "criterion", + "csv", + "egobox-doe", + "egobox-gp", + "env_logger", + "linfa", + "linfa-clustering", + "linfa-linalg", + "linfa-pls", + "log", + "ndarray", + "ndarray-csv", + "ndarray-linalg", + "ndarray-npy", + "ndarray-rand", + "ndarray-stats", + "paste", + "rand_isaac", + "rand_xoshiro", + "serde", + "serde_json", + "thiserror", + "typetag", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "env_filter" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + +[[package]] +name = "finitediff" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29b3f2b07b398985f495a66466e0a1fd105e022c25e1fd7042b60402cba765a" +dependencies = [ + "ndarray", +] + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "inventory" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" + +[[package]] +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kdtree" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80ee359328fc9087e9e3fc0a4567c4dd27ec69a127d6a70e8d9dd22845b8b1a2" +dependencies = [ + "num-traits", +] + +[[package]] +name = "lapack" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a7f0050af10913bc5e4f6091df38870cb5d4e45094d3dd551c1aff9d1d59b26" +dependencies = [ + "lapack-sys", + "libc", + "num-complex", +] + +[[package]] +name = "lapack-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d3a8a9f07310243de6c6226f039f14bce8d2f4c96b5d30ddbcfa31eb4e94ad" +dependencies = [ + "libc", +] + +[[package]] +name = "lax" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd3ec1cacffe7a44aee66f9e85d87e3ac69b472b546449884bd1fc1ca8ab359" +dependencies = [ + "cauchy", + "lapack", + "num-traits", + "thiserror", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "linfa" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cab423110bc374e4cfa915da88952e2c6a4a5a6300ac0a0e68022bff2ace0b3" +dependencies = [ + "approx", + "ndarray", + "ndarray-linalg", + "num-traits", + "rand", + "serde", + "sprs", + "thiserror", +] + +[[package]] +name = "linfa-clustering" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aef28a433e8cf5301a878b8bb36d5de6d6ff9895245b358dc6039bf9cf4438b" +dependencies = [ + "linfa", + "linfa-linalg", + "linfa-nn", + "ndarray", + "ndarray-rand", + "ndarray-stats", + "noisy_float", + "num-traits", + "rand_xoshiro", + "serde", + "space", + "thiserror", +] + +[[package]] +name = "linfa-linalg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e7562b41c8876d3367897067013bb2884cc78e6893f092ecd26b305176ac82" +dependencies = [ + "ndarray", + "num-traits", + "thiserror", +] + +[[package]] +name = "linfa-nn" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1945b1a1435e885b4743dad94f9676c0bf65d6cce102e96c753f93b4cfe68d0" +dependencies = [ + "kdtree", + "linfa", + "ndarray", + "ndarray-stats", + "noisy_float", + "num-traits", + "order-stat", + "serde", + "thiserror", +] + +[[package]] +name = "linfa-pls" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd9bc190667ad5c4b6a529e3fec5b47979dcd9a58f935a5c3d47ad099deb3b0" +dependencies = [ + "linfa", + "linfa-linalg", + "ndarray", + "ndarray-linalg", + "ndarray-rand", + "ndarray-stats", + "num-traits", + "paste", + "thiserror", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "approx", + "cblas-sys", + "libc", + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", + "rayon", + "serde", +] + +[[package]] +name = "ndarray-csv" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2956dbaf15d46593bfddfdb88901cb35299f3a58390c7328ac4f58932800b8f8" +dependencies = [ + "csv", + "either", + "ndarray", + "serde", +] + +[[package]] +name = "ndarray-linalg" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f87ff36428f228c6056204d0f5cb8c5165f0db0a065429faace3edbc2718f1f" +dependencies = [ + "cauchy", + "lax", + "ndarray", + "num-complex", + "num-traits", + "rand", + "thiserror", +] + +[[package]] +name = "ndarray-npy" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f85776816e34becd8bd9540818d7dc77bf28307f3b3dcc51cc82403c6931680c" +dependencies = [ + "byteorder", + "ndarray", + "num-complex", + "num-traits", + "py_literal", + "zip", +] + +[[package]] +name = "ndarray-rand" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65608f937acc725f5b164dcf40f4f0bc5d67dc268ab8a649d3002606718c4588" +dependencies = [ + "ndarray", + "rand", + "rand_distr", +] + +[[package]] +name = "ndarray-stats" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af5a8477ac96877b5bd1fd67e0c28736c12943aba24eda92b127e036b0c8f400" +dependencies = [ + "indexmap", + "itertools", + "ndarray", + "noisy_float", + "num-integer", + "num-traits", + "rand", +] + +[[package]] +name = "ndarray_einsum_beta" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b3abeae3e0637740340e0e32a9bf9308380e146ea6797950f9ff16e88d88a" +dependencies = [ + "lazy_static", + "ndarray", + "num-traits", + "regex", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nlopt" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ba8957c9e4d06c8e55df20a756a2e0467c819bba343b68bafa26b0ce789d62" +dependencies = [ + "cmake", +] + +[[package]] +name = "noisy_float" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978fe6e6ebc0bf53de533cd456ca2d9de13de13856eda1518a285d7705a213af" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", + "rand", + "serde", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "numpy" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf314fca279e6e6ac2126a4ff98f26d88aa4ad06bc68fb6ae5cf4bd706758311" +dependencies = [ + "libc", + "ndarray", + "num-complex", + "num-integer", + "num-traits", + "pyo3", + "rustc-hash", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + +[[package]] +name = "order-stat" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa535d5117d3661134dbf1719b6f0ffe06f2375843b13935db186cd094105eb" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pest" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "pest_meta" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "py_literal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "102df7a3d46db9d3891f178dcc826dc270a6746277a9ae6436f8d29fd490a8e1" +dependencies = [ + "num-bigint", + "num-complex", + "num-traits", + "pest", + "pest_derive", +] + +[[package]] +name = "pyo3" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e89ce2565d6044ca31a3eb79a334c3a79a841120a98f64eea9f579564cb691" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8afbaf3abd7325e08f35ffb8deb5892046fcb2608b703db6a583a5ba4cea01e" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec15a5ba277339d04763f4c23d85987a5b08cbb494860be141e6a10a8eb88022" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-log" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ac84e6eec1159bc2a575c9ae6723baa6ee9d45873e9bebad1e3ad7e8d28a443" +dependencies = [ + "arc-swap", + "log", + "pyo3", +] + +[[package]] +name = "pyo3-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e0f01b5364bcfbb686a52fc4181d412b708a68ed20c330db9fc8d2c2bf5a43" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a09b550200e1e5ed9176976d0060cbc2ea82dc8515da07885e7b8153a85caacb" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "rand_isaac" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac4373cd91b4f55722c553fb0f286edbb81ef3ff6eec7b99d1898a4110a0b28" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core", + "serde", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scc" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c1f7fc6deb21665a9060dfc7d271be784669295a31babdcd4dd2c79ae8cbfb" +dependencies = [ + "sdd", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdd" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49c1eeaf4b6a87c7479688c6d52b9f1153cedd3c489300564f932b065c6eab95" + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serial_test" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b4b487fe2acf240a021cf57c6b2b4903b1e78ca0ecd862a71b71d2a51fed77d" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slog" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" + +[[package]] +name = "slog-async" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c8038f898a2c79507940990f05386455b3a317d8f18d4caea7cbc3d5096b84" +dependencies = [ + "crossbeam-channel", + "slog", + "take_mut", + "thread_local", +] + +[[package]] +name = "slog-term" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e022d0b998abfe5c3782c1f03551a596269450ccd677ea51c56f8b214610e8" +dependencies = [ + "is-terminal", + "slog", + "term", + "thread_local", + "time", +] + +[[package]] +name = "slsqp" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d0744cf4f8f4adb210fee9c76d1e218172e762872bae09f9ee6fa246a2d458" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "space" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e990cc6cb89a82d70fe722cd7811dbce48a72bbfaebd623e58f142b6db28428f" + +[[package]] +name = "sprs" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704ef26d974e8a452313ed629828cd9d4e4fa34667ca1ad9d6b1fffa43c6e166" +dependencies = [ + "ndarray", + "num-complex", + "num-traits", + "smallvec", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "typetag" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ba3b6e86ffe0054b2c44f2d86407388b933b16cb0a70eea3929420db1d9bbe" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70b20a22c42c8f1cd23ce5e34f165d4d37038f5b663ad20fb6adbdf029172483" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unindent" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[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.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[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-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "zip" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" +dependencies = [ + "byteorder", + "crc32fast", + "flate2", + "thiserror", +] diff --git a/Cargo.toml b/Cargo.toml index a8b9a697..ef0cd363 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,6 @@ linfa = { version = "0.7", default-features = false } ndarray = { version = "0.15", features = ["rayon", "approx"] } ndarray-rand = "0.14" -numpy = "0.21.0" anyhow = "1" rayon = "1" @@ -49,10 +48,14 @@ libm = "0.2" finitediff = { version = "0.1.4", features = ["ndarray"] } env_logger = "0.11" log = "0.4" -pyo3 = { version = "0.21", features = ["extension-module"] } -pyo3-log = "0.10" + +pyo3 = { version = "0.22", features = ["extension-module"] } +pyo3-log = "0.11" +numpy = "0.22.0" + serde = "1" serde_json = "1" + ctrlc = "3.4" [dev-dependencies] diff --git a/doc/Egor_Tutorial.ipynb b/doc/Egor_Tutorial.ipynb index 1ae93fd7..611c54fa 100644 --- a/doc/Egor_Tutorial.ipynb +++ b/doc/Egor_Tutorial.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, "id": "1504e619-5775-42d3-8f48-7339272303ec", "metadata": {}, "outputs": [ @@ -28,7 +28,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: egobox in d:\\rlafage\\miniconda3\\lib\\site-packages (0.21.1)\n", + "Requirement already satisfied: egobox in d:\\rlafage\\miniconda3\\lib\\site-packages (0.23.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "0edaf00f", "metadata": {}, "outputs": [], @@ -67,14 +67,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "af2d82be", "metadata": {}, "outputs": [], "source": [ "# To display optimization information (none by default)\n", - "# import logging\n", - "# logging.basicConfig(level=logging.INFO)" + "import logging\n", + "logging.basicConfig(level=logging.INFO)" ] }, { @@ -97,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "7f6da807", "metadata": {}, "outputs": [], @@ -113,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "4c436437", "metadata": {}, "outputs": [], @@ -163,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -172,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 14, "id": "c8942031", "metadata": {}, "outputs": [], @@ -183,7 +183,7 @@ " cstr_tol=[1e-3, 1e-3],\n", " infill_strategy=egx.InfillStrategy.WB2,\n", " target=-5.5,\n", - " trego=True,\n", + " trego=False,\n", " # outdir=\"./out\",\n", " # hot_start=True\n", " ) \n", @@ -196,46 +196,98 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 15, "id": "c12b8e9d", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:egobox_ego.egor:EgorConfig { max_iters: 30, n_start: 20, n_optmod: 1, q_points: 1, n_doe: 10, n_cstr: 2, cstr_tol: Some([0.001, 0.001], shape=[2], strides=[1], layout=CFcf (0xf), const ndim=1), doe: None, q_ei: KrigingBeliever, infill_criterion: WB2, infill_optimizer: Cobyla, regression_spec: RegressionSpec(CONSTANT), correlation_spec: CorrelationSpec(SQUAREDEXPONENTIAL), kpls_dim: None, n_clusters: 1, target: -5.5, outdir: None, warm_start: false, hot_start: Disabled, xtypes: [Cont(0.0, 3.0), Cont(0.0, 4.0)], seed: None, trego: TregoConfig { activated: false, n_local_steps: 4, d: (1e-6, 1.0), beta: 0.9, gamma: 1.1111111111111112, sigma0: 0.1 } }\n", + "INFO:egobox_ego.solver.egor_solver:Compute initial LHS with 10 points\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 10 points...\n", + "INFO:egobox_ego.solver.egor_impl:Constraint[1] Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:Constraint[2] Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Constraint[1] trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:... Constraint[2] trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 9.204937362462847\n", + "INFO:egobox_ego.solver.egor_impl:Constraints scalings is updated to [17.30641653855953, 33.9424257801921]\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = inf\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 11 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 1/30 in 0.050s: Best fun(x)=[-4.503768675148718, -2.772294135479884, -0.3577741240315433] at x=[2.47747031435393, 2.0262983607947884]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 11 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [4.407757464854422e-6, 6.6329730464699226e-6], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 8.804656340337294\n", + "INFO:egobox_ego.solver.egor_impl:Constraints scalings is updated to [17.56984718519449, 35.521700892457886]\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 0.7350888624584337\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 12 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 2/30 in 0.019s: Best fun(x)=[-5.50730270590525, -0.003599839358417789, 0.00045571025737700666] at x=[2.329835276516248, 3.1774674293890017]\n", + "INFO:egobox_ego.egor:OptimizationResult:\n", + " Solver: Egor\n", + " param (best): [2.329835276516248, 3.1774674293890017], shape=[2], strides=[1], layout=CFcf (0xf), const ndim=1\n", + " cost (best): -5.50730270590525\n", + " iters (best): 2\n", + " iters (total): 2\n", + " termination: Target cost value reached\n", + " time: 73.1247ms\n", + "\n", + "INFO:egobox_ego.egor:Data: \n", + "[[0.4961250387492723, 1.8049235831213664, -2.3010486218706387, -1.3084367509878811, -4.562017356649495],\n", + " [0.07205367196005169, 0.5520168141425913, -0.6240704861026429, -1.4865782805260945, -28.97584021206128],\n", + " [0.6189725170397715, 3.079848892419401, -3.698821409459173, -0.381578929510098, -0.21246634154878308],\n", + " [1.7661252742523637, 1.5247759537989403, -3.290901228051304, -0.8164480616010863, -2.0496121641816245],\n", + " [0.9965523019629694, 3.6449033758400775, -4.641455677803047, -0.35504907795548846, 3.644712533623114],\n", + " [2.066350736834213, 3.2082639645147473, -5.274614701348961, 1.17066900904396, -0.7565941984749358],\n", + " [2.47747031435393, 2.0262983607947884, -4.503768675148718, -2.772294135479884, -0.3577741240315433],\n", + " [1.2277925489034751, 0.23153528039931548, -1.4593278293027905, -3.566291967331459, -0.42034543889667475],\n", + " [2.975641161313411, 2.6560621808060785, -5.63170334211949, -16.20059054509947, 2.646798378429132],\n", + " [2.23300709518891, 1.1946417877411886, -3.4276488829300984, -1.3467959134546437, -2.382810379132323],\n", + " [2.3440242366633006, 3.291088916864334, -5.635113153527635, -0.00947670850878346, 0.18188089704997168],\n", + " [2.329835276516248, 3.1774674293890017, -5.50730270590525, -0.003599839358417789, 0.00045571025737700666]]\n", + "INFO:egobox_ego.egor:Optim Result: min f(x)=[-5.50730270590525, -0.003599839358417789, 0.00045571025737700666] at x=[2.329835276516248, 3.1774674293890017]\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Optimization f=[-5.50793692e+00 -1.35143852e-04 -5.26158286e-05] at [2.32952661 3.17841031]\n", + "Optimization f=[-5.50730271e+00 -3.59983936e-03 4.55710257e-04] at [2.32983528 3.17746743]\n", "Optimization history: \n", - "Inputs = [[1.55335241 0.36609899]\n", - " [0.48433871 1.59588025]\n", - " [2.93418005 2.74753497]\n", - " [2.58045769 1.77813431]\n", - " [1.06805821 2.89510289]\n", - " [1.48471388 3.81690289]\n", - " [2.37071614 1.10296966]\n", - " [0.82720969 0.44451136]\n", - " [2.08425444 3.41673721]\n", - " [0.08617534 2.39265705]\n", - " [2.24213008 3.99999996]\n", - " [2.47071614 1.20296966]\n", - " [2.58182726 1.31408077]\n", - " [2.63287837 1.43753756]\n", - " [2.32952661 3.17841031]]\n", - "Outputs = [[-1.91945140e+00 -2.59662097e+00 -2.19714000e+00]\n", - " [-2.08021896e+00 -1.48190609e+00 -5.13533364e+00]\n", - " [-5.68171502e+00 -1.42792021e+01 2.68270603e+00]\n", - " [-4.35859200e+00 -4.70895411e+00 1.94930315e-02]\n", - " [-3.96316111e+00 -1.08641233e+00 2.82595019e+00]\n", - " [-5.30161677e+00 6.46292378e-01 1.65905814e+00]\n", - " [-3.47368580e+00 -2.44182980e+00 -1.87313519e+00]\n", - " [-1.27172105e+00 -3.43784549e+00 -1.19300768e-01]\n", - " [-5.50099165e+00 1.35506108e+00 -5.26673877e-01]\n", - " [-2.47883239e+00 3.38256872e-01 -2.59677570e+01]\n", - " [-6.24213005e+00 1.41054706e+00 4.55267296e-01]\n", - " [-3.67368580e+00 -3.50219615e+00 -1.22082043e+00]\n", - " [-3.89590802e+00 -5.19899351e+00 -4.36126757e-01]\n", - " [-4.07041593e+00 -6.11551899e+00 1.04566960e-04]\n", - " [-5.50793692e+00 -1.35143852e-04 -5.26158286e-05]]\n" + "Inputs = [[0.49612504 1.80492358]\n", + " [0.07205367 0.55201681]\n", + " [0.61897252 3.07984889]\n", + " [1.76612527 1.52477595]\n", + " [0.9965523 3.64490338]\n", + " [2.06635074 3.20826396]\n", + " [2.47747031 2.02629836]\n", + " [1.22779255 0.23153528]\n", + " [2.97564116 2.65606218]\n", + " [2.2330071 1.19464179]\n", + " [2.34402424 3.29108892]\n", + " [2.32983528 3.17746743]]\n", + "Outputs = [[-2.30104862e+00 -1.30843675e+00 -4.56201736e+00]\n", + " [-6.24070486e-01 -1.48657828e+00 -2.89758402e+01]\n", + " [-3.69882141e+00 -3.81578930e-01 -2.12466342e-01]\n", + " [-3.29090123e+00 -8.16448062e-01 -2.04961216e+00]\n", + " [-4.64145568e+00 -3.55049078e-01 3.64471253e+00]\n", + " [-5.27461470e+00 1.17066901e+00 -7.56594198e-01]\n", + " [-4.50376868e+00 -2.77229414e+00 -3.57774124e-01]\n", + " [-1.45932783e+00 -3.56629197e+00 -4.20345439e-01]\n", + " [-5.63170334e+00 -1.62005905e+01 2.64679838e+00]\n", + " [-3.42764888e+00 -1.34679591e+00 -2.38281038e+00]\n", + " [-5.63511315e+00 -9.47670851e-03 1.81880897e-01]\n", + " [-5.50730271e+00 -3.59983936e-03 4.55710257e-04]]\n" ] } ], @@ -265,9 +317,65 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 16, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 3 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 13.125691505249769\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 4 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 24.009123072353827\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 5 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 16.452207688308267\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 6 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 15.162692789516004\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 7 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 15.126446757171275\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 8 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 15.12508657993481\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 9 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 15.12508593774764\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 10 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 15.125085764592573\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 11 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 15.125085717147357\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 12 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 15.125085700566705\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -311,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 17, "id": "6948efc1", "metadata": {}, "outputs": [], @@ -339,29 +447,90 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 18, "id": "928d1f38", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:egobox_ego.egor:EgorConfig { max_iters: 30, n_start: 20, n_optmod: 1, q_points: 1, n_doe: 3, n_cstr: 0, cstr_tol: Some([], shape=[0], strides=[0], layout=CFcf (0xf), const ndim=1), doe: None, q_ei: KrigingBeliever, infill_criterion: EI, infill_optimizer: Cobyla, regression_spec: RegressionSpec(CONSTANT), correlation_spec: CorrelationSpec(SQUAREDEXPONENTIAL), kpls_dim: None, n_clusters: 1, target: -15.12, outdir: None, warm_start: false, hot_start: Disabled, xtypes: [Int(0, 25)], seed: None, trego: TregoConfig { activated: false, n_local_steps: 4, d: (1e-6, 1.0), beta: 0.9, gamma: 1.1111111111111112, sigma0: 0.1 } }\n", + "INFO:egobox_ego.solver.egor_solver:Compute initial LHS with 3 points\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 3 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion EI scaling is updated to 0.4465851155504781\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion EI max found = inf\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 4 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 1/30 in 0.017s: Best fun(x)=[-9.285318589373164] at x=[15.994108409160857]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 4 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [100.0], bounds: [(1e-8, 100.0)] }]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:egobox_ego.solver.egor_impl:Infill criterion EI scaling is updated to 0.5619422973386059\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion EI max found = 1\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 5 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 2/30 in 0.017s: Best fun(x)=[-12.352951424113456] at x=[17.055840869536123]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 5 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [19.826278888584234], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion EI scaling is updated to 1.312744230503256\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion EI max found = 1\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 6 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 3/30 in 0.015s: Best fun(x)=[-14.431984706366741] at x=[17.975239434691566]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 6 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [2.482582982104211], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion EI scaling is updated to 0.9535320054402261\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion EI max found = 1\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 7 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 4/30 in 0.015s: Best fun(x)=[-15.121611536143384] at x=[19.177310138404625]\n", + "INFO:egobox_ego.egor:OptimizationResult:\n", + " Solver: Egor\n", + " param (best): [19.177310138404625], shape=[1], strides=[1], layout=CFcf (0xf), const ndim=1\n", + " cost (best): -15.121611536143384\n", + " iters (best): 4\n", + " iters (total): 4\n", + " termination: Target cost value reached\n", + " time: 68.3634ms\n", + "\n", + "INFO:egobox_ego.egor:Data: \n", + "[[16, -9.285318589373164],\n", + " [6, 1.7860147802257362],\n", + " [23, -1.483344970869238],\n", + " [15, -5.703849598284653],\n", + " [17, -12.352951424113456],\n", + " [18, -14.431984706366741],\n", + " [19, -15.121611536143384]]\n", + "INFO:egobox_ego.egor:Optim Result: min f(x)=[-15.121611536143384] at x=[19]\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ "Optimization f=[-15.12161154] at [19.]\n", "Optimization history: \n", - "Inputs = [[22.]\n", - " [ 1.]\n", - " [ 9.]\n", - " [25.]\n", - " [21.]\n", - " [20.]\n", + "Inputs = [[16.]\n", + " [ 6.]\n", + " [23.]\n", + " [15.]\n", + " [17.]\n", + " [18.]\n", " [19.]]\n", - "Outputs = [[ -7.10960014]\n", + "Outputs = [[ -9.28531859]\n", " [ 1.78601478]\n", - " [ 5.41123083]\n", - " [ 11.42919546]\n", - " [-11.44370682]\n", - " [-14.15453288]\n", + " [ -1.48334497]\n", + " [ -5.7038496 ]\n", + " [-12.35295142]\n", + " [-14.43198471]\n", " [-15.12161154]]\n" ] } @@ -409,7 +578,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 19, "id": "f1615d5c", "metadata": {}, "outputs": [], @@ -445,10 +614,118 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 20, "id": "d14fff89", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:egobox_ego.egor:EgorConfig { max_iters: 10, n_start: 20, n_optmod: 1, q_points: 1, n_doe: 0, n_cstr: 0, cstr_tol: Some([], shape=[0], strides=[0], layout=CFcf (0xf), const ndim=1), doe: None, q_ei: KrigingBeliever, infill_criterion: WB2, infill_optimizer: Cobyla, regression_spec: RegressionSpec(CONSTANT), correlation_spec: CorrelationSpec(SQUAREDEXPONENTIAL), kpls_dim: None, n_clusters: 1, target: -inf, outdir: None, warm_start: false, hot_start: Disabled, xtypes: [Cont(-5.0, 5.0), Enum(3), Enum(2), Ord([0.0, 2.0, 3.0])], seed: Some(42), trego: TregoConfig { activated: false, n_local_steps: 4, d: (1e-6, 1.0), beta: 0.9, gamma: 1.1111111111111112, sigma0: 0.1 } }\n", + "INFO:egobox_ego.solver.egor_solver:Compute initial LHS with 8 points\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 8 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective Clustering and training...\n", + "INFO:egobox_ego.solver.egor_impl:... Objective trained (1 / Mixture[Smooth(1)])\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 10.427625363551902\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = inf\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 9 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 1/10 in 0.068s: Best fun(x)=[-13.600561811398896] at x=[-4.772126951368034, 0.07106593344512147, 0.5776272930917846, 0.9764959509783371, 0.889985532652429, 0.016482002306890425, 0.4883350167902765]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 9 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.3279073128321191, 0.14579191381159926, 0.003178195975652111, 0.004109661531586309, 0.0058895238178533, 0.003741537159230122, 0.002986665562187433], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 15.717441868153957\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 0.9426269377277287\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 10 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 2/10 in 0.060s: Best fun(x)=[-14.249999999999991] at x=[-4.999999999999997, 0.9999999999999963, 0.12219891643593064, 1, 0.9999999999999998, 0.2484619221521031, 0.4526311325870707]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 10 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.01678513366226893, 0.03109491720482986, 5.363529298682542e-7, 1.3259795136722554e-5, 3.840007883864988e-8, 0.0010066243809035119, 0.0013566565351389836], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 14.11417912963542\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 0.936202073942628\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 11 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 3/10 in 0.055s: Best fun(x)=[-14.249999999999991] at x=[-4.999999999999997, 0.9999999999999963, 0.12219891643593064, 1, 0.9999999999999998, 0.2484619221521031, 0.4526311325870707]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 11 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.040965146568570004, 0.037432741862806616, 0.0008853971060016593, 0.021406717941303492, 3.1353940664716256e-7, 0.0001791831793187536, 0.001109996876760477], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 13.692123791461372\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 1.0265750595621848\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 12 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 4/10 in 0.057s: Best fun(x)=[-14.249999999999991] at x=[-4.999999999999997, 0.9999999999999963, 0.12219891643593064, 1, 0.9999999999999998, 0.2484619221521031, 0.4526311325870707]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 12 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.0668717003199035, 0.0649461868267533, 0.0020273965348522028, 0.020598249379754754, 2.7768908246917803e-8, 4.481260453946385e-8, 0.002004355075410772], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 14.203929544991526\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 1.040744369773153\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 13 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 5/10 in 0.054s: Best fun(x)=[-14.249999999999996] at x=[-4.999999999999999, 0.31395805447636166, 0.3104565135928992, 0.8735397363174146, 0.5463410616661962, 0.09090194219106236, 0.10050009651134147]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 13 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.09775572739490314, 0.07022815131834431, 0.0008613231602161097, 0.025845548783299147, 1e-8, 1e-8, 0.0032786360097763296], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 14.182184726586744\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 1.0032435427715949\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 14 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 6/10 in 0.049s: Best fun(x)=[-14.249999999999996] at x=[-4.999999999999999, 0.31395805447636166, 0.3104565135928992, 0.8735397363174146, 0.5463410616661962, 0.09090194219106236, 0.10050009651134147]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 14 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.09960699572211697, 0.07427639683769603, 0.0008590210289618461, 0.026391197839656863, 1e-8, 1e-8, 0.0032961311902232103], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 13.496865548497649\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 1.0047817507307495\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 15 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 7/10 in 0.068s: Best fun(x)=[-14.249999999999996] at x=[-4.999999999999999, 0.31395805447636166, 0.3104565135928992, 0.8735397363174146, 0.5463410616661962, 0.09090194219106236, 0.10050009651134147]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 15 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.13031027852925317, 0.08620606595263652, 0.000736351546778811, 0.03521453751432287, 1.0002246504001311e-8, 1.0000000000000061e-8, 0.004146088775902907], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 13.99300653283111\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 1.0558007179525009\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 16 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 8/10 in 0.058s: Best fun(x)=[-14.249999999999996] at x=[-4.999999999999999, 0.31395805447636166, 0.3104565135928992, 0.8735397363174146, 0.5463410616661962, 0.09090194219106236, 0.10050009651134147]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 16 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.13502411508713696, 0.08978775533761046, 0.0007839096175881273, 0.031942676589068915, 1.002485702782907e-8, 1e-8, 0.004737833241724021], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 13.700939807333842\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 1.018365869441227\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 17 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 9/10 in 0.052s: Best fun(x)=[-14.249999999999996] at x=[-4.999999999999999, 0.31395805447636166, 0.3104565135928992, 0.8735397363174146, 0.5463410616661962, 0.09090194219106236, 0.10050009651134147]\n", + "INFO:egobox_ego.solver.egor_impl:Train surrogates with 17 points...\n", + "INFO:egobox_ego.solver.egor_impl:Objective model hyperparameters optim init >>> [Optimized { init: [0.16580832268789727, 0.09216561475041728, 0.0008895373959649185, 0.038271813049394365, 1e-8, 1.000000000000002e-8, 0.00523435188387671], bounds: [(1e-8, 100.0)] }]\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 scaling is updated to 14.110122937458884\n", + "INFO:egobox_ego.solver.egor_impl:Optimize infill criterion...\n", + "INFO:egobox_ego.solver.egor_impl:Infill criterion WB2 max found = 1.0400746544113368\n", + "INFO:egobox_ego.solver.egor_impl:+1 point(s), total: 18 points\n", + "INFO:egobox_ego.solver.egor_solver:********* End iteration 10/10 in 0.056s: Best fun(x)=[-14.249999999999996] at x=[-4.999999999999999, 0.31395805447636166, 0.3104565135928992, 0.8735397363174146, 0.5463410616661962, 0.09090194219106236, 0.10050009651134147]\n", + "INFO:egobox_ego.egor:OptimizationResult:\n", + " Solver: Egor\n", + " param (best): [-4.999999999999999, 0.31395805447636166, 0.3104565135928992, 0.8735397363174146, 0.5463410616661962, 0.09090194219106236, 0.10050009651134147], shape=[7], strides=[1], layout=CFcf (0xf), const ndim=1\n", + " cost (best): -14.249999999999996\n", + " iters (best): 5\n", + " iters (total): 10\n", + " termination: Maximum number of iterations reached\n", + " time: 588.0172ms\n", + "\n", + "INFO:egobox_ego.egor:Data: \n", + "[[0.6993982417640456, 0, 0, 0, 0.6993982417640456],\n", + " [4.844118471243775, 1, 0, 0, 9.68823694248755],\n", + " [-4.750388126541087, 1, 0, 2, -7.500776253082174],\n", + " [-1.8196725823889182, 2, 1, 2, -3.186066859808416],\n", + " [2.460524670373232, 0, 0, 2, 4.460524670373232],\n", + " [-2.8285905426188527, 0, 0, 2, -0.8285905426188527],\n", + " [2.5012666016241045, 2, 1, 0, 7.128609814628697],\n", + " [-0.6935668028220796, 2, 1, 3, 1.0233346119570734],\n", + " [-4.772126951368034, 2, 1, 0, -13.600561811398896],\n", + " [-4.999999999999997, 2, 1, 0, -14.249999999999991],\n", + " [-4.9999999999999964, 2, 1, 0, -14.249999999999988],\n", + " [-4.999999999781715, 2, 1, 0, -14.249999999377886],\n", + " [-4.999999999999999, 2, 1, 0, -14.249999999999996],\n", + " [-4.9999999999999805, 2, 1, 0, -14.249999999999943],\n", + " [-4.999999999999999, 2, 1, 0, -14.249999999999996],\n", + " [-4.9999999999999964, 2, 1, 0, -14.249999999999988],\n", + " [-4.99999999999961, 2, 1, 0, -14.249999999998886],\n", + " [-4.999999999983547, 2, 1, 0, -14.249999999953108]]\n", + "INFO:egobox_ego.egor:Optim Result: min f(x)=[-14.249999999999996] at x=[-4.999999999999999, 2, 1, 0]\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -526,7 +803,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 21, "id": "b91f14f2", "metadata": {}, "outputs": [ @@ -537,7 +814,7 @@ "Help on Egor in module builtins object:\n", "\n", "class Egor(object)\n", - " | Egor(xspecs, n_cstr=0, cstr_tol=None, n_start=20, n_doe=0, doe=None, regr_spec=Ellipsis, corr_spec=Ellipsis, infill_strategy=Ellipsis, q_points=1, par_infill_strategy=Ellipsis, infill_optimizer=Ellipsis, kpls_dim=None, trego=False, n_clusters=1, n_optmod=1, target=Ellipsis, outdir=None, warm_start=False, seed=None)\n", + " | Egor(xspecs, n_cstr=0, cstr_tol=None, n_start=20, n_doe=0, doe=None, regr_spec=Ellipsis, corr_spec=Ellipsis, infill_strategy=Ellipsis, q_points=1, par_infill_strategy=Ellipsis, infill_optimizer=Ellipsis, kpls_dim=None, trego=False, n_clusters=1, n_optmod=1, target=Ellipsis, outdir=None, warm_start=False, hot_start=None, seed=None)\n", " | \n", " | Optimizer constructor\n", " | \n", @@ -638,6 +915,15 @@ " | warm_start (bool)\n", " | Start by loading initial doe from directory\n", " | \n", + " | hot_start (int >= 0 or None)\n", + " | When hot_start>=0 saves optimizer state at each iteration and starts from a previous checkpoint\n", + " | if any for the given hot_start number of iterations beyond the max_iters nb of iterations.\n", + " | In an unstable environment were there can be crashes it allows to restart the optimization\n", + " | from the last iteration till stopping criterion is reached. Just use hot_start=0 in this case.\n", + " | When specifying an extended nb of iterations (hot_start > 0) it can allow to continue till max_iters +\n", + " | hot_start nb of iters is reached (provided the stopping criterion is max_iters)\n", + " | Checkpoint information is stored in .checkpoint/egor.arg binary file.\n", + " | \n", " | seed (int >= 0)\n", " | Random generator seed to allow computation reproducibility.\n", " | \n", @@ -707,7 +993,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "base", "language": "python", "name": "python3" }, diff --git a/ego/src/types.rs b/ego/src/types.rs index eff12776..3dcc15af 100644 --- a/ego/src/types.rs +++ b/ego/src/types.rs @@ -63,8 +63,8 @@ pub enum QEiStrategy { /// /// The function is expected to return a matrix allowing nrows evaluations at once. /// A row of the output matrix is expected to contain [objective, cstr_1, ... cstr_n] values. -pub trait GroupFunc: Send + Sync + 'static + Clone + Fn(&ArrayView2) -> Array2 {} -impl GroupFunc for T where T: Send + Sync + 'static + Clone + Fn(&ArrayView2) -> Array2 {} +pub trait GroupFunc: Clone + Fn(&ArrayView2) -> Array2 {} +impl GroupFunc for T where T: Clone + Fn(&ArrayView2) -> Array2 {} /// As structure to handle the objective and constraints functions for implementing /// `argmin::CostFunction` to be used with argmin framework. diff --git a/src/egor.rs b/src/egor.rs index 549b2b4a..a4ae113f 100644 --- a/src/egor.rs +++ b/src/egor.rs @@ -277,12 +277,11 @@ impl Egor { /// #[pyo3(signature = (fun, max_iters = 20))] fn minimize(&self, py: Python, fun: PyObject, max_iters: usize) -> PyResult { - let fun = fun.to_object(py); - let obj = move |x: &ArrayView2| -> Array2 { + let obj = |x: &ArrayView2| -> Array2 { Python::with_gil(|py| { let args = (x.to_owned().into_pyarray_bound(py),); - let res = fun.call1(py, args).unwrap(); - let pyarray: &PyArray2 = res.extract(py).unwrap(); + let res = fun.bind(py).call1(args).unwrap(); + let pyarray = res.downcast_into::>().unwrap(); pyarray.to_owned_array() }) }; diff --git a/src/sampling.rs b/src/sampling.rs index 20a61b66..0be59a43 100644 --- a/src/sampling.rs +++ b/src/sampling.rs @@ -4,8 +4,8 @@ use egobox_ego::gpmix::mixint::MixintContext; use numpy::{IntoPyArray, PyArray2}; use pyo3::prelude::*; -#[pyclass(rename_all = "SCREAMING_SNAKE_CASE")] -#[derive(Debug, Clone, Copy)] +#[pyclass(eq, eq_int, rename_all = "SCREAMING_SNAKE_CASE")] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum Sampling { Lhs = 1, FullFactorial = 2, @@ -28,6 +28,7 @@ pub enum Sampling { /// ndarray of shape (n_samples, n_variables) /// #[pyfunction] +#[pyo3(signature = (method, xspecs, n_samples, seed=None))] pub fn sampling( py: Python<'_>, method: Sampling, @@ -89,6 +90,7 @@ pub fn sampling( /// ndarray of shape (n_samples, n_variables) /// #[pyfunction] +#[pyo3(signature = (xspecs, n_samples, seed=None))] pub(crate) fn lhs( py: Python, xspecs: PyObject, diff --git a/src/types.rs b/src/types.rs index 25a5be15..7aad25a8 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,7 +1,7 @@ use pyo3::prelude::*; -#[pyclass(rename_all = "UPPERCASE")] -#[derive(Clone)] +#[pyclass(eq, eq_int, rename_all = "UPPERCASE")] +#[derive(Debug, Clone, PartialEq)] pub enum Recombination { /// prediction is taken from the expert with highest responsability /// resulting in a model with discontinuities @@ -48,16 +48,16 @@ impl CorrelationSpec { pub(crate) const MATERN52: u8 = egobox_moe::CorrelationSpec::MATERN52.bits(); } -#[pyclass(rename_all = "UPPERCASE")] -#[derive(Debug, Clone, Copy)] +#[pyclass(eq, eq_int, rename_all = "UPPERCASE")] +#[derive(Debug, Clone, Copy, PartialEq)] pub(crate) enum InfillStrategy { Ei = 1, Wb2 = 2, Wb2s = 3, } -#[pyclass(rename_all = "UPPERCASE")] -#[derive(Debug, Clone, Copy)] +#[pyclass(eq, eq_int, rename_all = "UPPERCASE")] +#[derive(Debug, Clone, Copy, PartialEq)] pub(crate) enum ParInfillStrategy { Kb = 1, Kblb = 2, @@ -65,8 +65,8 @@ pub(crate) enum ParInfillStrategy { Clmin = 4, } -#[pyclass(rename_all = "UPPERCASE")] -#[derive(Debug, Clone, Copy)] +#[pyclass(eq, eq_int, rename_all = "UPPERCASE")] +#[derive(Debug, Clone, Copy, PartialEq)] pub(crate) enum InfillOptimizer { Cobyla = 1, Slsqp = 2, @@ -93,8 +93,8 @@ impl ExpectedOptimum { } } -#[pyclass(rename_all = "UPPERCASE")] -#[derive(Clone, Copy, Debug)] +#[pyclass(eq, eq_int, rename_all = "UPPERCASE")] +#[derive(Clone, Copy, Debug, PartialEq)] pub(crate) enum XType { Float = 1, Int = 2, @@ -126,8 +126,8 @@ impl XSpec { } } -#[pyclass(rename_all = "UPPERCASE")] -#[derive(Debug, Clone, Copy)] +#[pyclass(eq, eq_int, rename_all = "UPPERCASE")] +#[derive(Debug, Clone, Copy, PartialEq)] pub(crate) enum SparseMethod { Fitc = 1, Vfe = 2,