diff --git a/Cargo.lock b/Cargo.lock
index a71f75a..d0f6183 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -52,9 +52,9 @@ dependencies = [
[[package]]
name = "aho-corasick"
-version = "1.1.3"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
dependencies = [
"memchr",
]
@@ -70,9 +70,9 @@ dependencies = [
[[package]]
name = "allocator-api2"
-version = "0.2.21"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
[[package]]
name = "android_system_properties"
@@ -85,9 +85,9 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.20"
+version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -100,44 +100,43 @@ dependencies = [
[[package]]
name = "anstyle"
-version = "1.0.11"
+version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
[[package]]
name = "anstyle-parse"
-version = "0.2.7"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.1.4"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
dependencies = [
- "windows-sys 0.60.2",
+ "windows-sys 0.59.0",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.10"
+version = "3.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a"
+checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
dependencies = [
"anstyle",
- "once_cell_polyfill",
- "windows-sys 0.60.2",
+ "windows-sys 0.59.0",
]
[[package]]
name = "anyhow"
-version = "1.0.99"
+version = "1.0.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
+checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
[[package]]
name = "approx"
@@ -150,9 +149,9 @@ dependencies = [
[[package]]
name = "arbitrary"
-version = "1.4.2"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
+checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
dependencies = [
"derive_arbitrary",
]
@@ -165,7 +164,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -203,9 +202,9 @@ dependencies = [
[[package]]
name = "async-channel"
-version = "2.5.0"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
+checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
dependencies = [
"concurrent-queue",
"event-listener-strategy",
@@ -213,12 +212,6 @@ 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"
@@ -227,9 +220,9 @@ checksum = "628d228f918ac3b82fe590352cc719d30664a0c13ca3a60266fe02c7132d480a"
[[package]]
name = "autocfg"
-version = "1.5.0"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "av1-grain"
@@ -247,70 +240,13 @@ dependencies = [
[[package]]
name = "avif-serialize"
-version = "0.8.6"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f"
+checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e"
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"
@@ -380,9 +316,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
[[package]]
name = "bit_field"
-version = "0.10.3"
+version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6"
+checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
[[package]]
name = "bitflags"
@@ -392,9 +328,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.9.4"
+version = "2.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
+checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
dependencies = [
"serde",
]
@@ -451,7 +387,7 @@ dependencies = [
"burn",
"burn-rl",
"confy",
- "env_logger 0.10.2",
+ "env_logger 0.10.0",
"internal-iterator",
"log",
"pretty_assertions",
@@ -480,22 +416,21 @@ checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b"
[[package]]
name = "bumpalo"
-version = "3.19.0"
+version = "3.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
[[package]]
name = "burn"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "553c652ab5d2d1a4b3f5781ea4a3b907cecc09b8bc9fa93ca934f12e13bbbc96"
+checksum = "ec639306f45bd663957465e840cfb07bcd2ae18f7c045dd9aba8cb7a69c0654a"
dependencies = [
"burn-autodiff",
"burn-candle",
"burn-core",
"burn-cuda",
"burn-ndarray",
- "burn-remote",
"burn-rocm",
"burn-router",
"burn-tch",
@@ -505,38 +440,37 @@ dependencies = [
[[package]]
name = "burn-autodiff"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cfe012cffcf0f3700a1fccc8f78db08c63ba772d63a4d11687da58afa220e13"
+checksum = "a178966322ab7ce71405f1324cdc14f79256d85a47138bbd2c8c4f0056148601"
dependencies = [
"burn-common",
"burn-tensor",
- "derive-new",
- "hashbrown 0.15.5",
+ "derive-new 0.7.0",
+ "hashbrown 0.15.4",
"log",
"num-traits",
"portable-atomic",
- "spin",
+ "spin 0.10.0",
]
[[package]]
name = "burn-candle"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb052e5c240b7fc3265a3d8137a53b7c29b678f6b7613cc5ca315217e4a8d627"
+checksum = "9ed0981b3c1d07e9df0f5bef1042921b6db6e88b5d91916fa5dbdd7f0ca921c3"
dependencies = [
- "burn-common",
"burn-tensor",
"candle-core",
- "derive-new",
+ "derive-new 0.7.0",
"half",
]
[[package]]
name = "burn-common"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a99029e20e31124a48fd9ed7a56898a878df224f7030940d40a88cc36a086cc9"
+checksum = "1c3fae76798ea4dd14e6290b6753eb6235ac28c6ceaf6da35ff8396775d5494d"
dependencies = [
"cubecl-common",
"rayon",
@@ -545,9 +479,9 @@ dependencies = [
[[package]]
name = "burn-core"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33f7a4166dfa0d7b30f5caa583d9bf01366052537f8cbd522c8a415125fe4592"
+checksum = "2afa81c868c1a9b3fad25c31176945d0cc5181ba7b77c0456bc05cf57fca975c"
dependencies = [
"ahash",
"bincode 2.0.1",
@@ -556,26 +490,26 @@ dependencies = [
"burn-derive",
"burn-tensor",
"data-encoding",
- "derive-new",
+ "derive-new 0.7.0",
"flate2",
"half",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"log",
"num-traits",
"portable-atomic-util",
- "rand 0.9.2",
+ "rand 0.9.1",
"rmp-serde",
"serde",
"serde_json",
- "spin",
+ "spin 0.10.0",
"uuid",
]
[[package]]
name = "burn-cubecl"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cec89330675dabf02ba979ddf6874c2bd38d17d398a446e83a8c7b586536a940"
+checksum = "c547cbe414274ab4022abcc85993e1e41aa7cdccc92395ba5658acfdac285e07"
dependencies = [
"burn-common",
"burn-cubecl-fusion",
@@ -584,121 +518,122 @@ dependencies = [
"burn-tensor",
"bytemuck",
"cubecl",
- "derive-new",
+ "cubecl-std",
+ "derive-new 0.7.0",
"futures-lite",
"half",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"log",
"num-traits",
- "rand 0.9.2",
+ "rand 0.9.1",
"serde",
- "spin",
+ "spin 0.10.0",
"text_placeholder",
]
[[package]]
name = "burn-cubecl-fusion"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "823fdd0fc98a5a2adcfa5fb6ff0791652db07aa72d68c0ab9cedd31188f01b0e"
+checksum = "c98a5cf4d17f2db71f68c44bda21bb85fe8fe06166ea83fdd2eaff557da7fc86"
dependencies = [
"burn-common",
"burn-fusion",
"burn-ir",
"burn-tensor",
"cubecl",
- "derive-new",
+ "derive-new 0.7.0",
"half",
"serde",
]
[[package]]
name = "burn-cuda"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a0d9909ff711c13a416a5212111a6c85defce9a5e194752a012e79b27a107f9"
+checksum = "995bd0b3f52a4cfe0cfe47c16b40b3fd33285d17a086dd583e5b432074857e02"
dependencies = [
"burn-cubecl",
"burn-fusion",
"burn-tensor",
"bytemuck",
"cubecl",
- "derive-new",
+ "derive-new 0.7.0",
"half",
"log",
]
[[package]]
name = "burn-dataset"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9737c7dd9c40ce2c194e0aa5bbc5af6d333093227e4e27ab1e38187ff592d6c3"
+checksum = "136c784dfc474c822f34d69e865f88a5675e9de9803ef38cee4ce14cdba34d54"
dependencies = [
"csv",
- "derive-new",
- "dirs",
+ "derive-new 0.7.0",
+ "dirs 6.0.0",
"gix-tempfile",
"image",
"r2d2",
"r2d2_sqlite",
- "rand 0.9.2",
+ "rand 0.9.1",
"rmp-serde",
"rusqlite",
- "sanitize-filename",
+ "sanitize-filename 0.6.0",
"serde",
"serde_json",
"serde_rusqlite",
- "strum 0.27.2",
+ "strum 0.27.1",
"tempfile",
- "thiserror 2.0.16",
+ "thiserror 2.0.12",
]
[[package]]
name = "burn-derive"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64e901ae21fa532d237168fe963db9bf2ff1d73c8fbde2c7cffe1cdbae107499"
+checksum = "12e9f07ccc658ef072bce2e996f0c38c80ee4c241598b6557afe1877dd87ae98"
dependencies = [
- "derive-new",
+ "derive-new 0.7.0",
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
name = "burn-fusion"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a97673bcc1f574d23d505605af943a9f84a495d8abd0af48b496927a004912c7"
+checksum = "f9ed8e016795ec066c1028fc0d395a00bd5459922b4fa0eeae839b4d4ec58c45"
dependencies = [
"burn-common",
"burn-ir",
"burn-tensor",
- "derive-new",
+ "derive-new 0.7.0",
"half",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"log",
"serde",
- "spin",
+ "spin 0.10.0",
]
[[package]]
name = "burn-ir"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf45587016162b5ec6764dd4b79ee43c85d1d04bb4850fccce97fe672c4e6fbb"
+checksum = "d63629f2c8b82ee52dbb9c18becded5117c2faf57365dc271a55c16d139cd91a"
dependencies = [
"burn-tensor",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"portable-atomic-util",
"serde",
]
[[package]]
name = "burn-ndarray"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6518dc3956cba8f6c8a747e498029e93b22727720c0bc4ebebef35fe447dfe02"
+checksum = "7e883846578e6915e1dbaeeb5bce32cc04cff03e7cb79c5836e1e888bbce974f"
dependencies = [
"atomic_float",
"burn-autodiff",
@@ -706,7 +641,7 @@ dependencies = [
"burn-ir",
"burn-tensor",
"bytemuck",
- "derive-new",
+ "derive-new 0.7.0",
"itertools 0.14.0",
"libm",
"macerator",
@@ -715,40 +650,15 @@ dependencies = [
"num-traits",
"paste",
"portable-atomic-util",
- "rand 0.9.2",
+ "rand 0.9.1",
"seq-macro",
- "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",
+ "spin 0.10.0",
]
[[package]]
name = "burn-rl"
version = "0.1.0"
-source = "git+https://github.com/yunjhongwu/burn-rl-examples.git#ef6e5d0644aff93fcb3e0d994fbd2722f6df2b42"
+source = "git+https://github.com/yunjhongwu/burn-rl-examples.git#4d59261f26429f9df16dabd2b183f7fccd27ff9a"
dependencies = [
"burn",
"gym-rs",
@@ -759,39 +669,39 @@ dependencies = [
[[package]]
name = "burn-rocm"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f2e74851c0e2fc600a0362544cd4cfccf0519ba11ab530734be30a79683c0ff"
+checksum = "bd39d58202558b65b575921b57bff933845e6171296e2b8faf6a9d3610a344c5"
dependencies = [
"burn-cubecl",
"burn-fusion",
"burn-tensor",
"bytemuck",
"cubecl",
- "derive-new",
+ "derive-new 0.7.0",
"half",
"log",
]
[[package]]
name = "burn-router"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37b0566c0414f63b7353c222231f075ed29bc55eb0fed9f4123edfd3a1ed4ac3"
+checksum = "22ed8614e180f7a58f77e658bd52e206d2f4a1ee37fcb4665c635ea9da90ea8b"
dependencies = [
"burn-common",
"burn-ir",
"burn-tensor",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"log",
- "spin",
+ "spin 0.10.0",
]
[[package]]
name = "burn-tch"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af0d68925516a49d841e23395ec095ccff2c5983a9a9d3dad3ee8240898a3fb7"
+checksum = "cacd39695f87086360a6457fa912062b2bbc04deacb281361539cf1bf6dcfac5"
dependencies = [
"burn-tensor",
"cc",
@@ -804,19 +714,19 @@ dependencies = [
[[package]]
name = "burn-tensor"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5719aec856f198aea8ac6bd859d2a9e88a626bafbb343a558614ec9ec9fb8605"
+checksum = "2a70d1562c0d00083939e34daad61dabebb0f8bc8c250d1ef2f5efc31eb93aaf"
dependencies = [
"burn-common",
"bytemuck",
"colored",
"cubecl",
- "derive-new",
+ "derive-new 0.7.0",
"half",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"num-traits",
- "rand 0.9.2",
+ "rand 0.9.1",
"rand_distr",
"serde",
"serde_bytes",
@@ -824,17 +734,17 @@ dependencies = [
[[package]]
name = "burn-train"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35f3b4ca82423a0c7652cab75c37f9446dc9315c624231783185abd10ecebe71"
+checksum = "140182cf5f1255d60e1d8c677fa45c6f71018c3c3c66aad093a9e4c3c222cf1c"
dependencies = [
"async-channel",
"burn-core",
"burn-ndarray",
- "derive-new",
+ "derive-new 0.7.0",
"log",
"nvml-wrapper",
- "ratatui",
+ "ratatui 0.29.0",
"rstest",
"serde",
"sysinfo",
@@ -846,9 +756,9 @@ dependencies = [
[[package]]
name = "burn-wgpu"
-version = "0.18.0"
+version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d59fcb1d419fe44700cac10b59e5dda0e1512e8f8d7199073c172d88ba964b8f"
+checksum = "215bf0e641a27e17bcd3941a11867dcda411c9cb009488c6b6650c8206437c30"
dependencies = [
"burn-cubecl",
"burn-fusion",
@@ -858,22 +768,22 @@ dependencies = [
[[package]]
name = "bytemuck"
-version = "1.23.2"
+version = "1.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677"
+checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422"
dependencies = [
"bytemuck_derive",
]
[[package]]
name = "bytemuck_derive"
-version = "1.10.1"
+version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29"
+checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -890,9 +800,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
[[package]]
name = "bytes"
-version = "1.10.1"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
[[package]]
name = "bytesize"
@@ -938,13 +848,13 @@ dependencies = [
"memmap2",
"num-traits",
"num_cpus",
- "rand 0.9.2",
+ "rand 0.9.1",
"rand_distr",
"rayon",
"safetensors 0.4.5",
"thiserror 1.0.69",
"ug",
- "yoke 0.7.5",
+ "yoke",
"zip 1.1.4",
]
@@ -962,20 +872,19 @@ checksum = "c4f8d981c476baadf74cd52897866a1d279d3e14e2d5e2d9af045210e0ae6128"
[[package]]
name = "castaway"
-version = "0.2.4"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
+checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5"
dependencies = [
"rustversion",
]
[[package]]
name = "cc"
-version = "1.2.36"
+version = "1.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54"
+checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
dependencies = [
- "find-msvc-tools",
"jobserver",
"libc",
"shlex",
@@ -993,9 +902,9 @@ dependencies = [
[[package]]
name = "cfg-if"
-version = "1.0.3"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
@@ -1057,7 +966,7 @@ dependencies = [
"anyhow",
"bincode 1.3.3",
"bot",
- "env_logger 0.11.8",
+ "env_logger 0.11.6",
"itertools 0.13.0",
"log",
"pico-args",
@@ -1066,6 +975,17 @@ 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"
@@ -1094,9 +1014,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
name = "colorchoice"
-version = "1.0.4"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]]
name = "colored"
@@ -1109,9 +1029,9 @@ dependencies = [
[[package]]
name = "compact_str"
-version = "0.8.1"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32"
+checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644"
dependencies = [
"castaway",
"cfg-if",
@@ -1138,8 +1058,8 @@ checksum = "f29222b549d4e3ded127989d523da9e928918d0d0d7f7c1690b439d0d538bae9"
dependencies = [
"directories",
"serde",
- "thiserror 2.0.16",
- "toml 0.8.23",
+ "thiserror 2.0.12",
+ "toml",
]
[[package]]
@@ -1177,28 +1097,22 @@ dependencies = [
[[package]]
name = "cpufeatures"
-version = "0.2.17"
+version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
-version = "1.5.0"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
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"
@@ -1239,11 +1153,11 @@ version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"crossterm_winapi",
"mio",
"parking_lot",
- "rustix 0.38.44",
+ "rustix 0.38.37",
"signal-hook",
"signal-hook-mio",
"winapi",
@@ -1260,9 +1174,9 @@ dependencies = [
[[package]]
name = "crunchy"
-version = "0.2.4"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
+checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
[[package]]
name = "crypto-common"
@@ -1298,16 +1212,14 @@ dependencies = [
[[package]]
name = "cubecl"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b418aabe526efb2d2714b9282a583bccbc555fe2e42546101259b2042bc133fa"
+checksum = "b1e438056cf7c25b3adde38240b89842e1c924b8e914731c82ad81161d23e6ff"
dependencies = [
- "cubecl-convolution",
"cubecl-core",
"cubecl-cuda",
"cubecl-hip",
- "cubecl-matmul",
- "cubecl-random",
+ "cubecl-linalg",
"cubecl-reduce",
"cubecl-runtime",
"cubecl-std",
@@ -1317,66 +1229,44 @@ dependencies = [
[[package]]
name = "cubecl-common"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff2bed7d9aa1a2fe640696067cab6b0b1b40dd30cdb8d12f91ae43ca6392498e"
+checksum = "79251bfc7f067ac9038232fe38a317adc2f31cb2fc3800e69fd409ccac7abc1f"
dependencies = [
"bytemuck",
- "cfg-if",
- "derive-new",
+ "derive-new 0.6.0",
"derive_more",
- "dirs",
+ "dirs 5.0.1",
"embassy-futures",
- "embassy-time",
"futures-lite",
"half",
- "hashbrown 0.15.5",
+ "hashbrown 0.14.5",
"log",
"num-traits",
"portable-atomic",
- "rand 0.9.2",
- "sanitize-filename",
+ "rand 0.9.1",
+ "sanitize-filename 0.5.0",
"serde",
"serde_json",
- "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",
+ "spin 0.9.8",
]
[[package]]
name = "cubecl-core"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc4c683bb3ed715eed12cfeca6599dc554efb9371e85f783eb7c3ae0d3781274"
+checksum = "b03bf4211cdbd68bb0fb8291e0ed825c13da0d1ac01b7c02dce3cee44a6138be"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"bytemuck",
"cubecl-common",
"cubecl-ir",
"cubecl-macros",
"cubecl-runtime",
- "derive-new",
+ "derive-new 0.6.0",
"derive_more",
"half",
- "hashbrown 0.15.5",
+ "hashbrown 0.14.5",
"log",
"num-traits",
"paste",
@@ -1387,24 +1277,24 @@ dependencies = [
[[package]]
name = "cubecl-cpp"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d06ed3e34f0a9f0a1ca225fc3351865a2ddf66966c73a7953dd27f1bbaed9b9"
+checksum = "a5eef85cbcc34be7e25fc9d39edf99ed68559862dbf25c1877ebdf4a9595d31b"
dependencies = [
"bytemuck",
"cubecl-common",
"cubecl-core",
"cubecl-runtime",
- "derive-new",
+ "derive-new 0.6.0",
"half",
"log",
]
[[package]]
name = "cubecl-cuda"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf8898be518bd3df9f7d0df8c25e95f07cfc087c6485dda42e99add432e3463b"
+checksum = "71e091e4e3a3900faff440aec4053805ec4456f94f4acc4afe8e6b27519c6d16"
dependencies = [
"bytemuck",
"cubecl-common",
@@ -1412,7 +1302,7 @@ dependencies = [
"cubecl-cpp",
"cubecl-runtime",
"cudarc",
- "derive-new",
+ "derive-new 0.6.0",
"half",
"log",
"serde",
@@ -1420,9 +1310,9 @@ dependencies = [
[[package]]
name = "cubecl-hip"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9afb1c085f8d715fd8686ad77ada69e364c9cc16a51cf10a7d65ad88d760b6b"
+checksum = "0c2f8c00207517de61cccdc4ca2724bc1db9dab94840beaf4329e43cead3bc4a"
dependencies = [
"bytemuck",
"cubecl-common",
@@ -1430,7 +1320,7 @@ dependencies = [
"cubecl-cpp",
"cubecl-hip-sys",
"cubecl-runtime",
- "derive-new",
+ "derive-new 0.6.0",
"half",
"log",
"paste",
@@ -1438,19 +1328,18 @@ dependencies = [
[[package]]
name = "cubecl-hip-sys"
-version = "6.4.4348201"
+version = "6.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "678a20e5e38ce9c772bdd53596f2801ef210ae735ec2d7d46b5d5b675c09d929"
+checksum = "9f7557762176858fa0357504025f09ae6e979c3547776ff8b6a1025ef0702450"
dependencies = [
"libc",
- "regex",
]
[[package]]
name = "cubecl-ir"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbb72454fb17da66e60f98a011cce199ff0bb78c4e465236459af619039b6cd5"
+checksum = "e096d77646590f0180ed4ce1aa7df4ecc7219f3c4616e9fe72d93ab63a352855"
dependencies = [
"cubecl-common",
"cubecl-macros-internal",
@@ -1458,7 +1347,7 @@ dependencies = [
"float-ord",
"fnv",
"half",
- "hashbrown 0.15.5",
+ "hashbrown 0.14.5",
"num-traits",
"portable-atomic",
"serde",
@@ -1466,43 +1355,14 @@ dependencies = [
]
[[package]]
-name = "cubecl-macros"
-version = "0.6.0"
+name = "cubecl-linalg"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-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"
+checksum = "75aacf86f6004c274e63589aed55c5edcbcdf1b292eaf4ce2c1688c04c41a194"
dependencies = [
"bytemuck",
"cubecl-common",
"cubecl-core",
- "cubecl-random",
"cubecl-reduce",
"cubecl-runtime",
"cubecl-std",
@@ -1511,40 +1371,51 @@ dependencies = [
]
[[package]]
-name = "cubecl-random"
-version = "0.6.0"
+name = "cubecl-macros"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "648731639463df215c01ee209477a2f233fb5168fb50e8df755e658ddaaf29f4"
+checksum = "cd74622b5c8cb161e3f7fa0b2b751784ef89ab45acfa355f511eb2219dde337e"
dependencies = [
"cubecl-common",
- "cubecl-core",
- "cubecl-runtime",
- "cubecl-std",
- "half",
- "num-traits",
- "rand 0.9.2",
- "serde",
+ "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",
]
[[package]]
name = "cubecl-reduce"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "729e3de15783aed5c617c8c4de633765c6d0cf4b9564bb51d21dd67b4fdeeebf"
+checksum = "7afbdfe03e7e3ca71f61890ebebc6b4390494204b545e6f6bf51a43755449073"
dependencies = [
"cubecl-core",
"cubecl-runtime",
"cubecl-std",
- "half",
"num-traits",
"serde",
]
[[package]]
name = "cubecl-runtime"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68ab7c56cbb83e43fd1b52ee3d521bcb816068e0bb6f4aeb56c9bd63218b1147"
+checksum = "385234520c9e392382737f32ad372b05f345656eb798ba00b72d2722c68b698c"
dependencies = [
"async-channel",
"bytemuck",
@@ -1552,25 +1423,22 @@ dependencies = [
"cfg_aliases",
"cubecl-common",
"cubecl-ir",
- "derive-new",
- "dirs",
- "foldhash",
- "hashbrown 0.15.5",
+ "derive-new 0.6.0",
+ "hashbrown 0.14.5",
"log",
"md5",
"serde",
"serde_json",
- "spin",
- "toml 0.9.5",
+ "spin 0.9.8",
"variadics_please",
"wasm-bindgen-futures",
]
[[package]]
name = "cubecl-std"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3536c4c1c878bd77ceda959a3f157bbb69f957269e3f138c7edd72d9deb533fd"
+checksum = "38868eea6fdc183feb3c46bcf5e666c78e6cf0ddca2c4f3a877785cc0eabd71e"
dependencies = [
"cubecl-core",
"cubecl-runtime",
@@ -1580,9 +1448,9 @@ dependencies = [
[[package]]
name = "cubecl-wgpu"
-version = "0.6.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d3f068c9a81201f43cdd3f6385201b330f2499f6c24d688d82a70d705261a32"
+checksum = "77fa2dcfaa6d75cfbc5ff05cafe99ec4a7fb7c0fa7197917e0fd20f5b90979fe"
dependencies = [
"async-channel",
"bytemuck",
@@ -1591,19 +1459,19 @@ dependencies = [
"cubecl-common",
"cubecl-core",
"cubecl-runtime",
- "derive-new",
+ "derive-new 0.6.0",
"derive_more",
- "half",
- "hashbrown 0.15.5",
+ "hashbrown 0.14.5",
"log",
+ "web-time",
"wgpu",
]
[[package]]
name = "cudarc"
-version = "0.16.6"
+version = "0.13.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17200eb07e7d85a243aa1bf4569a7aa998385ba98d14833973a817a63cc86e92"
+checksum = "486c221362668c63a1636cfa51463b09574433b39029326cff40864b3ba12b6e"
dependencies = [
"libloading",
]
@@ -1614,18 +1482,8 @@ version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
dependencies = [
- "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",
+ "darling_core",
+ "darling_macro",
]
[[package]]
@@ -1639,21 +1497,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "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",
+ "syn 2.0.104",
]
[[package]]
@@ -1662,20 +1506,9 @@ version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
- "darling_core 0.20.11",
+ "darling_core",
"quote",
- "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",
+ "syn 2.0.104",
]
[[package]]
@@ -1709,9 +1542,9 @@ dependencies = [
[[package]]
name = "deranged"
-version = "0.5.3"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc"
+checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
dependencies = [
"powerfmt",
]
@@ -1727,6 +1560,17 @@ 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"
@@ -1735,38 +1579,38 @@ checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
name = "derive_arbitrary"
-version = "1.4.2"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
+checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
name = "derive_more"
-version = "2.0.1"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
+checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
dependencies = [
"derive_more-impl",
]
[[package]]
name = "derive_more-impl"
-version = "2.0.1"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
+checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
"unicode-xid",
]
@@ -1793,7 +1637,16 @@ version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d"
dependencies = [
- "dirs-sys",
+ "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",
]
[[package]]
@@ -1802,7 +1655,19 @@ version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
dependencies = [
- "dirs-sys",
+ "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",
]
[[package]]
@@ -1813,8 +1678,8 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
dependencies = [
"libc",
"option-ext",
- "redox_users",
- "windows-sys 0.61.0",
+ "redox_users 0.5.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1825,7 +1690,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -1858,65 +1723,15 @@ dependencies = [
[[package]]
name = "either"
-version = "1.15.0"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]]
name = "embassy-futures"
-version = "0.1.2"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-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",
-]
+checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067"
[[package]]
name = "enum-as-inner"
@@ -1927,7 +1742,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -1942,9 +1757,9 @@ dependencies = [
[[package]]
name = "env_logger"
-version = "0.10.2"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580"
+checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
dependencies = [
"humantime",
"is-terminal",
@@ -1955,14 +1770,14 @@ dependencies = [
[[package]]
name = "env_logger"
-version = "0.11.8"
+version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f"
+checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0"
dependencies = [
"anstream",
"anstyle",
"env_filter",
- "jiff",
+ "humantime",
"log",
]
@@ -1983,30 +1798,30 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
name = "equivalent"
-version = "1.0.2"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
-version = "0.3.13"
+version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
+checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18"
dependencies = [
"libc",
- "windows-sys 0.60.2",
+ "windows-sys 0.59.0",
]
[[package]]
name = "event-listener"
-version = "5.4.1"
+version = "5.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
+checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae"
dependencies = [
"concurrent-queue",
"parking",
@@ -2078,26 +1893,6 @@ 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"
@@ -2107,12 +1902,6 @@ 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"
@@ -2137,9 +1926,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foldhash"
-version = "0.1.5"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
[[package]]
name = "foreign-types"
@@ -2159,7 +1948,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -2170,22 +1959,13 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
[[package]]
name = "form_urlencoded"
-version = "1.2.2"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
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"
@@ -2200,9 +1980,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
[[package]]
name = "futures-lite"
-version = "2.6.1"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
+checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532"
dependencies = [
"fastrand",
"futures-core",
@@ -2219,15 +1999,9 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
-[[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"
@@ -2248,7 +2022,6 @@ checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [
"futures-core",
"futures-macro",
- "futures-sink",
"futures-task",
"pin-project-lite",
"pin-utils",
@@ -2291,7 +2064,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.6.0",
+ "raw-cpuid 11.5.0",
"seq-macro",
]
@@ -2321,7 +2094,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.6.0",
+ "raw-cpuid 11.5.0",
"seq-macro",
]
@@ -2351,7 +2124,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.6.0",
+ "raw-cpuid 11.5.0",
"seq-macro",
]
@@ -2390,7 +2163,7 @@ dependencies = [
"once_cell",
"paste",
"pulp 0.21.5",
- "raw-cpuid 11.6.0",
+ "raw-cpuid 11.5.0",
"rayon",
"seq-macro",
"sysctl 0.6.0",
@@ -2427,7 +2200,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.6.0",
+ "raw-cpuid 11.5.0",
"rayon",
"seq-macro",
]
@@ -2458,7 +2231,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.6.0",
+ "raw-cpuid 11.5.0",
"seq-macro",
]
@@ -2488,7 +2261,7 @@ dependencies = [
"num-complex",
"num-traits",
"paste",
- "raw-cpuid 11.6.0",
+ "raw-cpuid 11.5.0",
"seq-macro",
]
@@ -2510,7 +2283,7 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"libc",
- "wasi 0.11.1+wasi-snapshot-preview1",
+ "wasi 0.11.0+wasi-snapshot-preview1",
]
[[package]]
@@ -2522,14 +2295,14 @@ dependencies = [
"cfg-if",
"libc",
"r-efi",
- "wasi 0.14.3+wasi-0.2.4",
+ "wasi 0.14.2+wasi-0.2.4",
]
[[package]]
name = "gif"
-version = "0.13.3"
+version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b"
+checksum = "fcc37f9a2bfe731e69f1e08d29d91d30604b9ce24bcb2880a961e82d89c6ed89"
dependencies = [
"color_quant",
"weezl",
@@ -2563,21 +2336,21 @@ dependencies = [
"gix-features",
"gix-path",
"gix-utils",
- "thiserror 2.0.16",
+ "thiserror 2.0.12",
]
[[package]]
name = "gix-path"
-version = "0.10.20"
+version = "0.10.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06d37034a4c67bbdda76f7bcd037b2f7bc0fba0c09a6662b19697a5716e7b2fd"
+checksum = "567f65fec4ef10dfab97ae71f26a27fd4d7fe7b8e3f90c8a58551c41ff3fb65b"
dependencies = [
"bstr",
"gix-trace",
"gix-validate",
"home",
"once_cell",
- "thiserror 2.0.16",
+ "thiserror 2.0.12",
]
[[package]]
@@ -2598,9 +2371,9 @@ dependencies = [
[[package]]
name = "gix-trace"
-version = "0.1.13"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2ccaf54b0b1743a695b482ca0ab9d7603744d8d10b2e5d1a332fef337bee658"
+checksum = "7c396a2036920c69695f760a65e7f2677267ccf483f25046977d87e4cb2665f7"
[[package]]
name = "gix-utils"
@@ -2619,7 +2392,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d"
dependencies = [
"bstr",
- "thiserror 2.0.16",
+ "thiserror 2.0.12",
]
[[package]]
@@ -2635,9 +2408,9 @@ dependencies = [
[[package]]
name = "glob"
-version = "0.3.3"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
+checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]]
name = "glow"
@@ -2666,7 +2439,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"gpu-alloc-types",
]
@@ -2676,7 +2449,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
]
[[package]]
@@ -2697,9 +2470,9 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"gpu-descriptor-types",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
]
[[package]]
@@ -2708,7 +2481,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
]
[[package]]
@@ -2717,7 +2490,7 @@ version = "0.3.1"
source = "git+https://github.com/MathisWellmann/gym-rs.git#5283afaa86a3a7c45c46c882cfad459f02539b62"
dependencies = [
"derivative",
- "derive-new",
+ "derive-new 0.7.0",
"log",
"nalgebra",
"num-traits",
@@ -2738,7 +2511,7 @@ dependencies = [
"cfg-if",
"crunchy",
"num-traits",
- "rand 0.9.2",
+ "rand 0.9.1",
"rand_distr",
"serde",
]
@@ -2757,12 +2530,17 @@ 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.5"
+version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
dependencies = [
"allocator-api2",
"equivalent",
@@ -2776,7 +2554,7 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
dependencies = [
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
]
[[package]]
@@ -2785,6 +2563,12 @@ 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"
@@ -2815,180 +2599,11 @@ dependencies = [
"windows-sys 0.59.0",
]
-[[package]]
-name = "http"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-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"
+version = "2.1.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",
-]
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "ident_case"
@@ -2998,30 +2613,19 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
-version = "1.1.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
dependencies = [
- "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",
+ "unicode-bidi",
+ "unicode-normalization",
]
[[package]]
name = "image"
-version = "0.25.8"
+version = "0.25.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7"
+checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a"
dependencies = [
"bytemuck",
"byteorder-lite",
@@ -3029,7 +2633,6 @@ dependencies = [
"exr",
"gif",
"image-webp",
- "moxcms",
"num-traits",
"png",
"qoi",
@@ -3043,9 +2646,9 @@ dependencies = [
[[package]]
name = "image-webp"
-version = "0.2.4"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3"
+checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b"
dependencies = [
"byteorder-lite",
"quick-error",
@@ -3059,12 +2662,12 @@ checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408"
[[package]]
name = "indexmap"
-version = "2.11.0"
+version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
+checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
dependencies = [
"equivalent",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
]
[[package]]
@@ -3075,24 +2678,21 @@ checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
[[package]]
name = "inout"
-version = "0.1.4"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
dependencies = [
"generic-array",
]
[[package]]
name = "instability"
-version = "0.3.9"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a"
+checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c"
dependencies = [
- "darling 0.20.11",
- "indoc",
- "proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -3109,29 +2709,18 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
dependencies = [
"proc-macro2",
"quote",
- "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",
+ "syn 2.0.104",
]
[[package]]
name = "is-terminal"
-version = "0.4.16"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
+checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
dependencies = [
- "hermit-abi",
- "libc",
- "windows-sys 0.59.0",
+ "hermit-abi 0.3.9",
+ "rustix 0.38.37",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -3178,33 +2767,9 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.15"
+version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-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",
-]
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]]
name = "jni-sys"
@@ -3214,19 +2779,25 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "jobserver"
-version = "0.1.34"
+version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
+checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
dependencies = [
"getrandom 0.3.3",
"libc",
]
[[package]]
-name = "js-sys"
-version = "0.3.78"
+name = "jpeg-decoder"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738"
+checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07"
+
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -3263,15 +2834,15 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
[[package]]
name = "libc"
-version = "0.2.175"
+version = "0.2.172"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
+checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
[[package]]
name = "libfuzzer-sys"
-version = "0.4.10"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404"
+checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75"
dependencies = [
"arbitrary",
"cc",
@@ -3284,7 +2855,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
dependencies = [
"cfg-if",
- "windows-targets 0.53.3",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -3295,19 +2866,19 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
[[package]]
name = "libredox"
-version = "0.1.9"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"libc",
]
[[package]]
name = "libsqlite3-sys"
-version = "0.35.0"
+version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f"
+checksum = "fbb8270bb4060bd76c6e96f20c52d80620f1d82a3470885694e41e0f81ef6fe7"
dependencies = [
"cc",
"pkg-config",
@@ -3316,9 +2887,9 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
-version = "0.4.15"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "linux-raw-sys"
@@ -3326,23 +2897,17 @@ version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
-[[package]]
-name = "litemap"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
-
[[package]]
name = "litrs"
-version = "0.4.2"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed"
+checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
[[package]]
name = "lock_api"
-version = "0.4.13"
+version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
dependencies = [
"autocfg",
"scopeguard",
@@ -3350,9 +2915,9 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.28"
+version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
+checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "loop9"
@@ -3369,14 +2934,14 @@ version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
dependencies = [
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
]
[[package]]
name = "macerator"
-version = "0.2.9"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ac9c19702c37bae1a53d130a326b1c4f58cb17d472538cf547d44b46dbbe3aa"
+checksum = "bce07f822458c4c303081d133a90610406162e7c8df17434956ac1892faf447b"
dependencies = [
"bytemuck",
"cfg_aliases",
@@ -3385,19 +2950,18 @@ dependencies = [
"moddef",
"num-traits",
"paste",
- "rustc_version",
]
[[package]]
name = "macerator-macros"
-version = "0.1.3"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cd48b535b9b37a25a2589ab8d4f997886a2c68f59960ce06588525f38dd4944"
+checksum = "a2b955a106dca78c0577269d67a6d56114abb8644b810fc995a22348276bb9dd"
dependencies = [
- "darling 0.20.11",
+ "darling",
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -3409,12 +2973,6 @@ 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"
@@ -3440,9 +2998,9 @@ dependencies = [
[[package]]
name = "md5"
-version = "0.8.0"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0"
+checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
[[package]]
name = "memchr"
@@ -3452,9 +3010,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "memmap2"
-version = "0.9.8"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7"
+checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
dependencies = [
"libc",
"stable_deref_trait",
@@ -3488,7 +3046,7 @@ version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"block",
"core-graphics-types",
"foreign-types",
@@ -3497,12 +3055,6 @@ 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"
@@ -3521,31 +3073,22 @@ dependencies = [
[[package]]
name = "mio"
-version = "1.0.4"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
+checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
dependencies = [
+ "hermit-abi 0.3.9",
"libc",
"log",
- "wasi 0.11.1+wasi-snapshot-preview1",
- "windows-sys 0.59.0",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.52.0",
]
[[package]]
name = "moddef"
-version = "0.3.0"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-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",
-]
+checksum = "4e519fd9c6131c1c9a4a67f8bdc4f32eb4105b16c1468adea1b8e68c98c85ec4"
[[package]]
name = "naga"
@@ -3555,11 +3098,11 @@ checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632"
dependencies = [
"arrayvec 0.7.6",
"bit-set",
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"cfg_aliases",
"codespan-reporting",
"half",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"hexf-parse",
"indexmap",
"log",
@@ -3568,7 +3111,7 @@ dependencies = [
"rustc-hash",
"spirv",
"strum 0.26.3",
- "thiserror 2.0.16",
+ "thiserror 2.0.12",
"unicode-ident",
]
@@ -3596,24 +3139,9 @@ checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
-[[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"
@@ -3684,11 +3212,12 @@ dependencies = [
[[package]]
name = "nu-ansi-term"
-version = "0.50.1"
+version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
dependencies = [
- "windows-sys 0.52.0",
+ "overload",
+ "winapi",
]
[[package]]
@@ -3739,7 +3268,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -3789,30 +3318,29 @@ version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
dependencies = [
- "hermit-abi",
+ "hermit-abi 0.5.2",
"libc",
]
[[package]]
name = "num_enum"
-version = "0.7.4"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a"
+checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179"
dependencies = [
"num_enum_derive",
- "rustversion",
]
[[package]]
name = "num_enum_derive"
-version = "0.7.4"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d"
+checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -3826,11 +3354,11 @@ dependencies = [
[[package]]
name = "nvml-wrapper"
-version = "0.11.0"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d5c6c0ef9702176a570f06ad94f3198bc29c524c8b498f1b9346e1b1bdcbb3a"
+checksum = "0c9bff0aa1d48904a1385ea2a8b97576fbdcbc9a3cfccd0d31fe978e1c4038c5"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"libloading",
"nvml-wrapper-sys",
"static_assertions",
@@ -3840,9 +3368,9 @@ dependencies = [
[[package]]
name = "nvml-wrapper-sys"
-version = "0.9.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd23dbe2eb8d8335d2bce0299e0a07d6a63c089243d626ca75b770a962ff49e6"
+checksum = "698d45156f28781a4e79652b6ebe2eaa0589057d588d3aec1333f6466f13fcb5"
dependencies = [
"libloading",
]
@@ -3856,25 +3384,6 @@ 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"
@@ -3896,17 +3405,11 @@ version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
-[[package]]
-name = "once_cell_polyfill"
-version = "1.70.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
-
[[package]]
name = "opaque-debug"
-version = "0.3.1"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]]
name = "option-ext"
@@ -3934,6 +3437,12 @@ 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"
@@ -3942,9 +3451,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
[[package]]
name = "parking_lot"
-version = "0.12.4"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -3952,15 +3461,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.11"
+version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
- "windows-targets 0.52.6",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -3994,9 +3503,9 @@ dependencies = [
[[package]]
name = "percent-encoding"
-version = "2.3.2"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pico-args"
@@ -4024,11 +3533,11 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "png"
-version = "0.18.0"
+version = "0.17.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0"
+checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 1.3.2",
"crc32fast",
"fdeflate",
"flate2",
@@ -4064,15 +3573,6 @@ 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"
@@ -4081,12 +3581,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
-version = "0.2.21"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
-dependencies = [
- "zerocopy",
-]
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "presser"
@@ -4096,9 +3593,9 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa"
[[package]]
name = "pretty_assertions"
-version = "1.4.1"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d"
+checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
dependencies = [
"diff",
"yansi",
@@ -4106,12 +3603,12 @@ dependencies = [
[[package]]
name = "prettyplease"
-version = "0.2.37"
+version = "0.2.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
+checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a"
dependencies = [
"proc-macro2",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -4149,9 +3646,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.101"
+version = "1.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
+checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
dependencies = [
"unicode-ident",
]
@@ -4172,7 +3669,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b"
dependencies = [
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -4201,15 +3698,6 @@ 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"
@@ -4253,9 +3741,9 @@ dependencies = [
[[package]]
name = "r2d2_sqlite"
-version = "0.31.0"
+version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63417e83dc891797eea3ad379f52a5986da4bca0d6ef28baf4d14034dd111b0c"
+checksum = "180da684f0a188977d3968f139eb44260192ef8d9a5b7b7cbd01d881e0353179"
dependencies = [
"r2d2",
"rusqlite",
@@ -4288,9 +3776,9 @@ dependencies = [
[[package]]
name = "rand"
-version = "0.9.2"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
+checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.3",
@@ -4358,7 +3846,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463"
dependencies = [
"num-traits",
- "rand 0.9.2",
+ "rand 0.9.1",
]
[[package]]
@@ -4403,13 +3891,34 @@ 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.4",
+ "bitflags 2.9.1",
"cassowary",
"compact_str",
"crossterm",
@@ -4486,11 +3995,11 @@ dependencies = [
[[package]]
name = "raw-cpuid"
-version = "11.6.0"
+version = "11.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186"
+checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
]
[[package]]
@@ -4507,9 +4016,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
[[package]]
name = "rayon"
-version = "1.11.0"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
+checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
@@ -4517,9 +4026,9 @@ dependencies = [
[[package]]
name = "rayon-core"
-version = "1.13.0"
+version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
+checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
@@ -4533,29 +4042,40 @@ checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430"
[[package]]
name = "redox_syscall"
-version = "0.5.17"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 1.3.2",
]
[[package]]
name = "redox_users"
-version = "0.5.2"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
+checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
dependencies = [
"getrandom 0.2.16",
"libredox",
- "thiserror 2.0.16",
+ "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",
]
[[package]]
name = "regex"
-version = "1.11.2"
+version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
+checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
@@ -4565,9 +4085,9 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.10"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
+checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
@@ -4576,9 +4096,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.8.6"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
+checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "relative-path"
@@ -4616,9 +4136,9 @@ dependencies = [
[[package]]
name = "rgb"
-version = "0.8.52"
+version = "0.8.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"
+checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
[[package]]
name = "ring"
@@ -4688,17 +4208,17 @@ dependencies = [
"regex",
"relative-path",
"rustc_version",
- "syn 2.0.106",
+ "syn 2.0.104",
"unicode-ident",
]
[[package]]
name = "rusqlite"
-version = "0.37.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f"
+checksum = "37e34486da88d8e051c7c0e23c3f15fd806ea8546260aa2fec247e97242ec143"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"fallible-iterator",
"fallible-streaming-iterator",
"hashlink",
@@ -4729,38 +4249,37 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.44"
+version = "0.38.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"errno",
"libc",
- "linux-raw-sys 0.4.15",
- "windows-sys 0.59.0",
+ "linux-raw-sys 0.4.14",
+ "windows-sys 0.52.0",
]
[[package]]
name = "rustix"
-version = "1.0.8"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
+checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"errno",
"libc",
"linux-raw-sys 0.9.4",
- "windows-sys 0.60.2",
+ "windows-sys 0.59.0",
]
[[package]]
name = "rustls"
-version = "0.23.31"
+version = "0.22.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc"
+checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432"
dependencies = [
"log",
- "once_cell",
"ring",
"rustls-pki-types",
"rustls-webpki",
@@ -4779,9 +4298,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
-version = "0.103.4"
+version = "0.102.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
+checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
dependencies = [
"ring",
"rustls-pki-types",
@@ -4790,15 +4309,15 @@ dependencies = [
[[package]]
name = "rustversion"
-version = "1.0.22"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
[[package]]
name = "ryu"
-version = "1.0.20"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
[[package]]
name = "safe_arch"
@@ -4838,6 +4357,16 @@ 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"
@@ -4925,14 +4454,14 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
name = "serde_json"
-version = "1.0.143"
+version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a"
+checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [
"itoa",
"memchr",
@@ -4940,21 +4469,11 @@ dependencies = [
"serde",
]
-[[package]]
-name = "serde_path_to_error"
-version = "0.1.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a"
-dependencies = [
- "itoa",
- "serde",
-]
-
[[package]]
name = "serde_rusqlite"
-version = "0.40.0"
+version = "0.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32d9325839c0a5dc4820323190bff9bba33f57362cb5591fa30db66cb56874b2"
+checksum = "1e77d42c863496aee3253704aa621691088f718cd8800bd50bcdc19f9bd2a8ea"
dependencies = [
"rusqlite",
"serde",
@@ -4969,27 +4488,6 @@ 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"
@@ -5029,9 +4527,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook"
-version = "0.3.18"
+version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
dependencies = [
"libc",
"signal-hook-registry",
@@ -5050,18 +4548,18 @@ dependencies = [
[[package]]
name = "signal-hook-registry"
-version = "1.4.6"
+version = "1.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
+checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
dependencies = [
"libc",
]
[[package]]
name = "simba"
-version = "0.9.1"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95"
+checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa"
dependencies = [
"approx",
"num-complex",
@@ -5087,9 +4585,9 @@ dependencies = [
[[package]]
name = "slab"
-version = "0.4.11"
+version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
+checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
[[package]]
name = "slotmap"
@@ -5102,18 +4600,18 @@ dependencies = [
[[package]]
name = "smallvec"
-version = "1.15.1"
+version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
[[package]]
-name = "socket2"
-version = "0.6.0"
+name = "spin"
+version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
dependencies = [
- "libc",
- "windows-sys 0.59.0",
+ "lock_api",
+ "portable-atomic",
]
[[package]]
@@ -5132,7 +4630,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.4",
+ "bitflags 2.9.1",
]
[[package]]
@@ -5182,11 +4680,11 @@ dependencies = [
[[package]]
name = "strum"
-version = "0.27.2"
+version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
+checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32"
dependencies = [
- "strum_macros 0.27.2",
+ "strum_macros 0.27.1",
]
[[package]]
@@ -5199,26 +4697,27 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
name = "strum_macros"
-version = "0.27.2"
+version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
+checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8"
dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "rustversion",
+ "syn 2.0.104",
]
[[package]]
name = "subtle"
-version = "2.6.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
[[package]]
name = "syn"
@@ -5233,21 +4732,15 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.106"
+version = "2.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
+checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
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"
@@ -5268,7 +4761,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -5277,7 +4770,7 @@ version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"byteorder",
"enum-as-inner",
"libc",
@@ -5291,7 +4784,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"byteorder",
"enum-as-inner",
"libc",
@@ -5301,16 +4794,16 @@ dependencies = [
[[package]]
name = "sysinfo"
-version = "0.36.1"
+version = "0.33.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
+checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
dependencies = [
+ "core-foundation-sys",
"libc",
"memchr",
"ntapi",
- "objc2-core-foundation",
- "objc2-io-kit",
- "windows 0.61.3",
+ "rayon",
+ "windows 0.57.0",
]
[[package]]
@@ -5322,15 +4815,15 @@ dependencies = [
"cfg-expr",
"heck",
"pkg-config",
- "toml 0.8.23",
+ "toml",
"version-compare 0.2.0",
]
[[package]]
name = "systemstat"
-version = "0.2.5"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5021f5184d44b26fb184acd689671bbe1e4bbd24bbdaa6bc7ec383fad32d2033"
+checksum = "668a4db78b439df482c238f559e4ea869017f9e62ef0a059c8bfcd841a4df544"
dependencies = [
"bytesize",
"lazy_static",
@@ -5365,15 +4858,15 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.21.0"
+version = "3.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e"
+checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
dependencies = [
"fastrand",
"getrandom 0.3.3",
"once_cell",
- "rustix 1.0.8",
- "windows-sys 0.60.2",
+ "rustix 1.0.7",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -5407,11 +4900,11 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "2.0.16"
+version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
+checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
dependencies = [
- "thiserror-impl 2.0.16",
+ "thiserror-impl 2.0.12",
]
[[package]]
@@ -5422,18 +4915,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
name = "thiserror-impl"
-version = "2.0.16"
+version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
+checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -5456,25 +4949,23 @@ dependencies = [
[[package]]
name = "tiff"
-version = "0.10.3"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f"
+checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
dependencies = [
- "fax",
"flate2",
- "half",
- "quick-error",
+ "jpeg-decoder",
"weezl",
- "zune-jpeg",
]
[[package]]
name = "time"
-version = "0.3.43"
+version = "0.3.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031"
+checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
dependencies = [
"deranged",
+ "itoa",
"libc",
"num-conv",
"num_threads",
@@ -5486,35 +4977,25 @@ dependencies = [
[[package]]
name = "time-core"
-version = "0.1.6"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b"
+checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
[[package]]
name = "time-macros"
-version = "0.2.24"
+version = "0.2.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3"
+checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
dependencies = [
"num-conv",
"time-core",
]
-[[package]]
-name = "tinystr"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
-dependencies = [
- "displaydoc",
- "zerovec",
-]
-
[[package]]
name = "tinyvec"
-version = "1.10.0"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
+checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71"
dependencies = [
"tinyvec_macros",
]
@@ -5525,59 +5006,6 @@ 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"
@@ -5585,26 +5013,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
dependencies = [
"serde",
- "serde_spanned 0.6.9",
- "toml_datetime 0.6.11",
+ "serde_spanned",
+ "toml_datetime",
"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"
@@ -5614,15 +5027,6 @@ 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"
@@ -5631,33 +5035,18 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
dependencies = [
"indexmap",
"serde",
- "serde_spanned 0.6.9",
- "toml_datetime 0.6.11",
+ "serde_spanned",
+ "toml_datetime",
"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"
@@ -5673,41 +5062,12 @@ 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",
@@ -5733,7 +5093,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -5759,9 +5119,9 @@ dependencies = [
[[package]]
name = "tracing-subscriber"
-version = "0.3.20"
+version = "0.3.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5"
+checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
dependencies = [
"nu-ansi-term",
"sharded-slab",
@@ -5773,53 +5133,31 @@ dependencies = [
[[package]]
name = "transpose"
-version = "0.2.3"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e"
+checksum = "e6522d49d03727ffb138ae4cbc1283d3774f0d10aa7f9bf52e6784c45daf9b23"
dependencies = [
"num-integer",
"strength_reduce",
]
[[package]]
-name = "tungstenite"
-version = "0.26.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13"
+name = "trictrac-server"
+version = "0.1.0"
dependencies = [
- "bytes",
- "data-encoding",
- "http",
- "httparse",
+ "bincode 1.3.3",
+ "env_logger 0.10.0",
"log",
- "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",
+ "pico-args",
+ "renet",
+ "store",
]
[[package]]
name = "typenum"
-version = "1.18.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "ug"
@@ -5839,9 +5177,15 @@ dependencies = [
"serde",
"thiserror 1.0.69",
"tracing",
- "yoke 0.7.5",
+ "yoke",
]
+[[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"
@@ -5859,9 +5203,9 @@ dependencies = [
[[package]]
name = "unicode-segmentation"
-version = "1.12.0"
+version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
[[package]]
name = "unicode-truncate"
@@ -5916,9 +5260,9 @@ checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae"
[[package]]
name = "ureq"
-version = "2.12.1"
+version = "2.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d"
+checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd"
dependencies = [
"base64 0.22.1",
"flate2",
@@ -5926,6 +5270,7 @@ dependencies = [
"once_cell",
"rustls",
"rustls-pki-types",
+ "rustls-webpki",
"serde",
"serde_json",
"url",
@@ -5934,28 +5279,15 @@ dependencies = [
[[package]]
name = "url"
-version = "2.5.7"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
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"
@@ -5964,13 +5296,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
-version = "1.18.1"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
+checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
dependencies = [
"getrandom 0.3.3",
"js-sys",
- "rand 0.9.2",
+ "rand 0.9.1",
"wasm-bindgen",
]
@@ -5999,7 +5331,7 @@ checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -6026,12 +5358,6 @@ 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"
@@ -6044,51 +5370,50 @@ dependencies = [
[[package]]
name = "wasi"
-version = "0.11.1+wasi-snapshot-preview1"
+version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasi"
-version = "0.14.3+wasi-0.2.4"
+version = "0.14.2+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95"
+checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
dependencies = [
- "wit-bindgen",
+ "wit-bindgen-rt",
]
[[package]]
name = "wasm-bindgen"
-version = "0.2.101"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
- "wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.101"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.51"
+version = "0.4.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe"
+checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
dependencies = [
"cfg-if",
"js-sys",
@@ -6099,9 +5424,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.101"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -6109,31 +5434,31 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.101"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.101"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
dependencies = [
"unicode-ident",
]
[[package]]
name = "web-sys"
-version = "0.3.78"
+version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12"
+checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -6155,14 +5480,14 @@ version = "0.26.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
dependencies = [
- "webpki-roots 1.0.2",
+ "webpki-roots 1.0.1",
]
[[package]]
name = "webpki-roots"
-version = "1.0.2"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2"
+checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502"
dependencies = [
"rustls-pki-types",
]
@@ -6180,10 +5505,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9"
dependencies = [
"arrayvec 0.7.6",
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"cfg_aliases",
"document-features",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"js-sys",
"log",
"naga",
@@ -6210,10 +5535,10 @@ dependencies = [
"arrayvec 0.7.6",
"bit-set",
"bit-vec",
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"cfg_aliases",
"document-features",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"indexmap",
"log",
"naga",
@@ -6224,7 +5549,7 @@ dependencies = [
"raw-window-handle",
"rustc-hash",
"smallvec",
- "thiserror 2.0.16",
+ "thiserror 2.0.12",
"wgpu-core-deps-apple",
"wgpu-core-deps-emscripten",
"wgpu-core-deps-windows-linux-android",
@@ -6269,7 +5594,7 @@ dependencies = [
"arrayvec 0.7.6",
"ash",
"bit-set",
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"block",
"bytemuck",
"cfg-if",
@@ -6280,7 +5605,7 @@ dependencies = [
"gpu-alloc",
"gpu-allocator",
"gpu-descriptor",
- "hashbrown 0.15.5",
+ "hashbrown 0.15.4",
"js-sys",
"khronos-egl",
"libc",
@@ -6298,7 +5623,7 @@ dependencies = [
"raw-window-handle",
"renderdoc-sys",
"smallvec",
- "thiserror 2.0.16",
+ "thiserror 2.0.12",
"wasm-bindgen",
"web-sys",
"wgpu-types",
@@ -6312,11 +5637,11 @@ version = "25.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc"
dependencies = [
- "bitflags 2.9.4",
+ "bitflags 2.9.1",
"bytemuck",
"js-sys",
"log",
- "thiserror 2.0.16",
+ "thiserror 2.0.12",
"web-sys",
]
@@ -6348,11 +5673,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.10"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
dependencies = [
- "windows-sys 0.60.2",
+ "winapi",
]
[[package]]
@@ -6361,6 +5686,16 @@ 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"
@@ -6372,25 +5707,15 @@ dependencies = [
]
[[package]]
-name = "windows"
-version = "0.61.3"
+name = "windows-core"
+version = "0.57.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
+checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
dependencies = [
- "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",
+ "windows-implement 0.57.0",
+ "windows-interface 0.57.0",
+ "windows-result 0.1.2",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -6402,32 +5727,19 @@ dependencies = [
"windows-implement 0.58.0",
"windows-interface 0.58.0",
"windows-result 0.2.0",
- "windows-strings 0.1.0",
+ "windows-strings",
"windows-targets 0.52.6",
]
[[package]]
-name = "windows-core"
-version = "0.61.2"
+name = "windows-implement"
+version = "0.57.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
+checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
dependencies = [
- "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",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.104",
]
[[package]]
@@ -6438,18 +5750,18 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
-name = "windows-implement"
-version = "0.60.0"
+name = "windows-interface"
+version = "0.57.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
+checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -6460,40 +5772,16 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
-name = "windows-interface"
-version = "0.59.1"
+name = "windows-result"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
+checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
dependencies = [
- "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",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -6505,15 +5793,6 @@ 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"
@@ -6525,12 +5804,12 @@ dependencies = [
]
[[package]]
-name = "windows-strings"
-version = "0.4.2"
+name = "windows-sys"
+version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
- "windows-link 0.1.3",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -6552,21 +5831,18 @@ dependencies = [
]
[[package]]
-name = "windows-sys"
-version = "0.60.2"
+name = "windows-targets"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
- "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",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
]
[[package]]
@@ -6578,7 +5854,7 @@ dependencies = [
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm 0.52.6",
+ "windows_i686_gnullvm",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
@@ -6586,30 +5862,10 @@ dependencies = [
]
[[package]]
-name = "windows-targets"
-version = "0.53.3"
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-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",
-]
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
@@ -6618,10 +5874,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.53.0"
+name = "windows_aarch64_msvc"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
@@ -6630,10 +5886,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
-name = "windows_aarch64_msvc"
-version = "0.53.0"
+name = "windows_i686_gnu"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
@@ -6641,12 +5897,6 @@ 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"
@@ -6654,10 +5904,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
-name = "windows_i686_gnullvm"
-version = "0.53.0"
+name = "windows_i686_msvc"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
@@ -6666,10 +5916,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
-name = "windows_i686_msvc"
-version = "0.53.0"
+name = "windows_x86_64_gnu"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
@@ -6678,10 +5928,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
-name = "windows_x86_64_gnu"
-version = "0.53.0"
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
@@ -6690,10 +5940,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.53.0"
+name = "windows_x86_64_msvc"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "windows_x86_64_msvc"
@@ -6701,26 +5951,23 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.53.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
-
[[package]]
name = "winnow"
-version = "0.7.13"
+version = "0.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
+checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd"
dependencies = [
"memchr",
]
[[package]]
-name = "wit-bindgen"
-version = "0.45.1"
+name = "wit-bindgen-rt"
+version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36"
+checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
+dependencies = [
+ "bitflags 2.9.1",
+]
[[package]]
name = "wrapcenum-derive"
@@ -6728,29 +5975,23 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76ff259533532054cfbaefb115c613203c73707017459206380f03b3b3f266e"
dependencies = [
- "darling 0.20.11",
+ "darling",
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
-[[package]]
-name = "writeable"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
-
[[package]]
name = "xml-rs"
-version = "0.8.27"
+version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7"
+checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda"
[[package]]
name = "yansi"
-version = "1.0.1"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
+checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
[[package]]
name = "yoke"
@@ -6760,19 +6001,7 @@ checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
dependencies = [
"serde",
"stable_deref_trait",
- "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",
+ "yoke-derive",
"zerofrom",
]
@@ -6784,19 +6013,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [
"proc-macro2",
"quote",
- "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",
+ "syn 2.0.104",
"synstructure 0.13.2",
]
@@ -6817,7 +6034,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
]
[[package]]
@@ -6837,48 +6054,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.106",
+ "syn 2.0.104",
"synstructure 0.13.2",
]
[[package]]
name = "zeroize"
-version = "1.8.1"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-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",
-]
+checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
[[package]]
name = "zip"
@@ -6936,9 +6120,9 @@ dependencies = [
[[package]]
name = "zstd-sys"
-version = "2.0.16+zstd.1.5.7"
+version = "2.0.15+zstd.1.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748"
+checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237"
dependencies = [
"cc",
"pkg-config",
@@ -6961,9 +6145,9 @@ dependencies = [
[[package]]
name = "zune-jpeg"
-version = "0.4.21"
+version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713"
+checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa"
dependencies = [
"zune-core",
]
diff --git a/Cargo.toml b/Cargo.toml
index b9e6d45..6068644 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,4 +1,4 @@
[workspace]
resolver = "2"
-members = ["client_cli", "bot", "store"]
+members = ["client_tui", "client_cli", "bot", "server", "store"]
diff --git a/README.md b/README.md
index e5a0f39..d2808fa 100644
--- a/README.md
+++ b/README.md
@@ -1,41 +1,7 @@
# Trictrac
-This is a game of [Trictrac](https://en.wikipedia.org/wiki/Trictrac) rust implementation.
+Game of [Trictrac](https://en.wikipedia.org/wiki/Trictrac) in rust.
-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.
+wip
-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 fa782fd..21e0128 100644
--- a/bot/Cargo.toml
+++ b/bot/Cargo.toml
@@ -9,6 +9,10 @@ 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"] }
@@ -16,7 +20,7 @@ serde_json = "1.0"
store = { path = "../store" }
rand = "0.8"
env_logger = "0.10"
-burn = { version = "0.18", features = ["ndarray", "autodiff"] }
+burn = { version = "0.17", 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
new file mode 100644
index 0000000..7e8951f
--- /dev/null
+++ b/bot/src/burnrl/algos/dqn_big.rs
@@ -0,0 +1,194 @@
+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 5a67dfc..af13327 100644
--- a/bot/src/burnrl/algos/mod.rs
+++ b/bot/src/burnrl/algos/mod.rs
@@ -1,6 +1,9 @@
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
new file mode 100644
index 0000000..ab860ee
--- /dev/null
+++ b/bot/src/burnrl/algos/ppo_big.rs
@@ -0,0 +1,191 @@
+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
new file mode 100644
index 0000000..1361b42
--- /dev/null
+++ b/bot/src/burnrl/algos/sac_big.rs
@@ -0,0 +1,222 @@
+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 84c8311..50daf11 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.0012121;
-const REWARD_VALID_MOVE: f32 = 1.0012121;
-const REWARD_RATIO: f32 = 0.1;
-const WIN_POINTS: f32 = 100.0;
+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;
/// É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,11 +312,9 @@ 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
new file mode 100644
index 0000000..1bba2bd
--- /dev/null
+++ b/bot/src/burnrl/environment_big.rs
@@ -0,0 +1,469 @@
+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 9c27af9..346044c 100644
--- a/bot/src/burnrl/environment_valid.rs
+++ b/bot/src/burnrl/environment_valid.rs
@@ -1,12 +1,9 @@
-use crate::training_common;
+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 = -1.0012121;
-const REWARD_RATIO: f32 = 0.1;
-
/// État du jeu Trictrac pour burn-rl
#[derive(Debug, Clone, Copy)]
pub struct TrictracState {
@@ -217,16 +214,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::TrictracAction::from_action_index(action.index.try_into().unwrap())
+ 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
fn convert_valid_action_index(
&self,
action: TrictracAction,
- ) -> Option {
- use training_common::get_valid_actions;
+ ) -> Option {
+ use training_common_big::get_valid_actions;
// Obtenir les actions valides dans le contexte actuel
let valid_actions = get_valid_actions(&self.game);
@@ -243,19 +240,72 @@ impl TrictracEnvironment {
/// Exécute une action Trictrac dans le jeu
// fn execute_action(
// &mut self,
- // action: training_common::TrictracAction,
+ // action: training_common_big::TrictracAction,
// ) -> Result> {
- fn execute_action(&mut self, action: training_common::TrictracAction) -> (f32, bool) {
- use training_common::TrictracAction;
+ 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 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) = action.to_event(&self.game) {
+ 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) {
let mut rng = thread_rng();
@@ -269,7 +319,7 @@ impl TrictracEnvironment {
if self.game.validate(&dice_event) {
self.game.consume(&dice_event);
let (points, adv_points) = self.game.dice_points;
- reward += REWARD_RATIO * (points as f32 - adv_points as f32);
+ reward += Self::REWARD_RATIO * (points - adv_points) as f32;
if points > 0 {
is_rollpoint = true;
// println!("info: rolled for {reward}");
@@ -281,12 +331,9 @@ impl TrictracEnvironment {
// Pénalité pour action invalide
// 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);
+ println!("info: action invalide -> err_reward");
+ reward = Self::ERROR_REWARD;
}
- } 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 5230ec0..f7608a3 100644
--- a/bot/src/burnrl/main.rs
+++ b/bot/src/burnrl/main.rs
@@ -1,5 +1,8 @@
-use bot::burnrl::algos::{dqn, dqn_valid, ppo, ppo_valid, sac, sac_valid};
+use bot::burnrl::algos::{
+ dqn, dqn_big, dqn_valid, ppo, ppo_big, ppo_valid, sac, sac_big, 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};
@@ -33,6 +36,16 @@ 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");
@@ -53,6 +66,16 @@ 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");
@@ -73,6 +96,16 @@ 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 292bbb8..62bebc8 100644
--- a/bot/src/burnrl/mod.rs
+++ b/bot/src/burnrl/mod.rs
@@ -1,4 +1,5 @@
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
new file mode 100644
index 0000000..9c31f44
--- /dev/null
+++ b/bot/src/dqn_simple/dqn_model.rs
@@ -0,0 +1,153 @@
+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
new file mode 100644
index 0000000..ed60f5e
--- /dev/null
+++ b/bot/src/dqn_simple/dqn_trainer.rs
@@ -0,0 +1,494 @@
+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
new file mode 100644
index 0000000..024f895
--- /dev/null
+++ b/bot/src/dqn_simple/main.rs
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..8090a29
--- /dev/null
+++ b/bot/src/dqn_simple/mod.rs
@@ -0,0 +1,2 @@
+pub mod dqn_model;
+pub mod dqn_trainer;
diff --git a/bot/src/lib.rs b/bot/src/lib.rs
index 0fc6fdf..dab36be 100644
--- a/bot/src/lib.rs
+++ b/bot/src/lib.rs
@@ -1,11 +1,14 @@
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
new file mode 100644
index 0000000..2874195
--- /dev/null
+++ b/bot/src/strategy/dqn.rs
@@ -0,0 +1,174 @@
+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 00293cb..b9fa3b2 100644
--- a/bot/src/strategy/mod.rs
+++ b/bot/src/strategy/mod.rs
@@ -1,5 +1,6 @@
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 ee33d0c..0a581dd 100644
--- a/bot/src/training_common.rs
+++ b/bot/src/training_common.rs
@@ -1,15 +1,9 @@
-/// 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 {
@@ -164,7 +158,10 @@ impl TrictracAction {
/// Retourne la taille de l'espace d'actions total
pub fn action_space_size() -> usize {
- ACTION_SPACE_SIZE
+ // 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
}
// pub fn to_game_event(&self, player_id: PlayerId, dice: Dice) -> GameEvent {
@@ -228,11 +225,7 @@ 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 mut possible_moves = rules.get_possible_moves_sequences(true, vec![]);
- if possible_moves.is_empty() {
- // Empty move
- possible_moves.push((CheckerMove::default(), CheckerMove::default()));
- }
+ 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);
diff --git a/bot/src/training_common_big.rs b/bot/src/training_common_big.rs
new file mode 100644
index 0000000..db9ee2b
--- /dev/null
+++ b/bot/src/training_common_big.rs
@@ -0,0 +1,262 @@
+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 5e9fc7f..01b2a82 100644
--- a/bot/src/trictrac_board.rs
+++ b/bot/src/trictrac_board.rs
@@ -6,11 +6,10 @@ 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, Hash)]
+#[derive(Clone, Debug, Eq, PartialEq)]
pub struct TrictracBoard(crate::GameState);
impl Default for TrictracBoard {
@@ -78,20 +77,6 @@ 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
new file mode 100644
index 0000000..b6bc0d3
--- /dev/null
+++ b/client_bevy/.cargo/config.toml
@@ -0,0 +1,8 @@
+[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
new file mode 100644
index 0000000..aaa6b7d
--- /dev/null
+++ b/client_bevy/Cargo.toml
@@ -0,0 +1,14 @@
+[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
new file mode 100644
index 0000000..34848ca
Binary files /dev/null and b/client_bevy/assets/Inconsolata.ttf differ
diff --git a/client_bevy/assets/board.png b/client_bevy/assets/board.png
new file mode 100644
index 0000000..5d16ac3
Binary files /dev/null and b/client_bevy/assets/board.png differ
diff --git a/client_bevy/assets/sound/click.wav b/client_bevy/assets/sound/click.wav
new file mode 100644
index 0000000..8b6c99d
Binary files /dev/null and b/client_bevy/assets/sound/click.wav differ
diff --git a/client_bevy/assets/sound/throw.wav b/client_bevy/assets/sound/throw.wav
new file mode 100755
index 0000000..cb5e438
Binary files /dev/null and b/client_bevy/assets/sound/throw.wav differ
diff --git a/client_bevy/assets/tac.png b/client_bevy/assets/tac.png
new file mode 100644
index 0000000..2c18813
Binary files /dev/null and b/client_bevy/assets/tac.png differ
diff --git a/client_bevy/assets/tic.png b/client_bevy/assets/tic.png
new file mode 100644
index 0000000..786e0c7
Binary files /dev/null and b/client_bevy/assets/tic.png differ
diff --git a/client_bevy/src/main.rs b/client_bevy/src/main.rs
new file mode 100644
index 0000000..504602e
--- /dev/null
+++ b/client_bevy/src/main.rs
@@ -0,0 +1,334 @@
+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