diff --git a/Cargo.lock b/Cargo.lock
index d0f6183..a71f75a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -52,9 +52,9 @@ dependencies = [
[[package]]
name = "aho-corasick"
-version = "1.1.2"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
@@ -70,9 +70,9 @@ dependencies = [
[[package]]
name = "allocator-api2"
-version = "0.2.16"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "android_system_properties"
@@ -85,9 +85,9 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.18"
+version = "0.6.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -100,43 +100,44 @@ dependencies = [
[[package]]
name = "anstyle"
-version = "1.0.10"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
+checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
[[package]]
name = "anstyle-parse"
-version = "0.2.6"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.1.2"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2"
dependencies = [
- "windows-sys 0.59.0",
+ "windows-sys 0.60.2",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.6"
+version = "3.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
+checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a"
dependencies = [
"anstyle",
- "windows-sys 0.59.0",
+ "once_cell_polyfill",
+ "windows-sys 0.60.2",
]
[[package]]
name = "anyhow"
-version = "1.0.89"
+version = "1.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
+checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
[[package]]
name = "approx"
@@ -149,9 +150,9 @@ dependencies = [
[[package]]
name = "arbitrary"
-version = "1.4.1"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
+checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
dependencies = [
"derive_arbitrary",
]
@@ -164,7 +165,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -202,9 +203,9 @@ dependencies = [
[[package]]
name = "async-channel"
-version = "2.3.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
+checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
dependencies = [
"concurrent-queue",
"event-listener-strategy",
@@ -212,6 +213,12 @@ dependencies = [
"pin-project-lite",
]
+[[package]]
+name = "atomic-waker"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
[[package]]
name = "atomic_float"
version = "1.1.0"
@@ -220,9 +227,9 @@ checksum = "628d228f918ac3b82fe590352cc719d30664a0c13ca3a60266fe02c7132d480a"
[[package]]
name = "autocfg"
-version = "1.1.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "av1-grain"
@@ -240,13 +247,70 @@ dependencies = [
[[package]]
name = "avif-serialize"
-version = "0.8.3"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e"
+checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f"
dependencies = [
"arrayvec 0.7.6",
]
+[[package]]
+name = "axum"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5"
+dependencies = [
+ "axum-core",
+ "base64 0.22.1",
+ "bytes",
+ "form_urlencoded",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-util",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "serde_json",
+ "serde_path_to_error",
+ "serde_urlencoded",
+ "sha1",
+ "sync_wrapper",
+ "tokio",
+ "tokio-tungstenite 0.26.2",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "http-body-util",
+ "mime",
+ "pin-project-lite",
+ "rustversion",
+ "sync_wrapper",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
[[package]]
name = "backtrace"
version = "0.3.75"
@@ -316,9 +380,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
[[package]]
name = "bit_field"
-version = "0.10.2"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
+checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6"
[[package]]
name = "bitflags"
@@ -328,9 +392,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.9.1"
+version = "2.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
+checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
dependencies = [
"serde",
]
@@ -387,7 +451,7 @@ dependencies = [
"burn",
"burn-rl",
"confy",
- "env_logger 0.10.0",
+ "env_logger 0.10.2",
"internal-iterator",
"log",
"pretty_assertions",
@@ -416,21 +480,22 @@ checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b"
[[package]]
name = "bumpalo"
-version = "3.18.1"
+version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
[[package]]
name = "burn"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec639306f45bd663957465e840cfb07bcd2ae18f7c045dd9aba8cb7a69c0654a"
+checksum = "553c652ab5d2d1a4b3f5781ea4a3b907cecc09b8bc9fa93ca934f12e13bbbc96"
dependencies = [
"burn-autodiff",
"burn-candle",
"burn-core",
"burn-cuda",
"burn-ndarray",
+ "burn-remote",
"burn-rocm",
"burn-router",
"burn-tch",
@@ -440,37 +505,38 @@ dependencies = [
[[package]]
name = "burn-autodiff"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a178966322ab7ce71405f1324cdc14f79256d85a47138bbd2c8c4f0056148601"
+checksum = "5cfe012cffcf0f3700a1fccc8f78db08c63ba772d63a4d11687da58afa220e13"
dependencies = [
"burn-common",
"burn-tensor",
- "derive-new 0.7.0",
- "hashbrown 0.15.4",
+ "derive-new",
+ "hashbrown 0.15.5",
"log",
"num-traits",
"portable-atomic",
- "spin 0.10.0",
+ "spin",
]
[[package]]
name = "burn-candle"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed0981b3c1d07e9df0f5bef1042921b6db6e88b5d91916fa5dbdd7f0ca921c3"
+checksum = "eb052e5c240b7fc3265a3d8137a53b7c29b678f6b7613cc5ca315217e4a8d627"
dependencies = [
+ "burn-common",
"burn-tensor",
"candle-core",
- "derive-new 0.7.0",
+ "derive-new",
"half",
]
[[package]]
name = "burn-common"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c3fae76798ea4dd14e6290b6753eb6235ac28c6ceaf6da35ff8396775d5494d"
+checksum = "a99029e20e31124a48fd9ed7a56898a878df224f7030940d40a88cc36a086cc9"
dependencies = [
"cubecl-common",
"rayon",
@@ -479,9 +545,9 @@ dependencies = [
[[package]]
name = "burn-core"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2afa81c868c1a9b3fad25c31176945d0cc5181ba7b77c0456bc05cf57fca975c"
+checksum = "33f7a4166dfa0d7b30f5caa583d9bf01366052537f8cbd522c8a415125fe4592"
dependencies = [
"ahash",
"bincode 2.0.1",
@@ -490,26 +556,26 @@ dependencies = [
"burn-derive",
"burn-tensor",
"data-encoding",
- "derive-new 0.7.0",
+ "derive-new",
"flate2",
"half",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"log",
"num-traits",
"portable-atomic-util",
- "rand 0.9.1",
+ "rand 0.9.2",
"rmp-serde",
"serde",
"serde_json",
- "spin 0.10.0",
+ "spin",
"uuid",
]
[[package]]
name = "burn-cubecl"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c547cbe414274ab4022abcc85993e1e41aa7cdccc92395ba5658acfdac285e07"
+checksum = "cec89330675dabf02ba979ddf6874c2bd38d17d398a446e83a8c7b586536a940"
dependencies = [
"burn-common",
"burn-cubecl-fusion",
@@ -518,122 +584,121 @@ dependencies = [
"burn-tensor",
"bytemuck",
"cubecl",
- "cubecl-std",
- "derive-new 0.7.0",
+ "derive-new",
"futures-lite",
"half",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"log",
"num-traits",
- "rand 0.9.1",
+ "rand 0.9.2",
"serde",
- "spin 0.10.0",
+ "spin",
"text_placeholder",
]
[[package]]
name = "burn-cubecl-fusion"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c98a5cf4d17f2db71f68c44bda21bb85fe8fe06166ea83fdd2eaff557da7fc86"
+checksum = "823fdd0fc98a5a2adcfa5fb6ff0791652db07aa72d68c0ab9cedd31188f01b0e"
dependencies = [
"burn-common",
"burn-fusion",
"burn-ir",
"burn-tensor",
"cubecl",
- "derive-new 0.7.0",
+ "derive-new",
"half",
"serde",
]
[[package]]
name = "burn-cuda"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "995bd0b3f52a4cfe0cfe47c16b40b3fd33285d17a086dd583e5b432074857e02"
+checksum = "2a0d9909ff711c13a416a5212111a6c85defce9a5e194752a012e79b27a107f9"
dependencies = [
"burn-cubecl",
"burn-fusion",
"burn-tensor",
"bytemuck",
"cubecl",
- "derive-new 0.7.0",
+ "derive-new",
"half",
"log",
]
[[package]]
name = "burn-dataset"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136c784dfc474c822f34d69e865f88a5675e9de9803ef38cee4ce14cdba34d54"
+checksum = "9737c7dd9c40ce2c194e0aa5bbc5af6d333093227e4e27ab1e38187ff592d6c3"
dependencies = [
"csv",
- "derive-new 0.7.0",
- "dirs 6.0.0",
+ "derive-new",
+ "dirs",
"gix-tempfile",
"image",
"r2d2",
"r2d2_sqlite",
- "rand 0.9.1",
+ "rand 0.9.2",
"rmp-serde",
"rusqlite",
- "sanitize-filename 0.6.0",
+ "sanitize-filename",
"serde",
"serde_json",
"serde_rusqlite",
- "strum 0.27.1",
+ "strum 0.27.2",
"tempfile",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
]
[[package]]
name = "burn-derive"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12e9f07ccc658ef072bce2e996f0c38c80ee4c241598b6557afe1877dd87ae98"
+checksum = "64e901ae21fa532d237168fe963db9bf2ff1d73c8fbde2c7cffe1cdbae107499"
dependencies = [
- "derive-new 0.7.0",
+ "derive-new",
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
name = "burn-fusion"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9ed8e016795ec066c1028fc0d395a00bd5459922b4fa0eeae839b4d4ec58c45"
+checksum = "a97673bcc1f574d23d505605af943a9f84a495d8abd0af48b496927a004912c7"
dependencies = [
"burn-common",
"burn-ir",
"burn-tensor",
- "derive-new 0.7.0",
+ "derive-new",
"half",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"log",
"serde",
- "spin 0.10.0",
+ "spin",
]
[[package]]
name = "burn-ir"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d63629f2c8b82ee52dbb9c18becded5117c2faf57365dc271a55c16d139cd91a"
+checksum = "bf45587016162b5ec6764dd4b79ee43c85d1d04bb4850fccce97fe672c4e6fbb"
dependencies = [
"burn-tensor",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"portable-atomic-util",
"serde",
]
[[package]]
name = "burn-ndarray"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e883846578e6915e1dbaeeb5bce32cc04cff03e7cb79c5836e1e888bbce974f"
+checksum = "6518dc3956cba8f6c8a747e498029e93b22727720c0bc4ebebef35fe447dfe02"
dependencies = [
"atomic_float",
"burn-autodiff",
@@ -641,7 +706,7 @@ dependencies = [
"burn-ir",
"burn-tensor",
"bytemuck",
- "derive-new 0.7.0",
+ "derive-new",
"itertools 0.14.0",
"libm",
"macerator",
@@ -650,15 +715,40 @@ dependencies = [
"num-traits",
"paste",
"portable-atomic-util",
- "rand 0.9.1",
+ "rand 0.9.2",
"seq-macro",
- "spin 0.10.0",
+ "spin",
+]
+
+[[package]]
+name = "burn-remote"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c4f39b217cbe8d3a587db1bf9ff5ec18ca0500210c5ae931cfb4d654bb2e4da"
+dependencies = [
+ "async-channel",
+ "axum",
+ "burn-common",
+ "burn-ir",
+ "burn-router",
+ "burn-tensor",
+ "bytes",
+ "derive-new",
+ "futures-util",
+ "log",
+ "rmp-serde",
+ "serde",
+ "serde_bytes",
+ "tokio",
+ "tokio-tungstenite 0.27.0",
+ "tracing-core",
+ "tracing-subscriber",
]
[[package]]
name = "burn-rl"
version = "0.1.0"
-source = "git+https://github.com/yunjhongwu/burn-rl-examples.git#4d59261f26429f9df16dabd2b183f7fccd27ff9a"
+source = "git+https://github.com/yunjhongwu/burn-rl-examples.git#ef6e5d0644aff93fcb3e0d994fbd2722f6df2b42"
dependencies = [
"burn",
"gym-rs",
@@ -669,39 +759,39 @@ dependencies = [
[[package]]
name = "burn-rocm"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd39d58202558b65b575921b57bff933845e6171296e2b8faf6a9d3610a344c5"
+checksum = "3f2e74851c0e2fc600a0362544cd4cfccf0519ba11ab530734be30a79683c0ff"
dependencies = [
"burn-cubecl",
"burn-fusion",
"burn-tensor",
"bytemuck",
"cubecl",
- "derive-new 0.7.0",
+ "derive-new",
"half",
"log",
]
[[package]]
name = "burn-router"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22ed8614e180f7a58f77e658bd52e206d2f4a1ee37fcb4665c635ea9da90ea8b"
+checksum = "37b0566c0414f63b7353c222231f075ed29bc55eb0fed9f4123edfd3a1ed4ac3"
dependencies = [
"burn-common",
"burn-ir",
"burn-tensor",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"log",
- "spin 0.10.0",
+ "spin",
]
[[package]]
name = "burn-tch"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cacd39695f87086360a6457fa912062b2bbc04deacb281361539cf1bf6dcfac5"
+checksum = "af0d68925516a49d841e23395ec095ccff2c5983a9a9d3dad3ee8240898a3fb7"
dependencies = [
"burn-tensor",
"cc",
@@ -714,19 +804,19 @@ dependencies = [
[[package]]
name = "burn-tensor"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a70d1562c0d00083939e34daad61dabebb0f8bc8c250d1ef2f5efc31eb93aaf"
+checksum = "5719aec856f198aea8ac6bd859d2a9e88a626bafbb343a558614ec9ec9fb8605"
dependencies = [
"burn-common",
"bytemuck",
"colored",
"cubecl",
- "derive-new 0.7.0",
+ "derive-new",
"half",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"num-traits",
- "rand 0.9.1",
+ "rand 0.9.2",
"rand_distr",
"serde",
"serde_bytes",
@@ -734,17 +824,17 @@ dependencies = [
[[package]]
name = "burn-train"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "140182cf5f1255d60e1d8c677fa45c6f71018c3c3c66aad093a9e4c3c222cf1c"
+checksum = "35f3b4ca82423a0c7652cab75c37f9446dc9315c624231783185abd10ecebe71"
dependencies = [
"async-channel",
"burn-core",
"burn-ndarray",
- "derive-new 0.7.0",
+ "derive-new",
"log",
"nvml-wrapper",
- "ratatui 0.29.0",
+ "ratatui",
"rstest",
"serde",
"sysinfo",
@@ -756,9 +846,9 @@ dependencies = [
[[package]]
name = "burn-wgpu"
-version = "0.17.1"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "215bf0e641a27e17bcd3941a11867dcda411c9cb009488c6b6650c8206437c30"
+checksum = "d59fcb1d419fe44700cac10b59e5dda0e1512e8f8d7199073c172d88ba964b8f"
dependencies = [
"burn-cubecl",
"burn-fusion",
@@ -768,22 +858,22 @@ dependencies = [
[[package]]
name = "bytemuck"
-version = "1.23.1"
+version = "1.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422"
+checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677"
dependencies = [
"bytemuck_derive",
]
[[package]]
name = "bytemuck_derive"
-version = "1.9.3"
+version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1"
+checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -800,9 +890,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
[[package]]
name = "bytes"
-version = "1.5.0"
+version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
[[package]]
name = "bytesize"
@@ -848,13 +938,13 @@ dependencies = [
"memmap2",
"num-traits",
"num_cpus",
- "rand 0.9.1",
+ "rand 0.9.2",
"rand_distr",
"rayon",
"safetensors 0.4.5",
"thiserror 1.0.69",
"ug",
- "yoke",
+ "yoke 0.7.5",
"zip 1.1.4",
]
@@ -872,19 +962,20 @@ checksum = "c4f8d981c476baadf74cd52897866a1d279d3e14e2d5e2d9af045210e0ae6128"
[[package]]
name = "castaway"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5"
+checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
dependencies = [
"rustversion",
]
[[package]]
name = "cc"
-version = "1.2.27"
+version = "1.2.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
+checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54"
dependencies = [
+ "find-msvc-tools",
"jobserver",
"libc",
"shlex",
@@ -902,9 +993,9 @@ dependencies = [
[[package]]
name = "cfg-if"
-version = "1.0.0"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
[[package]]
name = "cfg_aliases"
@@ -966,7 +1057,7 @@ dependencies = [
"anyhow",
"bincode 1.3.3",
"bot",
- "env_logger 0.11.6",
+ "env_logger 0.11.8",
"itertools 0.13.0",
"log",
"pico-args",
@@ -975,17 +1066,6 @@ dependencies = [
"store",
]
-[[package]]
-name = "client_tui"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "bincode 1.3.3",
- "crossterm",
- "ratatui 0.28.1",
- "store",
-]
-
[[package]]
name = "cmake"
version = "0.1.54"
@@ -1014,9 +1094,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
name = "colorchoice"
-version = "1.0.3"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
+checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]]
name = "colored"
@@ -1029,9 +1109,9 @@ dependencies = [
[[package]]
name = "compact_str"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644"
+checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32"
dependencies = [
"castaway",
"cfg-if",
@@ -1058,8 +1138,8 @@ checksum = "f29222b549d4e3ded127989d523da9e928918d0d0d7f7c1690b439d0d538bae9"
dependencies = [
"directories",
"serde",
- "thiserror 2.0.12",
- "toml",
+ "thiserror 2.0.16",
+ "toml 0.8.23",
]
[[package]]
@@ -1097,22 +1177,28 @@ dependencies = [
[[package]]
name = "cpufeatures"
-version = "0.2.11"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
-version = "1.4.2"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
dependencies = [
"cfg-if",
]
+[[package]]
+name = "critical-section"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
+
[[package]]
name = "crossbeam-channel"
version = "0.5.15"
@@ -1153,11 +1239,11 @@ version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"crossterm_winapi",
"mio",
"parking_lot",
- "rustix 0.38.37",
+ "rustix 0.38.44",
"signal-hook",
"signal-hook-mio",
"winapi",
@@ -1174,9 +1260,9 @@ dependencies = [
[[package]]
name = "crunchy"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
+checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
[[package]]
name = "crypto-common"
@@ -1212,14 +1298,16 @@ dependencies = [
[[package]]
name = "cubecl"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1e438056cf7c25b3adde38240b89842e1c924b8e914731c82ad81161d23e6ff"
+checksum = "b418aabe526efb2d2714b9282a583bccbc555fe2e42546101259b2042bc133fa"
dependencies = [
+ "cubecl-convolution",
"cubecl-core",
"cubecl-cuda",
"cubecl-hip",
- "cubecl-linalg",
+ "cubecl-matmul",
+ "cubecl-random",
"cubecl-reduce",
"cubecl-runtime",
"cubecl-std",
@@ -1229,44 +1317,66 @@ dependencies = [
[[package]]
name = "cubecl-common"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79251bfc7f067ac9038232fe38a317adc2f31cb2fc3800e69fd409ccac7abc1f"
+checksum = "ff2bed7d9aa1a2fe640696067cab6b0b1b40dd30cdb8d12f91ae43ca6392498e"
dependencies = [
"bytemuck",
- "derive-new 0.6.0",
+ "cfg-if",
+ "derive-new",
"derive_more",
- "dirs 5.0.1",
+ "dirs",
"embassy-futures",
+ "embassy-time",
"futures-lite",
"half",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.5",
"log",
"num-traits",
"portable-atomic",
- "rand 0.9.1",
- "sanitize-filename 0.5.0",
+ "rand 0.9.2",
+ "sanitize-filename",
"serde",
"serde_json",
- "spin 0.9.8",
+ "spin",
+ "wasm-bindgen-futures",
+ "web-time",
+]
+
+[[package]]
+name = "cubecl-convolution"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a324c7e684c627a2746fb4700a29b5881970c7f93cc06c66bcf3c2c5184af97b"
+dependencies = [
+ "bytemuck",
+ "cubecl-common",
+ "cubecl-core",
+ "cubecl-matmul",
+ "cubecl-random",
+ "cubecl-reduce",
+ "cubecl-runtime",
+ "cubecl-std",
+ "half",
+ "serde",
]
[[package]]
name = "cubecl-core"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b03bf4211cdbd68bb0fb8291e0ed825c13da0d1ac01b7c02dce3cee44a6138be"
+checksum = "bc4c683bb3ed715eed12cfeca6599dc554efb9371e85f783eb7c3ae0d3781274"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"bytemuck",
"cubecl-common",
"cubecl-ir",
"cubecl-macros",
"cubecl-runtime",
- "derive-new 0.6.0",
+ "derive-new",
"derive_more",
"half",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.5",
"log",
"num-traits",
"paste",
@@ -1277,24 +1387,24 @@ dependencies = [
[[package]]
name = "cubecl-cpp"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5eef85cbcc34be7e25fc9d39edf99ed68559862dbf25c1877ebdf4a9595d31b"
+checksum = "0d06ed3e34f0a9f0a1ca225fc3351865a2ddf66966c73a7953dd27f1bbaed9b9"
dependencies = [
"bytemuck",
"cubecl-common",
"cubecl-core",
"cubecl-runtime",
- "derive-new 0.6.0",
+ "derive-new",
"half",
"log",
]
[[package]]
name = "cubecl-cuda"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71e091e4e3a3900faff440aec4053805ec4456f94f4acc4afe8e6b27519c6d16"
+checksum = "bf8898be518bd3df9f7d0df8c25e95f07cfc087c6485dda42e99add432e3463b"
dependencies = [
"bytemuck",
"cubecl-common",
@@ -1302,7 +1412,7 @@ dependencies = [
"cubecl-cpp",
"cubecl-runtime",
"cudarc",
- "derive-new 0.6.0",
+ "derive-new",
"half",
"log",
"serde",
@@ -1310,9 +1420,9 @@ dependencies = [
[[package]]
name = "cubecl-hip"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c2f8c00207517de61cccdc4ca2724bc1db9dab94840beaf4329e43cead3bc4a"
+checksum = "d9afb1c085f8d715fd8686ad77ada69e364c9cc16a51cf10a7d65ad88d760b6b"
dependencies = [
"bytemuck",
"cubecl-common",
@@ -1320,7 +1430,7 @@ dependencies = [
"cubecl-cpp",
"cubecl-hip-sys",
"cubecl-runtime",
- "derive-new 0.6.0",
+ "derive-new",
"half",
"log",
"paste",
@@ -1328,18 +1438,19 @@ dependencies = [
[[package]]
name = "cubecl-hip-sys"
-version = "6.4.0"
+version = "6.4.4348201"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7557762176858fa0357504025f09ae6e979c3547776ff8b6a1025ef0702450"
+checksum = "678a20e5e38ce9c772bdd53596f2801ef210ae735ec2d7d46b5d5b675c09d929"
dependencies = [
"libc",
+ "regex",
]
[[package]]
name = "cubecl-ir"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e096d77646590f0180ed4ce1aa7df4ecc7219f3c4616e9fe72d93ab63a352855"
+checksum = "bbb72454fb17da66e60f98a011cce199ff0bb78c4e465236459af619039b6cd5"
dependencies = [
"cubecl-common",
"cubecl-macros-internal",
@@ -1347,7 +1458,7 @@ dependencies = [
"float-ord",
"fnv",
"half",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.5",
"num-traits",
"portable-atomic",
"serde",
@@ -1355,14 +1466,43 @@ dependencies = [
]
[[package]]
-name = "cubecl-linalg"
-version = "0.5.0"
+name = "cubecl-macros"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75aacf86f6004c274e63589aed55c5edcbcdf1b292eaf4ce2c1688c04c41a194"
+checksum = "72d61316b8a2ec26bb554745591174022bb048dbcc508091b15dd4f6fcb4793a"
+dependencies = [
+ "cubecl-common",
+ "darling 0.21.3",
+ "derive-new",
+ "ident_case",
+ "prettyplease",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "cubecl-macros-internal"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7c27cf02393d78a41ad125ef6d6274cd3930385f6945779f4f21a2c66e718db"
+dependencies = [
+ "darling 0.21.3",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "cubecl-matmul"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66af2716f458eed3bd14d810d9a90bc43dd35c5464b2fe4630a711a074892fb8"
dependencies = [
"bytemuck",
"cubecl-common",
"cubecl-core",
+ "cubecl-random",
"cubecl-reduce",
"cubecl-runtime",
"cubecl-std",
@@ -1371,51 +1511,40 @@ dependencies = [
]
[[package]]
-name = "cubecl-macros"
-version = "0.5.0"
+name = "cubecl-random"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd74622b5c8cb161e3f7fa0b2b751784ef89ab45acfa355f511eb2219dde337e"
+checksum = "648731639463df215c01ee209477a2f233fb5168fb50e8df755e658ddaaf29f4"
dependencies = [
"cubecl-common",
- "darling",
- "derive-new 0.6.0",
- "ident_case",
- "prettyplease",
- "proc-macro2",
- "quote",
- "syn 2.0.104",
-]
-
-[[package]]
-name = "cubecl-macros-internal"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a89898212c1eaba0e2f0dffcadc9790b20b75d2ec8836da084370b043be2623"
-dependencies = [
- "darling",
- "proc-macro2",
- "quote",
- "syn 2.0.104",
+ "cubecl-core",
+ "cubecl-runtime",
+ "cubecl-std",
+ "half",
+ "num-traits",
+ "rand 0.9.2",
+ "serde",
]
[[package]]
name = "cubecl-reduce"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7afbdfe03e7e3ca71f61890ebebc6b4390494204b545e6f6bf51a43755449073"
+checksum = "729e3de15783aed5c617c8c4de633765c6d0cf4b9564bb51d21dd67b4fdeeebf"
dependencies = [
"cubecl-core",
"cubecl-runtime",
"cubecl-std",
+ "half",
"num-traits",
"serde",
]
[[package]]
name = "cubecl-runtime"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "385234520c9e392382737f32ad372b05f345656eb798ba00b72d2722c68b698c"
+checksum = "68ab7c56cbb83e43fd1b52ee3d521bcb816068e0bb6f4aeb56c9bd63218b1147"
dependencies = [
"async-channel",
"bytemuck",
@@ -1423,22 +1552,25 @@ dependencies = [
"cfg_aliases",
"cubecl-common",
"cubecl-ir",
- "derive-new 0.6.0",
- "hashbrown 0.14.5",
+ "derive-new",
+ "dirs",
+ "foldhash",
+ "hashbrown 0.15.5",
"log",
"md5",
"serde",
"serde_json",
- "spin 0.9.8",
+ "spin",
+ "toml 0.9.5",
"variadics_please",
"wasm-bindgen-futures",
]
[[package]]
name = "cubecl-std"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38868eea6fdc183feb3c46bcf5e666c78e6cf0ddca2c4f3a877785cc0eabd71e"
+checksum = "3536c4c1c878bd77ceda959a3f157bbb69f957269e3f138c7edd72d9deb533fd"
dependencies = [
"cubecl-core",
"cubecl-runtime",
@@ -1448,9 +1580,9 @@ dependencies = [
[[package]]
name = "cubecl-wgpu"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77fa2dcfaa6d75cfbc5ff05cafe99ec4a7fb7c0fa7197917e0fd20f5b90979fe"
+checksum = "1d3f068c9a81201f43cdd3f6385201b330f2499f6c24d688d82a70d705261a32"
dependencies = [
"async-channel",
"bytemuck",
@@ -1459,19 +1591,19 @@ dependencies = [
"cubecl-common",
"cubecl-core",
"cubecl-runtime",
- "derive-new 0.6.0",
+ "derive-new",
"derive_more",
- "hashbrown 0.14.5",
+ "half",
+ "hashbrown 0.15.5",
"log",
- "web-time",
"wgpu",
]
[[package]]
name = "cudarc"
-version = "0.13.9"
+version = "0.16.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "486c221362668c63a1636cfa51463b09574433b39029326cff40864b3ba12b6e"
+checksum = "17200eb07e7d85a243aa1bf4569a7aa998385ba98d14833973a817a63cc86e92"
dependencies = [
"libloading",
]
@@ -1482,8 +1614,18 @@ version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
dependencies = [
- "darling_core",
- "darling_macro",
+ "darling_core 0.20.11",
+ "darling_macro 0.20.11",
+]
+
+[[package]]
+name = "darling"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0"
+dependencies = [
+ "darling_core 0.21.3",
+ "darling_macro 0.21.3",
]
[[package]]
@@ -1497,7 +1639,21 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.104",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn 2.0.106",
]
[[package]]
@@ -1506,9 +1662,20 @@ version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
- "darling_core",
+ "darling_core 0.20.11",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
+dependencies = [
+ "darling_core 0.21.3",
+ "quote",
+ "syn 2.0.106",
]
[[package]]
@@ -1542,9 +1709,9 @@ dependencies = [
[[package]]
name = "deranged"
-version = "0.4.0"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
+checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc"
dependencies = [
"powerfmt",
]
@@ -1560,17 +1727,6 @@ dependencies = [
"syn 1.0.109",
]
-[[package]]
-name = "derive-new"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.104",
-]
-
[[package]]
name = "derive-new"
version = "0.7.0"
@@ -1579,38 +1735,38 @@ checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
name = "derive_arbitrary"
-version = "1.4.1"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800"
+checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
name = "derive_more"
-version = "1.0.0"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
+checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
dependencies = [
"derive_more-impl",
]
[[package]]
name = "derive_more-impl"
-version = "1.0.0"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
+checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
"unicode-xid",
]
@@ -1637,16 +1793,7 @@ version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d"
dependencies = [
- "dirs-sys 0.5.0",
-]
-
-[[package]]
-name = "dirs"
-version = "5.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
-dependencies = [
- "dirs-sys 0.4.1",
+ "dirs-sys",
]
[[package]]
@@ -1655,19 +1802,7 @@ version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
dependencies = [
- "dirs-sys 0.5.0",
-]
-
-[[package]]
-name = "dirs-sys"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
-dependencies = [
- "libc",
- "option-ext",
- "redox_users 0.4.6",
- "windows-sys 0.48.0",
+ "dirs-sys",
]
[[package]]
@@ -1678,8 +1813,8 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
dependencies = [
"libc",
"option-ext",
- "redox_users 0.5.0",
- "windows-sys 0.59.0",
+ "redox_users",
+ "windows-sys 0.61.0",
]
[[package]]
@@ -1690,7 +1825,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -1723,15 +1858,65 @@ dependencies = [
[[package]]
name = "either"
-version = "1.9.0"
+version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
name = "embassy-futures"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067"
+checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01"
+
+[[package]]
+name = "embassy-time"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f820157f198ada183ad62e0a66f554c610cdcd1a9f27d4b316358103ced7a1f8"
+dependencies = [
+ "cfg-if",
+ "critical-section",
+ "document-features",
+ "embassy-time-driver",
+ "embedded-hal 0.2.7",
+ "embedded-hal 1.0.0",
+ "embedded-hal-async",
+ "futures-util",
+]
+
+[[package]]
+name = "embassy-time-driver"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0a244c7dc22c8d0289379c8d8830cae06bb93d8f990194d0de5efb3b5ae7ba6"
+dependencies = [
+ "document-features",
+]
+
+[[package]]
+name = "embedded-hal"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff"
+dependencies = [
+ "nb 0.1.3",
+ "void",
+]
+
+[[package]]
+name = "embedded-hal"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89"
+
+[[package]]
+name = "embedded-hal-async"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884"
+dependencies = [
+ "embedded-hal 1.0.0",
+]
[[package]]
name = "enum-as-inner"
@@ -1742,7 +1927,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -1757,9 +1942,9 @@ dependencies = [
[[package]]
name = "env_logger"
-version = "0.10.0"
+version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
+checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580"
dependencies = [
"humantime",
"is-terminal",
@@ -1770,14 +1955,14 @@ dependencies = [
[[package]]
name = "env_logger"
-version = "0.11.6"
+version = "0.11.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0"
+checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f"
dependencies = [
"anstream",
"anstyle",
"env_filter",
- "humantime",
+ "jiff",
"log",
]
@@ -1798,30 +1983,30 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
name = "equivalent"
-version = "1.0.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
-version = "0.3.12"
+version = "0.3.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18"
+checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
dependencies = [
"libc",
- "windows-sys 0.59.0",
+ "windows-sys 0.60.2",
]
[[package]]
name = "event-listener"
-version = "5.4.0"
+version = "5.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae"
+checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
dependencies = [
"concurrent-queue",
"parking",
@@ -1893,6 +2078,26 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+[[package]]
+name = "fax"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab"
+dependencies = [
+ "fax_derive",
+]
+
+[[package]]
+name = "fax_derive"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
[[package]]
name = "fdeflate"
version = "0.3.7"
@@ -1902,6 +2107,12 @@ dependencies = [
"simd-adler32",
]
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d"
+
[[package]]
name = "flate2"
version = "1.1.2"
@@ -1926,9 +2137,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foldhash"
-version = "0.1.3"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
[[package]]
name = "foreign-types"
@@ -1948,7 +2159,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -1959,13 +2170,22 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
[[package]]
name = "form_urlencoded"
-version = "1.2.1"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
"percent-encoding",
]
+[[package]]
+name = "futures-channel"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
+dependencies = [
+ "futures-core",
+]
+
[[package]]
name = "futures-core"
version = "0.3.31"
@@ -1980,9 +2200,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
[[package]]
name = "futures-lite"
-version = "2.6.0"
+version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532"
+checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
dependencies = [
"fastrand",
"futures-core",
@@ -1999,9 +2219,15 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
+[[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"
@@ -2022,6 +2248,7 @@ checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [
"futures-core",
"futures-macro",
+ "futures-sink",
"futures-task",
"pin-project-lite",
"pin-utils",
@@ -2064,7 +2291,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.5.0",
+ "raw-cpuid 11.6.0",
"seq-macro",
]
@@ -2094,7 +2321,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.5.0",
+ "raw-cpuid 11.6.0",
"seq-macro",
]
@@ -2124,7 +2351,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.5.0",
+ "raw-cpuid 11.6.0",
"seq-macro",
]
@@ -2163,7 +2390,7 @@ dependencies = [
"once_cell",
"paste",
"pulp 0.21.5",
- "raw-cpuid 11.5.0",
+ "raw-cpuid 11.6.0",
"rayon",
"seq-macro",
"sysctl 0.6.0",
@@ -2200,7 +2427,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.5.0",
+ "raw-cpuid 11.6.0",
"rayon",
"seq-macro",
]
@@ -2231,7 +2458,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.5.0",
+ "raw-cpuid 11.6.0",
"seq-macro",
]
@@ -2261,7 +2488,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.5.0",
+ "raw-cpuid 11.6.0",
"seq-macro",
]
@@ -2283,7 +2510,7 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi 0.11.1+wasi-snapshot-preview1",
]
[[package]]
@@ -2295,14 +2522,14 @@ dependencies = [
"cfg-if",
"libc",
"r-efi",
- "wasi 0.14.2+wasi-0.2.4",
+ "wasi 0.14.3+wasi-0.2.4",
]
[[package]]
name = "gif"
-version = "0.13.2"
+version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcc37f9a2bfe731e69f1e08d29d91d30604b9ce24bcb2880a961e82d89c6ed89"
+checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b"
dependencies = [
"color_quant",
"weezl",
@@ -2336,21 +2563,21 @@ dependencies = [
"gix-features",
"gix-path",
"gix-utils",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
]
[[package]]
name = "gix-path"
-version = "0.10.18"
+version = "0.10.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567f65fec4ef10dfab97ae71f26a27fd4d7fe7b8e3f90c8a58551c41ff3fb65b"
+checksum = "06d37034a4c67bbdda76f7bcd037b2f7bc0fba0c09a6662b19697a5716e7b2fd"
dependencies = [
"bstr",
"gix-trace",
"gix-validate",
"home",
"once_cell",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
]
[[package]]
@@ -2371,9 +2598,9 @@ dependencies = [
[[package]]
name = "gix-trace"
-version = "0.1.12"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c396a2036920c69695f760a65e7f2677267ccf483f25046977d87e4cb2665f7"
+checksum = "e2ccaf54b0b1743a695b482ca0ab9d7603744d8d10b2e5d1a332fef337bee658"
[[package]]
name = "gix-utils"
@@ -2392,7 +2619,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d"
dependencies = [
"bstr",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
]
[[package]]
@@ -2408,9 +2635,9 @@ dependencies = [
[[package]]
name = "glob"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
+checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
[[package]]
name = "glow"
@@ -2439,7 +2666,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"gpu-alloc-types",
]
@@ -2449,7 +2676,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
]
[[package]]
@@ -2470,9 +2697,9 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"gpu-descriptor-types",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
]
[[package]]
@@ -2481,7 +2708,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
]
[[package]]
@@ -2490,7 +2717,7 @@ version = "0.3.1"
source = "git+https://github.com/MathisWellmann/gym-rs.git#5283afaa86a3a7c45c46c882cfad459f02539b62"
dependencies = [
"derivative",
- "derive-new 0.7.0",
+ "derive-new",
"log",
"nalgebra",
"num-traits",
@@ -2511,7 +2738,7 @@ dependencies = [
"cfg-if",
"crunchy",
"num-traits",
- "rand 0.9.1",
+ "rand 0.9.2",
"rand_distr",
"serde",
]
@@ -2530,17 +2757,12 @@ name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
- "allocator-api2",
- "serde",
-]
[[package]]
name = "hashbrown"
-version = "0.15.4"
+version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
+checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
dependencies = [
"allocator-api2",
"equivalent",
@@ -2554,7 +2776,7 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
dependencies = [
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
]
[[package]]
@@ -2563,12 +2785,6 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-[[package]]
-name = "hermit-abi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
-
[[package]]
name = "hermit-abi"
version = "0.5.2"
@@ -2600,10 +2816,179 @@ dependencies = [
]
[[package]]
-name = "humantime"
-version = "2.1.0"
+name = "http"
+version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+dependencies = [
+ "bytes",
+ "http",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "humantime"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f"
+
+[[package]]
+name = "hyper"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "pin-utils",
+ "smallvec",
+ "tokio",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "hyper",
+ "pin-project-lite",
+ "tokio",
+ "tower-service",
+]
+
+[[package]]
+name = "icu_collections"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
+dependencies = [
+ "displaydoc",
+ "potential_utf",
+ "yoke 0.8.0",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_core"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
+
+[[package]]
+name = "icu_properties"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_locale_core",
+ "icu_properties_data",
+ "icu_provider",
+ "potential_utf",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
+
+[[package]]
+name = "icu_provider"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
+dependencies = [
+ "displaydoc",
+ "icu_locale_core",
+ "stable_deref_trait",
+ "tinystr",
+ "writeable",
+ "yoke 0.8.0",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
+]
[[package]]
name = "ident_case"
@@ -2613,19 +2998,30 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
-version = "0.5.0"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
]
[[package]]
name = "image"
-version = "0.25.6"
+version = "0.25.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a"
+checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7"
dependencies = [
"bytemuck",
"byteorder-lite",
@@ -2633,6 +3029,7 @@ dependencies = [
"exr",
"gif",
"image-webp",
+ "moxcms",
"num-traits",
"png",
"qoi",
@@ -2646,9 +3043,9 @@ dependencies = [
[[package]]
name = "image-webp"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b"
+checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3"
dependencies = [
"byteorder-lite",
"quick-error",
@@ -2662,12 +3059,12 @@ checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408"
[[package]]
name = "indexmap"
-version = "2.9.0"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
+checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
dependencies = [
"equivalent",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
]
[[package]]
@@ -2678,21 +3075,24 @@ checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
[[package]]
name = "inout"
-version = "0.1.3"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
dependencies = [
"generic-array",
]
[[package]]
name = "instability"
-version = "0.3.2"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c"
+checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a"
dependencies = [
+ "darling 0.20.11",
+ "indoc",
+ "proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -2709,18 +3109,29 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "io-uring"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b"
+dependencies = [
+ "bitflags 2.9.4",
+ "cfg-if",
+ "libc",
]
[[package]]
name = "is-terminal"
-version = "0.4.9"
+version = "0.4.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
+checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [
- "hermit-abi 0.3.9",
- "rustix 0.38.37",
- "windows-sys 0.48.0",
+ "hermit-abi",
+ "libc",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -2767,9 +3178,33 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.9"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
+[[package]]
+name = "jiff"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49"
+dependencies = [
+ "jiff-static",
+ "log",
+ "portable-atomic",
+ "portable-atomic-util",
+ "serde",
+]
+
+[[package]]
+name = "jiff-static"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
[[package]]
name = "jni-sys"
@@ -2779,25 +3214,19 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "jobserver"
-version = "0.1.33"
+version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
+checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
dependencies = [
"getrandom 0.3.3",
"libc",
]
-[[package]]
-name = "jpeg-decoder"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07"
-
[[package]]
name = "js-sys"
-version = "0.3.77"
+version = "0.3.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -2834,15 +3263,15 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
[[package]]
name = "libc"
-version = "0.2.172"
+version = "0.2.175"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
+checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
[[package]]
name = "libfuzzer-sys"
-version = "0.4.9"
+version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75"
+checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404"
dependencies = [
"arbitrary",
"cc",
@@ -2855,7 +3284,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
dependencies = [
"cfg-if",
- "windows-targets 0.52.6",
+ "windows-targets 0.53.3",
]
[[package]]
@@ -2866,19 +3295,19 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
[[package]]
name = "libredox"
-version = "0.1.3"
+version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
+checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"libc",
]
[[package]]
name = "libsqlite3-sys"
-version = "0.32.0"
+version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbb8270bb4060bd76c6e96f20c52d80620f1d82a3470885694e41e0f81ef6fe7"
+checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f"
dependencies = [
"cc",
"pkg-config",
@@ -2887,9 +3316,9 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
-version = "0.4.14"
+version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]]
name = "linux-raw-sys"
@@ -2898,16 +3327,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
[[package]]
-name = "litrs"
-version = "0.4.1"
+name = "litemap"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
+checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
+
+[[package]]
+name = "litrs"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed"
[[package]]
name = "lock_api"
-version = "0.4.11"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -2915,9 +3350,9 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.27"
+version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
[[package]]
name = "loop9"
@@ -2934,14 +3369,14 @@ version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
dependencies = [
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
]
[[package]]
name = "macerator"
-version = "0.2.8"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bce07f822458c4c303081d133a90610406162e7c8df17434956ac1892faf447b"
+checksum = "8ac9c19702c37bae1a53d130a326b1c4f58cb17d472538cf547d44b46dbbe3aa"
dependencies = [
"bytemuck",
"cfg_aliases",
@@ -2950,18 +3385,19 @@ dependencies = [
"moddef",
"num-traits",
"paste",
+ "rustc_version",
]
[[package]]
name = "macerator-macros"
-version = "0.1.2"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2b955a106dca78c0577269d67a6d56114abb8644b810fc995a22348276bb9dd"
+checksum = "8cd48b535b9b37a25a2589ab8d4f997886a2c68f59960ce06588525f38dd4944"
dependencies = [
- "darling",
+ "darling 0.20.11",
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -2973,6 +3409,12 @@ dependencies = [
"libc",
]
+[[package]]
+name = "matchit"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
+
[[package]]
name = "matrixmultiply"
version = "0.3.10"
@@ -2998,9 +3440,9 @@ dependencies = [
[[package]]
name = "md5"
-version = "0.7.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
+checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0"
[[package]]
name = "memchr"
@@ -3010,9 +3452,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "memmap2"
-version = "0.9.5"
+version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
+checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7"
dependencies = [
"libc",
"stable_deref_trait",
@@ -3046,7 +3488,7 @@ version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"block",
"core-graphics-types",
"foreign-types",
@@ -3055,6 +3497,12 @@ dependencies = [
"paste",
]
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
[[package]]
name = "minimal-lexical"
version = "0.2.1"
@@ -3073,22 +3521,31 @@ dependencies = [
[[package]]
name = "mio"
-version = "1.0.2"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
+checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
dependencies = [
- "hermit-abi 0.3.9",
"libc",
"log",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.52.0",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+ "windows-sys 0.59.0",
]
[[package]]
name = "moddef"
-version = "0.2.6"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e519fd9c6131c1c9a4a67f8bdc4f32eb4105b16c1468adea1b8e68c98c85ec4"
+checksum = "4a0b3262dc837d2513fe2ef31ff8461352ef932dcca31ba0c0abe33547cf6b9b"
+
+[[package]]
+name = "moxcms"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddd32fa8935aeadb8a8a6b6b351e40225570a37c43de67690383d87ef170cd08"
+dependencies = [
+ "num-traits",
+ "pxfm",
+]
[[package]]
name = "naga"
@@ -3098,11 +3555,11 @@ checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632"
dependencies = [
"arrayvec 0.7.6",
"bit-set",
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"cfg_aliases",
"codespan-reporting",
"half",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"hexf-parse",
"indexmap",
"log",
@@ -3111,7 +3568,7 @@ dependencies = [
"rustc-hash",
"spirv",
"strum 0.26.3",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
"unicode-ident",
]
@@ -3139,9 +3596,24 @@ checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
+[[package]]
+name = "nb"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f"
+dependencies = [
+ "nb 1.1.0",
+]
+
+[[package]]
+name = "nb"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d"
+
[[package]]
name = "ndarray"
version = "0.16.1"
@@ -3212,12 +3684,11 @@ dependencies = [
[[package]]
name = "nu-ansi-term"
-version = "0.46.0"
+version = "0.50.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399"
dependencies = [
- "overload",
- "winapi",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -3268,7 +3739,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -3318,29 +3789,30 @@ version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
dependencies = [
- "hermit-abi 0.5.2",
+ "hermit-abi",
"libc",
]
[[package]]
name = "num_enum"
-version = "0.7.3"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179"
+checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a"
dependencies = [
"num_enum_derive",
+ "rustversion",
]
[[package]]
name = "num_enum_derive"
-version = "0.7.3"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
+checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -3354,11 +3826,11 @@ dependencies = [
[[package]]
name = "nvml-wrapper"
-version = "0.10.0"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c9bff0aa1d48904a1385ea2a8b97576fbdcbc9a3cfccd0d31fe978e1c4038c5"
+checksum = "0d5c6c0ef9702176a570f06ad94f3198bc29c524c8b498f1b9346e1b1bdcbb3a"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"libloading",
"nvml-wrapper-sys",
"static_assertions",
@@ -3368,9 +3840,9 @@ dependencies = [
[[package]]
name = "nvml-wrapper-sys"
-version = "0.8.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "698d45156f28781a4e79652b6ebe2eaa0589057d588d3aec1333f6466f13fcb5"
+checksum = "dd23dbe2eb8d8335d2bce0299e0a07d6a63c089243d626ca75b770a962ff49e6"
dependencies = [
"libloading",
]
@@ -3384,6 +3856,25 @@ dependencies = [
"malloc_buf",
]
+[[package]]
+name = "objc2-core-foundation"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
+dependencies = [
+ "bitflags 2.9.4",
+]
+
+[[package]]
+name = "objc2-io-kit"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a"
+dependencies = [
+ "libc",
+ "objc2-core-foundation",
+]
+
[[package]]
name = "object"
version = "0.36.7"
@@ -3406,10 +3897,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
-name = "opaque-debug"
-version = "0.3.0"
+name = "once_cell_polyfill"
+version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "option-ext"
@@ -3437,12 +3934,6 @@ dependencies = [
"serde",
]
-[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
[[package]]
name = "parking"
version = "2.2.1"
@@ -3451,9 +3942,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
[[package]]
name = "parking_lot"
-version = "0.12.1"
+version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -3461,15 +3952,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -3503,9 +3994,9 @@ dependencies = [
[[package]]
name = "percent-encoding"
-version = "2.3.1"
+version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pico-args"
@@ -3533,11 +4024,11 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "png"
-version = "0.17.16"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
+checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.9.4",
"crc32fast",
"fdeflate",
"flate2",
@@ -3573,6 +4064,15 @@ dependencies = [
"portable-atomic",
]
+[[package]]
+name = "potential_utf"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
+dependencies = [
+ "zerovec",
+]
+
[[package]]
name = "powerfmt"
version = "0.2.0"
@@ -3581,9 +4081,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+dependencies = [
+ "zerocopy",
+]
[[package]]
name = "presser"
@@ -3593,9 +4096,9 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa"
[[package]]
name = "pretty_assertions"
-version = "1.4.0"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
+checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d"
dependencies = [
"diff",
"yansi",
@@ -3603,12 +4106,12 @@ dependencies = [
[[package]]
name = "prettyplease"
-version = "0.2.35"
+version = "0.2.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a"
+checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -3646,9 +4149,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.95"
+version = "1.0.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
dependencies = [
"unicode-ident",
]
@@ -3669,7 +4172,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b"
dependencies = [
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -3698,6 +4201,15 @@ dependencies = [
"version_check",
]
+[[package]]
+name = "pxfm"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "376f733579ac4d3b9fbf0afca99bf8f6b698d541118affca554d0b86f73c2470"
+dependencies = [
+ "num-traits",
+]
+
[[package]]
name = "qoi"
version = "0.4.1"
@@ -3741,9 +4253,9 @@ dependencies = [
[[package]]
name = "r2d2_sqlite"
-version = "0.27.0"
+version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "180da684f0a188977d3968f139eb44260192ef8d9a5b7b7cbd01d881e0353179"
+checksum = "63417e83dc891797eea3ad379f52a5986da4bca0d6ef28baf4d14034dd111b0c"
dependencies = [
"r2d2",
"rusqlite",
@@ -3776,9 +4288,9 @@ dependencies = [
[[package]]
name = "rand"
-version = "0.9.1"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
+checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.3",
@@ -3846,7 +4358,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463"
dependencies = [
"num-traits",
- "rand 0.9.1",
+ "rand 0.9.2",
]
[[package]]
@@ -3891,34 +4403,13 @@ version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde"
-[[package]]
-name = "ratatui"
-version = "0.28.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d"
-dependencies = [
- "bitflags 2.9.1",
- "cassowary",
- "compact_str",
- "crossterm",
- "instability",
- "itertools 0.13.0",
- "lru",
- "paste",
- "strum 0.26.3",
- "strum_macros 0.26.4",
- "unicode-segmentation",
- "unicode-truncate",
- "unicode-width 0.1.14",
-]
-
[[package]]
name = "ratatui"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"cassowary",
"compact_str",
"crossterm",
@@ -3995,11 +4486,11 @@ dependencies = [
[[package]]
name = "raw-cpuid"
-version = "11.5.0"
+version = "11.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146"
+checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
]
[[package]]
@@ -4016,9 +4507,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
[[package]]
name = "rayon"
-version = "1.10.0"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
+checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
dependencies = [
"either",
"rayon-core",
@@ -4026,9 +4517,9 @@ dependencies = [
[[package]]
name = "rayon-core"
-version = "1.12.1"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
+checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
@@ -4042,40 +4533,29 @@ checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430"
[[package]]
name = "redox_syscall"
-version = "0.4.1"
+version = "0.5.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.9.4",
]
[[package]]
name = "redox_users"
-version = "0.4.6"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
+checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
dependencies = [
"getrandom 0.2.16",
"libredox",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "redox_users"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b"
-dependencies = [
- "getrandom 0.2.16",
- "libredox",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
]
[[package]]
name = "regex"
-version = "1.11.1"
+version = "1.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
+checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
dependencies = [
"aho-corasick",
"memchr",
@@ -4085,9 +4565,9 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.9"
+version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
+checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
dependencies = [
"aho-corasick",
"memchr",
@@ -4096,9 +4576,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.8.5"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
+checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
[[package]]
name = "relative-path"
@@ -4136,9 +4616,9 @@ dependencies = [
[[package]]
name = "rgb"
-version = "0.8.50"
+version = "0.8.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
+checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"
[[package]]
name = "ring"
@@ -4208,17 +4688,17 @@ dependencies = [
"regex",
"relative-path",
"rustc_version",
- "syn 2.0.104",
+ "syn 2.0.106",
"unicode-ident",
]
[[package]]
name = "rusqlite"
-version = "0.34.0"
+version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37e34486da88d8e051c7c0e23c3f15fd806ea8546260aa2fec247e97242ec143"
+checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"fallible-iterator",
"fallible-streaming-iterator",
"hashlink",
@@ -4249,37 +4729,38 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.37"
+version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
+checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"errno",
"libc",
- "linux-raw-sys 0.4.14",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "rustix"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
-dependencies = [
- "bitflags 2.9.1",
- "errno",
- "libc",
- "linux-raw-sys 0.9.4",
+ "linux-raw-sys 0.4.15",
"windows-sys 0.59.0",
]
[[package]]
-name = "rustls"
-version = "0.22.4"
+name = "rustix"
+version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432"
+checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
+dependencies = [
+ "bitflags 2.9.4",
+ "errno",
+ "libc",
+ "linux-raw-sys 0.9.4",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "rustls"
+version = "0.23.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc"
dependencies = [
"log",
+ "once_cell",
"ring",
"rustls-pki-types",
"rustls-webpki",
@@ -4298,9 +4779,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
-version = "0.102.8"
+version = "0.103.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
+checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
dependencies = [
"ring",
"rustls-pki-types",
@@ -4309,15 +4790,15 @@ dependencies = [
[[package]]
name = "rustversion"
-version = "1.0.14"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
-version = "1.0.15"
+version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "safe_arch"
@@ -4357,16 +4838,6 @@ dependencies = [
"winapi-util",
]
-[[package]]
-name = "sanitize-filename"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603"
-dependencies = [
- "lazy_static",
- "regex",
-]
-
[[package]]
name = "sanitize-filename"
version = "0.6.0"
@@ -4454,14 +4925,14 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
name = "serde_json"
-version = "1.0.140"
+version = "1.0.143"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a"
dependencies = [
"itoa",
"memchr",
@@ -4470,10 +4941,20 @@ dependencies = [
]
[[package]]
-name = "serde_rusqlite"
-version = "0.38.0"
+name = "serde_path_to_error"
+version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e77d42c863496aee3253704aa621691088f718cd8800bd50bcdc19f9bd2a8ea"
+checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
+dependencies = [
+ "itoa",
+ "serde",
+]
+
+[[package]]
+name = "serde_rusqlite"
+version = "0.40.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32d9325839c0a5dc4820323190bff9bba33f57362cb5591fa30db66cb56874b2"
dependencies = [
"rusqlite",
"serde",
@@ -4488,6 +4969,27 @@ dependencies = [
"serde",
]
+[[package]]
+name = "serde_spanned"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
[[package]]
name = "sha1"
version = "0.10.6"
@@ -4527,9 +5029,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook"
-version = "0.3.17"
+version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
dependencies = [
"libc",
"signal-hook-registry",
@@ -4548,18 +5050,18 @@ dependencies = [
[[package]]
name = "signal-hook-registry"
-version = "1.4.5"
+version = "1.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
+checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
dependencies = [
"libc",
]
[[package]]
name = "simba"
-version = "0.9.0"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa"
+checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95"
dependencies = [
"approx",
"num-complex",
@@ -4585,9 +5087,9 @@ dependencies = [
[[package]]
name = "slab"
-version = "0.4.10"
+version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
+checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
[[package]]
name = "slotmap"
@@ -4600,18 +5102,18 @@ dependencies = [
[[package]]
name = "smallvec"
-version = "1.11.1"
+version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
-name = "spin"
-version = "0.9.8"
+name = "socket2"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
dependencies = [
- "lock_api",
- "portable-atomic",
+ "libc",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -4630,7 +5132,7 @@ version = "0.3.0+sdk-1.3.268.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
]
[[package]]
@@ -4680,11 +5182,11 @@ dependencies = [
[[package]]
name = "strum"
-version = "0.27.1"
+version = "0.27.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32"
+checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
dependencies = [
- "strum_macros 0.27.1",
+ "strum_macros 0.27.2",
]
[[package]]
@@ -4697,27 +5199,26 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
name = "strum_macros"
-version = "0.27.1"
+version = "0.27.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8"
+checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
dependencies = [
"heck",
"proc-macro2",
"quote",
- "rustversion",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
name = "subtle"
-version = "2.5.0"
+version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "syn"
@@ -4732,15 +5233,21 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.104"
+version = "2.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
+checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
+[[package]]
+name = "sync_wrapper"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+
[[package]]
name = "synstructure"
version = "0.12.6"
@@ -4761,7 +5268,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -4770,7 +5277,7 @@ version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"byteorder",
"enum-as-inner",
"libc",
@@ -4784,7 +5291,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"byteorder",
"enum-as-inner",
"libc",
@@ -4794,16 +5301,16 @@ dependencies = [
[[package]]
name = "sysinfo"
-version = "0.33.1"
+version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
+checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
dependencies = [
- "core-foundation-sys",
"libc",
"memchr",
"ntapi",
- "rayon",
- "windows 0.57.0",
+ "objc2-core-foundation",
+ "objc2-io-kit",
+ "windows 0.61.3",
]
[[package]]
@@ -4815,15 +5322,15 @@ dependencies = [
"cfg-expr",
"heck",
"pkg-config",
- "toml",
+ "toml 0.8.23",
"version-compare 0.2.0",
]
[[package]]
name = "systemstat"
-version = "0.2.4"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "668a4db78b439df482c238f559e4ea869017f9e62ef0a059c8bfcd841a4df544"
+checksum = "5021f5184d44b26fb184acd689671bbe1e4bbd24bbdaa6bc7ec383fad32d2033"
dependencies = [
"bytesize",
"lazy_static",
@@ -4858,15 +5365,15 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.20.0"
+version = "3.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
+checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e"
dependencies = [
"fastrand",
"getrandom 0.3.3",
"once_cell",
- "rustix 1.0.7",
- "windows-sys 0.59.0",
+ "rustix 1.0.8",
+ "windows-sys 0.60.2",
]
[[package]]
@@ -4900,11 +5407,11 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "2.0.12"
+version = "2.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
+checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
dependencies = [
- "thiserror-impl 2.0.12",
+ "thiserror-impl 2.0.16",
]
[[package]]
@@ -4915,18 +5422,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
name = "thiserror-impl"
-version = "2.0.12"
+version = "2.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
+checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -4949,23 +5456,25 @@ dependencies = [
[[package]]
name = "tiff"
-version = "0.9.1"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
+checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f"
dependencies = [
+ "fax",
"flate2",
- "jpeg-decoder",
+ "half",
+ "quick-error",
"weezl",
+ "zune-jpeg",
]
[[package]]
name = "time"
-version = "0.3.41"
+version = "0.3.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
+checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031"
dependencies = [
"deranged",
- "itoa",
"libc",
"num-conv",
"num_threads",
@@ -4977,25 +5486,35 @@ dependencies = [
[[package]]
name = "time-core"
-version = "0.1.4"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
+checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b"
[[package]]
name = "time-macros"
-version = "0.2.22"
+version = "0.2.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
+checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3"
dependencies = [
"num-conv",
"time-core",
]
[[package]]
-name = "tinyvec"
-version = "1.9.0"
+name = "tinystr"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71"
+checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
dependencies = [
"tinyvec_macros",
]
@@ -5006,6 +5525,59 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+[[package]]
+name = "tokio"
+version = "1.47.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "io-uring",
+ "libc",
+ "mio",
+ "pin-project-lite",
+ "slab",
+ "socket2",
+ "tokio-macros",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "tokio-tungstenite"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084"
+dependencies = [
+ "futures-util",
+ "log",
+ "tokio",
+ "tungstenite 0.26.2",
+]
+
+[[package]]
+name = "tokio-tungstenite"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1"
+dependencies = [
+ "futures-util",
+ "log",
+ "tokio",
+ "tungstenite 0.27.0",
+]
+
[[package]]
name = "toml"
version = "0.8.23"
@@ -5013,11 +5585,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
dependencies = [
"serde",
- "serde_spanned",
- "toml_datetime",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.11",
"toml_edit",
]
+[[package]]
+name = "toml"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned 1.0.0",
+ "toml_datetime 0.7.0",
+ "toml_parser",
+ "toml_writer",
+ "winnow",
+]
+
[[package]]
name = "toml_datetime"
version = "0.6.11"
@@ -5027,6 +5614,15 @@ dependencies = [
"serde",
]
+[[package]]
+name = "toml_datetime"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3"
+dependencies = [
+ "serde",
+]
+
[[package]]
name = "toml_edit"
version = "0.22.27"
@@ -5035,18 +5631,33 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
dependencies = [
"indexmap",
"serde",
- "serde_spanned",
- "toml_datetime",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.11",
"toml_write",
"winnow",
]
+[[package]]
+name = "toml_parser"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10"
+dependencies = [
+ "winnow",
+]
+
[[package]]
name = "toml_write"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
+[[package]]
+name = "toml_writer"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64"
+
[[package]]
name = "torch-sys"
version = "0.19.0"
@@ -5062,12 +5673,41 @@ dependencies = [
"zip 0.6.6",
]
+[[package]]
+name = "tower"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project-lite",
+ "sync_wrapper",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+
+[[package]]
+name = "tower-service"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+
[[package]]
name = "tracing"
version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
dependencies = [
+ "log",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
@@ -5093,7 +5733,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -5119,9 +5759,9 @@ dependencies = [
[[package]]
name = "tracing-subscriber"
-version = "0.3.19"
+version = "0.3.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
+checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5"
dependencies = [
"nu-ansi-term",
"sharded-slab",
@@ -5133,31 +5773,53 @@ dependencies = [
[[package]]
name = "transpose"
-version = "0.2.2"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6522d49d03727ffb138ae4cbc1283d3774f0d10aa7f9bf52e6784c45daf9b23"
+checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e"
dependencies = [
"num-integer",
"strength_reduce",
]
[[package]]
-name = "trictrac-server"
-version = "0.1.0"
+name = "tungstenite"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13"
dependencies = [
- "bincode 1.3.3",
- "env_logger 0.10.0",
+ "bytes",
+ "data-encoding",
+ "http",
+ "httparse",
"log",
- "pico-args",
- "renet",
- "store",
+ "rand 0.9.2",
+ "sha1",
+ "thiserror 2.0.16",
+ "utf-8",
+]
+
+[[package]]
+name = "tungstenite"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d"
+dependencies = [
+ "bytes",
+ "data-encoding",
+ "http",
+ "httparse",
+ "log",
+ "rand 0.9.2",
+ "sha1",
+ "thiserror 2.0.16",
+ "utf-8",
]
[[package]]
name = "typenum"
-version = "1.17.0"
+version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]]
name = "ug"
@@ -5177,15 +5839,9 @@ dependencies = [
"serde",
"thiserror 1.0.69",
"tracing",
- "yoke",
+ "yoke 0.7.5",
]
-[[package]]
-name = "unicode-bidi"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
-
[[package]]
name = "unicode-ident"
version = "1.0.18"
@@ -5203,9 +5859,9 @@ dependencies = [
[[package]]
name = "unicode-segmentation"
-version = "1.10.1"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
[[package]]
name = "unicode-truncate"
@@ -5260,9 +5916,9 @@ checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae"
[[package]]
name = "ureq"
-version = "2.9.7"
+version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd"
+checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d"
dependencies = [
"base64 0.22.1",
"flate2",
@@ -5270,7 +5926,6 @@ dependencies = [
"once_cell",
"rustls",
"rustls-pki-types",
- "rustls-webpki",
"serde",
"serde_json",
"url",
@@ -5279,15 +5934,28 @@ dependencies = [
[[package]]
name = "url"
-version = "2.5.2"
+version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
+checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
+ "serde",
]
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "utf8_iter"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
[[package]]
name = "utf8parse"
version = "0.2.2"
@@ -5296,13 +5964,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
-version = "1.17.0"
+version = "1.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
+checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
dependencies = [
"getrandom 0.3.3",
"js-sys",
- "rand 0.9.1",
+ "rand 0.9.2",
"wasm-bindgen",
]
@@ -5331,7 +5999,7 @@ checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -5358,6 +6026,12 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+
[[package]]
name = "walkdir"
version = "2.5.0"
@@ -5370,50 +6044,51 @@ dependencies = [
[[package]]
name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
+version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasi"
-version = "0.14.2+wasi-0.2.4"
+version = "0.14.3+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
+checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95"
dependencies = [
- "wit-bindgen-rt",
+ "wit-bindgen",
]
[[package]]
name = "wasm-bindgen"
-version = "0.2.100"
+version = "0.2.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
+ "wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.100"
+version = "0.2.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.50"
+version = "0.4.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
+checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe"
dependencies = [
"cfg-if",
"js-sys",
@@ -5424,9 +6099,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.100"
+version = "0.2.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -5434,31 +6109,31 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.100"
+version = "0.2.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.100"
+version = "0.2.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1"
dependencies = [
"unicode-ident",
]
[[package]]
name = "web-sys"
-version = "0.3.77"
+version = "0.3.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
+checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -5480,14 +6155,14 @@ version = "0.26.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
dependencies = [
- "webpki-roots 1.0.1",
+ "webpki-roots 1.0.2",
]
[[package]]
name = "webpki-roots"
-version = "1.0.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502"
+checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2"
dependencies = [
"rustls-pki-types",
]
@@ -5505,10 +6180,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9"
dependencies = [
"arrayvec 0.7.6",
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"cfg_aliases",
"document-features",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"js-sys",
"log",
"naga",
@@ -5535,10 +6210,10 @@ dependencies = [
"arrayvec 0.7.6",
"bit-set",
"bit-vec",
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"cfg_aliases",
"document-features",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"indexmap",
"log",
"naga",
@@ -5549,7 +6224,7 @@ dependencies = [
"raw-window-handle",
"rustc-hash",
"smallvec",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
"wgpu-core-deps-apple",
"wgpu-core-deps-emscripten",
"wgpu-core-deps-windows-linux-android",
@@ -5594,7 +6269,7 @@ dependencies = [
"arrayvec 0.7.6",
"ash",
"bit-set",
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"block",
"bytemuck",
"cfg-if",
@@ -5605,7 +6280,7 @@ dependencies = [
"gpu-alloc",
"gpu-allocator",
"gpu-descriptor",
- "hashbrown 0.15.4",
+ "hashbrown 0.15.5",
"js-sys",
"khronos-egl",
"libc",
@@ -5623,7 +6298,7 @@ dependencies = [
"raw-window-handle",
"renderdoc-sys",
"smallvec",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
"wasm-bindgen",
"web-sys",
"wgpu-types",
@@ -5637,11 +6312,11 @@ version = "25.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc"
dependencies = [
- "bitflags 2.9.1",
+ "bitflags 2.9.4",
"bytemuck",
"js-sys",
"log",
- "thiserror 2.0.12",
+ "thiserror 2.0.16",
"web-sys",
]
@@ -5673,11 +6348,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.6"
+version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22"
dependencies = [
- "winapi",
+ "windows-sys 0.60.2",
]
[[package]]
@@ -5686,16 +6361,6 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-[[package]]
-name = "windows"
-version = "0.57.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
-dependencies = [
- "windows-core 0.57.0",
- "windows-targets 0.52.6",
-]
-
[[package]]
name = "windows"
version = "0.58.0"
@@ -5707,15 +6372,25 @@ dependencies = [
]
[[package]]
-name = "windows-core"
-version = "0.57.0"
+name = "windows"
+version = "0.61.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
+checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
dependencies = [
- "windows-implement 0.57.0",
- "windows-interface 0.57.0",
- "windows-result 0.1.2",
- "windows-targets 0.52.6",
+ "windows-collections",
+ "windows-core 0.61.2",
+ "windows-future",
+ "windows-link 0.1.3",
+ "windows-numerics",
+]
+
+[[package]]
+name = "windows-collections"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
+dependencies = [
+ "windows-core 0.61.2",
]
[[package]]
@@ -5727,19 +6402,32 @@ dependencies = [
"windows-implement 0.58.0",
"windows-interface 0.58.0",
"windows-result 0.2.0",
- "windows-strings",
+ "windows-strings 0.1.0",
"windows-targets 0.52.6",
]
[[package]]
-name = "windows-implement"
-version = "0.57.0"
+name = "windows-core"
+version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
+checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.104",
+ "windows-implement 0.60.0",
+ "windows-interface 0.59.1",
+ "windows-link 0.1.3",
+ "windows-result 0.3.4",
+ "windows-strings 0.4.2",
+]
+
+[[package]]
+name = "windows-future"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
+dependencies = [
+ "windows-core 0.61.2",
+ "windows-link 0.1.3",
+ "windows-threading",
]
[[package]]
@@ -5750,18 +6438,18 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
-name = "windows-interface"
-version = "0.57.0"
+name = "windows-implement"
+version = "0.60.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
+checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -5772,16 +6460,40 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
-name = "windows-result"
-version = "0.1.2"
+name = "windows-interface"
+version = "0.59.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
+checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
dependencies = [
- "windows-targets 0.52.6",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
+
+[[package]]
+name = "windows-link"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
+
+[[package]]
+name = "windows-link"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65"
+
+[[package]]
+name = "windows-numerics"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
+dependencies = [
+ "windows-core 0.61.2",
+ "windows-link 0.1.3",
]
[[package]]
@@ -5793,6 +6505,15 @@ dependencies = [
"windows-targets 0.52.6",
]
+[[package]]
+name = "windows-result"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
+dependencies = [
+ "windows-link 0.1.3",
+]
+
[[package]]
name = "windows-strings"
version = "0.1.0"
@@ -5804,12 +6525,12 @@ dependencies = [
]
[[package]]
-name = "windows-sys"
-version = "0.48.0"
+name = "windows-strings"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
dependencies = [
- "windows-targets 0.48.5",
+ "windows-link 0.1.3",
]
[[package]]
@@ -5831,18 +6552,21 @@ dependencies = [
]
[[package]]
-name = "windows-targets"
-version = "0.48.5"
+name = "windows-sys"
+version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
+ "windows-targets 0.53.3",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.61.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa"
+dependencies = [
+ "windows-link 0.2.0",
]
[[package]]
@@ -5854,7 +6578,7 @@ dependencies = [
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm",
+ "windows_i686_gnullvm 0.52.6",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
@@ -5862,10 +6586,30 @@ dependencies = [
]
[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
+name = "windows-targets"
+version = "0.53.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91"
+dependencies = [
+ "windows-link 0.1.3",
+ "windows_aarch64_gnullvm 0.53.0",
+ "windows_aarch64_msvc 0.53.0",
+ "windows_i686_gnu 0.53.0",
+ "windows_i686_gnullvm 0.53.0",
+ "windows_i686_msvc 0.53.0",
+ "windows_x86_64_gnu 0.53.0",
+ "windows_x86_64_gnullvm 0.53.0",
+ "windows_x86_64_msvc 0.53.0",
+]
+
+[[package]]
+name = "windows-threading"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
+dependencies = [
+ "windows-link 0.1.3",
+]
[[package]]
name = "windows_aarch64_gnullvm"
@@ -5874,10 +6618,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
+name = "windows_aarch64_gnullvm"
+version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
[[package]]
name = "windows_aarch64_msvc"
@@ -5886,10 +6630,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
+name = "windows_aarch64_msvc"
+version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
[[package]]
name = "windows_i686_gnu"
@@ -5897,6 +6641,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+[[package]]
+name = "windows_i686_gnu"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
+
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
@@ -5904,10 +6654,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
+name = "windows_i686_gnullvm"
+version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
[[package]]
name = "windows_i686_msvc"
@@ -5916,10 +6666,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
+name = "windows_i686_msvc"
+version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
[[package]]
name = "windows_x86_64_gnu"
@@ -5928,10 +6678,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
+name = "windows_x86_64_gnu"
+version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
[[package]]
name = "windows_x86_64_gnullvm"
@@ -5940,10 +6690,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
+name = "windows_x86_64_gnullvm"
+version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
[[package]]
name = "windows_x86_64_msvc"
@@ -5952,22 +6702,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
-name = "winnow"
-version = "0.7.11"
+name = "windows_x86_64_msvc"
+version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd"
+checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
+
+[[package]]
+name = "winnow"
+version = "0.7.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
dependencies = [
"memchr",
]
[[package]]
-name = "wit-bindgen-rt"
-version = "0.39.0"
+name = "wit-bindgen"
+version = "0.45.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
-dependencies = [
- "bitflags 2.9.1",
-]
+checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36"
[[package]]
name = "wrapcenum-derive"
@@ -5975,23 +6728,29 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76ff259533532054cfbaefb115c613203c73707017459206380f03b3b3f266e"
dependencies = [
- "darling",
+ "darling 0.20.11",
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
-name = "xml-rs"
-version = "0.8.26"
+name = "writeable"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda"
+checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
+
+[[package]]
+name = "xml-rs"
+version = "0.8.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7"
[[package]]
name = "yansi"
-version = "0.5.1"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
+checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
[[package]]
name = "yoke"
@@ -6001,7 +6760,19 @@ checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
dependencies = [
"serde",
"stable_deref_trait",
- "yoke-derive",
+ "yoke-derive 0.7.5",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
+dependencies = [
+ "serde",
+ "stable_deref_trait",
+ "yoke-derive 0.8.0",
"zerofrom",
]
@@ -6013,7 +6784,19 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
+ "synstructure 0.13.2",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
"synstructure 0.13.2",
]
@@ -6034,7 +6817,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
]
[[package]]
@@ -6054,15 +6837,48 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.104",
+ "syn 2.0.106",
"synstructure 0.13.2",
]
[[package]]
name = "zeroize"
-version = "1.6.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+
+[[package]]
+name = "zerotrie"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
+dependencies = [
+ "displaydoc",
+ "yoke 0.8.0",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
+dependencies = [
+ "yoke 0.8.0",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.106",
+]
[[package]]
name = "zip"
@@ -6120,9 +6936,9 @@ dependencies = [
[[package]]
name = "zstd-sys"
-version = "2.0.15+zstd.1.5.7"
+version = "2.0.16+zstd.1.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237"
+checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748"
dependencies = [
"cc",
"pkg-config",
@@ -6145,9 +6961,9 @@ dependencies = [
[[package]]
name = "zune-jpeg"
-version = "0.4.18"
+version = "0.4.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa"
+checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713"
dependencies = [
"zune-core",
]
diff --git a/Cargo.toml b/Cargo.toml
index 6068644..b9e6d45 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,4 +1,4 @@
[workspace]
resolver = "2"
-members = ["client_tui", "client_cli", "bot", "server", "store"]
+members = ["client_cli", "bot", "store"]
diff --git a/README.md b/README.md
index d2808fa..e5a0f39 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,41 @@
# Trictrac
-Game of [Trictrac](https://en.wikipedia.org/wiki/Trictrac) in rust.
+This is a game of [Trictrac](https://en.wikipedia.org/wiki/Trictrac) rust implementation.
-wip
+The project is on its early stages.
+Rules (without "schools") are implemented, as well as a rudimentary terminal interface which allow you to play against a bot which plays randomly.
+Training of AI bots is the work in progress.
+## Usage
+
+`cargo run --bin=client_cli -- --bot random`
+
+## Roadmap
+
+- [x] rules
+- [x] command line interface
+- [x] basic bot (random play)
+- [ ] AI bot
+- [ ] network game
+- [ ] web client
+
+## Code structure
+
+- game rules and game state are implemented in the _store/_ folder.
+- the command-line application is implemented in _client_cli/_; it allows you to play against a bot, or to have two bots play against each other
+- the bots algorithms and the training of their models are implemented in the _bot/_ folder
+
+### _store_ package
+
+The game state is defined by the `GameState` struct in _store/src/game.rs_. The `to_string_id()` method allows this state to be encoded compactly in a string (without the played moves history). For a more readable textual representation, the `fmt::Display` trait is implemented.
+
+### _client_cli_ package
+
+`client_cli/src/game_runner.rs` contains the logic to make two bots play against each other.
+
+### _bot_ package
+
+- `bot/src/strategy/default.rs` contains the code for a basic bot strategy: it determines the list of valid moves (using the `get_possible_moves_sequences` method of `store::MoveRules`) and simply executes the first move in the list.
+- `bot/src/strategy/dqnburn.rs` is another bot strategy that uses a reinforcement learning trained model with the DQN algorithm via the burn library ().
+- `bot/scripts/trains.sh` allows you to train agents using different algorithms (DQN, PPO, SAC).
diff --git a/bot/Cargo.toml b/bot/Cargo.toml
index 21e0128..fa782fd 100644
--- a/bot/Cargo.toml
+++ b/bot/Cargo.toml
@@ -9,10 +9,6 @@ edition = "2021"
name = "burn_train"
path = "src/burnrl/main.rs"
-[[bin]]
-name = "train_dqn_simple"
-path = "src/dqn_simple/main.rs"
-
[dependencies]
pretty_assertions = "1.4.0"
serde = { version = "1.0", features = ["derive"] }
@@ -20,7 +16,7 @@ serde_json = "1.0"
store = { path = "../store" }
rand = "0.8"
env_logger = "0.10"
-burn = { version = "0.17", features = ["ndarray", "autodiff"] }
+burn = { version = "0.18", features = ["ndarray", "autodiff"] }
burn-rl = { git = "https://github.com/yunjhongwu/burn-rl-examples.git", package = "burn-rl" }
log = "0.4.20"
confy = "1.0.0"
diff --git a/bot/src/burnrl/algos/dqn_big.rs b/bot/src/burnrl/algos/dqn_big.rs
deleted file mode 100644
index 7e8951f..0000000
--- a/bot/src/burnrl/algos/dqn_big.rs
+++ /dev/null
@@ -1,194 +0,0 @@
-use crate::burnrl::environment_big::TrictracEnvironment;
-use crate::burnrl::utils::{soft_update_linear, Config};
-use burn::backend::{ndarray::NdArrayDevice, NdArray};
-use burn::module::Module;
-use burn::nn::{Linear, LinearConfig};
-use burn::optim::AdamWConfig;
-use burn::record::{CompactRecorder, Recorder};
-use burn::tensor::activation::relu;
-use burn::tensor::backend::{AutodiffBackend, Backend};
-use burn::tensor::Tensor;
-use burn_rl::agent::DQN;
-use burn_rl::agent::{DQNModel, DQNTrainingConfig};
-use burn_rl::base::{Action, Agent, ElemType, Environment, Memory, Model, State};
-use std::time::SystemTime;
-
-#[derive(Module, Debug)]
-pub struct Net {
- linear_0: Linear,
- linear_1: Linear,
- linear_2: Linear,
-}
-
-impl Net {
- #[allow(unused)]
- pub fn new(input_size: usize, dense_size: usize, output_size: usize) -> Self {
- Self {
- linear_0: LinearConfig::new(input_size, dense_size).init(&Default::default()),
- linear_1: LinearConfig::new(dense_size, dense_size).init(&Default::default()),
- linear_2: LinearConfig::new(dense_size, output_size).init(&Default::default()),
- }
- }
-
- fn consume(self) -> (Linear, Linear, Linear) {
- (self.linear_0, self.linear_1, self.linear_2)
- }
-}
-
-impl Model, Tensor> for Net {
- fn forward(&self, input: Tensor) -> Tensor {
- let layer_0_output = relu(self.linear_0.forward(input));
- let layer_1_output = relu(self.linear_1.forward(layer_0_output));
-
- relu(self.linear_2.forward(layer_1_output))
- }
-
- fn infer(&self, input: Tensor) -> Tensor {
- self.forward(input)
- }
-}
-
-impl DQNModel for Net {
- fn soft_update(this: Self, that: &Self, tau: ElemType) -> Self {
- let (linear_0, linear_1, linear_2) = this.consume();
-
- Self {
- linear_0: soft_update_linear(linear_0, &that.linear_0, tau),
- linear_1: soft_update_linear(linear_1, &that.linear_1, tau),
- linear_2: soft_update_linear(linear_2, &that.linear_2, tau),
- }
- }
-}
-
-#[allow(unused)]
-const MEMORY_SIZE: usize = 8192;
-
-type MyAgent = DQN>;
-
-#[allow(unused)]
-// pub fn run, B: AutodiffBackend>(
-pub fn run<
- E: Environment + AsMut,
- B: AutodiffBackend,
->(
- conf: &Config,
- visualized: bool,
- // ) -> DQN> {
-) -> impl Agent {
- let mut env = E::new(visualized);
- env.as_mut().max_steps = conf.max_steps;
-
- let model = Net::::new(
- <::StateType as State>::size(),
- conf.dense_size,
- <::ActionType as Action>::size(),
- );
-
- let mut agent = MyAgent::new(model);
-
- // let config = DQNTrainingConfig::default();
- let config = DQNTrainingConfig {
- gamma: conf.gamma,
- tau: conf.tau,
- learning_rate: conf.learning_rate,
- batch_size: conf.batch_size,
- clip_grad: Some(burn::grad_clipping::GradientClippingConfig::Value(
- conf.clip_grad,
- )),
- };
-
- let mut memory = Memory::::default();
-
- let mut optimizer = AdamWConfig::new()
- .with_grad_clipping(config.clip_grad.clone())
- .init();
-
- let mut policy_net = agent.model().as_ref().unwrap().clone();
-
- let mut step = 0_usize;
-
- for episode in 0..conf.num_episodes {
- let mut episode_done = false;
- let mut episode_reward: ElemType = 0.0;
- let mut episode_duration = 0_usize;
- let mut state = env.state();
- let mut now = SystemTime::now();
-
- while !episode_done {
- let eps_threshold = conf.eps_end
- + (conf.eps_start - conf.eps_end) * f64::exp(-(step as f64) / conf.eps_decay);
- let action =
- DQN::>::react_with_exploration(&policy_net, state, eps_threshold);
- let snapshot = env.step(action);
-
- episode_reward +=
- <::RewardType as Into>::into(snapshot.reward().clone());
-
- memory.push(
- state,
- *snapshot.state(),
- action,
- snapshot.reward().clone(),
- snapshot.done(),
- );
-
- if config.batch_size < memory.len() {
- policy_net =
- agent.train::(policy_net, &memory, &mut optimizer, &config);
- }
-
- step += 1;
- episode_duration += 1;
-
- if snapshot.done() || episode_duration >= conf.max_steps {
- let envmut = env.as_mut();
- let goodmoves_ratio = ((envmut.goodmoves_count as f32 / episode_duration as f32)
- * 100.0)
- .round() as u32;
- println!(
- "{{\"episode\": {episode}, \"reward\": {episode_reward:.4}, \"steps count\": {episode_duration}, \"epsilon\": {eps_threshold:.3}, \"goodmoves\": {}, \"ratio\": {}%, \"rollpoints\":{}, \"duration\": {}}}",
- envmut.goodmoves_count,
- goodmoves_ratio,
- envmut.pointrolls_count,
- now.elapsed().unwrap().as_secs(),
- );
- env.reset();
- episode_done = true;
- now = SystemTime::now();
- } else {
- state = *snapshot.state();
- }
- }
- }
- let valid_agent = agent.valid();
- if let Some(path) = &conf.save_path {
- save_model(valid_agent.model().as_ref().unwrap(), path);
- }
- valid_agent
-}
-
-pub fn save_model(model: &Net>, path: &String) {
- let recorder = CompactRecorder::new();
- let model_path = format!("{path}.mpk");
- println!("info: Modèle de validation sauvegardé : {model_path}");
- recorder
- .record(model.clone().into_record(), model_path.into())
- .unwrap();
-}
-
-pub fn load_model(dense_size: usize, path: &String) -> Option>> {
- let model_path = format!("{path}.mpk");
- // println!("Chargement du modèle depuis : {model_path}");
-
- CompactRecorder::new()
- .load(model_path.into(), &NdArrayDevice::default())
- .map(|record| {
- Net::new(
- ::StateType::size(),
- dense_size,
- ::ActionType::size(),
- )
- .load_record(record)
- })
- .ok()
-}
diff --git a/bot/src/burnrl/algos/mod.rs b/bot/src/burnrl/algos/mod.rs
index af13327..5a67dfc 100644
--- a/bot/src/burnrl/algos/mod.rs
+++ b/bot/src/burnrl/algos/mod.rs
@@ -1,9 +1,6 @@
pub mod dqn;
-pub mod dqn_big;
pub mod dqn_valid;
pub mod ppo;
-pub mod ppo_big;
pub mod ppo_valid;
pub mod sac;
-pub mod sac_big;
pub mod sac_valid;
diff --git a/bot/src/burnrl/algos/ppo_big.rs b/bot/src/burnrl/algos/ppo_big.rs
deleted file mode 100644
index ab860ee..0000000
--- a/bot/src/burnrl/algos/ppo_big.rs
+++ /dev/null
@@ -1,191 +0,0 @@
-use crate::burnrl::environment_big::TrictracEnvironment;
-use crate::burnrl::utils::Config;
-use burn::backend::{ndarray::NdArrayDevice, NdArray};
-use burn::module::Module;
-use burn::nn::{Initializer, Linear, LinearConfig};
-use burn::optim::AdamWConfig;
-use burn::record::{CompactRecorder, Recorder};
-use burn::tensor::activation::{relu, softmax};
-use burn::tensor::backend::{AutodiffBackend, Backend};
-use burn::tensor::Tensor;
-use burn_rl::agent::{PPOModel, PPOOutput, PPOTrainingConfig, PPO};
-use burn_rl::base::{Action, Agent, ElemType, Environment, Memory, Model, State};
-use std::env;
-use std::fs;
-use std::time::SystemTime;
-
-#[derive(Module, Debug)]
-pub struct Net {
- linear: Linear,
- linear_actor: Linear,
- linear_critic: Linear,
-}
-
-impl Net {
- #[allow(unused)]
- pub fn new(input_size: usize, dense_size: usize, output_size: usize) -> Self {
- let initializer = Initializer::XavierUniform { gain: 1.0 };
- Self {
- linear: LinearConfig::new(input_size, dense_size)
- .with_initializer(initializer.clone())
- .init(&Default::default()),
- linear_actor: LinearConfig::new(dense_size, output_size)
- .with_initializer(initializer.clone())
- .init(&Default::default()),
- linear_critic: LinearConfig::new(dense_size, 1)
- .with_initializer(initializer)
- .init(&Default::default()),
- }
- }
-}
-
-impl Model, PPOOutput, Tensor> for Net {
- fn forward(&self, input: Tensor) -> PPOOutput {
- let layer_0_output = relu(self.linear.forward(input));
- let policies = softmax(self.linear_actor.forward(layer_0_output.clone()), 1);
- let values = self.linear_critic.forward(layer_0_output);
-
- PPOOutput::::new(policies, values)
- }
-
- fn infer(&self, input: Tensor) -> Tensor {
- let layer_0_output = relu(self.linear.forward(input));
- softmax(self.linear_actor.forward(layer_0_output.clone()), 1)
- }
-}
-
-impl PPOModel for Net {}
-#[allow(unused)]
-const MEMORY_SIZE: usize = 512;
-
-type MyAgent = PPO>;
-
-#[allow(unused)]
-pub fn run<
- E: Environment + AsMut,
- B: AutodiffBackend,
->(
- conf: &Config,
- visualized: bool,
- // ) -> PPO> {
-) -> impl Agent {
- let mut env = E::new(visualized);
- env.as_mut().max_steps = conf.max_steps;
-
- let mut model = Net::::new(
- <::StateType as State>::size(),
- conf.dense_size,
- <::ActionType as Action>::size(),
- );
- let agent = MyAgent::default();
- let config = PPOTrainingConfig {
- gamma: conf.gamma,
- lambda: conf.lambda,
- epsilon_clip: conf.epsilon_clip,
- critic_weight: conf.critic_weight,
- entropy_weight: conf.entropy_weight,
- learning_rate: conf.learning_rate,
- epochs: conf.epochs,
- batch_size: conf.batch_size,
- clip_grad: Some(burn::grad_clipping::GradientClippingConfig::Value(
- conf.clip_grad,
- )),
- };
-
- let mut optimizer = AdamWConfig::new()
- .with_grad_clipping(config.clip_grad.clone())
- .init();
- let mut memory = Memory::::default();
- for episode in 0..conf.num_episodes {
- let mut episode_done = false;
- let mut episode_reward = 0.0;
- let mut episode_duration = 0_usize;
- let mut now = SystemTime::now();
-
- env.reset();
- while !episode_done {
- let state = env.state();
- if let Some(action) = MyAgent::::react_with_model(&state, &model) {
- let snapshot = env.step(action);
- episode_reward += <::RewardType as Into>::into(
- snapshot.reward().clone(),
- );
-
- memory.push(
- state,
- *snapshot.state(),
- action,
- snapshot.reward().clone(),
- snapshot.done(),
- );
-
- episode_duration += 1;
- episode_done = snapshot.done() || episode_duration >= conf.max_steps;
- }
- }
- println!(
- "{{\"episode\": {episode}, \"reward\": {episode_reward:.4}, \"steps count\": {episode_duration}, \"duration\": {}}}",
- now.elapsed().unwrap().as_secs(),
- );
-
- now = SystemTime::now();
- model = MyAgent::train::(model, &memory, &mut optimizer, &config);
- memory.clear();
- }
-
- if let Some(path) = &conf.save_path {
- let device = NdArrayDevice::default();
- let recorder = CompactRecorder::new();
- let tmp_path = env::temp_dir().join("tmp_model.mpk");
-
- // Save the trained model (backend B) to a temporary file
- recorder
- .record(model.clone().into_record(), tmp_path.clone())
- .expect("Failed to save temporary model");
-
- // Create a new model instance with the target backend (NdArray)
- let model_to_save: Net> = Net::new(
- <::StateType as State>::size(),
- conf.dense_size,
- <::ActionType as Action>::size(),
- );
-
- // Load the record from the temporary file into the new model
- let record = recorder
- .load(tmp_path.clone(), &device)
- .expect("Failed to load temporary model");
- let model_with_loaded_weights = model_to_save.load_record(record);
-
- // Clean up the temporary file
- fs::remove_file(tmp_path).expect("Failed to remove temporary model file");
-
- save_model(&model_with_loaded_weights, path);
- }
- agent.valid(model)
-}
-
-pub fn save_model(model: &Net>, path: &String) {
- let recorder = CompactRecorder::new();
- let model_path = format!("{path}.mpk");
- println!("info: Modèle de validation sauvegardé : {model_path}");
- recorder
- .record(model.clone().into_record(), model_path.into())
- .unwrap();
-}
-
-pub fn load_model(dense_size: usize, path: &String) -> Option>> {
- let model_path = format!("{path}.mpk");
- // println!("Chargement du modèle depuis : {model_path}");
-
- CompactRecorder::new()
- .load(model_path.into(), &NdArrayDevice::default())
- .map(|record| {
- Net::new(
- ::StateType::size(),
- dense_size,
- ::ActionType::size(),
- )
- .load_record(record)
- })
- .ok()
-}
diff --git a/bot/src/burnrl/algos/sac_big.rs b/bot/src/burnrl/algos/sac_big.rs
deleted file mode 100644
index 1361b42..0000000
--- a/bot/src/burnrl/algos/sac_big.rs
+++ /dev/null
@@ -1,222 +0,0 @@
-use crate::burnrl::environment_big::TrictracEnvironment;
-use crate::burnrl::utils::{soft_update_linear, Config};
-use burn::backend::{ndarray::NdArrayDevice, NdArray};
-use burn::module::Module;
-use burn::nn::{Linear, LinearConfig};
-use burn::optim::AdamWConfig;
-use burn::record::{CompactRecorder, Recorder};
-use burn::tensor::activation::{relu, softmax};
-use burn::tensor::backend::{AutodiffBackend, Backend};
-use burn::tensor::Tensor;
-use burn_rl::agent::{SACActor, SACCritic, SACNets, SACOptimizer, SACTrainingConfig, SAC};
-use burn_rl::base::{Action, Agent, ElemType, Environment, Memory, Model, State};
-use std::time::SystemTime;
-
-#[derive(Module, Debug)]
-pub struct Actor {
- linear_0: Linear,
- linear_1: Linear,
- linear_2: Linear,
-}
-
-impl Actor {
- pub fn new(input_size: usize, dense_size: usize, output_size: usize) -> Self {
- Self {
- linear_0: LinearConfig::new(input_size, dense_size).init(&Default::default()),
- linear_1: LinearConfig::new(dense_size, dense_size).init(&Default::default()),
- linear_2: LinearConfig::new(dense_size, output_size).init(&Default::default()),
- }
- }
-}
-
-impl Model, Tensor> for Actor {
- fn forward(&self, input: Tensor) -> Tensor {
- let layer_0_output = relu(self.linear_0.forward(input));
- let layer_1_output = relu(self.linear_1.forward(layer_0_output));
-
- softmax(self.linear_2.forward(layer_1_output), 1)
- }
-
- fn infer(&self, input: Tensor) -> Tensor {
- self.forward(input)
- }
-}
-
-impl SACActor for Actor {}
-
-#[derive(Module, Debug)]
-pub struct Critic {
- linear_0: Linear,
- linear_1: Linear,
- linear_2: Linear,
-}
-
-impl Critic {
- pub fn new(input_size: usize, dense_size: usize, output_size: usize) -> Self {
- Self {
- linear_0: LinearConfig::new(input_size, dense_size).init(&Default::default()),
- linear_1: LinearConfig::new(dense_size, dense_size).init(&Default::default()),
- linear_2: LinearConfig::new(dense_size, output_size).init(&Default::default()),
- }
- }
-
- fn consume(self) -> (Linear, Linear, Linear) {
- (self.linear_0, self.linear_1, self.linear_2)
- }
-}
-
-impl Model, Tensor> for Critic {
- fn forward(&self, input: Tensor) -> Tensor {
- let layer_0_output = relu(self.linear_0.forward(input));
- let layer_1_output = relu(self.linear_1.forward(layer_0_output));
-
- self.linear_2.forward(layer_1_output)
- }
-
- fn infer(&self, input: Tensor) -> Tensor {
- self.forward(input)
- }
-}
-
-impl SACCritic for Critic {
- fn soft_update(this: Self, that: &Self, tau: ElemType) -> Self {
- let (linear_0, linear_1, linear_2) = this.consume();
-
- Self {
- linear_0: soft_update_linear(linear_0, &that.linear_0, tau),
- linear_1: soft_update_linear(linear_1, &that.linear_1, tau),
- linear_2: soft_update_linear(linear_2, &that.linear_2, tau),
- }
- }
-}
-
-#[allow(unused)]
-const MEMORY_SIZE: usize = 4096;
-
-type MyAgent = SAC>;
-
-#[allow(unused)]
-pub fn run<
- E: Environment + AsMut,
- B: AutodiffBackend,
->(
- conf: &Config,
- visualized: bool,
-) -> impl Agent {
- let mut env = E::new(visualized);
- env.as_mut().max_steps = conf.max_steps;
- let state_dim = <::StateType as State>::size();
- let action_dim = <::ActionType as Action>::size();
-
- let actor = Actor::::new(state_dim, conf.dense_size, action_dim);
- let critic_1 = Critic::::new(state_dim, conf.dense_size, action_dim);
- let critic_2 = Critic::::new(state_dim, conf.dense_size, action_dim);
- let mut nets = SACNets::, Critic>::new(actor, critic_1, critic_2);
-
- let mut agent = MyAgent::default();
-
- let config = SACTrainingConfig {
- gamma: conf.gamma,
- tau: conf.tau,
- learning_rate: conf.learning_rate,
- min_probability: conf.min_probability,
- batch_size: conf.batch_size,
- clip_grad: Some(burn::grad_clipping::GradientClippingConfig::Value(
- conf.clip_grad,
- )),
- };
-
- let mut memory = Memory::::default();
-
- let optimizer_config = AdamWConfig::new().with_grad_clipping(config.clip_grad.clone());
-
- let mut optimizer = SACOptimizer::new(
- optimizer_config.clone().init(),
- optimizer_config.clone().init(),
- optimizer_config.clone().init(),
- optimizer_config.init(),
- );
-
- let mut step = 0_usize;
-
- for episode in 0..conf.num_episodes {
- let mut episode_done = false;
- let mut episode_reward = 0.0;
- let mut episode_duration = 0_usize;
- let mut state = env.state();
- let mut now = SystemTime::now();
-
- while !episode_done {
- if let Some(action) = MyAgent::::react_with_model(&state, &nets.actor) {
- let snapshot = env.step(action);
-
- episode_reward += <::RewardType as Into>::into(
- snapshot.reward().clone(),
- );
-
- memory.push(
- state,
- *snapshot.state(),
- action,
- snapshot.reward().clone(),
- snapshot.done(),
- );
-
- if config.batch_size < memory.len() {
- nets = agent.train::(nets, &memory, &mut optimizer, &config);
- }
-
- step += 1;
- episode_duration += 1;
-
- if snapshot.done() || episode_duration >= conf.max_steps {
- env.reset();
- episode_done = true;
-
- println!(
- "{{\"episode\": {episode}, \"reward\": {episode_reward:.4}, \"steps count\": {episode_duration}, \"duration\": {}}}",
- now.elapsed().unwrap().as_secs()
- );
- now = SystemTime::now();
- } else {
- state = *snapshot.state();
- }
- }
- }
- }
-
- let valid_agent = agent.valid(nets.actor);
- if let Some(path) = &conf.save_path {
- if let Some(model) = valid_agent.model() {
- save_model(model, path);
- }
- }
- valid_agent
-}
-
-pub fn save_model(model: &Actor>, path: &String) {
- let recorder = CompactRecorder::new();
- let model_path = format!("{path}.mpk");
- println!("info: Modèle de validation sauvegardé : {model_path}");
- recorder
- .record(model.clone().into_record(), model_path.into())
- .unwrap();
-}
-
-pub fn load_model(dense_size: usize, path: &String) -> Option>> {
- let model_path = format!("{path}.mpk");
- // println!("Chargement du modèle depuis : {model_path}");
-
- CompactRecorder::new()
- .load(model_path.into(), &NdArrayDevice::default())
- .map(|record| {
- Actor::new(
- ::StateType::size(),
- dense_size,
- ::ActionType::size(),
- )
- .load_record(record)
- })
- .ok()
-}
-
diff --git a/bot/src/burnrl/environment.rs b/bot/src/burnrl/environment.rs
index 50daf11..84c8311 100644
--- a/bot/src/burnrl/environment.rs
+++ b/bot/src/burnrl/environment.rs
@@ -6,10 +6,10 @@ use burn_rl::base::{Action, Environment, Snapshot, State};
use rand::{thread_rng, Rng};
use store::{GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage};
-const ERROR_REWARD: f32 = -1.12121;
-const REWARD_VALID_MOVE: f32 = 1.12121;
-const REWARD_RATIO: f32 = 0.01;
-const WIN_POINTS: f32 = 1.0;
+const ERROR_REWARD: f32 = -1.0012121;
+const REWARD_VALID_MOVE: f32 = 1.0012121;
+const REWARD_RATIO: f32 = 0.1;
+const WIN_POINTS: f32 = 100.0;
/// État du jeu Trictrac pour burn-rl
#[derive(Debug, Clone, Copy)]
@@ -285,7 +285,7 @@ impl TrictracEnvironment {
if let Some(event) = action.to_event(&self.game) {
if self.game.validate(&event) {
self.game.consume(&event);
- reward += REWARD_VALID_MOVE;
+ // reward += REWARD_VALID_MOVE;
// Simuler le résultat des dés après un Roll
if matches!(action, TrictracAction::Roll) {
let mut rng = thread_rng();
@@ -312,9 +312,11 @@ impl TrictracEnvironment {
// on annule les précédents reward
// et on indique une valeur reconnaissable pour statistiques
reward = ERROR_REWARD;
+ self.game.mark_points_for_bot_training(self.opponent_id, 1);
}
} else {
reward = ERROR_REWARD;
+ self.game.mark_points_for_bot_training(self.opponent_id, 1);
}
(reward, is_rollpoint)
diff --git a/bot/src/burnrl/environment_big.rs b/bot/src/burnrl/environment_big.rs
deleted file mode 100644
index 1bba2bd..0000000
--- a/bot/src/burnrl/environment_big.rs
+++ /dev/null
@@ -1,469 +0,0 @@
-use crate::training_common_big;
-use burn::{prelude::Backend, tensor::Tensor};
-use burn_rl::base::{Action, Environment, Snapshot, State};
-use rand::{thread_rng, Rng};
-use store::{GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage};
-
-const ERROR_REWARD: f32 = -2.12121;
-const REWARD_VALID_MOVE: f32 = 2.12121;
-const REWARD_RATIO: f32 = 0.01;
-const WIN_POINTS: f32 = 0.1;
-
-/// État du jeu Trictrac pour burn-rl
-#[derive(Debug, Clone, Copy)]
-pub struct TrictracState {
- pub data: [i8; 36], // Représentation vectorielle de l'état du jeu
-}
-
-impl State for TrictracState {
- type Data = [i8; 36];
-
- fn to_tensor(&self) -> Tensor {
- Tensor::from_floats(self.data, &B::Device::default())
- }
-
- fn size() -> usize {
- 36
- }
-}
-
-impl TrictracState {
- /// Convertit un GameState en TrictracState
- pub fn from_game_state(game_state: &GameState) -> Self {
- let state_vec = game_state.to_vec();
- let mut data = [0; 36];
-
- // Copier les données en s'assurant qu'on ne dépasse pas la taille
- let copy_len = state_vec.len().min(36);
- data[..copy_len].copy_from_slice(&state_vec[..copy_len]);
-
- TrictracState { data }
- }
-}
-
-/// Actions possibles dans Trictrac pour burn-rl
-#[derive(Debug, Clone, Copy, PartialEq)]
-pub struct TrictracAction {
- // u32 as required by burn_rl::base::Action type
- pub index: u32,
-}
-
-impl Action for TrictracAction {
- fn random() -> Self {
- use rand::{thread_rng, Rng};
- let mut rng = thread_rng();
- TrictracAction {
- index: rng.gen_range(0..Self::size() as u32),
- }
- }
-
- fn enumerate() -> Vec {
- (0..Self::size() as u32)
- .map(|index| TrictracAction { index })
- .collect()
- }
-
- fn size() -> usize {
- 1252
- }
-}
-
-impl From for TrictracAction {
- fn from(index: u32) -> Self {
- TrictracAction { index }
- }
-}
-
-impl From for u32 {
- fn from(action: TrictracAction) -> u32 {
- action.index
- }
-}
-
-/// Environnement Trictrac pour burn-rl
-#[derive(Debug)]
-pub struct TrictracEnvironment {
- pub game: GameState,
- active_player_id: PlayerId,
- opponent_id: PlayerId,
- current_state: TrictracState,
- episode_reward: f32,
- pub step_count: usize,
- pub max_steps: usize,
- pub pointrolls_count: usize,
- pub goodmoves_count: usize,
- pub goodmoves_ratio: f32,
- pub visualized: bool,
-}
-
-impl Environment for TrictracEnvironment {
- type StateType = TrictracState;
- type ActionType = TrictracAction;
- type RewardType = f32;
-
- fn new(visualized: bool) -> Self {
- let mut game = GameState::new(false);
-
- // Ajouter deux joueurs
- game.init_player("DQN Agent");
- game.init_player("Opponent");
- let player1_id = 1;
- let player2_id = 2;
-
- // Commencer la partie
- game.consume(&GameEvent::BeginGame { goes_first: 1 });
-
- let current_state = TrictracState::from_game_state(&game);
- TrictracEnvironment {
- game,
- active_player_id: player1_id,
- opponent_id: player2_id,
- current_state,
- episode_reward: 0.0,
- step_count: 0,
- max_steps: 2000,
- pointrolls_count: 0,
- goodmoves_count: 0,
- goodmoves_ratio: 0.0,
- visualized,
- }
- }
-
- fn state(&self) -> Self::StateType {
- self.current_state
- }
-
- fn reset(&mut self) -> Snapshot {
- // Réinitialiser le jeu
- self.game = GameState::new(false);
- self.game.init_player("DQN Agent");
- self.game.init_player("Opponent");
-
- // Commencer la partie
- self.game.consume(&GameEvent::BeginGame { goes_first: 1 });
-
- self.current_state = TrictracState::from_game_state(&self.game);
- self.episode_reward = 0.0;
- self.goodmoves_ratio = if self.step_count == 0 {
- 0.0
- } else {
- self.goodmoves_count as f32 / self.step_count as f32
- };
- println!(
- "info: correct moves: {} ({}%)",
- self.goodmoves_count,
- (100.0 * self.goodmoves_ratio).round() as u32
- );
- self.step_count = 0;
- self.pointrolls_count = 0;
- self.goodmoves_count = 0;
-
- Snapshot::new(self.current_state, 0.0, false)
- }
-
- fn step(&mut self, action: Self::ActionType) -> Snapshot {
- self.step_count += 1;
-
- // Convertir l'action burn-rl vers une action Trictrac
- let trictrac_action = Self::convert_action(action);
-
- let mut reward = 0.0;
- let is_rollpoint;
-
- // Exécuter l'action si c'est le tour de l'agent DQN
- if self.game.active_player_id == self.active_player_id {
- if let Some(action) = trictrac_action {
- (reward, is_rollpoint) = self.execute_action(action);
- if is_rollpoint {
- self.pointrolls_count += 1;
- }
- if reward != ERROR_REWARD {
- self.goodmoves_count += 1;
- // println!("{str_action}");
- }
- } else {
- // Action non convertible, pénalité
- reward = -0.5;
- }
- }
-
- // Faire jouer l'adversaire (stratégie simple)
- while self.game.active_player_id == self.opponent_id && self.game.stage != Stage::Ended {
- // print!(":");
- reward += self.play_opponent_if_needed();
- }
-
- // Vérifier si la partie est terminée
- // let max_steps = self.max_steps
- // let max_steps = self.min_steps
- // + (self.max_steps as f32 - self.min_steps)
- // * f32::exp((self.goodmoves_ratio - 1.0) / 0.25);
- let done = self.game.stage == Stage::Ended || self.game.determine_winner().is_some();
-
- if done {
- // Récompense finale basée sur le résultat
- if let Some(winner_id) = self.game.determine_winner() {
- if winner_id == self.active_player_id {
- reward += WIN_POINTS; // Victoire
- } else {
- reward -= WIN_POINTS; // Défaite
- }
- }
- }
- let terminated = done || self.step_count >= self.max_steps;
-
- // Mettre à jour l'état
- self.current_state = TrictracState::from_game_state(&self.game);
- self.episode_reward += reward;
- if self.visualized && terminated {
- println!(
- "Episode terminé. Récompense totale: {:.2}, Étapes: {}",
- self.episode_reward, self.step_count
- );
- }
-
- Snapshot::new(self.current_state, reward, terminated)
- }
-}
-
-impl TrictracEnvironment {
- /// Convertit une action burn-rl vers une action Trictrac
- pub fn convert_action(action: TrictracAction) -> Option {
- training_common_big::TrictracAction::from_action_index(action.index.try_into().unwrap())
- }
-
- /// Convertit l'index d'une action au sein des actions valides vers une action Trictrac
- #[allow(dead_code)]
- fn convert_valid_action_index(
- &self,
- action: TrictracAction,
- game_state: &GameState,
- ) -> Option {
- use training_common_big::get_valid_actions;
-
- // Obtenir les actions valides dans le contexte actuel
- let valid_actions = get_valid_actions(game_state);
-
- if valid_actions.is_empty() {
- return None;
- }
-
- // Mapper l'index d'action sur une action valide
- let action_index = (action.index as usize) % valid_actions.len();
- Some(valid_actions[action_index].clone())
- }
-
- /// Exécute une action Trictrac dans le jeu
- // fn execute_action(
- // &mut self,
- // action:training_common_big::TrictracAction,
- // ) -> Result> {
- fn execute_action(&mut self, action: training_common_big::TrictracAction) -> (f32, bool) {
- use training_common_big::TrictracAction;
-
- let mut reward = 0.0;
- let mut is_rollpoint = false;
- let mut need_roll = false;
-
- let event = match action {
- TrictracAction::Roll => {
- // Lancer les dés
- need_roll = true;
- Some(GameEvent::Roll {
- player_id: self.active_player_id,
- })
- }
- // TrictracAction::Mark => {
- // // Marquer des points
- // let points = self.game.
- // reward += 0.1 * points as f32;
- // Some(GameEvent::Mark {
- // player_id: self.active_player_id,
- // points,
- // })
- // }
- TrictracAction::Go => {
- // Continuer après avoir gagné un trou
- Some(GameEvent::Go {
- player_id: self.active_player_id,
- })
- }
- TrictracAction::Move {
- dice_order,
- from1,
- from2,
- } => {
- // Effectuer un mouvement
- let (dice1, dice2) = if dice_order {
- (self.game.dice.values.0, self.game.dice.values.1)
- } else {
- (self.game.dice.values.1, self.game.dice.values.0)
- };
- let mut to1 = from1 + dice1 as usize;
- let mut to2 = from2 + dice2 as usize;
-
- // Gestion prise de coin par puissance
- let opp_rest_field = 13;
- if to1 == opp_rest_field && to2 == opp_rest_field {
- to1 -= 1;
- to2 -= 1;
- }
-
- let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default();
- let checker_move2 = store::CheckerMove::new(from2, to2).unwrap_or_default();
-
- Some(GameEvent::Move {
- player_id: self.active_player_id,
- moves: (checker_move1, checker_move2),
- })
- }
- };
-
- // Appliquer l'événement si valide
- if let Some(event) = event {
- if self.game.validate(&event) {
- self.game.consume(&event);
- reward += REWARD_VALID_MOVE;
- // Simuler le résultat des dés après un Roll
- // if matches!(action, TrictracAction::Roll) {
- if need_roll {
- let mut rng = thread_rng();
- let dice_values = (rng.gen_range(1..=6), rng.gen_range(1..=6));
- let dice_event = GameEvent::RollResult {
- player_id: self.active_player_id,
- dice: store::Dice {
- values: dice_values,
- },
- };
- // print!("o");
- if self.game.validate(&dice_event) {
- self.game.consume(&dice_event);
- let (points, adv_points) = self.game.dice_points;
- reward += REWARD_RATIO * (points - adv_points) as f32;
- if points > 0 {
- is_rollpoint = true;
- // println!("info: rolled for {reward}");
- }
- // Récompense proportionnelle aux points
- }
- }
- } else {
- // Pénalité pour action invalide
- // on annule les précédents reward
- // et on indique une valeur reconnaissable pour statistiques
- reward = ERROR_REWARD;
- }
- }
-
- (reward, is_rollpoint)
- }
-
- /// Fait jouer l'adversaire avec une stratégie simple
- fn play_opponent_if_needed(&mut self) -> f32 {
- // print!("z?");
- let mut reward = 0.0;
-
- // Si c'est le tour de l'adversaire, jouer automatiquement
- if self.game.active_player_id == self.opponent_id && self.game.stage != Stage::Ended {
- // Utiliser la stratégie default pour l'adversaire
- use crate::BotStrategy;
-
- let mut strategy = crate::strategy::random::RandomStrategy::default();
- strategy.set_player_id(self.opponent_id);
- if let Some(color) = self.game.player_color_by_id(&self.opponent_id) {
- strategy.set_color(color);
- }
- *strategy.get_mut_game() = self.game.clone();
-
- // Exécuter l'action selon le turn_stage
- let mut calculate_points = false;
- let opponent_color = store::Color::Black;
- let event = match self.game.turn_stage {
- TurnStage::RollDice => GameEvent::Roll {
- player_id: self.opponent_id,
- },
- TurnStage::RollWaiting => {
- let mut rng = thread_rng();
- let dice_values = (rng.gen_range(1..=6), rng.gen_range(1..=6));
- calculate_points = true; // comment to replicate burnrl_before
- GameEvent::RollResult {
- player_id: self.opponent_id,
- dice: store::Dice {
- values: dice_values,
- },
- }
- }
- TurnStage::MarkPoints => {
- panic!("in play_opponent_if_needed > TurnStage::MarkPoints");
- // let dice_roll_count = self
- // .game
- // .players
- // .get(&self.opponent_id)
- // .unwrap()
- // .dice_roll_count;
- // let points_rules =
- // PointsRules::new(&opponent_color, &self.game.board, self.game.dice);
- // GameEvent::Mark {
- // player_id: self.opponent_id,
- // points: points_rules.get_points(dice_roll_count).0,
- // }
- }
- TurnStage::MarkAdvPoints => {
- let dice_roll_count = self
- .game
- .players
- .get(&self.opponent_id)
- .unwrap()
- .dice_roll_count;
- let points_rules =
- PointsRules::new(&opponent_color, &self.game.board, self.game.dice);
- // pas de reward : déjà comptabilisé lors du tour de blanc
- GameEvent::Mark {
- player_id: self.opponent_id,
- points: points_rules.get_points(dice_roll_count).1,
- }
- }
- TurnStage::HoldOrGoChoice => {
- // Stratégie simple : toujours continuer
- GameEvent::Go {
- player_id: self.opponent_id,
- }
- }
- TurnStage::Move => GameEvent::Move {
- player_id: self.opponent_id,
- moves: strategy.choose_move(),
- },
- };
-
- if self.game.validate(&event) {
- self.game.consume(&event);
- // print!(".");
- if calculate_points {
- // print!("x");
- let dice_roll_count = self
- .game
- .players
- .get(&self.opponent_id)
- .unwrap()
- .dice_roll_count;
- let points_rules =
- PointsRules::new(&opponent_color, &self.game.board, self.game.dice);
- let (points, adv_points) = points_rules.get_points(dice_roll_count);
- // Récompense proportionnelle aux points
- let adv_reward = REWARD_RATIO * (points - adv_points) as f32;
- reward -= adv_reward;
- // if adv_reward != 0.0 {
- // println!("info: opponent : {adv_reward} -> {reward}");
- // }
- }
- }
- }
- reward
- }
-}
-
-impl AsMut for TrictracEnvironment {
- fn as_mut(&mut self) -> &mut Self {
- self
- }
-}
diff --git a/bot/src/burnrl/environment_valid.rs b/bot/src/burnrl/environment_valid.rs
index 346044c..9c27af9 100644
--- a/bot/src/burnrl/environment_valid.rs
+++ b/bot/src/burnrl/environment_valid.rs
@@ -1,9 +1,12 @@
-use crate::training_common_big;
+use crate::training_common;
use burn::{prelude::Backend, tensor::Tensor};
use burn_rl::base::{Action, Environment, Snapshot, State};
use rand::{thread_rng, Rng};
use store::{GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage};
+const ERROR_REWARD: f32 = -1.0012121;
+const REWARD_RATIO: f32 = 0.1;
+
/// État du jeu Trictrac pour burn-rl
#[derive(Debug, Clone, Copy)]
pub struct TrictracState {
@@ -214,16 +217,16 @@ impl TrictracEnvironment {
const REWARD_RATIO: f32 = 1.0;
/// Convertit une action burn-rl vers une action Trictrac
- pub fn convert_action(action: TrictracAction) -> Option {
- training_common_big::TrictracAction::from_action_index(action.index.try_into().unwrap())
+ pub fn convert_action(action: TrictracAction) -> Option {
+ training_common::TrictracAction::from_action_index(action.index.try_into().unwrap())
}
/// Convertit l'index d'une action au sein des actions valides vers une action Trictrac
fn convert_valid_action_index(
&self,
action: TrictracAction,
- ) -> Option {
- use training_common_big::get_valid_actions;
+ ) -> Option {
+ use training_common::get_valid_actions;
// Obtenir les actions valides dans le contexte actuel
let valid_actions = get_valid_actions(&self.game);
@@ -240,72 +243,19 @@ impl TrictracEnvironment {
/// Exécute une action Trictrac dans le jeu
// fn execute_action(
// &mut self,
- // action: training_common_big::TrictracAction,
+ // action: training_common::TrictracAction,
// ) -> Result> {
- fn execute_action(&mut self, action: training_common_big::TrictracAction) -> (f32, bool) {
- use training_common_big::TrictracAction;
+ fn execute_action(&mut self, action: training_common::TrictracAction) -> (f32, bool) {
+ use training_common::TrictracAction;
let mut reward = 0.0;
let mut is_rollpoint = false;
- let event = match action {
- TrictracAction::Roll => {
- // Lancer les dés
- Some(GameEvent::Roll {
- player_id: self.active_player_id,
- })
- }
- // TrictracAction::Mark => {
- // // Marquer des points
- // let points = self.game.
- // reward += 0.1 * points as f32;
- // Some(GameEvent::Mark {
- // player_id: self.active_player_id,
- // points,
- // })
- // }
- TrictracAction::Go => {
- // Continuer après avoir gagné un trou
- Some(GameEvent::Go {
- player_id: self.active_player_id,
- })
- }
- TrictracAction::Move {
- dice_order,
- from1,
- from2,
- } => {
- // Effectuer un mouvement
- let (dice1, dice2) = if dice_order {
- (self.game.dice.values.0, self.game.dice.values.1)
- } else {
- (self.game.dice.values.1, self.game.dice.values.0)
- };
- let mut to1 = from1 + dice1 as usize;
- let mut to2 = from2 + dice2 as usize;
-
- // Gestion prise de coin par puissance
- let opp_rest_field = 13;
- if to1 == opp_rest_field && to2 == opp_rest_field {
- to1 -= 1;
- to2 -= 1;
- }
-
- let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default();
- let checker_move2 = store::CheckerMove::new(from2, to2).unwrap_or_default();
-
- Some(GameEvent::Move {
- player_id: self.active_player_id,
- moves: (checker_move1, checker_move2),
- })
- }
- };
-
// Appliquer l'événement si valide
- if let Some(event) = event {
+ if let Some(event) = action.to_event(&self.game) {
if self.game.validate(&event) {
self.game.consume(&event);
-
+ // reward += REWARD_VALID_MOVE;
// Simuler le résultat des dés après un Roll
if matches!(action, TrictracAction::Roll) {
let mut rng = thread_rng();
@@ -319,7 +269,7 @@ impl TrictracEnvironment {
if self.game.validate(&dice_event) {
self.game.consume(&dice_event);
let (points, adv_points) = self.game.dice_points;
- reward += Self::REWARD_RATIO * (points - adv_points) as f32;
+ reward += REWARD_RATIO * (points as f32 - adv_points as f32);
if points > 0 {
is_rollpoint = true;
// println!("info: rolled for {reward}");
@@ -331,9 +281,12 @@ impl TrictracEnvironment {
// Pénalité pour action invalide
// on annule les précédents reward
// et on indique une valeur reconnaissable pour statistiques
- println!("info: action invalide -> err_reward");
- reward = Self::ERROR_REWARD;
+ reward = ERROR_REWARD;
+ self.game.mark_points_for_bot_training(self.opponent_id, 1);
}
+ } else {
+ reward = ERROR_REWARD;
+ self.game.mark_points_for_bot_training(self.opponent_id, 1);
}
(reward, is_rollpoint)
diff --git a/bot/src/burnrl/main.rs b/bot/src/burnrl/main.rs
index f7608a3..5230ec0 100644
--- a/bot/src/burnrl/main.rs
+++ b/bot/src/burnrl/main.rs
@@ -1,8 +1,5 @@
-use bot::burnrl::algos::{
- dqn, dqn_big, dqn_valid, ppo, ppo_big, ppo_valid, sac, sac_big, sac_valid,
-};
+use bot::burnrl::algos::{dqn, dqn_valid, ppo, ppo_valid, sac, sac_valid};
use bot::burnrl::environment::TrictracEnvironment;
-use bot::burnrl::environment_big::TrictracEnvironment as TrictracEnvironmentBig;
use bot::burnrl::environment_valid::TrictracEnvironment as TrictracEnvironmentValid;
use bot::burnrl::utils::{demo_model, Config};
use burn::backend::{Autodiff, NdArray};
@@ -36,16 +33,6 @@ fn main() {
println!("> Test avec le modèle chargé");
demo_model(loaded_agent);
}
- "dqn_big" => {
- let _agent = dqn_big::run::(&conf, false);
- println!("> Chargement du modèle pour test");
- let loaded_model = dqn_big::load_model(conf.dense_size, &path);
- let loaded_agent: burn_rl::agent::DQN =
- burn_rl::agent::DQN::new(loaded_model.unwrap());
-
- println!("> Test avec le modèle chargé");
- demo_model(loaded_agent);
- }
"dqn_valid" => {
let _agent = dqn_valid::run::(&conf, false);
println!("> Chargement du modèle pour test");
@@ -66,16 +53,6 @@ fn main() {
println!("> Test avec le modèle chargé");
demo_model(loaded_agent);
}
- "sac_big" => {
- let _agent = sac_big::run::(&conf, false);
- println!("> Chargement du modèle pour test");
- let loaded_model = sac_big::load_model(conf.dense_size, &path);
- let loaded_agent: burn_rl::agent::SAC =
- burn_rl::agent::SAC::new(loaded_model.unwrap());
-
- println!("> Test avec le modèle chargé");
- demo_model(loaded_agent);
- }
"sac_valid" => {
let _agent = sac_valid::run::(&conf, false);
println!("> Chargement du modèle pour test");
@@ -96,16 +73,6 @@ fn main() {
println!("> Test avec le modèle chargé");
demo_model(loaded_agent);
}
- "ppo_big" => {
- let _agent = ppo_big::run::(&conf, false);
- println!("> Chargement du modèle pour test");
- let loaded_model = ppo_big::load_model(conf.dense_size, &path);
- let loaded_agent: burn_rl::agent::PPO =
- burn_rl::agent::PPO::new(loaded_model.unwrap());
-
- println!("> Test avec le modèle chargé");
- demo_model(loaded_agent);
- }
"ppo_valid" => {
let _agent = ppo_valid::run::(&conf, false);
println!("> Chargement du modèle pour test");
diff --git a/bot/src/burnrl/mod.rs b/bot/src/burnrl/mod.rs
index 62bebc8..292bbb8 100644
--- a/bot/src/burnrl/mod.rs
+++ b/bot/src/burnrl/mod.rs
@@ -1,5 +1,4 @@
pub mod algos;
pub mod environment;
-pub mod environment_big;
pub mod environment_valid;
pub mod utils;
diff --git a/bot/src/dqn_simple/dqn_model.rs b/bot/src/dqn_simple/dqn_model.rs
deleted file mode 100644
index 9c31f44..0000000
--- a/bot/src/dqn_simple/dqn_model.rs
+++ /dev/null
@@ -1,153 +0,0 @@
-use crate::training_common_big::TrictracAction;
-use serde::{Deserialize, Serialize};
-
-/// Configuration pour l'agent DQN
-#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct DqnConfig {
- pub state_size: usize,
- pub hidden_size: usize,
- pub num_actions: usize,
- pub learning_rate: f64,
- pub gamma: f64,
- pub epsilon: f64,
- pub epsilon_decay: f64,
- pub epsilon_min: f64,
- pub replay_buffer_size: usize,
- pub batch_size: usize,
-}
-
-impl Default for DqnConfig {
- fn default() -> Self {
- Self {
- state_size: 36,
- hidden_size: 512, // Augmenter la taille pour gérer l'espace d'actions élargi
- num_actions: TrictracAction::action_space_size(),
- learning_rate: 0.001,
- gamma: 0.99,
- epsilon: 0.1,
- epsilon_decay: 0.995,
- epsilon_min: 0.01,
- replay_buffer_size: 10000,
- batch_size: 32,
- }
- }
-}
-
-/// Réseau de neurones DQN simplifié (matrice de poids basique)
-#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct SimpleNeuralNetwork {
- pub weights1: Vec>,
- pub biases1: Vec,
- pub weights2: Vec>,
- pub biases2: Vec,
- pub weights3: Vec>,
- pub biases3: Vec,
-}
-
-impl SimpleNeuralNetwork {
- pub fn new(input_size: usize, hidden_size: usize, output_size: usize) -> Self {
- use rand::{thread_rng, Rng};
- let mut rng = thread_rng();
-
- // Initialisation aléatoire des poids avec Xavier/Glorot
- let scale1 = (2.0 / input_size as f32).sqrt();
- let weights1 = (0..hidden_size)
- .map(|_| {
- (0..input_size)
- .map(|_| rng.gen_range(-scale1..scale1))
- .collect()
- })
- .collect();
- let biases1 = vec![0.0; hidden_size];
-
- let scale2 = (2.0 / hidden_size as f32).sqrt();
- let weights2 = (0..hidden_size)
- .map(|_| {
- (0..hidden_size)
- .map(|_| rng.gen_range(-scale2..scale2))
- .collect()
- })
- .collect();
- let biases2 = vec![0.0; hidden_size];
-
- let scale3 = (2.0 / hidden_size as f32).sqrt();
- let weights3 = (0..output_size)
- .map(|_| {
- (0..hidden_size)
- .map(|_| rng.gen_range(-scale3..scale3))
- .collect()
- })
- .collect();
- let biases3 = vec![0.0; output_size];
-
- Self {
- weights1,
- biases1,
- weights2,
- biases2,
- weights3,
- biases3,
- }
- }
-
- pub fn forward(&self, input: &[f32]) -> Vec {
- // Première couche
- let mut layer1: Vec = self.biases1.clone();
- for (i, neuron_weights) in self.weights1.iter().enumerate() {
- for (j, &weight) in neuron_weights.iter().enumerate() {
- if j < input.len() {
- layer1[i] += input[j] * weight;
- }
- }
- layer1[i] = layer1[i].max(0.0); // ReLU
- }
-
- // Deuxième couche
- let mut layer2: Vec = self.biases2.clone();
- for (i, neuron_weights) in self.weights2.iter().enumerate() {
- for (j, &weight) in neuron_weights.iter().enumerate() {
- if j < layer1.len() {
- layer2[i] += layer1[j] * weight;
- }
- }
- layer2[i] = layer2[i].max(0.0); // ReLU
- }
-
- // Couche de sortie
- let mut output: Vec = self.biases3.clone();
- for (i, neuron_weights) in self.weights3.iter().enumerate() {
- for (j, &weight) in neuron_weights.iter().enumerate() {
- if j < layer2.len() {
- output[i] += layer2[j] * weight;
- }
- }
- }
-
- output
- }
-
- pub fn get_best_action(&self, input: &[f32]) -> usize {
- let q_values = self.forward(input);
- q_values
- .iter()
- .enumerate()
- .max_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap())
- .map(|(index, _)| index)
- .unwrap_or(0)
- }
-
- pub fn save>(
- &self,
- path: P,
- ) -> Result<(), Box> {
- let data = serde_json::to_string_pretty(self)?;
- std::fs::write(path, data)?;
- Ok(())
- }
-
- pub fn load>(path: P) -> Result> {
- let data = std::fs::read_to_string(path)?;
- let network = serde_json::from_str(&data)?;
- Ok(network)
- }
-}
diff --git a/bot/src/dqn_simple/dqn_trainer.rs b/bot/src/dqn_simple/dqn_trainer.rs
deleted file mode 100644
index ed60f5e..0000000
--- a/bot/src/dqn_simple/dqn_trainer.rs
+++ /dev/null
@@ -1,494 +0,0 @@
-use crate::{CheckerMove, Color, GameState, PlayerId};
-use rand::prelude::SliceRandom;
-use rand::{thread_rng, Rng};
-use serde::{Deserialize, Serialize};
-use std::collections::VecDeque;
-use store::{GameEvent, MoveRules, PointsRules, Stage, TurnStage};
-
-use super::dqn_model::{DqnConfig, SimpleNeuralNetwork};
-use crate::training_common_big::{get_valid_actions, TrictracAction};
-
-/// Expérience pour le buffer de replay
-#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct Experience {
- pub state: Vec,
- pub action: TrictracAction,
- pub reward: f32,
- pub next_state: Vec,
- pub done: bool,
-}
-
-/// Buffer de replay pour stocker les expériences
-#[derive(Debug)]
-pub struct ReplayBuffer {
- buffer: VecDeque,
- capacity: usize,
-}
-
-impl ReplayBuffer {
- pub fn new(capacity: usize) -> Self {
- Self {
- buffer: VecDeque::with_capacity(capacity),
- capacity,
- }
- }
-
- pub fn push(&mut self, experience: Experience) {
- if self.buffer.len() >= self.capacity {
- self.buffer.pop_front();
- }
- self.buffer.push_back(experience);
- }
-
- pub fn sample(&self, batch_size: usize) -> Vec {
- let mut rng = thread_rng();
- let len = self.buffer.len();
- if len < batch_size {
- return self.buffer.iter().cloned().collect();
- }
-
- let mut batch = Vec::with_capacity(batch_size);
- for _ in 0..batch_size {
- let idx = rng.gen_range(0..len);
- batch.push(self.buffer[idx].clone());
- }
- batch
- }
-
- pub fn is_empty(&self) -> bool {
- self.buffer.is_empty()
- }
-
- pub fn len(&self) -> usize {
- self.buffer.len()
- }
-}
-
-/// Agent DQN pour l'apprentissage par renforcement
-#[derive(Debug)]
-pub struct DqnAgent {
- config: DqnConfig,
- model: SimpleNeuralNetwork,
- target_model: SimpleNeuralNetwork,
- replay_buffer: ReplayBuffer,
- epsilon: f64,
- step_count: usize,
-}
-
-impl DqnAgent {
- pub fn new(config: DqnConfig) -> Self {
- let model =
- SimpleNeuralNetwork::new(config.state_size, config.hidden_size, config.num_actions);
- let target_model = model.clone();
- let replay_buffer = ReplayBuffer::new(config.replay_buffer_size);
- let epsilon = config.epsilon;
-
- Self {
- config,
- model,
- target_model,
- replay_buffer,
- epsilon,
- step_count: 0,
- }
- }
-
- pub fn select_action(&mut self, game_state: &GameState, state: &[f32]) -> TrictracAction {
- let valid_actions = get_valid_actions(game_state);
-
- if valid_actions.is_empty() {
- // Fallback si aucune action valide
- return TrictracAction::Roll;
- }
-
- let mut rng = thread_rng();
- if rng.gen::() < self.epsilon {
- // Exploration : action valide aléatoire
- valid_actions
- .choose(&mut rng)
- .cloned()
- .unwrap_or(TrictracAction::Roll)
- } else {
- // Exploitation : meilleure action valide selon le modèle
- let q_values = self.model.forward(state);
-
- let mut best_action = &valid_actions[0];
- let mut best_q_value = f32::NEG_INFINITY;
-
- for action in &valid_actions {
- let action_index = action.to_action_index();
- if action_index < q_values.len() {
- let q_value = q_values[action_index];
- if q_value > best_q_value {
- best_q_value = q_value;
- best_action = action;
- }
- }
- }
-
- best_action.clone()
- }
- }
-
- pub fn store_experience(&mut self, experience: Experience) {
- self.replay_buffer.push(experience);
- }
-
- pub fn train(&mut self) {
- if self.replay_buffer.len() < self.config.batch_size {
- return;
- }
-
- // Pour l'instant, on simule l'entraînement en mettant à jour epsilon
- // Dans une implémentation complète, ici on ferait la backpropagation
- self.epsilon = (self.epsilon * self.config.epsilon_decay).max(self.config.epsilon_min);
- self.step_count += 1;
-
- // Mise à jour du target model tous les 100 steps
- if self.step_count % 100 == 0 {
- self.target_model = self.model.clone();
- }
- }
-
- pub fn save_model>(
- &self,
- path: P,
- ) -> Result<(), Box> {
- self.model.save(path)
- }
-
- pub fn get_epsilon(&self) -> f64 {
- self.epsilon
- }
-
- pub fn get_step_count(&self) -> usize {
- self.step_count
- }
-}
-
-/// Environnement Trictrac pour l'entraînement
-#[derive(Debug)]
-pub struct TrictracEnv {
- pub game_state: GameState,
- pub agent_player_id: PlayerId,
- pub opponent_player_id: PlayerId,
- pub agent_color: Color,
- pub max_steps: usize,
- pub current_step: usize,
-}
-
-impl Default for TrictracEnv {
- fn default() -> Self {
- let mut game_state = GameState::new(false);
- game_state.init_player("agent");
- game_state.init_player("opponent");
-
- Self {
- game_state,
- agent_player_id: 1,
- opponent_player_id: 2,
- agent_color: Color::White,
- max_steps: 1000,
- current_step: 0,
- }
- }
-}
-
-impl TrictracEnv {
- pub fn reset(&mut self) -> Vec {
- self.game_state = GameState::new(false);
- self.game_state.init_player("agent");
- self.game_state.init_player("opponent");
-
- // Commencer la partie
- self.game_state.consume(&GameEvent::BeginGame {
- goes_first: self.agent_player_id,
- });
-
- self.current_step = 0;
- self.game_state.to_vec_float()
- }
-
- pub fn step(&mut self, action: TrictracAction) -> (Vec, f32, bool) {
- let mut reward = 0.0;
-
- // Appliquer l'action de l'agent
- if self.game_state.active_player_id == self.agent_player_id {
- reward += self.apply_agent_action(action);
- }
-
- // Faire jouer l'adversaire (stratégie simple)
- while self.game_state.active_player_id == self.opponent_player_id
- && self.game_state.stage != Stage::Ended
- {
- reward += self.play_opponent_turn();
- }
-
- // Vérifier si la partie est terminée
- let done = self.game_state.stage == Stage::Ended
- || self.game_state.determine_winner().is_some()
- || self.current_step >= self.max_steps;
-
- // Récompense finale si la partie est terminée
- if done {
- if let Some(winner) = self.game_state.determine_winner() {
- if winner == self.agent_player_id {
- reward += 100.0; // Bonus pour gagner
- } else {
- reward -= 50.0; // Pénalité pour perdre
- }
- }
- }
-
- self.current_step += 1;
- let next_state = self.game_state.to_vec_float();
- (next_state, reward, done)
- }
-
- fn apply_agent_action(&mut self, action: TrictracAction) -> f32 {
- let mut reward = 0.0;
-
- let event = match action {
- TrictracAction::Roll => {
- // Lancer les dés
- reward += 0.1;
- Some(GameEvent::Roll {
- player_id: self.agent_player_id,
- })
- }
- // TrictracAction::Mark => {
- // // Marquer des points
- // let points = self.game_state.
- // reward += 0.1 * points as f32;
- // Some(GameEvent::Mark {
- // player_id: self.agent_player_id,
- // points,
- // })
- // }
- TrictracAction::Go => {
- // Continuer après avoir gagné un trou
- reward += 0.2;
- Some(GameEvent::Go {
- player_id: self.agent_player_id,
- })
- }
- TrictracAction::Move {
- dice_order,
- from1,
- from2,
- } => {
- // Effectuer un mouvement
- let (dice1, dice2) = if dice_order {
- (self.game_state.dice.values.0, self.game_state.dice.values.1)
- } else {
- (self.game_state.dice.values.1, self.game_state.dice.values.0)
- };
- let mut to1 = from1 + dice1 as usize;
- let mut to2 = from2 + dice2 as usize;
-
- // Gestion prise de coin par puissance
- let opp_rest_field = 13;
- if to1 == opp_rest_field && to2 == opp_rest_field {
- to1 -= 1;
- to2 -= 1;
- }
-
- let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default();
- let checker_move2 = store::CheckerMove::new(from2, to2).unwrap_or_default();
-
- reward += 0.2;
- Some(GameEvent::Move {
- player_id: self.agent_player_id,
- moves: (checker_move1, checker_move2),
- })
- }
- };
-
- // Appliquer l'événement si valide
- if let Some(event) = event {
- if self.game_state.validate(&event) {
- self.game_state.consume(&event);
-
- // Simuler le résultat des dés après un Roll
- if matches!(action, TrictracAction::Roll) {
- let mut rng = thread_rng();
- let dice_values = (rng.gen_range(1..=6), rng.gen_range(1..=6));
- let dice_event = GameEvent::RollResult {
- player_id: self.agent_player_id,
- dice: store::Dice {
- values: dice_values,
- },
- };
- if self.game_state.validate(&dice_event) {
- self.game_state.consume(&dice_event);
- }
- }
- } else {
- // Pénalité pour action invalide
- reward -= 2.0;
- }
- }
-
- reward
- }
-
- // TODO : use default bot strategy
- fn play_opponent_turn(&mut self) -> f32 {
- let mut reward = 0.0;
- let event = match self.game_state.turn_stage {
- TurnStage::RollDice => GameEvent::Roll {
- player_id: self.opponent_player_id,
- },
- TurnStage::RollWaiting => {
- let mut rng = thread_rng();
- let dice_values = (rng.gen_range(1..=6), rng.gen_range(1..=6));
- GameEvent::RollResult {
- player_id: self.opponent_player_id,
- dice: store::Dice {
- values: dice_values,
- },
- }
- }
- TurnStage::MarkAdvPoints | TurnStage::MarkPoints => {
- let opponent_color = self.agent_color.opponent_color();
- let dice_roll_count = self
- .game_state
- .players
- .get(&self.opponent_player_id)
- .unwrap()
- .dice_roll_count;
- let points_rules = PointsRules::new(
- &opponent_color,
- &self.game_state.board,
- self.game_state.dice,
- );
- let (points, adv_points) = points_rules.get_points(dice_roll_count);
- reward -= 0.3 * (points - adv_points) as f32; // Récompense proportionnelle aux points
-
- GameEvent::Mark {
- player_id: self.opponent_player_id,
- points,
- }
- }
- TurnStage::Move => {
- let opponent_color = self.agent_color.opponent_color();
- let rules = MoveRules::new(
- &opponent_color,
- &self.game_state.board,
- self.game_state.dice,
- );
- let possible_moves = rules.get_possible_moves_sequences(true, vec![]);
-
- // Stratégie simple : choix aléatoire
- let mut rng = thread_rng();
- let choosen_move = *possible_moves
- .choose(&mut rng)
- .unwrap_or(&(CheckerMove::default(), CheckerMove::default()));
-
- GameEvent::Move {
- player_id: self.opponent_player_id,
- moves: if opponent_color == Color::White {
- choosen_move
- } else {
- (choosen_move.0.mirror(), choosen_move.1.mirror())
- },
- }
- }
- TurnStage::HoldOrGoChoice => {
- // Stratégie simple : toujours continuer
- GameEvent::Go {
- player_id: self.opponent_player_id,
- }
- }
- };
- if self.game_state.validate(&event) {
- self.game_state.consume(&event);
- }
- reward
- }
-}
-
-/// Entraîneur pour le modèle DQN
-pub struct DqnTrainer {
- agent: DqnAgent,
- env: TrictracEnv,
-}
-
-impl DqnTrainer {
- pub fn new(config: DqnConfig) -> Self {
- Self {
- agent: DqnAgent::new(config),
- env: TrictracEnv::default(),
- }
- }
-
- pub fn train_episode(&mut self) -> f32 {
- let mut total_reward = 0.0;
- let mut state = self.env.reset();
- // let mut step_count = 0;
-
- loop {
- // step_count += 1;
- let action = self.agent.select_action(&self.env.game_state, &state);
- let (next_state, reward, done) = self.env.step(action.clone());
- total_reward += reward;
-
- let experience = Experience {
- state: state.clone(),
- action,
- reward,
- next_state: next_state.clone(),
- done,
- };
- self.agent.store_experience(experience);
- self.agent.train();
-
- if done {
- break;
- }
- // if step_count % 100 == 0 {
- // println!("{:?}", next_state);
- // }
- state = next_state;
- }
-
- total_reward
- }
-
- pub fn train(
- &mut self,
- episodes: usize,
- save_every: usize,
- model_path: &str,
- ) -> Result<(), Box> {
- println!("Démarrage de l'entraînement DQN pour {episodes} épisodes");
-
- for episode in 1..=episodes {
- let reward = self.train_episode();
-
- if episode % 100 == 0 {
- println!(
- "Épisode {}/{}: Récompense = {:.2}, Epsilon = {:.3}, Steps = {}",
- episode,
- episodes,
- reward,
- self.agent.get_epsilon(),
- self.agent.get_step_count()
- );
- }
-
- if episode % save_every == 0 {
- let save_path = format!("{model_path}_episode_{episode}.json");
- self.agent.save_model(&save_path)?;
- println!("Modèle sauvegardé : {save_path}");
- }
- }
-
- // Sauvegarder le modèle final
- let final_path = format!("{model_path}_final.json");
- self.agent.save_model(&final_path)?;
- println!("Modèle final sauvegardé : {final_path}");
-
- Ok(())
- }
-}
diff --git a/bot/src/dqn_simple/main.rs b/bot/src/dqn_simple/main.rs
deleted file mode 100644
index 024f895..0000000
--- a/bot/src/dqn_simple/main.rs
+++ /dev/null
@@ -1,109 +0,0 @@
-use bot::dqn_simple::dqn_model::DqnConfig;
-use bot::dqn_simple::dqn_trainer::DqnTrainer;
-use bot::training_common::TrictracAction;
-use std::env;
-
-fn main() -> Result<(), Box> {
- env_logger::init();
-
- let args: Vec = env::args().collect();
-
- // Paramètres par défaut
- let mut episodes = 1000;
- let mut model_path = "models/dqn_model".to_string();
- let mut save_every = 100;
-
- // Parser les arguments de ligne de commande
- let mut i = 1;
- while i < args.len() {
- match args[i].as_str() {
- "--episodes" => {
- if i + 1 < args.len() {
- episodes = args[i + 1].parse().unwrap_or(1000);
- i += 2;
- } else {
- eprintln!("Erreur : --episodes nécessite une valeur");
- std::process::exit(1);
- }
- }
- "--model-path" => {
- if i + 1 < args.len() {
- model_path = args[i + 1].clone();
- i += 2;
- } else {
- eprintln!("Erreur : --model-path nécessite une valeur");
- std::process::exit(1);
- }
- }
- "--save-every" => {
- if i + 1 < args.len() {
- save_every = args[i + 1].parse().unwrap_or(100);
- i += 2;
- } else {
- eprintln!("Erreur : --save-every nécessite une valeur");
- std::process::exit(1);
- }
- }
- "--help" | "-h" => {
- print_help();
- std::process::exit(0);
- }
- _ => {
- eprintln!("Argument inconnu : {}", args[i]);
- print_help();
- std::process::exit(1);
- }
- }
- }
-
- // Créer le dossier models s'il n'existe pas
- std::fs::create_dir_all("models")?;
-
- println!("Configuration d'entraînement DQN :");
- println!(" Épisodes : {episodes}");
- println!(" Chemin du modèle : {model_path}");
- println!(" Sauvegarde tous les {save_every} épisodes");
- println!();
-
- // Configuration DQN
- let config = DqnConfig {
- state_size: 36, // state.to_vec size
- hidden_size: 256,
- num_actions: TrictracAction::action_space_size(),
- learning_rate: 0.001,
- gamma: 0.99,
- epsilon: 0.9, // Commencer avec plus d'exploration
- epsilon_decay: 0.995,
- epsilon_min: 0.01,
- replay_buffer_size: 10000,
- batch_size: 32,
- };
-
- // Créer et lancer l'entraîneur
- let mut trainer = DqnTrainer::new(config);
- trainer.train(episodes, save_every, &model_path)?;
-
- println!("Entraînement terminé avec succès !");
- println!("Pour utiliser le modèle entraîné :");
- println!(" cargo run --bin=client_cli -- --bot dqn:{model_path}_final.json,dummy");
-
- Ok(())
-}
-
-fn print_help() {
- println!("Entraîneur DQN pour Trictrac");
- println!();
- println!("USAGE:");
- println!(" cargo run --bin=train_dqn [OPTIONS]");
- println!();
- println!("OPTIONS:");
- println!(" --episodes Nombre d'épisodes d'entraînement (défaut: 1000)");
- println!(" --model-path Chemin de base pour sauvegarder les modèles (défaut: models/dqn_model)");
- println!(" --save-every Sauvegarder le modèle tous les N épisodes (défaut: 100)");
- println!(" -h, --help Afficher cette aide");
- println!();
- println!("EXEMPLES:");
- println!(" cargo run --bin=train_dqn");
- println!(" cargo run --bin=train_dqn -- --episodes 5000 --save-every 500");
- println!(" cargo run --bin=train_dqn -- --model-path models/my_model --episodes 2000");
-}
diff --git a/bot/src/dqn_simple/mod.rs b/bot/src/dqn_simple/mod.rs
deleted file mode 100644
index 8090a29..0000000
--- a/bot/src/dqn_simple/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub mod dqn_model;
-pub mod dqn_trainer;
diff --git a/bot/src/lib.rs b/bot/src/lib.rs
index dab36be..0fc6fdf 100644
--- a/bot/src/lib.rs
+++ b/bot/src/lib.rs
@@ -1,14 +1,11 @@
pub mod burnrl;
-pub mod dqn_simple;
pub mod strategy;
pub mod training_common;
-pub mod training_common_big;
pub mod trictrac_board;
use log::debug;
use store::{CheckerMove, Color, GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage};
pub use strategy::default::DefaultStrategy;
-pub use strategy::dqn::DqnStrategy;
pub use strategy::dqnburn::DqnBurnStrategy;
pub use strategy::erroneous_moves::ErroneousStrategy;
pub use strategy::random::RandomStrategy;
diff --git a/bot/src/strategy/dqn.rs b/bot/src/strategy/dqn.rs
deleted file mode 100644
index 2874195..0000000
--- a/bot/src/strategy/dqn.rs
+++ /dev/null
@@ -1,174 +0,0 @@
-use crate::{BotStrategy, CheckerMove, Color, GameState, PlayerId};
-use log::info;
-use std::path::Path;
-use store::MoveRules;
-
-use crate::dqn_simple::dqn_model::SimpleNeuralNetwork;
-use crate::training_common_big::{get_valid_actions, sample_valid_action, TrictracAction};
-
-/// Stratégie DQN pour le bot - ne fait que charger et utiliser un modèle pré-entraîné
-#[derive(Debug)]
-pub struct DqnStrategy {
- pub game: GameState,
- pub player_id: PlayerId,
- pub color: Color,
- pub model: Option,
-}
-
-impl Default for DqnStrategy {
- fn default() -> Self {
- Self {
- game: GameState::default(),
- player_id: 1,
- color: Color::White,
- model: None,
- }
- }
-}
-
-impl DqnStrategy {
- pub fn new() -> Self {
- Self::default()
- }
-
- pub fn new_with_model + std::fmt::Debug>(model_path: P) -> Self {
- let mut strategy = Self::new();
- if let Ok(model) = SimpleNeuralNetwork::load(&model_path) {
- info!("Loading model {model_path:?}");
- strategy.model = Some(model);
- }
- strategy
- }
-
- /// Utilise le modèle DQN pour choisir une action valide
- fn get_dqn_action(&self) -> Option {
- if let Some(ref model) = self.model {
- let state = self.game.to_vec_float();
- let valid_actions = get_valid_actions(&self.game);
-
- if valid_actions.is_empty() {
- return None;
- }
-
- // Obtenir les Q-values pour toutes les actions
- let q_values = model.forward(&state);
-
- // Trouver la meilleure action valide
- let mut best_action = &valid_actions[0];
- let mut best_q_value = f32::NEG_INFINITY;
-
- for action in &valid_actions {
- let action_index = action.to_action_index();
- if action_index < q_values.len() {
- let q_value = q_values[action_index];
- if q_value > best_q_value {
- best_q_value = q_value;
- best_action = action;
- }
- }
- }
-
- Some(best_action.clone())
- } else {
- // Fallback : action aléatoire valide
- sample_valid_action(&self.game)
- }
- }
-}
-
-impl BotStrategy for DqnStrategy {
- fn get_game(&self) -> &GameState {
- &self.game
- }
-
- fn get_mut_game(&mut self) -> &mut GameState {
- &mut self.game
- }
-
- fn set_color(&mut self, color: Color) {
- self.color = color;
- }
-
- fn set_player_id(&mut self, player_id: PlayerId) {
- self.player_id = player_id;
- }
-
- fn calculate_points(&self) -> u8 {
- self.game.dice_points.0
- }
-
- fn calculate_adv_points(&self) -> u8 {
- self.game.dice_points.1
- }
-
- fn choose_go(&self) -> bool {
- // Utiliser le DQN pour décider si on continue
- if let Some(action) = self.get_dqn_action() {
- matches!(action, TrictracAction::Go)
- } else {
- // Fallback : toujours continuer
- true
- }
- }
-
- fn choose_move(&self) -> (CheckerMove, CheckerMove) {
- // Utiliser le DQN pour choisir le mouvement
- if let Some(TrictracAction::Move {
- dice_order,
- from1,
- from2,
- }) = self.get_dqn_action()
- {
- let dicevals = self.game.dice.values;
- let (mut dice1, mut dice2) = if dice_order {
- (dicevals.0, dicevals.1)
- } else {
- (dicevals.1, dicevals.0)
- };
-
- if from1 == 0 {
- // empty move
- dice1 = 0;
- }
- let mut to1 = from1 + dice1 as usize;
- if 24 < to1 {
- // sortie
- to1 = 0;
- }
- if from2 == 0 {
- // empty move
- dice2 = 0;
- }
- let mut to2 = from2 + dice2 as usize;
- if 24 < to2 {
- // sortie
- to2 = 0;
- }
-
- let checker_move1 = CheckerMove::new(from1, to1).unwrap_or_default();
- let checker_move2 = CheckerMove::new(from2, to2).unwrap_or_default();
-
- let chosen_move = if self.color == Color::White {
- (checker_move1, checker_move2)
- } else {
- (checker_move1.mirror(), checker_move2.mirror())
- };
-
- return chosen_move;
- }
-
- // Fallback : utiliser la stratégie par défaut
- let rules = MoveRules::new(&self.color, &self.game.board, self.game.dice);
- let possible_moves = rules.get_possible_moves_sequences(true, vec![]);
-
- let chosen_move = *possible_moves
- .first()
- .unwrap_or(&(CheckerMove::default(), CheckerMove::default()));
-
- if self.color == Color::White {
- chosen_move
- } else {
- (chosen_move.0.mirror(), chosen_move.1.mirror())
- }
- }
-}
diff --git a/bot/src/strategy/mod.rs b/bot/src/strategy/mod.rs
index b9fa3b2..00293cb 100644
--- a/bot/src/strategy/mod.rs
+++ b/bot/src/strategy/mod.rs
@@ -1,6 +1,5 @@
pub mod client;
pub mod default;
-pub mod dqn;
pub mod dqnburn;
pub mod erroneous_moves;
pub mod random;
diff --git a/bot/src/training_common.rs b/bot/src/training_common.rs
index 0a581dd..ee33d0c 100644
--- a/bot/src/training_common.rs
+++ b/bot/src/training_common.rs
@@ -1,9 +1,15 @@
+/// training_common.rs : environnement avec espace d'actions optimisé
+/// (514 au lieu de 1252 pour training_common_big.rs de la branche 'big_and_full' )
use std::cmp::{max, min};
use std::fmt::{Debug, Display, Formatter};
use serde::{Deserialize, Serialize};
use store::{CheckerMove, GameEvent, GameState};
+// 1 (Roll) + 1 (Go) + mouvements possibles
+// Pour les mouvements : 2*16*16 = 514 (choix du dé + choix de la dame 0-15 pour chaque from)
+pub const ACTION_SPACE_SIZE: usize = 514;
+
/// Types d'actions possibles dans le jeu
#[derive(Debug, Copy, Clone, Eq, Serialize, Deserialize, PartialEq)]
pub enum TrictracAction {
@@ -158,10 +164,7 @@ impl TrictracAction {
/// Retourne la taille de l'espace d'actions total
pub fn action_space_size() -> usize {
- // 1 (Roll) + 1 (Go) + mouvements possibles
- // Pour les mouvements : 2*25*25 = 1250 (choix du dé + position 0-24 pour chaque from)
- // Mais on peut optimiser en limitant aux positions valides (1-24)
- 2 + (2 * 16 * 16) // = 514
+ ACTION_SPACE_SIZE
}
// pub fn to_game_event(&self, player_id: PlayerId, dice: Dice) -> GameEvent {
@@ -225,7 +228,11 @@ pub fn get_valid_actions(game_state: &crate::GameState) -> Vec {
}
TurnStage::Move => {
let rules = store::MoveRules::new(&color, &game_state.board, game_state.dice);
- let possible_moves = rules.get_possible_moves_sequences(true, vec![]);
+ let mut possible_moves = rules.get_possible_moves_sequences(true, vec![]);
+ if possible_moves.is_empty() {
+ // Empty move
+ possible_moves.push((CheckerMove::default(), CheckerMove::default()));
+ }
// Modififier checker_moves_to_trictrac_action si on doit gérer Black
assert_eq!(color, store::Color::White);
diff --git a/bot/src/training_common_big.rs b/bot/src/training_common_big.rs
deleted file mode 100644
index db9ee2b..0000000
--- a/bot/src/training_common_big.rs
+++ /dev/null
@@ -1,262 +0,0 @@
-use std::cmp::{max, min};
-
-use serde::{Deserialize, Serialize};
-use store::{CheckerMove, Dice};
-
-/// Types d'actions possibles dans le jeu
-#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
-pub enum TrictracAction {
- /// Lancer les dés
- Roll,
- /// Continuer après avoir gagné un trou
- Go,
- /// Effectuer un mouvement de pions
- Move {
- dice_order: bool, // true = utiliser dice[0] en premier, false = dice[1] en premier
- from1: usize, // position de départ du premier pion (0-24)
- from2: usize, // position de départ du deuxième pion (0-24)
- },
- // Marquer les points : à activer si support des écoles
- // Mark,
-}
-
-impl TrictracAction {
- /// Encode une action en index pour le réseau de neurones
- pub fn to_action_index(&self) -> usize {
- match self {
- TrictracAction::Roll => 0,
- TrictracAction::Go => 1,
- TrictracAction::Move {
- dice_order,
- from1,
- from2,
- } => {
- // Encoder les mouvements dans l'espace d'actions
- // Indices 2+ pour les mouvements
- // de 2 à 1251 (2 à 626 pour dé 1 en premier, 627 à 1251 pour dé 2 en premier)
- let mut start = 2;
- if !dice_order {
- // 25 * 25 = 625
- start += 625;
- }
- start + from1 * 25 + from2
- } // TrictracAction::Mark => 1252,
- }
- }
-
- /// Décode un index d'action en TrictracAction
- pub fn from_action_index(index: usize) -> Option {
- match index {
- 0 => Some(TrictracAction::Roll),
- // 1252 => Some(TrictracAction::Mark),
- 1 => Some(TrictracAction::Go),
- i if i >= 3 => {
- let move_code = i - 3;
- let (dice_order, from1, from2) = Self::decode_move(move_code);
- Some(TrictracAction::Move {
- dice_order,
- from1,
- from2,
- })
- }
- _ => None,
- }
- }
-
- /// Décode un entier en paire de mouvements
- fn decode_move(code: usize) -> (bool, usize, usize) {
- let mut encoded = code;
- let dice_order = code < 626;
- if !dice_order {
- encoded -= 625
- }
- let from1 = encoded / 25;
- let from2 = 1 + encoded % 25;
- (dice_order, from1, from2)
- }
-
- /// Retourne la taille de l'espace d'actions total
- pub fn action_space_size() -> usize {
- // 1 (Roll) + 1 (Go) + mouvements possibles
- // Pour les mouvements : 2*25*25 = 1250 (choix du dé + position 0-24 pour chaque from)
- // Mais on peut optimiser en limitant aux positions valides (1-24)
- 2 + (2 * 25 * 25) // = 1252
- }
-
- // pub fn to_game_event(&self, player_id: PlayerId, dice: Dice) -> GameEvent {
- // match action {
- // TrictracAction::Roll => Some(GameEvent::Roll { player_id }),
- // TrictracAction::Mark => Some(GameEvent::Mark { player_id, points }),
- // TrictracAction::Go => Some(GameEvent::Go { player_id }),
- // TrictracAction::Move {
- // dice_order,
- // from1,
- // from2,
- // } => {
- // // Effectuer un mouvement
- // let checker_move1 = store::CheckerMove::new(move1.0, move1.1).unwrap_or_default();
- // let checker_move2 = store::CheckerMove::new(move2.0, move2.1).unwrap_or_default();
- //
- // Some(GameEvent::Move {
- // player_id: self.agent_player_id,
- // moves: (checker_move1, checker_move2),
- // })
- // }
- // };
- // }
-}
-
-/// Obtient les actions valides pour l'état de jeu actuel
-pub fn get_valid_actions(game_state: &crate::GameState) -> Vec {
- use store::TurnStage;
-
- let mut valid_actions = Vec::new();
-
- let active_player_id = game_state.active_player_id;
- let player_color = game_state.player_color_by_id(&active_player_id);
-
- if let Some(color) = player_color {
- match game_state.turn_stage {
- TurnStage::RollDice => {
- valid_actions.push(TrictracAction::Roll);
- }
- TurnStage::MarkPoints | TurnStage::MarkAdvPoints | TurnStage::RollWaiting => {
- panic!(
- "get_valid_actions not implemented for turn stage {:?}",
- game_state.turn_stage
- );
- // valid_actions.push(TrictracAction::Mark);
- }
- TurnStage::HoldOrGoChoice => {
- valid_actions.push(TrictracAction::Go);
-
- // Ajoute aussi les mouvements possibles
- let rules = store::MoveRules::new(&color, &game_state.board, game_state.dice);
- let possible_moves = rules.get_possible_moves_sequences(true, vec![]);
-
- // Modififier checker_moves_to_trictrac_action si on doit gérer Black
- assert_eq!(color, store::Color::White);
- for (move1, move2) in possible_moves {
- valid_actions.push(checker_moves_to_trictrac_action(
- &move1,
- &move2,
- &game_state.dice,
- ));
- }
- }
- TurnStage::Move => {
- let rules = store::MoveRules::new(&color, &game_state.board, game_state.dice);
- let possible_moves = rules.get_possible_moves_sequences(true, vec![]);
-
- // Modififier checker_moves_to_trictrac_action si on doit gérer Black
- assert_eq!(color, store::Color::White);
- for (move1, move2) in possible_moves {
- valid_actions.push(checker_moves_to_trictrac_action(
- &move1,
- &move2,
- &game_state.dice,
- ));
- }
- }
- }
- }
-
- if valid_actions.is_empty() {
- panic!("empty valid_actions for state {game_state}");
- }
- valid_actions
-}
-
-// Valid only for White player
-fn checker_moves_to_trictrac_action(
- move1: &CheckerMove,
- move2: &CheckerMove,
- dice: &Dice,
-) -> TrictracAction {
- let to1 = move1.get_to();
- let to2 = move2.get_to();
- let from1 = move1.get_from();
- let from2 = move2.get_from();
-
- let mut diff_move1 = if to1 > 0 {
- // Mouvement sans sortie
- to1 - from1
- } else {
- // sortie, on utilise la valeur du dé
- if to2 > 0 {
- // sortie pour le mouvement 1 uniquement
- let dice2 = to2 - from2;
- if dice2 == dice.values.0 as usize {
- dice.values.1 as usize
- } else {
- dice.values.0 as usize
- }
- } else {
- // double sortie
- if from1 < from2 {
- max(dice.values.0, dice.values.1) as usize
- } else {
- min(dice.values.0, dice.values.1) as usize
- }
- }
- };
-
- // modification de diff_move1 si on est dans le cas d'un mouvement par puissance
- let rest_field = 12;
- if to1 == rest_field
- && to2 == rest_field
- && max(dice.values.0 as usize, dice.values.1 as usize) + min(from1, from2) != rest_field
- {
- // prise par puissance
- diff_move1 += 1;
- }
- TrictracAction::Move {
- dice_order: diff_move1 == dice.values.0 as usize,
- from1: move1.get_from(),
- from2: move2.get_from(),
- }
-}
-
-/// Retourne les indices des actions valides
-pub fn get_valid_action_indices(game_state: &crate::GameState) -> Vec {
- get_valid_actions(game_state)
- .into_iter()
- .map(|action| action.to_action_index())
- .collect()
-}
-
-/// Sélectionne une action valide aléatoire
-pub fn sample_valid_action(game_state: &crate::GameState) -> Option {
- use rand::{seq::SliceRandom, thread_rng};
-
- let valid_actions = get_valid_actions(game_state);
- let mut rng = thread_rng();
- valid_actions.choose(&mut rng).cloned()
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn to_action_index() {
- let action = TrictracAction::Move {
- dice_order: true,
- from1: 3,
- from2: 4,
- };
- let index = action.to_action_index();
- assert_eq!(Some(action), TrictracAction::from_action_index(index));
- assert_eq!(81, index);
- }
-
- #[test]
- fn from_action_index() {
- let action = TrictracAction::Move {
- dice_order: true,
- from1: 3,
- from2: 4,
- };
- assert_eq!(Some(action), TrictracAction::from_action_index(81));
- }
-}
diff --git a/bot/src/trictrac_board.rs b/bot/src/trictrac_board.rs
index 01b2a82..5e9fc7f 100644
--- a/bot/src/trictrac_board.rs
+++ b/bot/src/trictrac_board.rs
@@ -6,10 +6,11 @@ use board_game::board::{
use board_game::impl_unit_symmetry_board;
use internal_iterator::InternalIterator;
use std::fmt;
+use std::hash::Hash;
use std::ops::ControlFlow;
use store::Color;
-#[derive(Clone, Debug, Eq, PartialEq)]
+#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct TrictracBoard(crate::GameState);
impl Default for TrictracBoard {
@@ -77,6 +78,20 @@ impl BoardGameBoard for TrictracBoard {
}
}
+impl TrictracBoard {
+ pub fn inner(&self) -> &crate::GameState {
+ &self.0
+ }
+
+ pub fn to_fen(&self) -> String {
+ self.0.to_string_id()
+ }
+
+ pub fn from_fen(fen: &str) -> Result {
+ crate::GameState::from_string_id(fen).map(TrictracBoard)
+ }
+}
+
impl<'a> BoardMoves<'a, TrictracBoard> for TrictracBoard {
type AllMovesIterator = TrictracAllMovesIterator;
type AvailableMovesIterator = TrictracAvailableMovesIterator<'a>;
diff --git a/client_bevy/.cargo/config.toml b/client_bevy/.cargo/config.toml
deleted file mode 100644
index b6bc0d3..0000000
--- a/client_bevy/.cargo/config.toml
+++ /dev/null
@@ -1,8 +0,0 @@
-[target.x86_64-unknown-linux-gnu]
-linker = "clang"
-rustflags = ["-Clink-arg=-fuse-ld=lld", "-Zshare-generics=y"]
-
-# Optional: Uncommenting the following improves compile times, but reduces the amount of debug info to 'line number tables only'
-# In most cases the gains are negligible, but if you are on macos and have slow compile times you should see significant gains.
-#[profile.dev]
-#debug = 1
diff --git a/client_bevy/Cargo.toml b/client_bevy/Cargo.toml
deleted file mode 100644
index aaa6b7d..0000000
--- a/client_bevy/Cargo.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-[package]
-name = "trictrac-client"
-version = "0.1.0"
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-anyhow = "1.0.75"
-bevy = { version = "0.11.3" }
-bevy_renet = "0.0.9"
-bincode = "1.3.3"
-renet = "0.0.13"
-store = { path = "../store" }
diff --git a/client_bevy/assets/Inconsolata.ttf b/client_bevy/assets/Inconsolata.ttf
deleted file mode 100644
index 34848ca..0000000
Binary files a/client_bevy/assets/Inconsolata.ttf and /dev/null differ
diff --git a/client_bevy/assets/board.png b/client_bevy/assets/board.png
deleted file mode 100644
index 5d16ac3..0000000
Binary files a/client_bevy/assets/board.png and /dev/null differ
diff --git a/client_bevy/assets/sound/click.wav b/client_bevy/assets/sound/click.wav
deleted file mode 100644
index 8b6c99d..0000000
Binary files a/client_bevy/assets/sound/click.wav and /dev/null differ
diff --git a/client_bevy/assets/sound/throw.wav b/client_bevy/assets/sound/throw.wav
deleted file mode 100755
index cb5e438..0000000
Binary files a/client_bevy/assets/sound/throw.wav and /dev/null differ
diff --git a/client_bevy/assets/tac.png b/client_bevy/assets/tac.png
deleted file mode 100644
index 2c18813..0000000
Binary files a/client_bevy/assets/tac.png and /dev/null differ
diff --git a/client_bevy/assets/tic.png b/client_bevy/assets/tic.png
deleted file mode 100644
index 786e0c7..0000000
Binary files a/client_bevy/assets/tic.png and /dev/null differ
diff --git a/client_bevy/src/main.rs b/client_bevy/src/main.rs
deleted file mode 100644
index 504602e..0000000
--- a/client_bevy/src/main.rs
+++ /dev/null
@@ -1,334 +0,0 @@
-use std::{net::UdpSocket, time::SystemTime};
-
-use renet::transport::{NetcodeClientTransport, NetcodeTransportError, NETCODE_USER_DATA_BYTES};
-use store::{GameEvent, GameState, CheckerMove};
-
-use bevy::prelude::*;
-use bevy::window::PrimaryWindow;
-use bevy_renet::{
- renet::{transport::ClientAuthentication, ConnectionConfig, RenetClient},
- transport::{client_connected, NetcodeClientPlugin},
- RenetClientPlugin,
-};
-
-#[derive(Debug, Resource)]
-struct CurrentClientId(u64);
-
-#[derive(Resource)]
-struct BevyGameState(GameState);
-
-impl Default for BevyGameState {
- fn default() -> Self {
- Self {
- 0: GameState::default(),
- }
- }
-}
-
-#[derive(Resource, Deref, DerefMut)]
-struct GameUIState {
- selected_tile: Option,
-}
-
-impl Default for GameUIState {
- fn default() -> Self {
- Self {
- selected_tile: None,
- }
- }
-}
-
-#[derive(Event)]
-struct BevyGameEvent(GameEvent);
-
-// This id needs to be the same as the server is using
-const PROTOCOL_ID: u64 = 2878;
-
-fn main() {
- // Get username from stdin args
- let args = std::env::args().collect::>();
- let username = &args[1];
-
- let (client, transport, client_id) = new_renet_client(&username).unwrap();
- App::new()
- // Lets add a nice dark grey background color
- .insert_resource(ClearColor(Color::hex("282828").unwrap()))
- .add_plugins(DefaultPlugins.set(WindowPlugin {
- primary_window: Some(Window {
- // Adding the username to the window title makes debugging a whole lot easier.
- title: format!("TricTrac <{}>", username),
- resolution: (1080.0, 1080.0).into(),
- ..default()
- }),
- ..default()
- }))
- // Add our game state and register GameEvent as a bevy event
- .insert_resource(BevyGameState::default())
- .insert_resource(GameUIState::default())
- .add_event::()
- // Renet setup
- .add_plugins(RenetClientPlugin)
- .add_plugins(NetcodeClientPlugin)
- .insert_resource(client)
- .insert_resource(transport)
- .insert_resource(CurrentClientId(client_id))
- .add_systems(Startup, setup)
- .add_systems(Update, (update_waiting_text, input, update_board, panic_on_error_system))
- .add_systems(
- PostUpdate,
- receive_events_from_server.run_if(client_connected()),
- )
- .run();
-}
-
-////////// COMPONENTS //////////
-#[derive(Component)]
-struct UIRoot;
-
-#[derive(Component)]
-struct WaitingText;
-
-#[derive(Component)]
-struct Board {
- squares: [Square; 26]
-}
-
-impl Default for Board {
- fn default() -> Self {
- Self {
- squares: [Square { count: 0, color: None, position: 0}; 26]
- }
- }
-}
-
-impl Board {
- fn square_at(&self, position: usize) -> Square {
- self.squares[position]
- }
-}
-
-#[derive(Component, Clone, Copy)]
-struct Square {
- count: usize,
- color: Option,
- position: usize,
-}
-
-////////// UPDATE SYSTEMS //////////
-fn update_board(
- mut commands: Commands,
- game_state: Res,
- mut game_events: EventReader,
- asset_server: Res,
-) {
- for event in game_events.iter() {
- match event.0 {
- GameEvent::Move { player_id, moves } => {
- // trictrac positions, TODO : dépend de player_id
- let (x, y) = if moves.0.get_to() < 13 { (13 - moves.0.get_to(), 1) } else { (moves.0.get_to() - 13, 0)};
- let texture =
- asset_server.load(match game_state.0.players[&player_id].color {
- store::Color::Black => "tac.png",
- store::Color::White => "tic.png",
- });
-
- info!("spawning tictac sprite");
- commands.spawn(SpriteBundle {
- transform: Transform::from_xyz(
- 83.0 * (x as f32 - 1.0),
- -30.0 + 540.0 * (y as f32 - 1.0),
- 0.0,
- ),
- sprite: Sprite {
- custom_size: Some(Vec2::new(83.0, 83.0)),
- ..default()
- },
- texture: texture.into(),
- ..default()
- });
- }
- _ => {}
- }
- }
-}
-
-fn update_waiting_text(mut text_query: Query<&mut Text, With>, time: Res