├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── names.txt ├── notes.txt └── src ├── main.rs ├── nb001.rs ├── nb002.rs ├── nb003.rs ├── nb004.rs ├── nb005.rs ├── numr.rs ├── plot.rs ├── rust_mllib.rs └── utils.rs /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | *.dot 3 | *.png 4 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "adler2" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 10 | 11 | [[package]] 12 | name = "aes" 13 | version = "0.8.4" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 16 | dependencies = [ 17 | "cfg-if", 18 | "cipher", 19 | "cpufeatures", 20 | ] 21 | 22 | [[package]] 23 | name = "ahash" 24 | version = "0.8.11" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 27 | dependencies = [ 28 | "cfg-if", 29 | "once_cell", 30 | "version_check", 31 | "zerocopy", 32 | ] 33 | 34 | [[package]] 35 | name = "aho-corasick" 36 | version = "1.1.3" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 39 | dependencies = [ 40 | "memchr", 41 | ] 42 | 43 | [[package]] 44 | name = "aligned-vec" 45 | version = "0.5.0" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" 48 | 49 | [[package]] 50 | name = "allocator-api2" 51 | version = "0.2.21" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 54 | 55 | [[package]] 56 | name = "android-tzdata" 57 | version = "0.1.1" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 60 | 61 | [[package]] 62 | name = "android_system_properties" 63 | version = "0.1.5" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 66 | dependencies = [ 67 | "libc", 68 | ] 69 | 70 | [[package]] 71 | name = "anyhow" 72 | version = "1.0.95" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 75 | 76 | [[package]] 77 | name = "arbitrary" 78 | version = "1.4.1" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" 81 | dependencies = [ 82 | "derive_arbitrary", 83 | ] 84 | 85 | [[package]] 86 | name = "arg_enum_proc_macro" 87 | version = "0.3.4" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" 90 | dependencies = [ 91 | "proc-macro2", 92 | "quote", 93 | "syn 2.0.96", 94 | ] 95 | 96 | [[package]] 97 | name = "arrayvec" 98 | version = "0.7.6" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 101 | 102 | [[package]] 103 | name = "ash" 104 | version = "0.38.0+1.3.281" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" 107 | dependencies = [ 108 | "libloading", 109 | ] 110 | 111 | [[package]] 112 | name = "async-channel" 113 | version = "2.3.1" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 116 | dependencies = [ 117 | "concurrent-queue", 118 | "event-listener-strategy", 119 | "futures-core", 120 | "pin-project-lite", 121 | ] 122 | 123 | [[package]] 124 | name = "async-lock" 125 | version = "3.4.0" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 128 | dependencies = [ 129 | "event-listener", 130 | "event-listener-strategy", 131 | "pin-project-lite", 132 | ] 133 | 134 | [[package]] 135 | name = "atomic_float" 136 | version = "1.1.0" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "628d228f918ac3b82fe590352cc719d30664a0c13ca3a60266fe02c7132d480a" 139 | 140 | [[package]] 141 | name = "autocfg" 142 | version = "1.4.0" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 145 | 146 | [[package]] 147 | name = "av1-grain" 148 | version = "0.2.3" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" 151 | dependencies = [ 152 | "anyhow", 153 | "arrayvec", 154 | "log", 155 | "nom", 156 | "num-rational", 157 | "v_frame", 158 | ] 159 | 160 | [[package]] 161 | name = "avif-serialize" 162 | version = "0.8.2" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" 165 | dependencies = [ 166 | "arrayvec", 167 | ] 168 | 169 | [[package]] 170 | name = "base64" 171 | version = "0.22.1" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 174 | 175 | [[package]] 176 | name = "base64ct" 177 | version = "1.6.0" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 180 | 181 | [[package]] 182 | name = "bincode" 183 | version = "2.0.0-rc.3" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95" 186 | dependencies = [ 187 | "serde", 188 | ] 189 | 190 | [[package]] 191 | name = "bit-set" 192 | version = "0.6.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" 195 | dependencies = [ 196 | "bit-vec", 197 | ] 198 | 199 | [[package]] 200 | name = "bit-vec" 201 | version = "0.7.0" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" 204 | 205 | [[package]] 206 | name = "bit_field" 207 | version = "0.10.2" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" 210 | 211 | [[package]] 212 | name = "bitflags" 213 | version = "1.3.2" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 216 | 217 | [[package]] 218 | name = "bitflags" 219 | version = "2.8.0" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 222 | 223 | [[package]] 224 | name = "bitstream-io" 225 | version = "2.6.0" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" 228 | 229 | [[package]] 230 | name = "block" 231 | version = "0.1.6" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 234 | 235 | [[package]] 236 | name = "block-buffer" 237 | version = "0.10.4" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 240 | dependencies = [ 241 | "generic-array", 242 | ] 243 | 244 | [[package]] 245 | name = "built" 246 | version = "0.7.5" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" 249 | 250 | [[package]] 251 | name = "bumpalo" 252 | version = "3.16.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 255 | 256 | [[package]] 257 | name = "burn" 258 | version = "0.15.0" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "09d130fc29965cae23afcc594423e55d977fb142cee37e70034209745bb515e2" 261 | dependencies = [ 262 | "burn-core", 263 | "burn-train", 264 | ] 265 | 266 | [[package]] 267 | name = "burn-autodiff" 268 | version = "0.15.0" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "bb84f4c9c9e5e90bfdde7cf18d2f7684f60079629be80672d30add20df0d790f" 271 | dependencies = [ 272 | "burn-common 0.15.0", 273 | "burn-tensor 0.15.0", 274 | "derive-new 0.6.0", 275 | "log", 276 | "spin", 277 | ] 278 | 279 | [[package]] 280 | name = "burn-autodiff" 281 | version = "0.16.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "0fa53181463ef16220438e240f10e1e8cb2fcf1824dbc33b8f259a454ff5f46f" 284 | dependencies = [ 285 | "burn-common 0.16.0", 286 | "burn-tensor 0.16.0", 287 | "derive-new 0.7.0", 288 | "log", 289 | "spin", 290 | ] 291 | 292 | [[package]] 293 | name = "burn-candle" 294 | version = "0.15.0" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "7c8be4878fcd5f166755cf7f828edb6f98a120a41a3dca08f2b7a4195c27b78f" 297 | dependencies = [ 298 | "burn-tensor 0.15.0", 299 | "candle-core", 300 | "derive-new 0.6.0", 301 | "half", 302 | ] 303 | 304 | [[package]] 305 | name = "burn-common" 306 | version = "0.15.0" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "b812952386979b756241df0f1f3a0bdd5d2969dc39aedc028b0873c33df5e076" 309 | dependencies = [ 310 | "cubecl-common 0.3.0", 311 | "getrandom", 312 | "rayon", 313 | "web-time", 314 | ] 315 | 316 | [[package]] 317 | name = "burn-common" 318 | version = "0.16.0" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "8a1471949b06002c984df9d753a084a79149841dd7935911d9e432b8478f9fd5" 321 | dependencies = [ 322 | "cubecl-common 0.4.0", 323 | "getrandom", 324 | "rayon", 325 | "serde", 326 | "web-time", 327 | ] 328 | 329 | [[package]] 330 | name = "burn-core" 331 | version = "0.15.0" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "32dfd86c6615420077a089b01d83d9732f16e6dc692a1ad8184d5d46b69691cb" 334 | dependencies = [ 335 | "ahash", 336 | "bincode", 337 | "burn-autodiff 0.15.0", 338 | "burn-candle", 339 | "burn-common 0.15.0", 340 | "burn-cuda", 341 | "burn-dataset", 342 | "burn-derive", 343 | "burn-hip", 344 | "burn-ndarray 0.15.0", 345 | "burn-tch", 346 | "burn-tensor 0.15.0", 347 | "burn-wgpu", 348 | "data-encoding", 349 | "derive-new 0.6.0", 350 | "flate2", 351 | "half", 352 | "hashbrown 0.15.2", 353 | "log", 354 | "num-traits", 355 | "portable-atomic-util", 356 | "rand", 357 | "rmp-serde", 358 | "serde", 359 | "serde_json", 360 | "spin", 361 | "uuid", 362 | ] 363 | 364 | [[package]] 365 | name = "burn-cuda" 366 | version = "0.15.0" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "1f8a396e355968cfff8ec00f4ad225ccc3bbfc62f99036722e54af68066b0cd5" 369 | dependencies = [ 370 | "burn-fusion", 371 | "burn-jit", 372 | "burn-tensor 0.15.0", 373 | "bytemuck", 374 | "cubecl", 375 | "derive-new 0.6.0", 376 | "half", 377 | "log", 378 | ] 379 | 380 | [[package]] 381 | name = "burn-dataset" 382 | version = "0.15.0" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "9c6dc764e250fdccda1323a045881d369af0add9756f2ca95b2df3fc63810b8e" 385 | dependencies = [ 386 | "csv", 387 | "derive-new 0.6.0", 388 | "dirs", 389 | "gix-tempfile", 390 | "image 0.25.5", 391 | "r2d2", 392 | "r2d2_sqlite", 393 | "rand", 394 | "rmp-serde", 395 | "rusqlite", 396 | "sanitize-filename", 397 | "serde", 398 | "serde_json", 399 | "serde_rusqlite", 400 | "strum", 401 | "strum_macros", 402 | "tempfile", 403 | "thiserror", 404 | ] 405 | 406 | [[package]] 407 | name = "burn-derive" 408 | version = "0.15.0" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "893ec21275e5b0fceca831e6b751ab0df82fcb8ac4a987fe5d704639d23b1e0a" 411 | dependencies = [ 412 | "derive-new 0.6.0", 413 | "proc-macro2", 414 | "quote", 415 | "syn 2.0.96", 416 | ] 417 | 418 | [[package]] 419 | name = "burn-fusion" 420 | version = "0.15.0" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "c3de03914bb49c972f138a2ad6f6d92896a0e8a537a50aca6463fc55bb7bf8d9" 423 | dependencies = [ 424 | "burn-common 0.15.0", 425 | "burn-tensor 0.15.0", 426 | "derive-new 0.6.0", 427 | "half", 428 | "hashbrown 0.15.2", 429 | "log", 430 | "serde", 431 | "spin", 432 | ] 433 | 434 | [[package]] 435 | name = "burn-hip" 436 | version = "0.15.0" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "28af539a8dbf799747b00e1c28f45a876673de3ff5818f9e7f1e47c0806dd795" 439 | dependencies = [ 440 | "burn-fusion", 441 | "burn-jit", 442 | "burn-tensor 0.15.0", 443 | "bytemuck", 444 | "cubecl", 445 | "derive-new 0.6.0", 446 | "half", 447 | "log", 448 | ] 449 | 450 | [[package]] 451 | name = "burn-jit" 452 | version = "0.15.0" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "1d8af3155e5004a67ee0b378854912374c4b61e2d8d57fcd35794953dff336fc" 455 | dependencies = [ 456 | "burn-common 0.15.0", 457 | "burn-fusion", 458 | "burn-tensor 0.15.0", 459 | "bytemuck", 460 | "cubecl", 461 | "derive-new 0.6.0", 462 | "futures-lite", 463 | "half", 464 | "hashbrown 0.15.2", 465 | "log", 466 | "num-traits", 467 | "rand", 468 | "serde", 469 | "spin", 470 | "text_placeholder", 471 | ] 472 | 473 | [[package]] 474 | name = "burn-ndarray" 475 | version = "0.15.0" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "9df139ffaf1f3b5805dcc5e531e7fa3119ad52dcc5b42883661fbf0a694cd82b" 478 | dependencies = [ 479 | "atomic_float", 480 | "burn-autodiff 0.15.0", 481 | "burn-common 0.15.0", 482 | "burn-tensor 0.15.0", 483 | "derive-new 0.6.0", 484 | "libm", 485 | "matrixmultiply", 486 | "ndarray 0.16.1", 487 | "num-traits", 488 | "portable-atomic-util", 489 | "rand", 490 | "spin", 491 | ] 492 | 493 | [[package]] 494 | name = "burn-ndarray" 495 | version = "0.16.0" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "419fa3eda8cf9fddce0d156946b3d46642c10a41569b23e7855f775f862d310a" 498 | dependencies = [ 499 | "atomic_float", 500 | "burn-autodiff 0.16.0", 501 | "burn-common 0.16.0", 502 | "burn-tensor 0.16.0", 503 | "derive-new 0.7.0", 504 | "libm", 505 | "matrixmultiply", 506 | "ndarray 0.16.1", 507 | "num-traits", 508 | "portable-atomic-util", 509 | "rand", 510 | "spin", 511 | ] 512 | 513 | [[package]] 514 | name = "burn-tch" 515 | version = "0.15.0" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "c4dcb26f4a82f4f2a735d2390e390c499e84e1d5707eeabeefdbb8e160c870a7" 518 | dependencies = [ 519 | "burn-tensor 0.15.0", 520 | "half", 521 | "libc", 522 | "log", 523 | "rand", 524 | "tch", 525 | ] 526 | 527 | [[package]] 528 | name = "burn-tensor" 529 | version = "0.15.0" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "eb51351b03b2ab2a415c4de924df0409922c75268f9294793e38ae783754013c" 532 | dependencies = [ 533 | "burn-common 0.15.0", 534 | "bytemuck", 535 | "colored", 536 | "cubecl", 537 | "derive-new 0.6.0", 538 | "half", 539 | "hashbrown 0.15.2", 540 | "num-traits", 541 | "portable-atomic-util", 542 | "rand", 543 | "rand_distr", 544 | "serde", 545 | "serde_bytes", 546 | ] 547 | 548 | [[package]] 549 | name = "burn-tensor" 550 | version = "0.16.0" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "24db20273a636d5340e5a29af142722e0a657491e6b3cfcceb1e62eb862b3b37" 553 | dependencies = [ 554 | "burn-common 0.16.0", 555 | "bytemuck", 556 | "colored", 557 | "derive-new 0.7.0", 558 | "half", 559 | "hashbrown 0.15.2", 560 | "num-traits", 561 | "portable-atomic-util", 562 | "rand", 563 | "rand_distr", 564 | "serde", 565 | "serde_bytes", 566 | ] 567 | 568 | [[package]] 569 | name = "burn-train" 570 | version = "0.15.0" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "82e25321e3fb5633335217a0efe84ac2441c70bb61b4cdf66cc41f433ab38bef" 573 | dependencies = [ 574 | "burn-core", 575 | "derive-new 0.6.0", 576 | "log", 577 | "nvml-wrapper", 578 | "ratatui", 579 | "serde", 580 | "sysinfo", 581 | "systemstat", 582 | "tracing-appender", 583 | "tracing-core", 584 | "tracing-subscriber", 585 | ] 586 | 587 | [[package]] 588 | name = "burn-wgpu" 589 | version = "0.15.0" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "cd433918264c8233d104eee59294d13be2942740d369afa2284e08b143927c84" 592 | dependencies = [ 593 | "burn-fusion", 594 | "burn-jit", 595 | "burn-tensor 0.15.0", 596 | "cubecl", 597 | ] 598 | 599 | [[package]] 600 | name = "bytemuck" 601 | version = "1.21.0" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" 604 | dependencies = [ 605 | "bytemuck_derive", 606 | ] 607 | 608 | [[package]] 609 | name = "bytemuck_derive" 610 | version = "1.8.1" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" 613 | dependencies = [ 614 | "proc-macro2", 615 | "quote", 616 | "syn 2.0.96", 617 | ] 618 | 619 | [[package]] 620 | name = "byteorder" 621 | version = "1.5.0" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 624 | 625 | [[package]] 626 | name = "byteorder-lite" 627 | version = "0.1.0" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 630 | 631 | [[package]] 632 | name = "bytesize" 633 | version = "1.3.0" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" 636 | 637 | [[package]] 638 | name = "bzip2" 639 | version = "0.4.4" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" 642 | dependencies = [ 643 | "bzip2-sys", 644 | "libc", 645 | ] 646 | 647 | [[package]] 648 | name = "bzip2-sys" 649 | version = "0.1.11+1.0.8" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" 652 | dependencies = [ 653 | "cc", 654 | "libc", 655 | "pkg-config", 656 | ] 657 | 658 | [[package]] 659 | name = "candle-core" 660 | version = "0.6.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "d5b18de020c2729dbf7ac390325312644808b6ba9b7962f1f724e9185b1d53c7" 663 | dependencies = [ 664 | "byteorder", 665 | "gemm", 666 | "half", 667 | "memmap2", 668 | "num-traits", 669 | "num_cpus", 670 | "rand", 671 | "rand_distr", 672 | "rayon", 673 | "safetensors 0.4.5", 674 | "thiserror", 675 | "yoke", 676 | "zip 1.1.4", 677 | ] 678 | 679 | [[package]] 680 | name = "cassowary" 681 | version = "0.3.0" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" 684 | 685 | [[package]] 686 | name = "castaway" 687 | version = "0.2.3" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" 690 | dependencies = [ 691 | "rustversion", 692 | ] 693 | 694 | [[package]] 695 | name = "cc" 696 | version = "1.2.10" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" 699 | dependencies = [ 700 | "jobserver", 701 | "libc", 702 | "shlex", 703 | ] 704 | 705 | [[package]] 706 | name = "cfg-expr" 707 | version = "0.15.8" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" 710 | dependencies = [ 711 | "smallvec", 712 | "target-lexicon", 713 | ] 714 | 715 | [[package]] 716 | name = "cfg-if" 717 | version = "1.0.0" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 720 | 721 | [[package]] 722 | name = "cfg_aliases" 723 | version = "0.1.1" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 726 | 727 | [[package]] 728 | name = "cfg_aliases" 729 | version = "0.2.1" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 732 | 733 | [[package]] 734 | name = "chrono" 735 | version = "0.4.39" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 738 | dependencies = [ 739 | "android-tzdata", 740 | "iana-time-zone", 741 | "js-sys", 742 | "num-traits", 743 | "wasm-bindgen", 744 | "windows-targets 0.52.6", 745 | ] 746 | 747 | [[package]] 748 | name = "cipher" 749 | version = "0.4.4" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 752 | dependencies = [ 753 | "crypto-common", 754 | "inout", 755 | ] 756 | 757 | [[package]] 758 | name = "codespan-reporting" 759 | version = "0.11.1" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 762 | dependencies = [ 763 | "termcolor", 764 | "unicode-width 0.1.14", 765 | ] 766 | 767 | [[package]] 768 | name = "color_quant" 769 | version = "1.1.0" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 772 | 773 | [[package]] 774 | name = "colored" 775 | version = "2.2.0" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" 778 | dependencies = [ 779 | "lazy_static", 780 | "windows-sys 0.59.0", 781 | ] 782 | 783 | [[package]] 784 | name = "com" 785 | version = "0.6.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" 788 | dependencies = [ 789 | "com_macros", 790 | ] 791 | 792 | [[package]] 793 | name = "com_macros" 794 | version = "0.6.0" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" 797 | dependencies = [ 798 | "com_macros_support", 799 | "proc-macro2", 800 | "syn 1.0.109", 801 | ] 802 | 803 | [[package]] 804 | name = "com_macros_support" 805 | version = "0.6.0" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" 808 | dependencies = [ 809 | "proc-macro2", 810 | "quote", 811 | "syn 1.0.109", 812 | ] 813 | 814 | [[package]] 815 | name = "compact_str" 816 | version = "0.8.1" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" 819 | dependencies = [ 820 | "castaway", 821 | "cfg-if", 822 | "itoa", 823 | "rustversion", 824 | "ryu", 825 | "static_assertions", 826 | ] 827 | 828 | [[package]] 829 | name = "concurrent-queue" 830 | version = "2.5.0" 831 | source = "registry+https://github.com/rust-lang/crates.io-index" 832 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 833 | dependencies = [ 834 | "crossbeam-utils", 835 | ] 836 | 837 | [[package]] 838 | name = "constant_time_eq" 839 | version = "0.1.5" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 842 | 843 | [[package]] 844 | name = "core-foundation" 845 | version = "0.9.4" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 848 | dependencies = [ 849 | "core-foundation-sys", 850 | "libc", 851 | ] 852 | 853 | [[package]] 854 | name = "core-foundation-sys" 855 | version = "0.8.7" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 858 | 859 | [[package]] 860 | name = "core-graphics" 861 | version = "0.23.2" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 864 | dependencies = [ 865 | "bitflags 1.3.2", 866 | "core-foundation", 867 | "core-graphics-types", 868 | "foreign-types", 869 | "libc", 870 | ] 871 | 872 | [[package]] 873 | name = "core-graphics-types" 874 | version = "0.1.3" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 877 | dependencies = [ 878 | "bitflags 1.3.2", 879 | "core-foundation", 880 | "libc", 881 | ] 882 | 883 | [[package]] 884 | name = "core-text" 885 | version = "20.1.0" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" 888 | dependencies = [ 889 | "core-foundation", 890 | "core-graphics", 891 | "foreign-types", 892 | "libc", 893 | ] 894 | 895 | [[package]] 896 | name = "cpufeatures" 897 | version = "0.2.16" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" 900 | dependencies = [ 901 | "libc", 902 | ] 903 | 904 | [[package]] 905 | name = "crc32fast" 906 | version = "1.4.2" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 909 | dependencies = [ 910 | "cfg-if", 911 | ] 912 | 913 | [[package]] 914 | name = "crossbeam-channel" 915 | version = "0.5.14" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" 918 | dependencies = [ 919 | "crossbeam-utils", 920 | ] 921 | 922 | [[package]] 923 | name = "crossbeam-deque" 924 | version = "0.8.6" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 927 | dependencies = [ 928 | "crossbeam-epoch", 929 | "crossbeam-utils", 930 | ] 931 | 932 | [[package]] 933 | name = "crossbeam-epoch" 934 | version = "0.9.18" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 937 | dependencies = [ 938 | "crossbeam-utils", 939 | ] 940 | 941 | [[package]] 942 | name = "crossbeam-utils" 943 | version = "0.8.21" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 946 | 947 | [[package]] 948 | name = "crossterm" 949 | version = "0.28.1" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" 952 | dependencies = [ 953 | "bitflags 2.8.0", 954 | "crossterm_winapi", 955 | "mio", 956 | "parking_lot", 957 | "rustix", 958 | "signal-hook", 959 | "signal-hook-mio", 960 | "winapi", 961 | ] 962 | 963 | [[package]] 964 | name = "crossterm_winapi" 965 | version = "0.9.1" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 968 | dependencies = [ 969 | "winapi", 970 | ] 971 | 972 | [[package]] 973 | name = "crunchy" 974 | version = "0.2.3" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" 977 | 978 | [[package]] 979 | name = "crypto-common" 980 | version = "0.1.6" 981 | source = "registry+https://github.com/rust-lang/crates.io-index" 982 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 983 | dependencies = [ 984 | "generic-array", 985 | "typenum", 986 | ] 987 | 988 | [[package]] 989 | name = "csv" 990 | version = "1.3.1" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" 993 | dependencies = [ 994 | "csv-core", 995 | "itoa", 996 | "ryu", 997 | "serde", 998 | ] 999 | 1000 | [[package]] 1001 | name = "csv-core" 1002 | version = "0.1.11" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" 1005 | dependencies = [ 1006 | "memchr", 1007 | ] 1008 | 1009 | [[package]] 1010 | name = "cubecl" 1011 | version = "0.3.0" 1012 | source = "registry+https://github.com/rust-lang/crates.io-index" 1013 | checksum = "75e75c7e982b943380665c5901fe0b69d5df2627644e0e50199c52b64d8d5a1c" 1014 | dependencies = [ 1015 | "cubecl-core", 1016 | "cubecl-cuda", 1017 | "cubecl-hip", 1018 | "cubecl-linalg", 1019 | "cubecl-runtime", 1020 | "cubecl-wgpu", 1021 | ] 1022 | 1023 | [[package]] 1024 | name = "cubecl-common" 1025 | version = "0.3.0" 1026 | source = "registry+https://github.com/rust-lang/crates.io-index" 1027 | checksum = "51d402af454241d28d303a4cf4d2a861fae18404d65964c31934f746a40a6cf4" 1028 | dependencies = [ 1029 | "derive-new 0.6.0", 1030 | "embassy-futures", 1031 | "futures-lite", 1032 | "getrandom", 1033 | "log", 1034 | "portable-atomic", 1035 | "rand", 1036 | "serde", 1037 | "spin", 1038 | "web-time", 1039 | ] 1040 | 1041 | [[package]] 1042 | name = "cubecl-common" 1043 | version = "0.4.0" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "10239ee4800968f367fbc4828250d38acf5d14fa53e8d0370d5f474387591322" 1046 | dependencies = [ 1047 | "derive-new 0.6.0", 1048 | "embassy-futures", 1049 | "futures-lite", 1050 | "getrandom", 1051 | "log", 1052 | "portable-atomic", 1053 | "rand", 1054 | "serde", 1055 | "spin", 1056 | "web-time", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "cubecl-core" 1061 | version = "0.3.0" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "ec33b64139d1dfc747df8aed5834d10c3c55c716f5219041c6eb17241c96c929" 1064 | dependencies = [ 1065 | "bytemuck", 1066 | "cubecl-common 0.3.0", 1067 | "cubecl-macros", 1068 | "cubecl-runtime", 1069 | "derive-new 0.6.0", 1070 | "half", 1071 | "log", 1072 | "num-traits", 1073 | "paste", 1074 | "serde", 1075 | ] 1076 | 1077 | [[package]] 1078 | name = "cubecl-cpp" 1079 | version = "0.3.0" 1080 | source = "registry+https://github.com/rust-lang/crates.io-index" 1081 | checksum = "4ded461feb0ff342a4f675131dc0ae8ad94e58f66bad11e57f852cb7f190a731" 1082 | dependencies = [ 1083 | "bytemuck", 1084 | "cubecl-common 0.3.0", 1085 | "cubecl-core", 1086 | "cubecl-runtime", 1087 | "derive-new 0.6.0", 1088 | "half", 1089 | "log", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "cubecl-cuda" 1094 | version = "0.3.0" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | checksum = "88dfdfe616124d2abe5e82052ff56f86843c369440e181d6936f7409e161dd82" 1097 | dependencies = [ 1098 | "bytemuck", 1099 | "cubecl-common 0.3.0", 1100 | "cubecl-core", 1101 | "cubecl-cpp", 1102 | "cubecl-runtime", 1103 | "cudarc", 1104 | "derive-new 0.6.0", 1105 | "half", 1106 | "log", 1107 | ] 1108 | 1109 | [[package]] 1110 | name = "cubecl-hip" 1111 | version = "0.3.0" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | checksum = "409e0e176152ab51a60bbebb940b7a72aba210cd42b5f8cd2e87e7d7e674a13a" 1114 | dependencies = [ 1115 | "bytemuck", 1116 | "cubecl-common 0.3.0", 1117 | "cubecl-core", 1118 | "cubecl-cpp", 1119 | "cubecl-hip-sys", 1120 | "cubecl-runtime", 1121 | "derive-new 0.6.0", 1122 | "half", 1123 | "log", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "cubecl-hip-sys" 1128 | version = "0.0.5" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "2553766b483a28dd7db67cc4be9c61a7aa8cc7f02b3b8059ffdaeea1d8c8590e" 1131 | dependencies = [ 1132 | "libc", 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "cubecl-linalg" 1137 | version = "0.3.0" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "3c5634782d790e9b6562fc267ffd15e9a510b4d6ec32c144cd2b166af2ba0cfb" 1140 | dependencies = [ 1141 | "bytemuck", 1142 | "cubecl-core", 1143 | "cubecl-runtime", 1144 | "half", 1145 | ] 1146 | 1147 | [[package]] 1148 | name = "cubecl-macros" 1149 | version = "0.3.0" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "d2d22663257d9cdbcd67f5048d6f4e6eb965dd87104c3a173a7b0ea0d720e99b" 1152 | dependencies = [ 1153 | "cubecl-common 0.3.0", 1154 | "darling", 1155 | "derive-new 0.6.0", 1156 | "ident_case", 1157 | "prettyplease", 1158 | "proc-macro2", 1159 | "quote", 1160 | "syn 2.0.96", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "cubecl-runtime" 1165 | version = "0.3.0" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "3468467f412dff4bbf97fb5061a3557445f017299e2fb73ef7b96c6cdb799bc3" 1168 | dependencies = [ 1169 | "async-channel", 1170 | "async-lock", 1171 | "cfg_aliases 0.2.1", 1172 | "cubecl-common 0.3.0", 1173 | "derive-new 0.6.0", 1174 | "dirs", 1175 | "hashbrown 0.14.5", 1176 | "log", 1177 | "md5", 1178 | "sanitize-filename", 1179 | "serde", 1180 | "serde_json", 1181 | "spin", 1182 | "wasm-bindgen-futures", 1183 | ] 1184 | 1185 | [[package]] 1186 | name = "cubecl-wgpu" 1187 | version = "0.3.0" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "6779f1072d70923758421c6214fd0cd19a6f25b91035a522f9cd9407d03b5cae" 1190 | dependencies = [ 1191 | "async-channel", 1192 | "bytemuck", 1193 | "cfg_aliases 0.2.1", 1194 | "cubecl-common 0.3.0", 1195 | "cubecl-core", 1196 | "cubecl-runtime", 1197 | "derive-new 0.6.0", 1198 | "hashbrown 0.14.5", 1199 | "log", 1200 | "web-time", 1201 | "wgpu", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "cudarc" 1206 | version = "0.12.1" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "38cd60a9a42ec83a2ed7effb0b1f073270264ea99da7acfc44f7e8d74dee0384" 1209 | dependencies = [ 1210 | "libloading", 1211 | ] 1212 | 1213 | [[package]] 1214 | name = "d3d12" 1215 | version = "22.0.0" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "bdbd1f579714e3c809ebd822c81ef148b1ceaeb3d535352afc73fd0c4c6a0017" 1218 | dependencies = [ 1219 | "bitflags 2.8.0", 1220 | "libloading", 1221 | "winapi", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "darling" 1226 | version = "0.20.10" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 1229 | dependencies = [ 1230 | "darling_core", 1231 | "darling_macro", 1232 | ] 1233 | 1234 | [[package]] 1235 | name = "darling_core" 1236 | version = "0.20.10" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 1239 | dependencies = [ 1240 | "fnv", 1241 | "ident_case", 1242 | "proc-macro2", 1243 | "quote", 1244 | "strsim", 1245 | "syn 2.0.96", 1246 | ] 1247 | 1248 | [[package]] 1249 | name = "darling_macro" 1250 | version = "0.20.10" 1251 | source = "registry+https://github.com/rust-lang/crates.io-index" 1252 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 1253 | dependencies = [ 1254 | "darling_core", 1255 | "quote", 1256 | "syn 2.0.96", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "dashmap" 1261 | version = "6.1.0" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 1264 | dependencies = [ 1265 | "cfg-if", 1266 | "crossbeam-utils", 1267 | "hashbrown 0.14.5", 1268 | "lock_api", 1269 | "once_cell", 1270 | "parking_lot_core", 1271 | ] 1272 | 1273 | [[package]] 1274 | name = "data-encoding" 1275 | version = "2.7.0" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" 1278 | 1279 | [[package]] 1280 | name = "deranged" 1281 | version = "0.3.11" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 1284 | dependencies = [ 1285 | "powerfmt", 1286 | ] 1287 | 1288 | [[package]] 1289 | name = "derive-new" 1290 | version = "0.6.0" 1291 | source = "registry+https://github.com/rust-lang/crates.io-index" 1292 | checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" 1293 | dependencies = [ 1294 | "proc-macro2", 1295 | "quote", 1296 | "syn 2.0.96", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "derive-new" 1301 | version = "0.7.0" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc" 1304 | dependencies = [ 1305 | "proc-macro2", 1306 | "quote", 1307 | "syn 2.0.96", 1308 | ] 1309 | 1310 | [[package]] 1311 | name = "derive_arbitrary" 1312 | version = "1.4.1" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" 1315 | dependencies = [ 1316 | "proc-macro2", 1317 | "quote", 1318 | "syn 2.0.96", 1319 | ] 1320 | 1321 | [[package]] 1322 | name = "digest" 1323 | version = "0.10.7" 1324 | source = "registry+https://github.com/rust-lang/crates.io-index" 1325 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 1326 | dependencies = [ 1327 | "block-buffer", 1328 | "crypto-common", 1329 | "subtle", 1330 | ] 1331 | 1332 | [[package]] 1333 | name = "dirs" 1334 | version = "5.0.1" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 1337 | dependencies = [ 1338 | "dirs-sys", 1339 | ] 1340 | 1341 | [[package]] 1342 | name = "dirs-sys" 1343 | version = "0.4.1" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 1346 | dependencies = [ 1347 | "libc", 1348 | "option-ext", 1349 | "redox_users", 1350 | "windows-sys 0.48.0", 1351 | ] 1352 | 1353 | [[package]] 1354 | name = "displaydoc" 1355 | version = "0.2.5" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 1358 | dependencies = [ 1359 | "proc-macro2", 1360 | "quote", 1361 | "syn 2.0.96", 1362 | ] 1363 | 1364 | [[package]] 1365 | name = "dlib" 1366 | version = "0.5.2" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 1369 | dependencies = [ 1370 | "libloading", 1371 | ] 1372 | 1373 | [[package]] 1374 | name = "document-features" 1375 | version = "0.2.10" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" 1378 | dependencies = [ 1379 | "litrs", 1380 | ] 1381 | 1382 | [[package]] 1383 | name = "dwrote" 1384 | version = "0.11.2" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "70182709525a3632b2ba96b6569225467b18ecb4a77f46d255f713a6bebf05fd" 1387 | dependencies = [ 1388 | "lazy_static", 1389 | "libc", 1390 | "winapi", 1391 | "wio", 1392 | ] 1393 | 1394 | [[package]] 1395 | name = "dyn-stack" 1396 | version = "0.10.0" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" 1399 | dependencies = [ 1400 | "bytemuck", 1401 | "reborrow", 1402 | ] 1403 | 1404 | [[package]] 1405 | name = "either" 1406 | version = "1.13.0" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 1409 | 1410 | [[package]] 1411 | name = "embassy-futures" 1412 | version = "0.1.1" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" 1415 | 1416 | [[package]] 1417 | name = "enum-as-inner" 1418 | version = "0.6.1" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" 1421 | dependencies = [ 1422 | "heck", 1423 | "proc-macro2", 1424 | "quote", 1425 | "syn 2.0.96", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "equivalent" 1430 | version = "1.0.1" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 1433 | 1434 | [[package]] 1435 | name = "errno" 1436 | version = "0.3.10" 1437 | source = "registry+https://github.com/rust-lang/crates.io-index" 1438 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 1439 | dependencies = [ 1440 | "libc", 1441 | "windows-sys 0.59.0", 1442 | ] 1443 | 1444 | [[package]] 1445 | name = "event-listener" 1446 | version = "5.4.0" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1449 | dependencies = [ 1450 | "concurrent-queue", 1451 | "parking", 1452 | "pin-project-lite", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "event-listener-strategy" 1457 | version = "0.5.3" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" 1460 | dependencies = [ 1461 | "event-listener", 1462 | "pin-project-lite", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "exr" 1467 | version = "1.73.0" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" 1470 | dependencies = [ 1471 | "bit_field", 1472 | "half", 1473 | "lebe", 1474 | "miniz_oxide", 1475 | "rayon-core", 1476 | "smallvec", 1477 | "zune-inflate", 1478 | ] 1479 | 1480 | [[package]] 1481 | name = "fallible-iterator" 1482 | version = "0.3.0" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" 1485 | 1486 | [[package]] 1487 | name = "fallible-streaming-iterator" 1488 | version = "0.1.9" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" 1491 | 1492 | [[package]] 1493 | name = "faster-hex" 1494 | version = "0.9.0" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183" 1497 | 1498 | [[package]] 1499 | name = "fastrand" 1500 | version = "2.3.0" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1503 | 1504 | [[package]] 1505 | name = "fdeflate" 1506 | version = "0.3.7" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 1509 | dependencies = [ 1510 | "simd-adler32", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "flate2" 1515 | version = "1.0.35" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" 1518 | dependencies = [ 1519 | "crc32fast", 1520 | "miniz_oxide", 1521 | ] 1522 | 1523 | [[package]] 1524 | name = "float-ord" 1525 | version = "0.3.2" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" 1528 | 1529 | [[package]] 1530 | name = "fnv" 1531 | version = "1.0.7" 1532 | source = "registry+https://github.com/rust-lang/crates.io-index" 1533 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1534 | 1535 | [[package]] 1536 | name = "foldhash" 1537 | version = "0.1.4" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 1540 | 1541 | [[package]] 1542 | name = "font-kit" 1543 | version = "0.14.2" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "b64b34f4efd515f905952d91bc185039863705592c0c53ae6d979805dd154520" 1546 | dependencies = [ 1547 | "bitflags 2.8.0", 1548 | "byteorder", 1549 | "core-foundation", 1550 | "core-graphics", 1551 | "core-text", 1552 | "dirs", 1553 | "dwrote", 1554 | "float-ord", 1555 | "freetype-sys", 1556 | "lazy_static", 1557 | "libc", 1558 | "log", 1559 | "pathfinder_geometry", 1560 | "pathfinder_simd", 1561 | "walkdir", 1562 | "winapi", 1563 | "yeslogic-fontconfig-sys", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "foreign-types" 1568 | version = "0.5.0" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 1571 | dependencies = [ 1572 | "foreign-types-macros", 1573 | "foreign-types-shared", 1574 | ] 1575 | 1576 | [[package]] 1577 | name = "foreign-types-macros" 1578 | version = "0.2.3" 1579 | source = "registry+https://github.com/rust-lang/crates.io-index" 1580 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 1581 | dependencies = [ 1582 | "proc-macro2", 1583 | "quote", 1584 | "syn 2.0.96", 1585 | ] 1586 | 1587 | [[package]] 1588 | name = "foreign-types-shared" 1589 | version = "0.3.1" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 1592 | 1593 | [[package]] 1594 | name = "form_urlencoded" 1595 | version = "1.2.1" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1598 | dependencies = [ 1599 | "percent-encoding", 1600 | ] 1601 | 1602 | [[package]] 1603 | name = "freetype-sys" 1604 | version = "0.20.1" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" 1607 | dependencies = [ 1608 | "cc", 1609 | "libc", 1610 | "pkg-config", 1611 | ] 1612 | 1613 | [[package]] 1614 | name = "futures-core" 1615 | version = "0.3.31" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1618 | 1619 | [[package]] 1620 | name = "futures-io" 1621 | version = "0.3.31" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1624 | 1625 | [[package]] 1626 | name = "futures-lite" 1627 | version = "2.6.0" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1630 | dependencies = [ 1631 | "fastrand", 1632 | "futures-core", 1633 | "futures-io", 1634 | "parking", 1635 | "pin-project-lite", 1636 | ] 1637 | 1638 | [[package]] 1639 | name = "gemm" 1640 | version = "0.17.1" 1641 | source = "registry+https://github.com/rust-lang/crates.io-index" 1642 | checksum = "6ab24cc62135b40090e31a76a9b2766a501979f3070fa27f689c27ec04377d32" 1643 | dependencies = [ 1644 | "dyn-stack", 1645 | "gemm-c32", 1646 | "gemm-c64", 1647 | "gemm-common", 1648 | "gemm-f16", 1649 | "gemm-f32", 1650 | "gemm-f64", 1651 | "num-complex", 1652 | "num-traits", 1653 | "paste", 1654 | "raw-cpuid", 1655 | "seq-macro", 1656 | ] 1657 | 1658 | [[package]] 1659 | name = "gemm-c32" 1660 | version = "0.17.1" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "b9c030d0b983d1e34a546b86e08f600c11696fde16199f971cd46c12e67512c0" 1663 | dependencies = [ 1664 | "dyn-stack", 1665 | "gemm-common", 1666 | "num-complex", 1667 | "num-traits", 1668 | "paste", 1669 | "raw-cpuid", 1670 | "seq-macro", 1671 | ] 1672 | 1673 | [[package]] 1674 | name = "gemm-c64" 1675 | version = "0.17.1" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "fbb5f2e79fefb9693d18e1066a557b4546cd334b226beadc68b11a8f9431852a" 1678 | dependencies = [ 1679 | "dyn-stack", 1680 | "gemm-common", 1681 | "num-complex", 1682 | "num-traits", 1683 | "paste", 1684 | "raw-cpuid", 1685 | "seq-macro", 1686 | ] 1687 | 1688 | [[package]] 1689 | name = "gemm-common" 1690 | version = "0.17.1" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "a2e7ea062c987abcd8db95db917b4ffb4ecdfd0668471d8dc54734fdff2354e8" 1693 | dependencies = [ 1694 | "bytemuck", 1695 | "dyn-stack", 1696 | "half", 1697 | "num-complex", 1698 | "num-traits", 1699 | "once_cell", 1700 | "paste", 1701 | "pulp", 1702 | "raw-cpuid", 1703 | "rayon", 1704 | "seq-macro", 1705 | "sysctl", 1706 | ] 1707 | 1708 | [[package]] 1709 | name = "gemm-f16" 1710 | version = "0.17.1" 1711 | source = "registry+https://github.com/rust-lang/crates.io-index" 1712 | checksum = "7ca4c06b9b11952071d317604acb332e924e817bd891bec8dfb494168c7cedd4" 1713 | dependencies = [ 1714 | "dyn-stack", 1715 | "gemm-common", 1716 | "gemm-f32", 1717 | "half", 1718 | "num-complex", 1719 | "num-traits", 1720 | "paste", 1721 | "raw-cpuid", 1722 | "rayon", 1723 | "seq-macro", 1724 | ] 1725 | 1726 | [[package]] 1727 | name = "gemm-f32" 1728 | version = "0.17.1" 1729 | source = "registry+https://github.com/rust-lang/crates.io-index" 1730 | checksum = "e9a69f51aaefbd9cf12d18faf273d3e982d9d711f60775645ed5c8047b4ae113" 1731 | dependencies = [ 1732 | "dyn-stack", 1733 | "gemm-common", 1734 | "num-complex", 1735 | "num-traits", 1736 | "paste", 1737 | "raw-cpuid", 1738 | "seq-macro", 1739 | ] 1740 | 1741 | [[package]] 1742 | name = "gemm-f64" 1743 | version = "0.17.1" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "aa397a48544fadf0b81ec8741e5c0fba0043008113f71f2034def1935645d2b0" 1746 | dependencies = [ 1747 | "dyn-stack", 1748 | "gemm-common", 1749 | "num-complex", 1750 | "num-traits", 1751 | "paste", 1752 | "raw-cpuid", 1753 | "seq-macro", 1754 | ] 1755 | 1756 | [[package]] 1757 | name = "generic-array" 1758 | version = "0.14.7" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1761 | dependencies = [ 1762 | "typenum", 1763 | "version_check", 1764 | ] 1765 | 1766 | [[package]] 1767 | name = "getrandom" 1768 | version = "0.2.15" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 1771 | dependencies = [ 1772 | "cfg-if", 1773 | "js-sys", 1774 | "libc", 1775 | "wasi", 1776 | "wasm-bindgen", 1777 | ] 1778 | 1779 | [[package]] 1780 | name = "gif" 1781 | version = "0.12.0" 1782 | source = "registry+https://github.com/rust-lang/crates.io-index" 1783 | checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" 1784 | dependencies = [ 1785 | "color_quant", 1786 | "weezl", 1787 | ] 1788 | 1789 | [[package]] 1790 | name = "gif" 1791 | version = "0.13.1" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" 1794 | dependencies = [ 1795 | "color_quant", 1796 | "weezl", 1797 | ] 1798 | 1799 | [[package]] 1800 | name = "gix-features" 1801 | version = "0.38.2" 1802 | source = "registry+https://github.com/rust-lang/crates.io-index" 1803 | checksum = "ac7045ac9fe5f9c727f38799d002a7ed3583cd777e3322a7c4b43e3cf437dc69" 1804 | dependencies = [ 1805 | "gix-hash", 1806 | "gix-trace", 1807 | "gix-utils", 1808 | "libc", 1809 | ] 1810 | 1811 | [[package]] 1812 | name = "gix-fs" 1813 | version = "0.11.3" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "f2bfe6249cfea6d0c0e0990d5226a4cb36f030444ba9e35e0639275db8f98575" 1816 | dependencies = [ 1817 | "fastrand", 1818 | "gix-features", 1819 | "gix-utils", 1820 | ] 1821 | 1822 | [[package]] 1823 | name = "gix-hash" 1824 | version = "0.14.2" 1825 | source = "registry+https://github.com/rust-lang/crates.io-index" 1826 | checksum = "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e" 1827 | dependencies = [ 1828 | "faster-hex", 1829 | "thiserror", 1830 | ] 1831 | 1832 | [[package]] 1833 | name = "gix-tempfile" 1834 | version = "14.0.2" 1835 | source = "registry+https://github.com/rust-lang/crates.io-index" 1836 | checksum = "046b4927969fa816a150a0cda2e62c80016fe11fb3c3184e4dddf4e542f108aa" 1837 | dependencies = [ 1838 | "dashmap", 1839 | "gix-fs", 1840 | "libc", 1841 | "once_cell", 1842 | "parking_lot", 1843 | "signal-hook", 1844 | "signal-hook-registry", 1845 | "tempfile", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "gix-trace" 1850 | version = "0.1.12" 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" 1852 | checksum = "7c396a2036920c69695f760a65e7f2677267ccf483f25046977d87e4cb2665f7" 1853 | 1854 | [[package]] 1855 | name = "gix-utils" 1856 | version = "0.1.14" 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" 1858 | checksum = "ff08f24e03ac8916c478c8419d7d3c33393da9bb41fa4c24455d5406aeefd35f" 1859 | dependencies = [ 1860 | "fastrand", 1861 | "unicode-normalization", 1862 | ] 1863 | 1864 | [[package]] 1865 | name = "gl_generator" 1866 | version = "0.14.0" 1867 | source = "registry+https://github.com/rust-lang/crates.io-index" 1868 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 1869 | dependencies = [ 1870 | "khronos_api", 1871 | "log", 1872 | "xml-rs", 1873 | ] 1874 | 1875 | [[package]] 1876 | name = "glow" 1877 | version = "0.13.1" 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" 1879 | checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" 1880 | dependencies = [ 1881 | "js-sys", 1882 | "slotmap", 1883 | "wasm-bindgen", 1884 | "web-sys", 1885 | ] 1886 | 1887 | [[package]] 1888 | name = "glutin_wgl_sys" 1889 | version = "0.6.1" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" 1892 | dependencies = [ 1893 | "gl_generator", 1894 | ] 1895 | 1896 | [[package]] 1897 | name = "gpu-alloc" 1898 | version = "0.6.0" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 1901 | dependencies = [ 1902 | "bitflags 2.8.0", 1903 | "gpu-alloc-types", 1904 | ] 1905 | 1906 | [[package]] 1907 | name = "gpu-alloc-types" 1908 | version = "0.3.0" 1909 | source = "registry+https://github.com/rust-lang/crates.io-index" 1910 | checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 1911 | dependencies = [ 1912 | "bitflags 2.8.0", 1913 | ] 1914 | 1915 | [[package]] 1916 | name = "gpu-allocator" 1917 | version = "0.26.0" 1918 | source = "registry+https://github.com/rust-lang/crates.io-index" 1919 | checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7" 1920 | dependencies = [ 1921 | "log", 1922 | "presser", 1923 | "thiserror", 1924 | "winapi", 1925 | "windows", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "gpu-descriptor" 1930 | version = "0.3.1" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" 1933 | dependencies = [ 1934 | "bitflags 2.8.0", 1935 | "gpu-descriptor-types", 1936 | "hashbrown 0.15.2", 1937 | ] 1938 | 1939 | [[package]] 1940 | name = "gpu-descriptor-types" 1941 | version = "0.2.0" 1942 | source = "registry+https://github.com/rust-lang/crates.io-index" 1943 | checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" 1944 | dependencies = [ 1945 | "bitflags 2.8.0", 1946 | ] 1947 | 1948 | [[package]] 1949 | name = "half" 1950 | version = "2.4.1" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 1953 | dependencies = [ 1954 | "bytemuck", 1955 | "cfg-if", 1956 | "crunchy", 1957 | "num-traits", 1958 | "rand", 1959 | "rand_distr", 1960 | "serde", 1961 | ] 1962 | 1963 | [[package]] 1964 | name = "hashbrown" 1965 | version = "0.13.2" 1966 | source = "registry+https://github.com/rust-lang/crates.io-index" 1967 | checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" 1968 | dependencies = [ 1969 | "ahash", 1970 | ] 1971 | 1972 | [[package]] 1973 | name = "hashbrown" 1974 | version = "0.14.5" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1977 | dependencies = [ 1978 | "ahash", 1979 | "allocator-api2", 1980 | ] 1981 | 1982 | [[package]] 1983 | name = "hashbrown" 1984 | version = "0.15.2" 1985 | source = "registry+https://github.com/rust-lang/crates.io-index" 1986 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 1987 | dependencies = [ 1988 | "allocator-api2", 1989 | "equivalent", 1990 | "foldhash", 1991 | "serde", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "hashlink" 1996 | version = "0.9.1" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" 1999 | dependencies = [ 2000 | "hashbrown 0.14.5", 2001 | ] 2002 | 2003 | [[package]] 2004 | name = "hassle-rs" 2005 | version = "0.11.0" 2006 | source = "registry+https://github.com/rust-lang/crates.io-index" 2007 | checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" 2008 | dependencies = [ 2009 | "bitflags 2.8.0", 2010 | "com", 2011 | "libc", 2012 | "libloading", 2013 | "thiserror", 2014 | "widestring", 2015 | "winapi", 2016 | ] 2017 | 2018 | [[package]] 2019 | name = "heck" 2020 | version = "0.5.0" 2021 | source = "registry+https://github.com/rust-lang/crates.io-index" 2022 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 2023 | 2024 | [[package]] 2025 | name = "hermit-abi" 2026 | version = "0.3.9" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 2029 | 2030 | [[package]] 2031 | name = "hexf-parse" 2032 | version = "0.2.1" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 2035 | 2036 | [[package]] 2037 | name = "hmac" 2038 | version = "0.12.1" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 2041 | dependencies = [ 2042 | "digest", 2043 | ] 2044 | 2045 | [[package]] 2046 | name = "iana-time-zone" 2047 | version = "0.1.61" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 2050 | dependencies = [ 2051 | "android_system_properties", 2052 | "core-foundation-sys", 2053 | "iana-time-zone-haiku", 2054 | "js-sys", 2055 | "wasm-bindgen", 2056 | "windows-core", 2057 | ] 2058 | 2059 | [[package]] 2060 | name = "iana-time-zone-haiku" 2061 | version = "0.1.2" 2062 | source = "registry+https://github.com/rust-lang/crates.io-index" 2063 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 2064 | dependencies = [ 2065 | "cc", 2066 | ] 2067 | 2068 | [[package]] 2069 | name = "icu_collections" 2070 | version = "1.5.0" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 2073 | dependencies = [ 2074 | "displaydoc", 2075 | "yoke", 2076 | "zerofrom", 2077 | "zerovec", 2078 | ] 2079 | 2080 | [[package]] 2081 | name = "icu_locid" 2082 | version = "1.5.0" 2083 | source = "registry+https://github.com/rust-lang/crates.io-index" 2084 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 2085 | dependencies = [ 2086 | "displaydoc", 2087 | "litemap", 2088 | "tinystr", 2089 | "writeable", 2090 | "zerovec", 2091 | ] 2092 | 2093 | [[package]] 2094 | name = "icu_locid_transform" 2095 | version = "1.5.0" 2096 | source = "registry+https://github.com/rust-lang/crates.io-index" 2097 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 2098 | dependencies = [ 2099 | "displaydoc", 2100 | "icu_locid", 2101 | "icu_locid_transform_data", 2102 | "icu_provider", 2103 | "tinystr", 2104 | "zerovec", 2105 | ] 2106 | 2107 | [[package]] 2108 | name = "icu_locid_transform_data" 2109 | version = "1.5.0" 2110 | source = "registry+https://github.com/rust-lang/crates.io-index" 2111 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 2112 | 2113 | [[package]] 2114 | name = "icu_normalizer" 2115 | version = "1.5.0" 2116 | source = "registry+https://github.com/rust-lang/crates.io-index" 2117 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 2118 | dependencies = [ 2119 | "displaydoc", 2120 | "icu_collections", 2121 | "icu_normalizer_data", 2122 | "icu_properties", 2123 | "icu_provider", 2124 | "smallvec", 2125 | "utf16_iter", 2126 | "utf8_iter", 2127 | "write16", 2128 | "zerovec", 2129 | ] 2130 | 2131 | [[package]] 2132 | name = "icu_normalizer_data" 2133 | version = "1.5.0" 2134 | source = "registry+https://github.com/rust-lang/crates.io-index" 2135 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 2136 | 2137 | [[package]] 2138 | name = "icu_properties" 2139 | version = "1.5.1" 2140 | source = "registry+https://github.com/rust-lang/crates.io-index" 2141 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 2142 | dependencies = [ 2143 | "displaydoc", 2144 | "icu_collections", 2145 | "icu_locid_transform", 2146 | "icu_properties_data", 2147 | "icu_provider", 2148 | "tinystr", 2149 | "zerovec", 2150 | ] 2151 | 2152 | [[package]] 2153 | name = "icu_properties_data" 2154 | version = "1.5.0" 2155 | source = "registry+https://github.com/rust-lang/crates.io-index" 2156 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 2157 | 2158 | [[package]] 2159 | name = "icu_provider" 2160 | version = "1.5.0" 2161 | source = "registry+https://github.com/rust-lang/crates.io-index" 2162 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 2163 | dependencies = [ 2164 | "displaydoc", 2165 | "icu_locid", 2166 | "icu_provider_macros", 2167 | "stable_deref_trait", 2168 | "tinystr", 2169 | "writeable", 2170 | "yoke", 2171 | "zerofrom", 2172 | "zerovec", 2173 | ] 2174 | 2175 | [[package]] 2176 | name = "icu_provider_macros" 2177 | version = "1.5.0" 2178 | source = "registry+https://github.com/rust-lang/crates.io-index" 2179 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 2180 | dependencies = [ 2181 | "proc-macro2", 2182 | "quote", 2183 | "syn 2.0.96", 2184 | ] 2185 | 2186 | [[package]] 2187 | name = "ident_case" 2188 | version = "1.0.1" 2189 | source = "registry+https://github.com/rust-lang/crates.io-index" 2190 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 2191 | 2192 | [[package]] 2193 | name = "idna" 2194 | version = "1.0.3" 2195 | source = "registry+https://github.com/rust-lang/crates.io-index" 2196 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 2197 | dependencies = [ 2198 | "idna_adapter", 2199 | "smallvec", 2200 | "utf8_iter", 2201 | ] 2202 | 2203 | [[package]] 2204 | name = "idna_adapter" 2205 | version = "1.2.0" 2206 | source = "registry+https://github.com/rust-lang/crates.io-index" 2207 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 2208 | dependencies = [ 2209 | "icu_normalizer", 2210 | "icu_properties", 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "image" 2215 | version = "0.24.9" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" 2218 | dependencies = [ 2219 | "bytemuck", 2220 | "byteorder", 2221 | "color_quant", 2222 | "jpeg-decoder", 2223 | "num-traits", 2224 | "png", 2225 | ] 2226 | 2227 | [[package]] 2228 | name = "image" 2229 | version = "0.25.5" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" 2232 | dependencies = [ 2233 | "bytemuck", 2234 | "byteorder-lite", 2235 | "color_quant", 2236 | "exr", 2237 | "gif 0.13.1", 2238 | "image-webp", 2239 | "num-traits", 2240 | "png", 2241 | "qoi", 2242 | "ravif", 2243 | "rayon", 2244 | "rgb", 2245 | "tiff", 2246 | "zune-core", 2247 | "zune-jpeg", 2248 | ] 2249 | 2250 | [[package]] 2251 | name = "image-webp" 2252 | version = "0.2.1" 2253 | source = "registry+https://github.com/rust-lang/crates.io-index" 2254 | checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" 2255 | dependencies = [ 2256 | "byteorder-lite", 2257 | "quick-error", 2258 | ] 2259 | 2260 | [[package]] 2261 | name = "imgref" 2262 | version = "1.11.0" 2263 | source = "registry+https://github.com/rust-lang/crates.io-index" 2264 | checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" 2265 | 2266 | [[package]] 2267 | name = "indexmap" 2268 | version = "2.7.1" 2269 | source = "registry+https://github.com/rust-lang/crates.io-index" 2270 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 2271 | dependencies = [ 2272 | "equivalent", 2273 | "hashbrown 0.15.2", 2274 | ] 2275 | 2276 | [[package]] 2277 | name = "indoc" 2278 | version = "2.0.5" 2279 | source = "registry+https://github.com/rust-lang/crates.io-index" 2280 | checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" 2281 | 2282 | [[package]] 2283 | name = "inout" 2284 | version = "0.1.3" 2285 | source = "registry+https://github.com/rust-lang/crates.io-index" 2286 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 2287 | dependencies = [ 2288 | "generic-array", 2289 | ] 2290 | 2291 | [[package]] 2292 | name = "instability" 2293 | version = "0.3.7" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" 2296 | dependencies = [ 2297 | "darling", 2298 | "indoc", 2299 | "proc-macro2", 2300 | "quote", 2301 | "syn 2.0.96", 2302 | ] 2303 | 2304 | [[package]] 2305 | name = "interpolate_name" 2306 | version = "0.2.4" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" 2309 | dependencies = [ 2310 | "proc-macro2", 2311 | "quote", 2312 | "syn 2.0.96", 2313 | ] 2314 | 2315 | [[package]] 2316 | name = "itertools" 2317 | version = "0.12.1" 2318 | source = "registry+https://github.com/rust-lang/crates.io-index" 2319 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 2320 | dependencies = [ 2321 | "either", 2322 | ] 2323 | 2324 | [[package]] 2325 | name = "itertools" 2326 | version = "0.13.0" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 2329 | dependencies = [ 2330 | "either", 2331 | ] 2332 | 2333 | [[package]] 2334 | name = "itoa" 2335 | version = "1.0.14" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 2338 | 2339 | [[package]] 2340 | name = "jni-sys" 2341 | version = "0.3.0" 2342 | source = "registry+https://github.com/rust-lang/crates.io-index" 2343 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 2344 | 2345 | [[package]] 2346 | name = "jobserver" 2347 | version = "0.1.32" 2348 | source = "registry+https://github.com/rust-lang/crates.io-index" 2349 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 2350 | dependencies = [ 2351 | "libc", 2352 | ] 2353 | 2354 | [[package]] 2355 | name = "jpeg-decoder" 2356 | version = "0.3.1" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 2359 | 2360 | [[package]] 2361 | name = "js-sys" 2362 | version = "0.3.77" 2363 | source = "registry+https://github.com/rust-lang/crates.io-index" 2364 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 2365 | dependencies = [ 2366 | "once_cell", 2367 | "wasm-bindgen", 2368 | ] 2369 | 2370 | [[package]] 2371 | name = "khronos-egl" 2372 | version = "6.0.0" 2373 | source = "registry+https://github.com/rust-lang/crates.io-index" 2374 | checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 2375 | dependencies = [ 2376 | "libc", 2377 | "libloading", 2378 | "pkg-config", 2379 | ] 2380 | 2381 | [[package]] 2382 | name = "khronos_api" 2383 | version = "3.1.0" 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" 2385 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 2386 | 2387 | [[package]] 2388 | name = "lazy_static" 2389 | version = "1.5.0" 2390 | source = "registry+https://github.com/rust-lang/crates.io-index" 2391 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2392 | 2393 | [[package]] 2394 | name = "lebe" 2395 | version = "0.5.2" 2396 | source = "registry+https://github.com/rust-lang/crates.io-index" 2397 | checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" 2398 | 2399 | [[package]] 2400 | name = "libc" 2401 | version = "0.2.169" 2402 | source = "registry+https://github.com/rust-lang/crates.io-index" 2403 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 2404 | 2405 | [[package]] 2406 | name = "libfuzzer-sys" 2407 | version = "0.4.8" 2408 | source = "registry+https://github.com/rust-lang/crates.io-index" 2409 | checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" 2410 | dependencies = [ 2411 | "arbitrary", 2412 | "cc", 2413 | ] 2414 | 2415 | [[package]] 2416 | name = "libloading" 2417 | version = "0.8.6" 2418 | source = "registry+https://github.com/rust-lang/crates.io-index" 2419 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 2420 | dependencies = [ 2421 | "cfg-if", 2422 | "windows-targets 0.52.6", 2423 | ] 2424 | 2425 | [[package]] 2426 | name = "libm" 2427 | version = "0.2.11" 2428 | source = "registry+https://github.com/rust-lang/crates.io-index" 2429 | checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 2430 | 2431 | [[package]] 2432 | name = "libredox" 2433 | version = "0.1.3" 2434 | source = "registry+https://github.com/rust-lang/crates.io-index" 2435 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 2436 | dependencies = [ 2437 | "bitflags 2.8.0", 2438 | "libc", 2439 | ] 2440 | 2441 | [[package]] 2442 | name = "libsqlite3-sys" 2443 | version = "0.30.1" 2444 | source = "registry+https://github.com/rust-lang/crates.io-index" 2445 | checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 2446 | dependencies = [ 2447 | "cc", 2448 | "pkg-config", 2449 | "vcpkg", 2450 | ] 2451 | 2452 | [[package]] 2453 | name = "linux-raw-sys" 2454 | version = "0.4.15" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 2457 | 2458 | [[package]] 2459 | name = "litemap" 2460 | version = "0.7.4" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 2463 | 2464 | [[package]] 2465 | name = "litrs" 2466 | version = "0.4.1" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 2469 | 2470 | [[package]] 2471 | name = "lock_api" 2472 | version = "0.4.12" 2473 | source = "registry+https://github.com/rust-lang/crates.io-index" 2474 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 2475 | dependencies = [ 2476 | "autocfg", 2477 | "scopeguard", 2478 | ] 2479 | 2480 | [[package]] 2481 | name = "log" 2482 | version = "0.4.25" 2483 | source = "registry+https://github.com/rust-lang/crates.io-index" 2484 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 2485 | 2486 | [[package]] 2487 | name = "loop9" 2488 | version = "0.1.5" 2489 | source = "registry+https://github.com/rust-lang/crates.io-index" 2490 | checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" 2491 | dependencies = [ 2492 | "imgref", 2493 | ] 2494 | 2495 | [[package]] 2496 | name = "lru" 2497 | version = "0.12.5" 2498 | source = "registry+https://github.com/rust-lang/crates.io-index" 2499 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 2500 | dependencies = [ 2501 | "hashbrown 0.15.2", 2502 | ] 2503 | 2504 | [[package]] 2505 | name = "makemore_rs" 2506 | version = "0.1.0" 2507 | dependencies = [ 2508 | "burn", 2509 | "burn-ndarray 0.16.0", 2510 | "ndarray 0.16.1", 2511 | "num-traits", 2512 | "plotters", 2513 | "rand", 2514 | "rand_distr", 2515 | "uuid", 2516 | ] 2517 | 2518 | [[package]] 2519 | name = "malloc_buf" 2520 | version = "0.0.6" 2521 | source = "registry+https://github.com/rust-lang/crates.io-index" 2522 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 2523 | dependencies = [ 2524 | "libc", 2525 | ] 2526 | 2527 | [[package]] 2528 | name = "matrixmultiply" 2529 | version = "0.3.9" 2530 | source = "registry+https://github.com/rust-lang/crates.io-index" 2531 | checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" 2532 | dependencies = [ 2533 | "autocfg", 2534 | "num_cpus", 2535 | "once_cell", 2536 | "rawpointer", 2537 | "thread-tree", 2538 | ] 2539 | 2540 | [[package]] 2541 | name = "maybe-rayon" 2542 | version = "0.1.1" 2543 | source = "registry+https://github.com/rust-lang/crates.io-index" 2544 | checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" 2545 | dependencies = [ 2546 | "cfg-if", 2547 | "rayon", 2548 | ] 2549 | 2550 | [[package]] 2551 | name = "md5" 2552 | version = "0.7.0" 2553 | source = "registry+https://github.com/rust-lang/crates.io-index" 2554 | checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" 2555 | 2556 | [[package]] 2557 | name = "memchr" 2558 | version = "2.7.4" 2559 | source = "registry+https://github.com/rust-lang/crates.io-index" 2560 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 2561 | 2562 | [[package]] 2563 | name = "memmap2" 2564 | version = "0.9.5" 2565 | source = "registry+https://github.com/rust-lang/crates.io-index" 2566 | checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" 2567 | dependencies = [ 2568 | "libc", 2569 | "stable_deref_trait", 2570 | ] 2571 | 2572 | [[package]] 2573 | name = "metal" 2574 | version = "0.29.0" 2575 | source = "registry+https://github.com/rust-lang/crates.io-index" 2576 | checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" 2577 | dependencies = [ 2578 | "bitflags 2.8.0", 2579 | "block", 2580 | "core-graphics-types", 2581 | "foreign-types", 2582 | "log", 2583 | "objc", 2584 | "paste", 2585 | ] 2586 | 2587 | [[package]] 2588 | name = "minimal-lexical" 2589 | version = "0.2.1" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2592 | 2593 | [[package]] 2594 | name = "miniz_oxide" 2595 | version = "0.8.3" 2596 | source = "registry+https://github.com/rust-lang/crates.io-index" 2597 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 2598 | dependencies = [ 2599 | "adler2", 2600 | "simd-adler32", 2601 | ] 2602 | 2603 | [[package]] 2604 | name = "mio" 2605 | version = "1.0.3" 2606 | source = "registry+https://github.com/rust-lang/crates.io-index" 2607 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 2608 | dependencies = [ 2609 | "libc", 2610 | "log", 2611 | "wasi", 2612 | "windows-sys 0.52.0", 2613 | ] 2614 | 2615 | [[package]] 2616 | name = "naga" 2617 | version = "22.1.0" 2618 | source = "registry+https://github.com/rust-lang/crates.io-index" 2619 | checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" 2620 | dependencies = [ 2621 | "arrayvec", 2622 | "bit-set", 2623 | "bitflags 2.8.0", 2624 | "cfg_aliases 0.1.1", 2625 | "codespan-reporting", 2626 | "hexf-parse", 2627 | "indexmap", 2628 | "log", 2629 | "rustc-hash", 2630 | "spirv", 2631 | "termcolor", 2632 | "thiserror", 2633 | "unicode-xid", 2634 | ] 2635 | 2636 | [[package]] 2637 | name = "ndarray" 2638 | version = "0.15.6" 2639 | source = "registry+https://github.com/rust-lang/crates.io-index" 2640 | checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" 2641 | dependencies = [ 2642 | "matrixmultiply", 2643 | "num-complex", 2644 | "num-integer", 2645 | "num-traits", 2646 | "rawpointer", 2647 | ] 2648 | 2649 | [[package]] 2650 | name = "ndarray" 2651 | version = "0.16.1" 2652 | source = "registry+https://github.com/rust-lang/crates.io-index" 2653 | checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" 2654 | dependencies = [ 2655 | "matrixmultiply", 2656 | "num-complex", 2657 | "num-integer", 2658 | "num-traits", 2659 | "portable-atomic", 2660 | "portable-atomic-util", 2661 | "rawpointer", 2662 | "rayon", 2663 | ] 2664 | 2665 | [[package]] 2666 | name = "ndk-sys" 2667 | version = "0.5.0+25.2.9519653" 2668 | source = "registry+https://github.com/rust-lang/crates.io-index" 2669 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 2670 | dependencies = [ 2671 | "jni-sys", 2672 | ] 2673 | 2674 | [[package]] 2675 | name = "new_debug_unreachable" 2676 | version = "1.0.6" 2677 | source = "registry+https://github.com/rust-lang/crates.io-index" 2678 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 2679 | 2680 | [[package]] 2681 | name = "nom" 2682 | version = "7.1.3" 2683 | source = "registry+https://github.com/rust-lang/crates.io-index" 2684 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2685 | dependencies = [ 2686 | "memchr", 2687 | "minimal-lexical", 2688 | ] 2689 | 2690 | [[package]] 2691 | name = "noop_proc_macro" 2692 | version = "0.3.0" 2693 | source = "registry+https://github.com/rust-lang/crates.io-index" 2694 | checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" 2695 | 2696 | [[package]] 2697 | name = "ntapi" 2698 | version = "0.4.1" 2699 | source = "registry+https://github.com/rust-lang/crates.io-index" 2700 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 2701 | dependencies = [ 2702 | "winapi", 2703 | ] 2704 | 2705 | [[package]] 2706 | name = "nu-ansi-term" 2707 | version = "0.46.0" 2708 | source = "registry+https://github.com/rust-lang/crates.io-index" 2709 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 2710 | dependencies = [ 2711 | "overload", 2712 | "winapi", 2713 | ] 2714 | 2715 | [[package]] 2716 | name = "num-bigint" 2717 | version = "0.4.6" 2718 | source = "registry+https://github.com/rust-lang/crates.io-index" 2719 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 2720 | dependencies = [ 2721 | "num-integer", 2722 | "num-traits", 2723 | ] 2724 | 2725 | [[package]] 2726 | name = "num-complex" 2727 | version = "0.4.6" 2728 | source = "registry+https://github.com/rust-lang/crates.io-index" 2729 | checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 2730 | dependencies = [ 2731 | "bytemuck", 2732 | "num-traits", 2733 | ] 2734 | 2735 | [[package]] 2736 | name = "num-conv" 2737 | version = "0.1.0" 2738 | source = "registry+https://github.com/rust-lang/crates.io-index" 2739 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2740 | 2741 | [[package]] 2742 | name = "num-derive" 2743 | version = "0.4.2" 2744 | source = "registry+https://github.com/rust-lang/crates.io-index" 2745 | checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 2746 | dependencies = [ 2747 | "proc-macro2", 2748 | "quote", 2749 | "syn 2.0.96", 2750 | ] 2751 | 2752 | [[package]] 2753 | name = "num-integer" 2754 | version = "0.1.46" 2755 | source = "registry+https://github.com/rust-lang/crates.io-index" 2756 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 2757 | dependencies = [ 2758 | "num-traits", 2759 | ] 2760 | 2761 | [[package]] 2762 | name = "num-rational" 2763 | version = "0.4.2" 2764 | source = "registry+https://github.com/rust-lang/crates.io-index" 2765 | checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 2766 | dependencies = [ 2767 | "num-bigint", 2768 | "num-integer", 2769 | "num-traits", 2770 | ] 2771 | 2772 | [[package]] 2773 | name = "num-traits" 2774 | version = "0.2.19" 2775 | source = "registry+https://github.com/rust-lang/crates.io-index" 2776 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2777 | dependencies = [ 2778 | "autocfg", 2779 | "libm", 2780 | ] 2781 | 2782 | [[package]] 2783 | name = "num_cpus" 2784 | version = "1.16.0" 2785 | source = "registry+https://github.com/rust-lang/crates.io-index" 2786 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 2787 | dependencies = [ 2788 | "hermit-abi", 2789 | "libc", 2790 | ] 2791 | 2792 | [[package]] 2793 | name = "num_enum" 2794 | version = "0.7.3" 2795 | source = "registry+https://github.com/rust-lang/crates.io-index" 2796 | checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 2797 | dependencies = [ 2798 | "num_enum_derive", 2799 | ] 2800 | 2801 | [[package]] 2802 | name = "num_enum_derive" 2803 | version = "0.7.3" 2804 | source = "registry+https://github.com/rust-lang/crates.io-index" 2805 | checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 2806 | dependencies = [ 2807 | "proc-macro-crate", 2808 | "proc-macro2", 2809 | "quote", 2810 | "syn 2.0.96", 2811 | ] 2812 | 2813 | [[package]] 2814 | name = "num_threads" 2815 | version = "0.1.7" 2816 | source = "registry+https://github.com/rust-lang/crates.io-index" 2817 | checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 2818 | dependencies = [ 2819 | "libc", 2820 | ] 2821 | 2822 | [[package]] 2823 | name = "nvml-wrapper" 2824 | version = "0.10.0" 2825 | source = "registry+https://github.com/rust-lang/crates.io-index" 2826 | checksum = "0c9bff0aa1d48904a1385ea2a8b97576fbdcbc9a3cfccd0d31fe978e1c4038c5" 2827 | dependencies = [ 2828 | "bitflags 2.8.0", 2829 | "libloading", 2830 | "nvml-wrapper-sys", 2831 | "static_assertions", 2832 | "thiserror", 2833 | "wrapcenum-derive", 2834 | ] 2835 | 2836 | [[package]] 2837 | name = "nvml-wrapper-sys" 2838 | version = "0.8.0" 2839 | source = "registry+https://github.com/rust-lang/crates.io-index" 2840 | checksum = "698d45156f28781a4e79652b6ebe2eaa0589057d588d3aec1333f6466f13fcb5" 2841 | dependencies = [ 2842 | "libloading", 2843 | ] 2844 | 2845 | [[package]] 2846 | name = "objc" 2847 | version = "0.2.7" 2848 | source = "registry+https://github.com/rust-lang/crates.io-index" 2849 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 2850 | dependencies = [ 2851 | "malloc_buf", 2852 | ] 2853 | 2854 | [[package]] 2855 | name = "once_cell" 2856 | version = "1.20.2" 2857 | source = "registry+https://github.com/rust-lang/crates.io-index" 2858 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 2859 | 2860 | [[package]] 2861 | name = "option-ext" 2862 | version = "0.2.0" 2863 | source = "registry+https://github.com/rust-lang/crates.io-index" 2864 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 2865 | 2866 | [[package]] 2867 | name = "overload" 2868 | version = "0.1.1" 2869 | source = "registry+https://github.com/rust-lang/crates.io-index" 2870 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 2871 | 2872 | [[package]] 2873 | name = "parking" 2874 | version = "2.2.1" 2875 | source = "registry+https://github.com/rust-lang/crates.io-index" 2876 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 2877 | 2878 | [[package]] 2879 | name = "parking_lot" 2880 | version = "0.12.3" 2881 | source = "registry+https://github.com/rust-lang/crates.io-index" 2882 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 2883 | dependencies = [ 2884 | "lock_api", 2885 | "parking_lot_core", 2886 | ] 2887 | 2888 | [[package]] 2889 | name = "parking_lot_core" 2890 | version = "0.9.10" 2891 | source = "registry+https://github.com/rust-lang/crates.io-index" 2892 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 2893 | dependencies = [ 2894 | "cfg-if", 2895 | "libc", 2896 | "redox_syscall", 2897 | "smallvec", 2898 | "windows-targets 0.52.6", 2899 | ] 2900 | 2901 | [[package]] 2902 | name = "password-hash" 2903 | version = "0.4.2" 2904 | source = "registry+https://github.com/rust-lang/crates.io-index" 2905 | checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" 2906 | dependencies = [ 2907 | "base64ct", 2908 | "rand_core", 2909 | "subtle", 2910 | ] 2911 | 2912 | [[package]] 2913 | name = "paste" 2914 | version = "1.0.15" 2915 | source = "registry+https://github.com/rust-lang/crates.io-index" 2916 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 2917 | 2918 | [[package]] 2919 | name = "pathfinder_geometry" 2920 | version = "0.5.1" 2921 | source = "registry+https://github.com/rust-lang/crates.io-index" 2922 | checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" 2923 | dependencies = [ 2924 | "log", 2925 | "pathfinder_simd", 2926 | ] 2927 | 2928 | [[package]] 2929 | name = "pathfinder_simd" 2930 | version = "0.5.4" 2931 | source = "registry+https://github.com/rust-lang/crates.io-index" 2932 | checksum = "5cf07ef4804cfa9aea3b04a7bbdd5a40031dbb6b4f2cbaf2b011666c80c5b4f2" 2933 | dependencies = [ 2934 | "rustc_version", 2935 | ] 2936 | 2937 | [[package]] 2938 | name = "pbkdf2" 2939 | version = "0.11.0" 2940 | source = "registry+https://github.com/rust-lang/crates.io-index" 2941 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" 2942 | dependencies = [ 2943 | "digest", 2944 | "hmac", 2945 | "password-hash", 2946 | "sha2", 2947 | ] 2948 | 2949 | [[package]] 2950 | name = "percent-encoding" 2951 | version = "2.3.1" 2952 | source = "registry+https://github.com/rust-lang/crates.io-index" 2953 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2954 | 2955 | [[package]] 2956 | name = "pin-project-lite" 2957 | version = "0.2.16" 2958 | source = "registry+https://github.com/rust-lang/crates.io-index" 2959 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 2960 | 2961 | [[package]] 2962 | name = "pkg-config" 2963 | version = "0.3.31" 2964 | source = "registry+https://github.com/rust-lang/crates.io-index" 2965 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 2966 | 2967 | [[package]] 2968 | name = "plotters" 2969 | version = "0.3.7" 2970 | source = "registry+https://github.com/rust-lang/crates.io-index" 2971 | checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" 2972 | dependencies = [ 2973 | "chrono", 2974 | "font-kit", 2975 | "image 0.24.9", 2976 | "lazy_static", 2977 | "num-traits", 2978 | "pathfinder_geometry", 2979 | "plotters-backend", 2980 | "plotters-bitmap", 2981 | "plotters-svg", 2982 | "ttf-parser", 2983 | "wasm-bindgen", 2984 | "web-sys", 2985 | ] 2986 | 2987 | [[package]] 2988 | name = "plotters-backend" 2989 | version = "0.3.7" 2990 | source = "registry+https://github.com/rust-lang/crates.io-index" 2991 | checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" 2992 | 2993 | [[package]] 2994 | name = "plotters-bitmap" 2995 | version = "0.3.7" 2996 | source = "registry+https://github.com/rust-lang/crates.io-index" 2997 | checksum = "72ce181e3f6bf82d6c1dc569103ca7b1bd964c60ba03d7e6cdfbb3e3eb7f7405" 2998 | dependencies = [ 2999 | "gif 0.12.0", 3000 | "image 0.24.9", 3001 | "plotters-backend", 3002 | ] 3003 | 3004 | [[package]] 3005 | name = "plotters-svg" 3006 | version = "0.3.7" 3007 | source = "registry+https://github.com/rust-lang/crates.io-index" 3008 | checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" 3009 | dependencies = [ 3010 | "plotters-backend", 3011 | ] 3012 | 3013 | [[package]] 3014 | name = "png" 3015 | version = "0.17.16" 3016 | source = "registry+https://github.com/rust-lang/crates.io-index" 3017 | checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" 3018 | dependencies = [ 3019 | "bitflags 1.3.2", 3020 | "crc32fast", 3021 | "fdeflate", 3022 | "flate2", 3023 | "miniz_oxide", 3024 | ] 3025 | 3026 | [[package]] 3027 | name = "portable-atomic" 3028 | version = "1.10.0" 3029 | source = "registry+https://github.com/rust-lang/crates.io-index" 3030 | checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" 3031 | 3032 | [[package]] 3033 | name = "portable-atomic-util" 3034 | version = "0.2.4" 3035 | source = "registry+https://github.com/rust-lang/crates.io-index" 3036 | checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 3037 | dependencies = [ 3038 | "portable-atomic", 3039 | ] 3040 | 3041 | [[package]] 3042 | name = "powerfmt" 3043 | version = "0.2.0" 3044 | source = "registry+https://github.com/rust-lang/crates.io-index" 3045 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 3046 | 3047 | [[package]] 3048 | name = "ppv-lite86" 3049 | version = "0.2.20" 3050 | source = "registry+https://github.com/rust-lang/crates.io-index" 3051 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 3052 | dependencies = [ 3053 | "zerocopy", 3054 | ] 3055 | 3056 | [[package]] 3057 | name = "presser" 3058 | version = "0.3.1" 3059 | source = "registry+https://github.com/rust-lang/crates.io-index" 3060 | checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" 3061 | 3062 | [[package]] 3063 | name = "prettyplease" 3064 | version = "0.2.29" 3065 | source = "registry+https://github.com/rust-lang/crates.io-index" 3066 | checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" 3067 | dependencies = [ 3068 | "proc-macro2", 3069 | "syn 2.0.96", 3070 | ] 3071 | 3072 | [[package]] 3073 | name = "proc-macro-crate" 3074 | version = "3.2.0" 3075 | source = "registry+https://github.com/rust-lang/crates.io-index" 3076 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" 3077 | dependencies = [ 3078 | "toml_edit", 3079 | ] 3080 | 3081 | [[package]] 3082 | name = "proc-macro2" 3083 | version = "1.0.93" 3084 | source = "registry+https://github.com/rust-lang/crates.io-index" 3085 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 3086 | dependencies = [ 3087 | "unicode-ident", 3088 | ] 3089 | 3090 | [[package]] 3091 | name = "profiling" 3092 | version = "1.0.16" 3093 | source = "registry+https://github.com/rust-lang/crates.io-index" 3094 | checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" 3095 | dependencies = [ 3096 | "profiling-procmacros", 3097 | ] 3098 | 3099 | [[package]] 3100 | name = "profiling-procmacros" 3101 | version = "1.0.16" 3102 | source = "registry+https://github.com/rust-lang/crates.io-index" 3103 | checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" 3104 | dependencies = [ 3105 | "quote", 3106 | "syn 2.0.96", 3107 | ] 3108 | 3109 | [[package]] 3110 | name = "pulp" 3111 | version = "0.18.22" 3112 | source = "registry+https://github.com/rust-lang/crates.io-index" 3113 | checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" 3114 | dependencies = [ 3115 | "bytemuck", 3116 | "libm", 3117 | "num-complex", 3118 | "reborrow", 3119 | ] 3120 | 3121 | [[package]] 3122 | name = "qoi" 3123 | version = "0.4.1" 3124 | source = "registry+https://github.com/rust-lang/crates.io-index" 3125 | checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" 3126 | dependencies = [ 3127 | "bytemuck", 3128 | ] 3129 | 3130 | [[package]] 3131 | name = "quick-error" 3132 | version = "2.0.1" 3133 | source = "registry+https://github.com/rust-lang/crates.io-index" 3134 | checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 3135 | 3136 | [[package]] 3137 | name = "quote" 3138 | version = "1.0.38" 3139 | source = "registry+https://github.com/rust-lang/crates.io-index" 3140 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 3141 | dependencies = [ 3142 | "proc-macro2", 3143 | ] 3144 | 3145 | [[package]] 3146 | name = "r2d2" 3147 | version = "0.8.10" 3148 | source = "registry+https://github.com/rust-lang/crates.io-index" 3149 | checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" 3150 | dependencies = [ 3151 | "log", 3152 | "parking_lot", 3153 | "scheduled-thread-pool", 3154 | ] 3155 | 3156 | [[package]] 3157 | name = "r2d2_sqlite" 3158 | version = "0.25.0" 3159 | source = "registry+https://github.com/rust-lang/crates.io-index" 3160 | checksum = "eb14dba8247a6a15b7fdbc7d389e2e6f03ee9f184f87117706d509c092dfe846" 3161 | dependencies = [ 3162 | "r2d2", 3163 | "rusqlite", 3164 | "uuid", 3165 | ] 3166 | 3167 | [[package]] 3168 | name = "rand" 3169 | version = "0.8.5" 3170 | source = "registry+https://github.com/rust-lang/crates.io-index" 3171 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 3172 | dependencies = [ 3173 | "libc", 3174 | "rand_chacha", 3175 | "rand_core", 3176 | ] 3177 | 3178 | [[package]] 3179 | name = "rand_chacha" 3180 | version = "0.3.1" 3181 | source = "registry+https://github.com/rust-lang/crates.io-index" 3182 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 3183 | dependencies = [ 3184 | "ppv-lite86", 3185 | "rand_core", 3186 | ] 3187 | 3188 | [[package]] 3189 | name = "rand_core" 3190 | version = "0.6.4" 3191 | source = "registry+https://github.com/rust-lang/crates.io-index" 3192 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 3193 | dependencies = [ 3194 | "getrandom", 3195 | ] 3196 | 3197 | [[package]] 3198 | name = "rand_distr" 3199 | version = "0.4.3" 3200 | source = "registry+https://github.com/rust-lang/crates.io-index" 3201 | checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" 3202 | dependencies = [ 3203 | "num-traits", 3204 | "rand", 3205 | ] 3206 | 3207 | [[package]] 3208 | name = "range-alloc" 3209 | version = "0.1.4" 3210 | source = "registry+https://github.com/rust-lang/crates.io-index" 3211 | checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" 3212 | 3213 | [[package]] 3214 | name = "ratatui" 3215 | version = "0.29.0" 3216 | source = "registry+https://github.com/rust-lang/crates.io-index" 3217 | checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" 3218 | dependencies = [ 3219 | "bitflags 2.8.0", 3220 | "cassowary", 3221 | "compact_str", 3222 | "crossterm", 3223 | "indoc", 3224 | "instability", 3225 | "itertools 0.13.0", 3226 | "lru", 3227 | "paste", 3228 | "strum", 3229 | "time", 3230 | "unicode-segmentation", 3231 | "unicode-truncate", 3232 | "unicode-width 0.2.0", 3233 | ] 3234 | 3235 | [[package]] 3236 | name = "rav1e" 3237 | version = "0.7.1" 3238 | source = "registry+https://github.com/rust-lang/crates.io-index" 3239 | checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" 3240 | dependencies = [ 3241 | "arbitrary", 3242 | "arg_enum_proc_macro", 3243 | "arrayvec", 3244 | "av1-grain", 3245 | "bitstream-io", 3246 | "built", 3247 | "cfg-if", 3248 | "interpolate_name", 3249 | "itertools 0.12.1", 3250 | "libc", 3251 | "libfuzzer-sys", 3252 | "log", 3253 | "maybe-rayon", 3254 | "new_debug_unreachable", 3255 | "noop_proc_macro", 3256 | "num-derive", 3257 | "num-traits", 3258 | "once_cell", 3259 | "paste", 3260 | "profiling", 3261 | "rand", 3262 | "rand_chacha", 3263 | "simd_helpers", 3264 | "system-deps", 3265 | "thiserror", 3266 | "v_frame", 3267 | "wasm-bindgen", 3268 | ] 3269 | 3270 | [[package]] 3271 | name = "ravif" 3272 | version = "0.11.11" 3273 | source = "registry+https://github.com/rust-lang/crates.io-index" 3274 | checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" 3275 | dependencies = [ 3276 | "avif-serialize", 3277 | "imgref", 3278 | "loop9", 3279 | "quick-error", 3280 | "rav1e", 3281 | "rayon", 3282 | "rgb", 3283 | ] 3284 | 3285 | [[package]] 3286 | name = "raw-cpuid" 3287 | version = "10.7.0" 3288 | source = "registry+https://github.com/rust-lang/crates.io-index" 3289 | checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" 3290 | dependencies = [ 3291 | "bitflags 1.3.2", 3292 | ] 3293 | 3294 | [[package]] 3295 | name = "raw-window-handle" 3296 | version = "0.6.2" 3297 | source = "registry+https://github.com/rust-lang/crates.io-index" 3298 | checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 3299 | 3300 | [[package]] 3301 | name = "rawpointer" 3302 | version = "0.2.1" 3303 | source = "registry+https://github.com/rust-lang/crates.io-index" 3304 | checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" 3305 | 3306 | [[package]] 3307 | name = "rayon" 3308 | version = "1.10.0" 3309 | source = "registry+https://github.com/rust-lang/crates.io-index" 3310 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 3311 | dependencies = [ 3312 | "either", 3313 | "rayon-core", 3314 | ] 3315 | 3316 | [[package]] 3317 | name = "rayon-core" 3318 | version = "1.12.1" 3319 | source = "registry+https://github.com/rust-lang/crates.io-index" 3320 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 3321 | dependencies = [ 3322 | "crossbeam-deque", 3323 | "crossbeam-utils", 3324 | ] 3325 | 3326 | [[package]] 3327 | name = "reborrow" 3328 | version = "0.5.5" 3329 | source = "registry+https://github.com/rust-lang/crates.io-index" 3330 | checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" 3331 | 3332 | [[package]] 3333 | name = "redox_syscall" 3334 | version = "0.5.8" 3335 | source = "registry+https://github.com/rust-lang/crates.io-index" 3336 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 3337 | dependencies = [ 3338 | "bitflags 2.8.0", 3339 | ] 3340 | 3341 | [[package]] 3342 | name = "redox_users" 3343 | version = "0.4.6" 3344 | source = "registry+https://github.com/rust-lang/crates.io-index" 3345 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 3346 | dependencies = [ 3347 | "getrandom", 3348 | "libredox", 3349 | "thiserror", 3350 | ] 3351 | 3352 | [[package]] 3353 | name = "regex" 3354 | version = "1.11.1" 3355 | source = "registry+https://github.com/rust-lang/crates.io-index" 3356 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3357 | dependencies = [ 3358 | "aho-corasick", 3359 | "memchr", 3360 | "regex-automata", 3361 | "regex-syntax", 3362 | ] 3363 | 3364 | [[package]] 3365 | name = "regex-automata" 3366 | version = "0.4.9" 3367 | source = "registry+https://github.com/rust-lang/crates.io-index" 3368 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3369 | dependencies = [ 3370 | "aho-corasick", 3371 | "memchr", 3372 | "regex-syntax", 3373 | ] 3374 | 3375 | [[package]] 3376 | name = "regex-syntax" 3377 | version = "0.8.5" 3378 | source = "registry+https://github.com/rust-lang/crates.io-index" 3379 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3380 | 3381 | [[package]] 3382 | name = "renderdoc-sys" 3383 | version = "1.1.0" 3384 | source = "registry+https://github.com/rust-lang/crates.io-index" 3385 | checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 3386 | 3387 | [[package]] 3388 | name = "rgb" 3389 | version = "0.8.50" 3390 | source = "registry+https://github.com/rust-lang/crates.io-index" 3391 | checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" 3392 | 3393 | [[package]] 3394 | name = "ring" 3395 | version = "0.17.8" 3396 | source = "registry+https://github.com/rust-lang/crates.io-index" 3397 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 3398 | dependencies = [ 3399 | "cc", 3400 | "cfg-if", 3401 | "getrandom", 3402 | "libc", 3403 | "spin", 3404 | "untrusted", 3405 | "windows-sys 0.52.0", 3406 | ] 3407 | 3408 | [[package]] 3409 | name = "rmp" 3410 | version = "0.8.14" 3411 | source = "registry+https://github.com/rust-lang/crates.io-index" 3412 | checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" 3413 | dependencies = [ 3414 | "byteorder", 3415 | "num-traits", 3416 | "paste", 3417 | ] 3418 | 3419 | [[package]] 3420 | name = "rmp-serde" 3421 | version = "1.3.0" 3422 | source = "registry+https://github.com/rust-lang/crates.io-index" 3423 | checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" 3424 | dependencies = [ 3425 | "byteorder", 3426 | "rmp", 3427 | "serde", 3428 | ] 3429 | 3430 | [[package]] 3431 | name = "rusqlite" 3432 | version = "0.32.1" 3433 | source = "registry+https://github.com/rust-lang/crates.io-index" 3434 | checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" 3435 | dependencies = [ 3436 | "bitflags 2.8.0", 3437 | "fallible-iterator", 3438 | "fallible-streaming-iterator", 3439 | "hashlink", 3440 | "libsqlite3-sys", 3441 | "smallvec", 3442 | ] 3443 | 3444 | [[package]] 3445 | name = "rustc-hash" 3446 | version = "1.1.0" 3447 | source = "registry+https://github.com/rust-lang/crates.io-index" 3448 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 3449 | 3450 | [[package]] 3451 | name = "rustc_version" 3452 | version = "0.4.1" 3453 | source = "registry+https://github.com/rust-lang/crates.io-index" 3454 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 3455 | dependencies = [ 3456 | "semver", 3457 | ] 3458 | 3459 | [[package]] 3460 | name = "rustix" 3461 | version = "0.38.44" 3462 | source = "registry+https://github.com/rust-lang/crates.io-index" 3463 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 3464 | dependencies = [ 3465 | "bitflags 2.8.0", 3466 | "errno", 3467 | "libc", 3468 | "linux-raw-sys", 3469 | "windows-sys 0.59.0", 3470 | ] 3471 | 3472 | [[package]] 3473 | name = "rustls" 3474 | version = "0.23.21" 3475 | source = "registry+https://github.com/rust-lang/crates.io-index" 3476 | checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" 3477 | dependencies = [ 3478 | "log", 3479 | "once_cell", 3480 | "ring", 3481 | "rustls-pki-types", 3482 | "rustls-webpki", 3483 | "subtle", 3484 | "zeroize", 3485 | ] 3486 | 3487 | [[package]] 3488 | name = "rustls-pki-types" 3489 | version = "1.10.1" 3490 | source = "registry+https://github.com/rust-lang/crates.io-index" 3491 | checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" 3492 | 3493 | [[package]] 3494 | name = "rustls-webpki" 3495 | version = "0.102.8" 3496 | source = "registry+https://github.com/rust-lang/crates.io-index" 3497 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 3498 | dependencies = [ 3499 | "ring", 3500 | "rustls-pki-types", 3501 | "untrusted", 3502 | ] 3503 | 3504 | [[package]] 3505 | name = "rustversion" 3506 | version = "1.0.19" 3507 | source = "registry+https://github.com/rust-lang/crates.io-index" 3508 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 3509 | 3510 | [[package]] 3511 | name = "ryu" 3512 | version = "1.0.18" 3513 | source = "registry+https://github.com/rust-lang/crates.io-index" 3514 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 3515 | 3516 | [[package]] 3517 | name = "safetensors" 3518 | version = "0.3.3" 3519 | source = "registry+https://github.com/rust-lang/crates.io-index" 3520 | checksum = "d93279b86b3de76f820a8854dd06cbc33cfa57a417b19c47f6a25280112fb1df" 3521 | dependencies = [ 3522 | "serde", 3523 | "serde_json", 3524 | ] 3525 | 3526 | [[package]] 3527 | name = "safetensors" 3528 | version = "0.4.5" 3529 | source = "registry+https://github.com/rust-lang/crates.io-index" 3530 | checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" 3531 | dependencies = [ 3532 | "serde", 3533 | "serde_json", 3534 | ] 3535 | 3536 | [[package]] 3537 | name = "same-file" 3538 | version = "1.0.6" 3539 | source = "registry+https://github.com/rust-lang/crates.io-index" 3540 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 3541 | dependencies = [ 3542 | "winapi-util", 3543 | ] 3544 | 3545 | [[package]] 3546 | name = "sanitize-filename" 3547 | version = "0.5.0" 3548 | source = "registry+https://github.com/rust-lang/crates.io-index" 3549 | checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603" 3550 | dependencies = [ 3551 | "lazy_static", 3552 | "regex", 3553 | ] 3554 | 3555 | [[package]] 3556 | name = "scheduled-thread-pool" 3557 | version = "0.2.7" 3558 | source = "registry+https://github.com/rust-lang/crates.io-index" 3559 | checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" 3560 | dependencies = [ 3561 | "parking_lot", 3562 | ] 3563 | 3564 | [[package]] 3565 | name = "scopeguard" 3566 | version = "1.2.0" 3567 | source = "registry+https://github.com/rust-lang/crates.io-index" 3568 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 3569 | 3570 | [[package]] 3571 | name = "semver" 3572 | version = "1.0.25" 3573 | source = "registry+https://github.com/rust-lang/crates.io-index" 3574 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 3575 | 3576 | [[package]] 3577 | name = "seq-macro" 3578 | version = "0.3.5" 3579 | source = "registry+https://github.com/rust-lang/crates.io-index" 3580 | checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" 3581 | 3582 | [[package]] 3583 | name = "serde" 3584 | version = "1.0.217" 3585 | source = "registry+https://github.com/rust-lang/crates.io-index" 3586 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 3587 | dependencies = [ 3588 | "serde_derive", 3589 | ] 3590 | 3591 | [[package]] 3592 | name = "serde_bytes" 3593 | version = "0.11.15" 3594 | source = "registry+https://github.com/rust-lang/crates.io-index" 3595 | checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" 3596 | dependencies = [ 3597 | "serde", 3598 | ] 3599 | 3600 | [[package]] 3601 | name = "serde_derive" 3602 | version = "1.0.217" 3603 | source = "registry+https://github.com/rust-lang/crates.io-index" 3604 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 3605 | dependencies = [ 3606 | "proc-macro2", 3607 | "quote", 3608 | "syn 2.0.96", 3609 | ] 3610 | 3611 | [[package]] 3612 | name = "serde_json" 3613 | version = "1.0.137" 3614 | source = "registry+https://github.com/rust-lang/crates.io-index" 3615 | checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" 3616 | dependencies = [ 3617 | "itoa", 3618 | "memchr", 3619 | "ryu", 3620 | "serde", 3621 | ] 3622 | 3623 | [[package]] 3624 | name = "serde_rusqlite" 3625 | version = "0.36.0" 3626 | source = "registry+https://github.com/rust-lang/crates.io-index" 3627 | checksum = "b741cc5ef185cd96157e762c3bba743c4e94c8dc6af0edb053c48d2b3c27e691" 3628 | dependencies = [ 3629 | "rusqlite", 3630 | "serde", 3631 | ] 3632 | 3633 | [[package]] 3634 | name = "serde_spanned" 3635 | version = "0.6.8" 3636 | source = "registry+https://github.com/rust-lang/crates.io-index" 3637 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 3638 | dependencies = [ 3639 | "serde", 3640 | ] 3641 | 3642 | [[package]] 3643 | name = "sha1" 3644 | version = "0.10.6" 3645 | source = "registry+https://github.com/rust-lang/crates.io-index" 3646 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 3647 | dependencies = [ 3648 | "cfg-if", 3649 | "cpufeatures", 3650 | "digest", 3651 | ] 3652 | 3653 | [[package]] 3654 | name = "sha2" 3655 | version = "0.10.8" 3656 | source = "registry+https://github.com/rust-lang/crates.io-index" 3657 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 3658 | dependencies = [ 3659 | "cfg-if", 3660 | "cpufeatures", 3661 | "digest", 3662 | ] 3663 | 3664 | [[package]] 3665 | name = "sharded-slab" 3666 | version = "0.1.7" 3667 | source = "registry+https://github.com/rust-lang/crates.io-index" 3668 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 3669 | dependencies = [ 3670 | "lazy_static", 3671 | ] 3672 | 3673 | [[package]] 3674 | name = "shlex" 3675 | version = "1.3.0" 3676 | source = "registry+https://github.com/rust-lang/crates.io-index" 3677 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 3678 | 3679 | [[package]] 3680 | name = "signal-hook" 3681 | version = "0.3.17" 3682 | source = "registry+https://github.com/rust-lang/crates.io-index" 3683 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 3684 | dependencies = [ 3685 | "libc", 3686 | "signal-hook-registry", 3687 | ] 3688 | 3689 | [[package]] 3690 | name = "signal-hook-mio" 3691 | version = "0.2.4" 3692 | source = "registry+https://github.com/rust-lang/crates.io-index" 3693 | checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" 3694 | dependencies = [ 3695 | "libc", 3696 | "mio", 3697 | "signal-hook", 3698 | ] 3699 | 3700 | [[package]] 3701 | name = "signal-hook-registry" 3702 | version = "1.4.2" 3703 | source = "registry+https://github.com/rust-lang/crates.io-index" 3704 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 3705 | dependencies = [ 3706 | "libc", 3707 | ] 3708 | 3709 | [[package]] 3710 | name = "simd-adler32" 3711 | version = "0.3.7" 3712 | source = "registry+https://github.com/rust-lang/crates.io-index" 3713 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 3714 | 3715 | [[package]] 3716 | name = "simd_helpers" 3717 | version = "0.1.0" 3718 | source = "registry+https://github.com/rust-lang/crates.io-index" 3719 | checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" 3720 | dependencies = [ 3721 | "quote", 3722 | ] 3723 | 3724 | [[package]] 3725 | name = "slotmap" 3726 | version = "1.0.7" 3727 | source = "registry+https://github.com/rust-lang/crates.io-index" 3728 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 3729 | dependencies = [ 3730 | "version_check", 3731 | ] 3732 | 3733 | [[package]] 3734 | name = "smallvec" 3735 | version = "1.13.2" 3736 | source = "registry+https://github.com/rust-lang/crates.io-index" 3737 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 3738 | 3739 | [[package]] 3740 | name = "spin" 3741 | version = "0.9.8" 3742 | source = "registry+https://github.com/rust-lang/crates.io-index" 3743 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 3744 | dependencies = [ 3745 | "lock_api", 3746 | "portable-atomic", 3747 | ] 3748 | 3749 | [[package]] 3750 | name = "spirv" 3751 | version = "0.3.0+sdk-1.3.268.0" 3752 | source = "registry+https://github.com/rust-lang/crates.io-index" 3753 | checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 3754 | dependencies = [ 3755 | "bitflags 2.8.0", 3756 | ] 3757 | 3758 | [[package]] 3759 | name = "stable_deref_trait" 3760 | version = "1.2.0" 3761 | source = "registry+https://github.com/rust-lang/crates.io-index" 3762 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3763 | 3764 | [[package]] 3765 | name = "static_assertions" 3766 | version = "1.1.0" 3767 | source = "registry+https://github.com/rust-lang/crates.io-index" 3768 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 3769 | 3770 | [[package]] 3771 | name = "strsim" 3772 | version = "0.11.1" 3773 | source = "registry+https://github.com/rust-lang/crates.io-index" 3774 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 3775 | 3776 | [[package]] 3777 | name = "strum" 3778 | version = "0.26.3" 3779 | source = "registry+https://github.com/rust-lang/crates.io-index" 3780 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 3781 | dependencies = [ 3782 | "strum_macros", 3783 | ] 3784 | 3785 | [[package]] 3786 | name = "strum_macros" 3787 | version = "0.26.4" 3788 | source = "registry+https://github.com/rust-lang/crates.io-index" 3789 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 3790 | dependencies = [ 3791 | "heck", 3792 | "proc-macro2", 3793 | "quote", 3794 | "rustversion", 3795 | "syn 2.0.96", 3796 | ] 3797 | 3798 | [[package]] 3799 | name = "subtle" 3800 | version = "2.6.1" 3801 | source = "registry+https://github.com/rust-lang/crates.io-index" 3802 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 3803 | 3804 | [[package]] 3805 | name = "syn" 3806 | version = "1.0.109" 3807 | source = "registry+https://github.com/rust-lang/crates.io-index" 3808 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 3809 | dependencies = [ 3810 | "proc-macro2", 3811 | "quote", 3812 | "unicode-ident", 3813 | ] 3814 | 3815 | [[package]] 3816 | name = "syn" 3817 | version = "2.0.96" 3818 | source = "registry+https://github.com/rust-lang/crates.io-index" 3819 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 3820 | dependencies = [ 3821 | "proc-macro2", 3822 | "quote", 3823 | "unicode-ident", 3824 | ] 3825 | 3826 | [[package]] 3827 | name = "synstructure" 3828 | version = "0.13.1" 3829 | source = "registry+https://github.com/rust-lang/crates.io-index" 3830 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 3831 | dependencies = [ 3832 | "proc-macro2", 3833 | "quote", 3834 | "syn 2.0.96", 3835 | ] 3836 | 3837 | [[package]] 3838 | name = "sysctl" 3839 | version = "0.5.5" 3840 | source = "registry+https://github.com/rust-lang/crates.io-index" 3841 | checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" 3842 | dependencies = [ 3843 | "bitflags 2.8.0", 3844 | "byteorder", 3845 | "enum-as-inner", 3846 | "libc", 3847 | "thiserror", 3848 | "walkdir", 3849 | ] 3850 | 3851 | [[package]] 3852 | name = "sysinfo" 3853 | version = "0.30.13" 3854 | source = "registry+https://github.com/rust-lang/crates.io-index" 3855 | checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" 3856 | dependencies = [ 3857 | "cfg-if", 3858 | "core-foundation-sys", 3859 | "libc", 3860 | "ntapi", 3861 | "once_cell", 3862 | "rayon", 3863 | "windows", 3864 | ] 3865 | 3866 | [[package]] 3867 | name = "system-deps" 3868 | version = "6.2.2" 3869 | source = "registry+https://github.com/rust-lang/crates.io-index" 3870 | checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" 3871 | dependencies = [ 3872 | "cfg-expr", 3873 | "heck", 3874 | "pkg-config", 3875 | "toml", 3876 | "version-compare", 3877 | ] 3878 | 3879 | [[package]] 3880 | name = "systemstat" 3881 | version = "0.2.4" 3882 | source = "registry+https://github.com/rust-lang/crates.io-index" 3883 | checksum = "668a4db78b439df482c238f559e4ea869017f9e62ef0a059c8bfcd841a4df544" 3884 | dependencies = [ 3885 | "bytesize", 3886 | "lazy_static", 3887 | "libc", 3888 | "nom", 3889 | "time", 3890 | "winapi", 3891 | ] 3892 | 3893 | [[package]] 3894 | name = "target-lexicon" 3895 | version = "0.12.16" 3896 | source = "registry+https://github.com/rust-lang/crates.io-index" 3897 | checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" 3898 | 3899 | [[package]] 3900 | name = "tch" 3901 | version = "0.15.0" 3902 | source = "registry+https://github.com/rust-lang/crates.io-index" 3903 | checksum = "7c7cb00bc2770454b515388d45be7097a3ded2eca172f3dcdb7ca4cc06c40bf1" 3904 | dependencies = [ 3905 | "half", 3906 | "lazy_static", 3907 | "libc", 3908 | "ndarray 0.15.6", 3909 | "rand", 3910 | "safetensors 0.3.3", 3911 | "thiserror", 3912 | "torch-sys", 3913 | "zip 0.6.6", 3914 | ] 3915 | 3916 | [[package]] 3917 | name = "tempfile" 3918 | version = "3.15.0" 3919 | source = "registry+https://github.com/rust-lang/crates.io-index" 3920 | checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" 3921 | dependencies = [ 3922 | "cfg-if", 3923 | "fastrand", 3924 | "getrandom", 3925 | "once_cell", 3926 | "rustix", 3927 | "windows-sys 0.59.0", 3928 | ] 3929 | 3930 | [[package]] 3931 | name = "termcolor" 3932 | version = "1.4.1" 3933 | source = "registry+https://github.com/rust-lang/crates.io-index" 3934 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 3935 | dependencies = [ 3936 | "winapi-util", 3937 | ] 3938 | 3939 | [[package]] 3940 | name = "text_placeholder" 3941 | version = "0.5.1" 3942 | source = "registry+https://github.com/rust-lang/crates.io-index" 3943 | checksum = "dd5008f74a09742486ef0047596cf35df2b914e2a8dca5727fcb6ba6842a766b" 3944 | dependencies = [ 3945 | "hashbrown 0.13.2", 3946 | "serde", 3947 | "serde_json", 3948 | ] 3949 | 3950 | [[package]] 3951 | name = "thiserror" 3952 | version = "1.0.69" 3953 | source = "registry+https://github.com/rust-lang/crates.io-index" 3954 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 3955 | dependencies = [ 3956 | "thiserror-impl", 3957 | ] 3958 | 3959 | [[package]] 3960 | name = "thiserror-impl" 3961 | version = "1.0.69" 3962 | source = "registry+https://github.com/rust-lang/crates.io-index" 3963 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 3964 | dependencies = [ 3965 | "proc-macro2", 3966 | "quote", 3967 | "syn 2.0.96", 3968 | ] 3969 | 3970 | [[package]] 3971 | name = "thread-tree" 3972 | version = "0.3.3" 3973 | source = "registry+https://github.com/rust-lang/crates.io-index" 3974 | checksum = "ffbd370cb847953a25954d9f63e14824a36113f8c72eecf6eccef5dc4b45d630" 3975 | dependencies = [ 3976 | "crossbeam-channel", 3977 | ] 3978 | 3979 | [[package]] 3980 | name = "thread_local" 3981 | version = "1.1.8" 3982 | source = "registry+https://github.com/rust-lang/crates.io-index" 3983 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 3984 | dependencies = [ 3985 | "cfg-if", 3986 | "once_cell", 3987 | ] 3988 | 3989 | [[package]] 3990 | name = "tiff" 3991 | version = "0.9.1" 3992 | source = "registry+https://github.com/rust-lang/crates.io-index" 3993 | checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" 3994 | dependencies = [ 3995 | "flate2", 3996 | "jpeg-decoder", 3997 | "weezl", 3998 | ] 3999 | 4000 | [[package]] 4001 | name = "time" 4002 | version = "0.3.37" 4003 | source = "registry+https://github.com/rust-lang/crates.io-index" 4004 | checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 4005 | dependencies = [ 4006 | "deranged", 4007 | "itoa", 4008 | "libc", 4009 | "num-conv", 4010 | "num_threads", 4011 | "powerfmt", 4012 | "serde", 4013 | "time-core", 4014 | "time-macros", 4015 | ] 4016 | 4017 | [[package]] 4018 | name = "time-core" 4019 | version = "0.1.2" 4020 | source = "registry+https://github.com/rust-lang/crates.io-index" 4021 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 4022 | 4023 | [[package]] 4024 | name = "time-macros" 4025 | version = "0.2.19" 4026 | source = "registry+https://github.com/rust-lang/crates.io-index" 4027 | checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 4028 | dependencies = [ 4029 | "num-conv", 4030 | "time-core", 4031 | ] 4032 | 4033 | [[package]] 4034 | name = "tinystr" 4035 | version = "0.7.6" 4036 | source = "registry+https://github.com/rust-lang/crates.io-index" 4037 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 4038 | dependencies = [ 4039 | "displaydoc", 4040 | "zerovec", 4041 | ] 4042 | 4043 | [[package]] 4044 | name = "tinyvec" 4045 | version = "1.8.1" 4046 | source = "registry+https://github.com/rust-lang/crates.io-index" 4047 | checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 4048 | dependencies = [ 4049 | "tinyvec_macros", 4050 | ] 4051 | 4052 | [[package]] 4053 | name = "tinyvec_macros" 4054 | version = "0.1.1" 4055 | source = "registry+https://github.com/rust-lang/crates.io-index" 4056 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 4057 | 4058 | [[package]] 4059 | name = "toml" 4060 | version = "0.8.19" 4061 | source = "registry+https://github.com/rust-lang/crates.io-index" 4062 | checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 4063 | dependencies = [ 4064 | "serde", 4065 | "serde_spanned", 4066 | "toml_datetime", 4067 | "toml_edit", 4068 | ] 4069 | 4070 | [[package]] 4071 | name = "toml_datetime" 4072 | version = "0.6.8" 4073 | source = "registry+https://github.com/rust-lang/crates.io-index" 4074 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 4075 | dependencies = [ 4076 | "serde", 4077 | ] 4078 | 4079 | [[package]] 4080 | name = "toml_edit" 4081 | version = "0.22.22" 4082 | source = "registry+https://github.com/rust-lang/crates.io-index" 4083 | checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" 4084 | dependencies = [ 4085 | "indexmap", 4086 | "serde", 4087 | "serde_spanned", 4088 | "toml_datetime", 4089 | "winnow", 4090 | ] 4091 | 4092 | [[package]] 4093 | name = "torch-sys" 4094 | version = "0.15.0" 4095 | source = "registry+https://github.com/rust-lang/crates.io-index" 4096 | checksum = "29e0244e5b148a31dd7fe961165037d1927754d024095c1013937532d7e73a22" 4097 | dependencies = [ 4098 | "anyhow", 4099 | "cc", 4100 | "libc", 4101 | "serde", 4102 | "serde_json", 4103 | "ureq", 4104 | "zip 0.6.6", 4105 | ] 4106 | 4107 | [[package]] 4108 | name = "tracing-appender" 4109 | version = "0.2.3" 4110 | source = "registry+https://github.com/rust-lang/crates.io-index" 4111 | checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" 4112 | dependencies = [ 4113 | "crossbeam-channel", 4114 | "thiserror", 4115 | "time", 4116 | "tracing-subscriber", 4117 | ] 4118 | 4119 | [[package]] 4120 | name = "tracing-core" 4121 | version = "0.1.33" 4122 | source = "registry+https://github.com/rust-lang/crates.io-index" 4123 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 4124 | dependencies = [ 4125 | "once_cell", 4126 | "valuable", 4127 | ] 4128 | 4129 | [[package]] 4130 | name = "tracing-log" 4131 | version = "0.2.0" 4132 | source = "registry+https://github.com/rust-lang/crates.io-index" 4133 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 4134 | dependencies = [ 4135 | "log", 4136 | "once_cell", 4137 | "tracing-core", 4138 | ] 4139 | 4140 | [[package]] 4141 | name = "tracing-subscriber" 4142 | version = "0.3.19" 4143 | source = "registry+https://github.com/rust-lang/crates.io-index" 4144 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 4145 | dependencies = [ 4146 | "nu-ansi-term", 4147 | "sharded-slab", 4148 | "smallvec", 4149 | "thread_local", 4150 | "tracing-core", 4151 | "tracing-log", 4152 | ] 4153 | 4154 | [[package]] 4155 | name = "ttf-parser" 4156 | version = "0.20.0" 4157 | source = "registry+https://github.com/rust-lang/crates.io-index" 4158 | checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" 4159 | 4160 | [[package]] 4161 | name = "typenum" 4162 | version = "1.17.0" 4163 | source = "registry+https://github.com/rust-lang/crates.io-index" 4164 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 4165 | 4166 | [[package]] 4167 | name = "unicode-ident" 4168 | version = "1.0.14" 4169 | source = "registry+https://github.com/rust-lang/crates.io-index" 4170 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 4171 | 4172 | [[package]] 4173 | name = "unicode-normalization" 4174 | version = "0.1.24" 4175 | source = "registry+https://github.com/rust-lang/crates.io-index" 4176 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 4177 | dependencies = [ 4178 | "tinyvec", 4179 | ] 4180 | 4181 | [[package]] 4182 | name = "unicode-segmentation" 4183 | version = "1.12.0" 4184 | source = "registry+https://github.com/rust-lang/crates.io-index" 4185 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 4186 | 4187 | [[package]] 4188 | name = "unicode-truncate" 4189 | version = "1.1.0" 4190 | source = "registry+https://github.com/rust-lang/crates.io-index" 4191 | checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" 4192 | dependencies = [ 4193 | "itertools 0.13.0", 4194 | "unicode-segmentation", 4195 | "unicode-width 0.1.14", 4196 | ] 4197 | 4198 | [[package]] 4199 | name = "unicode-width" 4200 | version = "0.1.14" 4201 | source = "registry+https://github.com/rust-lang/crates.io-index" 4202 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 4203 | 4204 | [[package]] 4205 | name = "unicode-width" 4206 | version = "0.2.0" 4207 | source = "registry+https://github.com/rust-lang/crates.io-index" 4208 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 4209 | 4210 | [[package]] 4211 | name = "unicode-xid" 4212 | version = "0.2.6" 4213 | source = "registry+https://github.com/rust-lang/crates.io-index" 4214 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 4215 | 4216 | [[package]] 4217 | name = "untrusted" 4218 | version = "0.9.0" 4219 | source = "registry+https://github.com/rust-lang/crates.io-index" 4220 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 4221 | 4222 | [[package]] 4223 | name = "ureq" 4224 | version = "2.12.1" 4225 | source = "registry+https://github.com/rust-lang/crates.io-index" 4226 | checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" 4227 | dependencies = [ 4228 | "base64", 4229 | "flate2", 4230 | "log", 4231 | "once_cell", 4232 | "rustls", 4233 | "rustls-pki-types", 4234 | "serde", 4235 | "serde_json", 4236 | "url", 4237 | "webpki-roots", 4238 | ] 4239 | 4240 | [[package]] 4241 | name = "url" 4242 | version = "2.5.4" 4243 | source = "registry+https://github.com/rust-lang/crates.io-index" 4244 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4245 | dependencies = [ 4246 | "form_urlencoded", 4247 | "idna", 4248 | "percent-encoding", 4249 | ] 4250 | 4251 | [[package]] 4252 | name = "utf16_iter" 4253 | version = "1.0.5" 4254 | source = "registry+https://github.com/rust-lang/crates.io-index" 4255 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 4256 | 4257 | [[package]] 4258 | name = "utf8_iter" 4259 | version = "1.0.4" 4260 | source = "registry+https://github.com/rust-lang/crates.io-index" 4261 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 4262 | 4263 | [[package]] 4264 | name = "uuid" 4265 | version = "1.12.1" 4266 | source = "registry+https://github.com/rust-lang/crates.io-index" 4267 | checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" 4268 | dependencies = [ 4269 | "getrandom", 4270 | "rand", 4271 | ] 4272 | 4273 | [[package]] 4274 | name = "v_frame" 4275 | version = "0.3.8" 4276 | source = "registry+https://github.com/rust-lang/crates.io-index" 4277 | checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" 4278 | dependencies = [ 4279 | "aligned-vec", 4280 | "num-traits", 4281 | "wasm-bindgen", 4282 | ] 4283 | 4284 | [[package]] 4285 | name = "valuable" 4286 | version = "0.1.1" 4287 | source = "registry+https://github.com/rust-lang/crates.io-index" 4288 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 4289 | 4290 | [[package]] 4291 | name = "vcpkg" 4292 | version = "0.2.15" 4293 | source = "registry+https://github.com/rust-lang/crates.io-index" 4294 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 4295 | 4296 | [[package]] 4297 | name = "version-compare" 4298 | version = "0.2.0" 4299 | source = "registry+https://github.com/rust-lang/crates.io-index" 4300 | checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4301 | 4302 | [[package]] 4303 | name = "version_check" 4304 | version = "0.9.5" 4305 | source = "registry+https://github.com/rust-lang/crates.io-index" 4306 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 4307 | 4308 | [[package]] 4309 | name = "walkdir" 4310 | version = "2.5.0" 4311 | source = "registry+https://github.com/rust-lang/crates.io-index" 4312 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 4313 | dependencies = [ 4314 | "same-file", 4315 | "winapi-util", 4316 | ] 4317 | 4318 | [[package]] 4319 | name = "wasi" 4320 | version = "0.11.0+wasi-snapshot-preview1" 4321 | source = "registry+https://github.com/rust-lang/crates.io-index" 4322 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 4323 | 4324 | [[package]] 4325 | name = "wasm-bindgen" 4326 | version = "0.2.100" 4327 | source = "registry+https://github.com/rust-lang/crates.io-index" 4328 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4329 | dependencies = [ 4330 | "cfg-if", 4331 | "once_cell", 4332 | "rustversion", 4333 | "wasm-bindgen-macro", 4334 | ] 4335 | 4336 | [[package]] 4337 | name = "wasm-bindgen-backend" 4338 | version = "0.2.100" 4339 | source = "registry+https://github.com/rust-lang/crates.io-index" 4340 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 4341 | dependencies = [ 4342 | "bumpalo", 4343 | "log", 4344 | "proc-macro2", 4345 | "quote", 4346 | "syn 2.0.96", 4347 | "wasm-bindgen-shared", 4348 | ] 4349 | 4350 | [[package]] 4351 | name = "wasm-bindgen-futures" 4352 | version = "0.4.50" 4353 | source = "registry+https://github.com/rust-lang/crates.io-index" 4354 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4355 | dependencies = [ 4356 | "cfg-if", 4357 | "js-sys", 4358 | "once_cell", 4359 | "wasm-bindgen", 4360 | "web-sys", 4361 | ] 4362 | 4363 | [[package]] 4364 | name = "wasm-bindgen-macro" 4365 | version = "0.2.100" 4366 | source = "registry+https://github.com/rust-lang/crates.io-index" 4367 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4368 | dependencies = [ 4369 | "quote", 4370 | "wasm-bindgen-macro-support", 4371 | ] 4372 | 4373 | [[package]] 4374 | name = "wasm-bindgen-macro-support" 4375 | version = "0.2.100" 4376 | source = "registry+https://github.com/rust-lang/crates.io-index" 4377 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4378 | dependencies = [ 4379 | "proc-macro2", 4380 | "quote", 4381 | "syn 2.0.96", 4382 | "wasm-bindgen-backend", 4383 | "wasm-bindgen-shared", 4384 | ] 4385 | 4386 | [[package]] 4387 | name = "wasm-bindgen-shared" 4388 | version = "0.2.100" 4389 | source = "registry+https://github.com/rust-lang/crates.io-index" 4390 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 4391 | dependencies = [ 4392 | "unicode-ident", 4393 | ] 4394 | 4395 | [[package]] 4396 | name = "web-sys" 4397 | version = "0.3.77" 4398 | source = "registry+https://github.com/rust-lang/crates.io-index" 4399 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 4400 | dependencies = [ 4401 | "js-sys", 4402 | "wasm-bindgen", 4403 | ] 4404 | 4405 | [[package]] 4406 | name = "web-time" 4407 | version = "1.1.0" 4408 | source = "registry+https://github.com/rust-lang/crates.io-index" 4409 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 4410 | dependencies = [ 4411 | "js-sys", 4412 | "wasm-bindgen", 4413 | ] 4414 | 4415 | [[package]] 4416 | name = "webpki-roots" 4417 | version = "0.26.7" 4418 | source = "registry+https://github.com/rust-lang/crates.io-index" 4419 | checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" 4420 | dependencies = [ 4421 | "rustls-pki-types", 4422 | ] 4423 | 4424 | [[package]] 4425 | name = "weezl" 4426 | version = "0.1.8" 4427 | source = "registry+https://github.com/rust-lang/crates.io-index" 4428 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 4429 | 4430 | [[package]] 4431 | name = "wgpu" 4432 | version = "22.1.0" 4433 | source = "registry+https://github.com/rust-lang/crates.io-index" 4434 | checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433" 4435 | dependencies = [ 4436 | "arrayvec", 4437 | "cfg_aliases 0.1.1", 4438 | "document-features", 4439 | "js-sys", 4440 | "log", 4441 | "naga", 4442 | "parking_lot", 4443 | "profiling", 4444 | "raw-window-handle", 4445 | "smallvec", 4446 | "static_assertions", 4447 | "wasm-bindgen", 4448 | "wasm-bindgen-futures", 4449 | "web-sys", 4450 | "wgpu-core", 4451 | "wgpu-hal", 4452 | "wgpu-types", 4453 | ] 4454 | 4455 | [[package]] 4456 | name = "wgpu-core" 4457 | version = "22.1.0" 4458 | source = "registry+https://github.com/rust-lang/crates.io-index" 4459 | checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" 4460 | dependencies = [ 4461 | "arrayvec", 4462 | "bit-vec", 4463 | "bitflags 2.8.0", 4464 | "cfg_aliases 0.1.1", 4465 | "document-features", 4466 | "indexmap", 4467 | "log", 4468 | "naga", 4469 | "once_cell", 4470 | "parking_lot", 4471 | "profiling", 4472 | "raw-window-handle", 4473 | "rustc-hash", 4474 | "smallvec", 4475 | "thiserror", 4476 | "wgpu-hal", 4477 | "wgpu-types", 4478 | ] 4479 | 4480 | [[package]] 4481 | name = "wgpu-hal" 4482 | version = "22.0.0" 4483 | source = "registry+https://github.com/rust-lang/crates.io-index" 4484 | checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" 4485 | dependencies = [ 4486 | "android_system_properties", 4487 | "arrayvec", 4488 | "ash", 4489 | "bit-set", 4490 | "bitflags 2.8.0", 4491 | "block", 4492 | "cfg_aliases 0.1.1", 4493 | "core-graphics-types", 4494 | "d3d12", 4495 | "glow", 4496 | "glutin_wgl_sys", 4497 | "gpu-alloc", 4498 | "gpu-allocator", 4499 | "gpu-descriptor", 4500 | "hassle-rs", 4501 | "js-sys", 4502 | "khronos-egl", 4503 | "libc", 4504 | "libloading", 4505 | "log", 4506 | "metal", 4507 | "naga", 4508 | "ndk-sys", 4509 | "objc", 4510 | "once_cell", 4511 | "parking_lot", 4512 | "profiling", 4513 | "range-alloc", 4514 | "raw-window-handle", 4515 | "renderdoc-sys", 4516 | "rustc-hash", 4517 | "smallvec", 4518 | "thiserror", 4519 | "wasm-bindgen", 4520 | "web-sys", 4521 | "wgpu-types", 4522 | "winapi", 4523 | ] 4524 | 4525 | [[package]] 4526 | name = "wgpu-types" 4527 | version = "22.0.0" 4528 | source = "registry+https://github.com/rust-lang/crates.io-index" 4529 | checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" 4530 | dependencies = [ 4531 | "bitflags 2.8.0", 4532 | "js-sys", 4533 | "web-sys", 4534 | ] 4535 | 4536 | [[package]] 4537 | name = "widestring" 4538 | version = "1.1.0" 4539 | source = "registry+https://github.com/rust-lang/crates.io-index" 4540 | checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" 4541 | 4542 | [[package]] 4543 | name = "winapi" 4544 | version = "0.3.9" 4545 | source = "registry+https://github.com/rust-lang/crates.io-index" 4546 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 4547 | dependencies = [ 4548 | "winapi-i686-pc-windows-gnu", 4549 | "winapi-x86_64-pc-windows-gnu", 4550 | ] 4551 | 4552 | [[package]] 4553 | name = "winapi-i686-pc-windows-gnu" 4554 | version = "0.4.0" 4555 | source = "registry+https://github.com/rust-lang/crates.io-index" 4556 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 4557 | 4558 | [[package]] 4559 | name = "winapi-util" 4560 | version = "0.1.9" 4561 | source = "registry+https://github.com/rust-lang/crates.io-index" 4562 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 4563 | dependencies = [ 4564 | "windows-sys 0.59.0", 4565 | ] 4566 | 4567 | [[package]] 4568 | name = "winapi-x86_64-pc-windows-gnu" 4569 | version = "0.4.0" 4570 | source = "registry+https://github.com/rust-lang/crates.io-index" 4571 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 4572 | 4573 | [[package]] 4574 | name = "windows" 4575 | version = "0.52.0" 4576 | source = "registry+https://github.com/rust-lang/crates.io-index" 4577 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" 4578 | dependencies = [ 4579 | "windows-core", 4580 | "windows-targets 0.52.6", 4581 | ] 4582 | 4583 | [[package]] 4584 | name = "windows-core" 4585 | version = "0.52.0" 4586 | source = "registry+https://github.com/rust-lang/crates.io-index" 4587 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 4588 | dependencies = [ 4589 | "windows-targets 0.52.6", 4590 | ] 4591 | 4592 | [[package]] 4593 | name = "windows-sys" 4594 | version = "0.48.0" 4595 | source = "registry+https://github.com/rust-lang/crates.io-index" 4596 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 4597 | dependencies = [ 4598 | "windows-targets 0.48.5", 4599 | ] 4600 | 4601 | [[package]] 4602 | name = "windows-sys" 4603 | version = "0.52.0" 4604 | source = "registry+https://github.com/rust-lang/crates.io-index" 4605 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 4606 | dependencies = [ 4607 | "windows-targets 0.52.6", 4608 | ] 4609 | 4610 | [[package]] 4611 | name = "windows-sys" 4612 | version = "0.59.0" 4613 | source = "registry+https://github.com/rust-lang/crates.io-index" 4614 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 4615 | dependencies = [ 4616 | "windows-targets 0.52.6", 4617 | ] 4618 | 4619 | [[package]] 4620 | name = "windows-targets" 4621 | version = "0.48.5" 4622 | source = "registry+https://github.com/rust-lang/crates.io-index" 4623 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 4624 | dependencies = [ 4625 | "windows_aarch64_gnullvm 0.48.5", 4626 | "windows_aarch64_msvc 0.48.5", 4627 | "windows_i686_gnu 0.48.5", 4628 | "windows_i686_msvc 0.48.5", 4629 | "windows_x86_64_gnu 0.48.5", 4630 | "windows_x86_64_gnullvm 0.48.5", 4631 | "windows_x86_64_msvc 0.48.5", 4632 | ] 4633 | 4634 | [[package]] 4635 | name = "windows-targets" 4636 | version = "0.52.6" 4637 | source = "registry+https://github.com/rust-lang/crates.io-index" 4638 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 4639 | dependencies = [ 4640 | "windows_aarch64_gnullvm 0.52.6", 4641 | "windows_aarch64_msvc 0.52.6", 4642 | "windows_i686_gnu 0.52.6", 4643 | "windows_i686_gnullvm", 4644 | "windows_i686_msvc 0.52.6", 4645 | "windows_x86_64_gnu 0.52.6", 4646 | "windows_x86_64_gnullvm 0.52.6", 4647 | "windows_x86_64_msvc 0.52.6", 4648 | ] 4649 | 4650 | [[package]] 4651 | name = "windows_aarch64_gnullvm" 4652 | version = "0.48.5" 4653 | source = "registry+https://github.com/rust-lang/crates.io-index" 4654 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 4655 | 4656 | [[package]] 4657 | name = "windows_aarch64_gnullvm" 4658 | version = "0.52.6" 4659 | source = "registry+https://github.com/rust-lang/crates.io-index" 4660 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 4661 | 4662 | [[package]] 4663 | name = "windows_aarch64_msvc" 4664 | version = "0.48.5" 4665 | source = "registry+https://github.com/rust-lang/crates.io-index" 4666 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 4667 | 4668 | [[package]] 4669 | name = "windows_aarch64_msvc" 4670 | version = "0.52.6" 4671 | source = "registry+https://github.com/rust-lang/crates.io-index" 4672 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 4673 | 4674 | [[package]] 4675 | name = "windows_i686_gnu" 4676 | version = "0.48.5" 4677 | source = "registry+https://github.com/rust-lang/crates.io-index" 4678 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 4679 | 4680 | [[package]] 4681 | name = "windows_i686_gnu" 4682 | version = "0.52.6" 4683 | source = "registry+https://github.com/rust-lang/crates.io-index" 4684 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 4685 | 4686 | [[package]] 4687 | name = "windows_i686_gnullvm" 4688 | version = "0.52.6" 4689 | source = "registry+https://github.com/rust-lang/crates.io-index" 4690 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 4691 | 4692 | [[package]] 4693 | name = "windows_i686_msvc" 4694 | version = "0.48.5" 4695 | source = "registry+https://github.com/rust-lang/crates.io-index" 4696 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 4697 | 4698 | [[package]] 4699 | name = "windows_i686_msvc" 4700 | version = "0.52.6" 4701 | source = "registry+https://github.com/rust-lang/crates.io-index" 4702 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 4703 | 4704 | [[package]] 4705 | name = "windows_x86_64_gnu" 4706 | version = "0.48.5" 4707 | source = "registry+https://github.com/rust-lang/crates.io-index" 4708 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 4709 | 4710 | [[package]] 4711 | name = "windows_x86_64_gnu" 4712 | version = "0.52.6" 4713 | source = "registry+https://github.com/rust-lang/crates.io-index" 4714 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 4715 | 4716 | [[package]] 4717 | name = "windows_x86_64_gnullvm" 4718 | version = "0.48.5" 4719 | source = "registry+https://github.com/rust-lang/crates.io-index" 4720 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 4721 | 4722 | [[package]] 4723 | name = "windows_x86_64_gnullvm" 4724 | version = "0.52.6" 4725 | source = "registry+https://github.com/rust-lang/crates.io-index" 4726 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 4727 | 4728 | [[package]] 4729 | name = "windows_x86_64_msvc" 4730 | version = "0.48.5" 4731 | source = "registry+https://github.com/rust-lang/crates.io-index" 4732 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 4733 | 4734 | [[package]] 4735 | name = "windows_x86_64_msvc" 4736 | version = "0.52.6" 4737 | source = "registry+https://github.com/rust-lang/crates.io-index" 4738 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 4739 | 4740 | [[package]] 4741 | name = "winnow" 4742 | version = "0.6.24" 4743 | source = "registry+https://github.com/rust-lang/crates.io-index" 4744 | checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" 4745 | dependencies = [ 4746 | "memchr", 4747 | ] 4748 | 4749 | [[package]] 4750 | name = "wio" 4751 | version = "0.2.2" 4752 | source = "registry+https://github.com/rust-lang/crates.io-index" 4753 | checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" 4754 | dependencies = [ 4755 | "winapi", 4756 | ] 4757 | 4758 | [[package]] 4759 | name = "wrapcenum-derive" 4760 | version = "0.4.1" 4761 | source = "registry+https://github.com/rust-lang/crates.io-index" 4762 | checksum = "a76ff259533532054cfbaefb115c613203c73707017459206380f03b3b3f266e" 4763 | dependencies = [ 4764 | "darling", 4765 | "proc-macro2", 4766 | "quote", 4767 | "syn 2.0.96", 4768 | ] 4769 | 4770 | [[package]] 4771 | name = "write16" 4772 | version = "1.0.0" 4773 | source = "registry+https://github.com/rust-lang/crates.io-index" 4774 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 4775 | 4776 | [[package]] 4777 | name = "writeable" 4778 | version = "0.5.5" 4779 | source = "registry+https://github.com/rust-lang/crates.io-index" 4780 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 4781 | 4782 | [[package]] 4783 | name = "xml-rs" 4784 | version = "0.8.25" 4785 | source = "registry+https://github.com/rust-lang/crates.io-index" 4786 | checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" 4787 | 4788 | [[package]] 4789 | name = "yeslogic-fontconfig-sys" 4790 | version = "6.0.0" 4791 | source = "registry+https://github.com/rust-lang/crates.io-index" 4792 | checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd" 4793 | dependencies = [ 4794 | "dlib", 4795 | "once_cell", 4796 | "pkg-config", 4797 | ] 4798 | 4799 | [[package]] 4800 | name = "yoke" 4801 | version = "0.7.5" 4802 | source = "registry+https://github.com/rust-lang/crates.io-index" 4803 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 4804 | dependencies = [ 4805 | "serde", 4806 | "stable_deref_trait", 4807 | "yoke-derive", 4808 | "zerofrom", 4809 | ] 4810 | 4811 | [[package]] 4812 | name = "yoke-derive" 4813 | version = "0.7.5" 4814 | source = "registry+https://github.com/rust-lang/crates.io-index" 4815 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 4816 | dependencies = [ 4817 | "proc-macro2", 4818 | "quote", 4819 | "syn 2.0.96", 4820 | "synstructure", 4821 | ] 4822 | 4823 | [[package]] 4824 | name = "zerocopy" 4825 | version = "0.7.35" 4826 | source = "registry+https://github.com/rust-lang/crates.io-index" 4827 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 4828 | dependencies = [ 4829 | "byteorder", 4830 | "zerocopy-derive", 4831 | ] 4832 | 4833 | [[package]] 4834 | name = "zerocopy-derive" 4835 | version = "0.7.35" 4836 | source = "registry+https://github.com/rust-lang/crates.io-index" 4837 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 4838 | dependencies = [ 4839 | "proc-macro2", 4840 | "quote", 4841 | "syn 2.0.96", 4842 | ] 4843 | 4844 | [[package]] 4845 | name = "zerofrom" 4846 | version = "0.1.5" 4847 | source = "registry+https://github.com/rust-lang/crates.io-index" 4848 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 4849 | dependencies = [ 4850 | "zerofrom-derive", 4851 | ] 4852 | 4853 | [[package]] 4854 | name = "zerofrom-derive" 4855 | version = "0.1.5" 4856 | source = "registry+https://github.com/rust-lang/crates.io-index" 4857 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 4858 | dependencies = [ 4859 | "proc-macro2", 4860 | "quote", 4861 | "syn 2.0.96", 4862 | "synstructure", 4863 | ] 4864 | 4865 | [[package]] 4866 | name = "zeroize" 4867 | version = "1.8.1" 4868 | source = "registry+https://github.com/rust-lang/crates.io-index" 4869 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 4870 | 4871 | [[package]] 4872 | name = "zerovec" 4873 | version = "0.10.4" 4874 | source = "registry+https://github.com/rust-lang/crates.io-index" 4875 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 4876 | dependencies = [ 4877 | "yoke", 4878 | "zerofrom", 4879 | "zerovec-derive", 4880 | ] 4881 | 4882 | [[package]] 4883 | name = "zerovec-derive" 4884 | version = "0.10.3" 4885 | source = "registry+https://github.com/rust-lang/crates.io-index" 4886 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 4887 | dependencies = [ 4888 | "proc-macro2", 4889 | "quote", 4890 | "syn 2.0.96", 4891 | ] 4892 | 4893 | [[package]] 4894 | name = "zip" 4895 | version = "0.6.6" 4896 | source = "registry+https://github.com/rust-lang/crates.io-index" 4897 | checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" 4898 | dependencies = [ 4899 | "aes", 4900 | "byteorder", 4901 | "bzip2", 4902 | "constant_time_eq", 4903 | "crc32fast", 4904 | "crossbeam-utils", 4905 | "flate2", 4906 | "hmac", 4907 | "pbkdf2", 4908 | "sha1", 4909 | "time", 4910 | "zstd", 4911 | ] 4912 | 4913 | [[package]] 4914 | name = "zip" 4915 | version = "1.1.4" 4916 | source = "registry+https://github.com/rust-lang/crates.io-index" 4917 | checksum = "9cc23c04387f4da0374be4533ad1208cbb091d5c11d070dfef13676ad6497164" 4918 | dependencies = [ 4919 | "arbitrary", 4920 | "crc32fast", 4921 | "crossbeam-utils", 4922 | "displaydoc", 4923 | "indexmap", 4924 | "num_enum", 4925 | "thiserror", 4926 | ] 4927 | 4928 | [[package]] 4929 | name = "zstd" 4930 | version = "0.11.2+zstd.1.5.2" 4931 | source = "registry+https://github.com/rust-lang/crates.io-index" 4932 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" 4933 | dependencies = [ 4934 | "zstd-safe", 4935 | ] 4936 | 4937 | [[package]] 4938 | name = "zstd-safe" 4939 | version = "5.0.2+zstd.1.5.2" 4940 | source = "registry+https://github.com/rust-lang/crates.io-index" 4941 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" 4942 | dependencies = [ 4943 | "libc", 4944 | "zstd-sys", 4945 | ] 4946 | 4947 | [[package]] 4948 | name = "zstd-sys" 4949 | version = "2.0.13+zstd.1.5.6" 4950 | source = "registry+https://github.com/rust-lang/crates.io-index" 4951 | checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" 4952 | dependencies = [ 4953 | "cc", 4954 | "pkg-config", 4955 | ] 4956 | 4957 | [[package]] 4958 | name = "zune-core" 4959 | version = "0.4.12" 4960 | source = "registry+https://github.com/rust-lang/crates.io-index" 4961 | checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 4962 | 4963 | [[package]] 4964 | name = "zune-inflate" 4965 | version = "0.2.54" 4966 | source = "registry+https://github.com/rust-lang/crates.io-index" 4967 | checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" 4968 | dependencies = [ 4969 | "simd-adler32", 4970 | ] 4971 | 4972 | [[package]] 4973 | name = "zune-jpeg" 4974 | version = "0.4.14" 4975 | source = "registry+https://github.com/rust-lang/crates.io-index" 4976 | checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" 4977 | dependencies = [ 4978 | "zune-core", 4979 | ] 4980 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "makemore_rs" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | burn = { version = "0.15.0", features = ["ndarray", "autodiff"] } 8 | burn-ndarray = "0.16.0" 9 | ndarray = "0.16.1" 10 | num-traits = "0.2.19" 11 | plotters = "0.3.7" 12 | rand = "0.8.5" 13 | rand_distr = "0.4.3" 14 | 15 | [dependencies.uuid] 16 | version = "1.11.0" 17 | features = [ 18 | "v4", 19 | ] 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) Copyright (c) 2025 Arjun Mukherjee, Shoestring Software Private Limited 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # makemore-rs 2 | 3 | ### Objective 4 | 5 | This is a rewrite of Andrej Karpathy's character level language model which he codes in the following video: 6 | 7 | 8 | 9 | [Rust](https://www.rust-lang.org/) is the only requirement. 10 | 11 | ### Prerequisites 12 | 13 | You must have Rust installed. Follow instructions here: 14 | 15 | 16 | ### Installation 17 | 18 | Clone this repo in any folder. 19 | 20 | Inside the folder, just do: 21 | 22 | ```bash 23 | cargo run 24 | ``` 25 | 26 | ### Code layout 27 | 28 | The code has been written as a single binary crate with modules for libs as well as *notebook* explorations. 29 | 30 | It can be refactored into a library crate with multiple binaries for each of the notebook later. 31 | 32 | The *notebook* files are prefixed with `nb`. For e.g. `nb001`, `nb002`, etc. 33 | 34 | Each of the *cell* inside a *notebook* file is written as a Rust function prefixed with `ex`. 35 | For e.g. `ex1`, `ex2`, etc. 36 | 37 | ### Usage 38 | 39 | Whenever you want to execute cells in a particular notebook, do the following: 40 | - go to `main.rs`. 41 | - In the `main` function, select the notebook (for e.g. `nb005`) by: 42 | ```rust 43 | nb005::main(); 44 | ``` 45 | - Each notebook file has its own `main` function. 46 | - Inside the `nb005.rs` file, execute any cell (for e.g. `ex11` by executing the `ex11()` function in `nb005` `main` function. 47 | 48 | ### Highlights 49 | 50 | Andrej was using matplotlib and PyTorch. Many functions like plotting the heat map, bigram matrix, multinomial sampling, PyTorch one hot encoding. etc. were written easily using other Rust crates. 51 | 52 | We used [ndarray crate](https://crates.io/crates/ndarray) for majority of the notebook examples till we came to the point where gradients had to be calculated. We switched to [burn crate](https://crates.io/crates/burn) thereafter. 53 | 54 | ### Code examples 55 | 56 | The *notebooks* of importance are everything except `nb004`. Just ignore that. 57 | 58 | Andrej this time did not write a library like when he did for [microgradr](https://github.com/shoestringinc/microgradr). Everyhting was done in a notebook. 59 | 60 | The entire `makemore` language model was coded in a Python notebook and we likewise coded in `nb001` to `nb005`. 61 | 62 | We kept on adding functions for notebook users in the following files: 63 | - `rust_mllib` which has functions that use `Burn lib`. This is our `PyTorch` equivalent. 64 | - `numr` which has functions that usse `ndarray` crate. This is our `numpy` equivalent. 65 | - `plot` has all the plotting functions. This is our `matplotlib` equivalent. 66 | 67 | The library files are little messy as we got ambitious creating super convenient interface for notebook users. But we wanted to finish the project so some structs, etc. are not used and not complete. 68 | 69 | But nevertheless, the lib modules have tons of tips for using various Rust AI crates. You will find lots of useful nuggets. 70 | 71 | For the finale, read the cell `ex11` in `nb005` notebook. 72 | It trains the neural net and then generates the words using multinomial distribution from the probabilities calculated from the final weights. 73 | 74 | 75 | ### Important imports for notebooks 76 | 77 | ```rust 78 | use crate::numr::*; 79 | use crate::plot::*; 80 | use crate::rust_mllib::*; 81 | use crate::utils::*; 82 | ``` 83 | 84 | There are others too which are just exposing the lower level crates. Maybe in future we will refactor them to use only the above crates. 85 | 86 | ### Plotting 87 | 88 | Andrej uses matplotlib for plotting. 89 | 90 | Check the `plot` module. 91 | 92 | The main functions are: 93 | - `plot_to_file` (for plotting points. We can rename it :-) 94 | - `plot_heat_map` 95 | - `plot_data` (used for plotting bigram matrix counts) 96 | 97 | Open the files in any rendering app. We use `Preview` on `osx`. `Preview` automatically re-renders as the graph changes. 98 | 99 | 100 | ### Final notes 101 | 102 | As usual, lots of reorgnization and refactoring can be done including separate test folder, lib and binaries etc. 103 | 104 | ### License 105 | 106 | MIT 107 | 108 | See the LICENSE file for more info. 109 | -------------------------------------------------------------------------------- /notes.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | mod nb001; 4 | mod nb002; 5 | mod nb003; 6 | mod nb004; 7 | mod nb005; 8 | 9 | mod utils; 10 | mod rust_mllib; 11 | mod numr; 12 | mod plot; 13 | 14 | fn main() { 15 | nb005::main(); 16 | // nb001::main(); 17 | // numr::main(); 18 | // rust_mllib::main(); 19 | } 20 | -------------------------------------------------------------------------------- /src/nb001.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | use std::collections::HashSet; 4 | use std::ops::Range; 5 | use std::{collections::HashMap, fs}; 6 | 7 | use crate::numr::*; 8 | use crate::plot::*; 9 | use crate::rust_mllib::*; 10 | use crate::utils::{create_char_matrix_ndarr, ctoi, get_names}; 11 | 12 | fn ex1() { 13 | let names = fs::read_to_string("names.txt").unwrap(); 14 | let names: Vec<_> = names.lines().collect(); 15 | // NOTE: we have a get_names() function in utils module to save some typing in cells. 16 | // println!("{:#?}", &names); 17 | 18 | let xs = &names[0..10]; // first 10 names 19 | // dbg!(&xs); 20 | 21 | println!("Total names: {}", names.len()); 22 | 23 | // shortest word 24 | let shortest = names.iter().map(|e| e.len()).min().unwrap(); 25 | println!("shortest length: {}", shortest); 26 | 27 | // longest word 28 | let longest = names.iter().map(|e| e.len()).max().unwrap(); 29 | println!("longest length: {}", longest); 30 | } 31 | 32 | fn ex2() { 33 | let names = get_names(); 34 | // println!("{:#?}", &names); 35 | 36 | for w in &names[0..3] { 37 | println!("{w}"); 38 | for (ch1, ch2) in w.chars().zip(w.chars().skip(1)) { 39 | println!("{ch1} {ch2}"); 40 | } 41 | println!("==="); 42 | } 43 | } 44 | 45 | fn ex3() { 46 | let names = get_names(); 47 | 48 | let mut b: HashMap<(char, char), usize> = HashMap::new(); 49 | // for w in &names[0..3] { 50 | for w in &names { 51 | let w = format!("<{}>", w); 52 | for (ch1, ch2) in w.chars().zip(w.chars().skip(1)) { 53 | let bigram = (ch1, ch2); 54 | b.entry(bigram).and_modify(|e| *e += 1).or_insert(1); 55 | // println!("{ch1} {ch2}"); 56 | } 57 | } 58 | 59 | // println!("{:#?}", &b); 60 | 61 | let mut sorted_entries: Vec<_> = b.iter().collect(); 62 | sorted_entries.sort_by(|a, b| b.1.cmp(a.1)); 63 | sorted_entries 64 | .iter() 65 | .take(10) 66 | .for_each(|e| println!("{:?}", e)); 67 | } 68 | 69 | fn ex4() { 70 | // Rough work: Testing Rust stuff 71 | let a = 1; 72 | let b = 2; 73 | println!("{:?}", a.cmp(&b)); 74 | println!("{:?}", b.cmp(&a)); 75 | let mut xs = vec![a, b]; 76 | xs.sort_by(|x, y| x.cmp(y)); 77 | println!("{:?}", xs); 78 | let mut xs = vec![a, b]; 79 | xs.sort_by(|x, y| y.cmp(x)); 80 | println!("{:?}", xs); 81 | } 82 | 83 | fn ex5() { 84 | let mut a = zeros_int(3, 5); 85 | dbg!(&a); 86 | a[[1, 3]] = 1; 87 | dbg!(&a); 88 | a[[1, 3]] += 1; 89 | dbg!(&a); 90 | a[[0, 0]] = 5; 91 | dbg!(&a); 92 | } 93 | 94 | fn ex6() { 95 | let names = get_names(); 96 | let mut chs: HashSet = names.join("").chars().collect(); 97 | // println!("{chs:?}"); 98 | // println!("{}", chs.len()); 99 | let mut chs = Vec::from_iter(chs); 100 | chs.sort(); 101 | chs.push('<'); 102 | chs.push('>'); 103 | println!("{chs:?}"); 104 | let xs: HashMap = (0..).zip(chs).map(|e| (e.1, e.0)).collect(); 105 | dbg!(&xs); 106 | 107 | // we have refactored this into a function calle ctoi in utils 108 | 109 | // let a = zeros_int(28, 28); 110 | } 111 | 112 | fn ex7() { 113 | let ctoi = ctoi(); 114 | let mut n = zeros_int(28, 28); 115 | let names = get_names(); 116 | for w in &names { 117 | let w = format!("<{}>", w); 118 | for (ch1, ch2) in w.chars().zip(w.chars().skip(1)) { 119 | let ix1 = ctoi[&ch1]; 120 | let ix2 = ctoi[&ch2]; 121 | n[[ix1, ix2]] += 1; 122 | } 123 | } 124 | // dbg!(&n); 125 | plot_heat_map(&n, "heat.png"); 126 | } 127 | 128 | fn ex8() { 129 | let ctoi = ctoi(); 130 | let itoc: HashMap = ctoi.iter().map(|(&k, &v)| (v, k)).collect(); 131 | println!("{:?}", itoc); 132 | } 133 | 134 | fn ex9() { 135 | let data = create_char_matrix_ndarr(); 136 | plot_heat_map(&data, "heat7_1.png"); 137 | } 138 | 139 | fn ex10() { 140 | let data = create_char_matrix_ndarr(); 141 | plot_data(&data, "data.png"); 142 | } 143 | 144 | fn ex11() { 145 | let data = create_char_matrix_ndarr(); 146 | let (v, min, max) = ndarray_to_image_data(&data); 147 | dbg!(&v); 148 | } 149 | 150 | pub fn main() { 151 | println!("Notebook 001"); 152 | ex9(); 153 | } 154 | -------------------------------------------------------------------------------- /src/nb002.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | use std::collections::HashSet; 4 | use std::ops::Range; 5 | use std::{collections::HashMap, fs}; 6 | 7 | use ndarray::Array1; 8 | use rand::thread_rng; 9 | 10 | use crate::utils::{create_char_matrix_ndarr, ctoi, get_names, itoc}; 11 | use crate::rust_mllib::*; 12 | use crate::numr::*; 13 | use crate::plot::*; 14 | 15 | 16 | fn ex1() { 17 | // Andrej switches to dot replacing and we used chars '<', '>' 18 | let ctoi = ctoi(); 19 | dbg!(&ctoi); 20 | } 21 | 22 | fn ex2() { 23 | let data = create_char_matrix_ndarr(); 24 | plot_data(&data, "data3.png"); 25 | 26 | // first row will be all the starting characters - ".a", ".b", etc. 27 | // first column are all the ending characters - "a.", "b." 28 | } 29 | 30 | fn ex3() { 31 | // let us begin with starting chars i.e. row 0 32 | let data = create_char_matrix_ndarr(); 33 | 34 | let row0 = data.row(0); 35 | // println!("{:?}", row0); 36 | 37 | // convert to floats 38 | let row0f = row0.mapv(|e|e as f64); 39 | // println!("{:?}", row0f); 40 | 41 | // probability distribution 42 | let total = row0f.sum(); 43 | let p = row0f.mapv(|e| e/ total); 44 | // println!("{:?}", p); 45 | 46 | // let samples = multinomial_distrib(100, &p); 47 | // dbg!(&samples); 48 | // println!("{}", samples.len()); 49 | 50 | // let samples = multinomial_distrib(1, &p); 51 | // let ctoi = ctoi(); 52 | // let itoc = itoc(&ctoi); 53 | // // find the first index having 1 54 | // let x = (0..).zip(samples.iter()).find(|(idx, &value)|value == 1).unwrap().0; 55 | // println!("{:?}", samples); 56 | // println!("{}", x); 57 | // println!("{}", itoc[&x]); 58 | 59 | } 60 | 61 | fn ex4() { 62 | let data = create_char_matrix_ndarr(); 63 | let ctoi = ctoi(); 64 | let itoc = itoc(&ctoi); 65 | 66 | let probs = probability_distrib(&data, 0); 67 | let mut rng = thread_rng(); 68 | let res = multinomial_distrib(1, &probs, &mut rng); 69 | dbg!(&res); 70 | let idx = res[0]; 71 | println!("{}", itoc[&idx]); 72 | 73 | // let idx = multinomial_char_index(&probs); 74 | // println!("char - {}", itoc[&idx]); 75 | } 76 | 77 | fn ex5() { 78 | let data = create_char_matrix_ndarr(); 79 | let ctoi = ctoi(); 80 | let itoc = itoc(&ctoi); 81 | let mut rng = thread_rng(); 82 | 83 | let mut row_num = 0_usize; 84 | let mut chs = Vec::new(); 85 | loop { 86 | let probs = probability_distrib(&data, row_num); 87 | row_num = multinomial_distrib(1, &probs, &mut rng)[0];// remember we get Array so extract 88 | let ch = itoc[&row_num]; 89 | if row_num == 0 { 90 | break; 91 | } 92 | chs.push(ch); 93 | } 94 | 95 | let name: String = chs.iter().collect(); 96 | 97 | println!("{}", name); 98 | 99 | } 100 | 101 | fn ex6() { 102 | // Bigram generation was not that good but better than uniform distribution shown here 103 | 104 | let data = create_char_matrix_ndarr(); 105 | let ctoi = ctoi(); 106 | let itoc = itoc(&ctoi); 107 | let mut rng = thread_rng(); 108 | 109 | let mut row_num = 0_usize; 110 | let mut chs = Vec::new(); 111 | let probs = ones_distrib(27); 112 | loop { 113 | row_num = multinomial_distrib(1, &probs, &mut rng)[0];// remember we get Array so extract 114 | let ch = itoc[&row_num]; 115 | if row_num == 0 { 116 | break; 117 | } 118 | chs.push(ch); 119 | } 120 | 121 | let name: String = chs.iter().collect(); 122 | 123 | println!("{}", name); 124 | 125 | } 126 | 127 | fn ex7() { 128 | let data = create_char_matrix_ndarr(); 129 | let pd = probability_distrib_matrix(&data); 130 | dbg!(&pd[0]); 131 | } 132 | 133 | fn ex8() { 134 | let data = create_char_matrix_ndarr(); 135 | let pd = probability_distrib_matrix(&data); 136 | let ctoi = ctoi(); 137 | let itoc = itoc(&ctoi); 138 | let mut rng = thread_rng(); 139 | 140 | let mut row_num = 0_usize; 141 | let mut chs = Vec::new(); 142 | loop { 143 | row_num = multinomial_distrib(1, &pd[row_num], &mut rng)[0];// remember we get Array so extract 144 | let ch = itoc[&row_num]; 145 | if row_num == 0 { 146 | break; 147 | } 148 | chs.push(ch); 149 | } 150 | 151 | let name: String = chs.iter().collect(); 152 | 153 | println!("{}", name); 154 | 155 | 156 | } 157 | 158 | fn ex9() { 159 | let data = create_char_matrix_ndarr(); 160 | let pd = probability_distrib_matrix(&data); 161 | println!("{}", &pd[1].sum()); 162 | println!("{:?}", &pd[0]); 163 | 164 | } 165 | 166 | 167 | pub fn main() { 168 | println!("Notebook 002"); 169 | ex9(); 170 | } 171 | 172 | // 1:06:26 -------------------------------------------------------------------------------- /src/nb003.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | use std::collections::HashSet; 4 | use std::f64::consts::E; 5 | use std::ops::Range; 6 | use std::{collections::HashMap, fs}; 7 | 8 | use ndarray::{Array1, Array2}; 9 | use rand::thread_rng; 10 | 11 | use std::sync::OnceLock; 12 | 13 | use crate::utils::{create_char_matrix_ndarr, ctoi, get_names, itoc}; 14 | use crate::rust_mllib::*; 15 | use crate::numr::*; 16 | use crate::plot::*; 17 | 18 | static WORDS: OnceLock> = OnceLock::new(); 19 | static DATA: OnceLock> = OnceLock::new(); 20 | static PD: OnceLock>> = OnceLock::new(); 21 | static CTOI: OnceLock> = OnceLock::new(); 22 | static ITOC: OnceLock> = OnceLock::new(); 23 | 24 | 25 | fn init_core_data() { 26 | WORDS.get_or_init(|| get_names()); 27 | DATA.get_or_init(|| create_char_matrix_ndarr()); 28 | let data = DATA.get().unwrap(); 29 | PD.get_or_init(|| probability_distrib_matrix(data)); 30 | CTOI.get_or_init(||ctoi()); 31 | let ctoi = CTOI.get().unwrap(); 32 | ITOC.get_or_init(||itoc(ctoi)); 33 | } 34 | 35 | fn ex1() { 36 | let words = WORDS.get().unwrap(); 37 | let data = DATA.get().unwrap(); 38 | let pd = PD.get().unwrap(); 39 | let ctoi = CTOI.get().unwrap(); 40 | let itoc = ITOC.get().unwrap(); 41 | } 42 | 43 | fn ex2() { 44 | let words = WORDS.get().unwrap(); 45 | let data = DATA.get().unwrap(); 46 | let pd = PD.get().unwrap(); 47 | let ctoi = CTOI.get().unwrap(); 48 | let itoc = ITOC.get().unwrap(); 49 | 50 | let mut log_likelihood = 0.0; 51 | let mut n = 0_usize; 52 | 53 | for w in &words[..3] { 54 | let chs = format!(".{}.", w); 55 | for (ch1, ch2) in chs.chars().zip(chs.chars().skip(1)) { 56 | let ix1 = ctoi[&ch1]; 57 | let ix2 = ctoi[&ch2]; 58 | let prob = &pd[ix1][ix2]; 59 | let logprob = prob.log(E); // natural log - base `e` 60 | log_likelihood += logprob; 61 | n += 1; 62 | // println!("{}{}: {:.4} {:.4}", ch1, ch2, prob, logprob); 63 | } 64 | } 65 | // maximize the probs which are model params 66 | // we maximize the log_likelihood (log is monotonic - lease negative) 67 | // equivalent to minimizing the nll 68 | // equivalent to minimizing the avg nll - lowest 0 69 | println!("{}", log_likelihood); // log likelihood is 0 when prob 1. Otherwise grows to negative inf as prob decreases. 70 | let nll = -log_likelihood; // higher it is bad. near 0 best 71 | println!("{nll}"); 72 | let avg_nll = nll / (n as f64); // lower is better 73 | println!("{}", avg_nll); 74 | } 75 | 76 | fn ex3() { 77 | let words = WORDS.get().unwrap(); 78 | let data = DATA.get().unwrap(); 79 | let pd = PD.get().unwrap(); 80 | let ctoi = CTOI.get().unwrap(); 81 | let itoc = ITOC.get().unwrap(); 82 | 83 | let mut log_likelihood = 0.0; 84 | let mut n = 0_usize; 85 | 86 | // just adding q - make the loss function `inf` 87 | for w in ["andrejq"] { 88 | let chs = format!(".{}.", w); 89 | for (ch1, ch2) in chs.chars().zip(chs.chars().skip(1)) { 90 | let ix1 = ctoi[&ch1]; 91 | let ix2 = ctoi[&ch2]; 92 | let prob = &pd[ix1][ix2]; 93 | let logprob = prob.log(E); // natural log - base `e` 94 | log_likelihood += logprob; 95 | n += 1; 96 | println!("{}{}: {:.4} {:.4}", ch1, ch2, prob, logprob); 97 | } 98 | } 99 | println!("{}", log_likelihood); // log likelihood is 0 when prob 1. Otherwise grows to negative inf as prob decreases. 100 | let nll = -log_likelihood; // higher it is bad. near 0 best 101 | println!("{nll}"); 102 | let avg_nll = nll / (n as f64); // lower is better 103 | println!("{}", avg_nll); 104 | 105 | } 106 | 107 | fn ex3_1() { 108 | let data = DATA.get().unwrap(); 109 | plot_data(data, "data_ndarr.png"); 110 | 111 | } 112 | 113 | fn ex4() { 114 | let words = WORDS.get().unwrap(); 115 | let data = DATA.get().unwrap(); 116 | let pd = PD.get().unwrap(); 117 | let ctoi = CTOI.get().unwrap(); 118 | let itoc = ITOC.get().unwrap(); 119 | 120 | // println!("{:?}", data[[0,1]]); 121 | // println!("{:?}", data.row(0)); 122 | 123 | // model smoothing 124 | // so that in our avg_nll we don't get infinity 125 | // respectable bigram character level langaueg model 126 | let data = data.mapv(|e| e+ 1); 127 | let pd = probability_distrib_matrix(&data); 128 | 129 | let mut log_likelihood = 0.0; 130 | let mut n = 0_usize; 131 | 132 | // just adding q - make the loss function `inf` 133 | for w in ["andrejq"] { 134 | let chs = format!(".{}.", w); 135 | for (ch1, ch2) in chs.chars().zip(chs.chars().skip(1)) { 136 | let ix1 = ctoi[&ch1]; 137 | let ix2 = ctoi[&ch2]; 138 | let prob = &pd[ix1][ix2]; 139 | let logprob = prob.log(E); // natural log - base `e` 140 | log_likelihood += logprob; 141 | n += 1; 142 | println!("{}{}: {:.4} {:.4}", ch1, ch2, prob, logprob); 143 | } 144 | } 145 | println!("{}", log_likelihood); // log likelihood is 0 when prob 1. Otherwise grows to negative inf as prob decreases. 146 | let nll = -log_likelihood; // higher it is bad. near 0 best 147 | println!("{nll}"); 148 | let avg_nll = nll / (n as f64); // lower is better 149 | println!("{}", avg_nll); 150 | 151 | 152 | } 153 | 154 | pub fn main() { 155 | println!("Notebook 002"); 156 | init_core_data(); 157 | ex3_1(); 158 | } 159 | 160 | // 56:17 -------------------------------------------------------------------------------- /src/nb004.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | use std::collections::HashSet; 4 | use std::f64::consts::E; 5 | use std::ops::Range; 6 | use std::{collections::HashMap, fs}; 7 | 8 | use ndarray::{Array1, Array2}; 9 | use rand::thread_rng; 10 | 11 | use std::sync::OnceLock; 12 | 13 | use crate::utils::{create_char_matrix_ndarr, create_char_matrix_tensor, ctoi, get_names, itoc}; 14 | use crate::rust_mllib::*; 15 | use crate::numr::*; 16 | use crate::plot::*; 17 | 18 | // Ignore this notebook 19 | // We were planning to rewrite all the cells using Burn Tensor rather than ndarray crate 20 | // But for fast rewrite we will continue till probably we reach auto diff position 21 | // Go to notebook 5 22 | 23 | fn ex1() { 24 | let words = get_names(); 25 | let ctoi = ctoi(); 26 | let itoc = itoc(&ctoi); 27 | 28 | let mut xs: Vec = vec![]; // input char 29 | let mut ys: Vec = vec![]; // desired char 30 | 31 | for w in &words[..1] { 32 | let chs = format!(".{}.", w); 33 | for (ch1, ch2) in chs.chars().zip(chs.chars().skip(1)) { 34 | let ix1 = ctoi[&ch1]; 35 | let ix2 = ctoi[&ch2]; 36 | println!("{} {}", ch1, ch2); 37 | xs.push(ix1 as f64); 38 | ys.push(ix2 as f64); 39 | } 40 | } 41 | 42 | let xs = tensor1df(&xs); 43 | let ys = tensor1df(&ys); 44 | println!("{}", &xs); 45 | let l = xs.dims(); 46 | println!("{}", l[0]); 47 | 48 | println!("length of xs: {}", len1df(&xs)); 49 | 50 | let onehot = one_hot_tensor(&xs, 27); 51 | println!("{}", onehot); 52 | } 53 | 54 | fn ex2() { 55 | // Use the struct TensorInt and TensorFloat rather than the functions - much easier 56 | let matrix = create_char_matrix_tensor(); 57 | // println!("{}", matrix); 58 | let tensor = matrix.tensor(); 59 | let t1 = tensor.clone().slice([0..1, 0..27]); 60 | // println!("{}", t1); 61 | let t2 = tensor.clone().slice([0..1, 1..2]); 62 | println!("{}", t2); 63 | } 64 | 65 | pub fn main() { 66 | println!("Notebook 004"); 67 | ex2(); 68 | 69 | } 70 | 71 | // 53:38 -------------------------------------------------------------------------------- /src/nb005.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | use burn::backend::autodiff::grads::Gradients; 4 | use ndarray::{arr2, Array1, Array2}; 5 | use ndarray::{stack, Axis}; 6 | use rand::thread_rng; 7 | use std::f64::consts::E; 8 | 9 | use crate::numr::*; 10 | use crate::plot::*; 11 | use crate::rust_mllib::*; 12 | use crate::utils::*; 13 | // use crate::utils::{ 14 | // create_char_matrix_ndarr, create_char_matrix_tensor, ctoi, get_names, itoc, 15 | // rand_normal_distrib, rand_uniform_nums, 16 | // }; 17 | 18 | fn input_output_pairs(num_words: usize) -> (Vec, Vec) { 19 | let words = get_names(); 20 | let ctoi = ctoi(); 21 | let itoc = itoc(&ctoi); 22 | 23 | let mut xs: Vec = vec![]; // input char 24 | let mut ys: Vec = vec![]; // desired char 25 | 26 | for w in &words[..num_words] { 27 | let chs = format!(".{}.", w); 28 | for (ch1, ch2) in chs.chars().zip(chs.chars().skip(1)) { 29 | let ix1 = ctoi[&ch1]; 30 | let ix2 = ctoi[&ch2]; 31 | xs.push(ix1); 32 | ys.push(ix2); 33 | } 34 | } 35 | 36 | (xs, ys) 37 | } 38 | 39 | fn ex1() { 40 | let words = get_names(); 41 | let ctoi = ctoi(); 42 | let itoc = itoc(&ctoi); 43 | 44 | let mut xs: Vec = vec![]; // input char 45 | let mut ys: Vec = vec![]; // desired char 46 | 47 | for w in &words[..1] { 48 | let chs = format!(".{}.", w); 49 | for (ch1, ch2) in chs.chars().zip(chs.chars().skip(1)) { 50 | let ix1 = ctoi[&ch1]; 51 | let ix2 = ctoi[&ch2]; 52 | // println!("{} {}", ch1, ch2); 53 | xs.push(ix1); 54 | ys.push(ix2); 55 | } 56 | } 57 | 58 | // single word i.e. first will have 5 examples for the neural net 59 | // dbg!(&xs); 60 | // dbg!(&ys); 61 | 62 | let xenc = one_hot_vec(&xs, 27); 63 | // dbg!(&xenc); 64 | 65 | // Because plot_heat_map takes ndarray Array2 66 | let t1 = vec_to_ndarr2(&xenc, xenc.len(), xenc[0].len()); 67 | 68 | // dbg!(&t1); 69 | plot_heat_map(&t1, "one_hot2.png"); 70 | } 71 | 72 | fn ex2() { 73 | let (xs, ys) = input_output_pairs(1); 74 | let xenc = one_hot(&xs, 27); 75 | 76 | // Weights 77 | let weights = randn(27, 1); 78 | dbg!(&weights); 79 | 80 | // 5 x 1 81 | // Basically for each input what value did the neuron give! 82 | // Here we had only one neuron 83 | let xs_x_ws = xenc.dot(&weights); 84 | dbg!(&xs_x_ws); 85 | } 86 | 87 | fn ex3() { 88 | // Dot product check 89 | // 2 x 3 90 | let inputs = vec![1, 2, 3, 4, 5, 6]; 91 | let t1 = Array2::from_shape_vec((2, 3), inputs).unwrap(); 92 | dbg!(&t1); 93 | // 3 x 1 94 | let weights = vec![10, 20, 30]; 95 | let t2 = Array2::from_shape_vec((3, 1), weights).unwrap(); 96 | dbg!(&t2); 97 | // 2 x 1 98 | let t3 = t1.dot(&t2); 99 | dbg!(&t3); 100 | } 101 | 102 | fn ex4() { 103 | let (xs, ys) = input_output_pairs(1); 104 | let inputs = one_hot(&xs, 27); 105 | // weights for 27 neurons 106 | let weights = randn(27, 27); 107 | // dbg!(&weights); 108 | 109 | // for each input what is the value of each of the 27 neurons 110 | // 5 x 27 111 | let res = inputs.dot(&weights); 112 | // println!("{}", res); 113 | 114 | // First input and the second neuron 115 | let x = res[[0, 1]]; 116 | // println!("{x}"); 117 | 118 | // 3rd input on the 13th neuron 119 | // println!("13th neuron firing on 3rd input {}", res[[2, 12]]); // 2.8925935942128285 120 | 121 | /* 122 | [[-2.6896996588544386, -1.5949525349934195, -0.36076418044950387, 0.4091364954293706, 2.6120071232583846, 1.2314528278303034, -2.838831036125167, 0.33008849484841907, 3.0133161273678764, -0.35825709187816734, -0.6420595146743118, 1.5875684977386153, 1.8350184501541702, -0.6456139093298119, -1.9579950436862585, 2.648992573329092, 1.3222773043017235, -1.3252280993555992, -2.001235221408179, -2.9887649454088847, -1.1458983501403546, 2.257846216908319, 1.7772263189951798, 0.1501913083161388, -0.9796481956789109, -2.677147109388177, 0.8744016396511647], 123 | [1.14150296134278, 1.1684028926131984, -1.9888881302044372, -2.4273821098120187, -2.6507106299391148, 0.16882557016191546, -1.1275460307685656, -2.9991717770551842, -2.0690872682826056, 1.1784448747673388, 0.42905521502608757, -1.1296264777749223, -1.7768623223259352, 0.8230961606019918, -2.9185420465990592, -2.0427854171285342, -1.7164251125736245, 0.820068555661086, 1.3812426363022312, 0.7198595207154219, 1.3916527284260618, 0.7719923798457673, -1.9528237901573842, -1.6580223728891172, 1.381601839069209, -3.0598736900607317, 2.70972898766277], 124 | [2.7364450625162093, -1.4804293758899, 2.3449644944575945, -1.8241268282369218, 2.295022887019592, 2.634656372868091, -2.357621156287847, -2.3759311533525147, -2.8726209958495392, -0.030764101098648133, 1.7477583825770275, 0.6661904676565276, 2.8925935942128285, 0.5016242514520788, -0.8393768333410856, 2.8318586096005025, 0.9476680056897604, -2.0984665285721937, -0.6364859649935615, -2.4372038136858114, 0.41510535351636557, -1.819521334684037, 2.9592667579412413, 2.089531878287825, -1.2108739131442412, 0.35087157482443354, -0.6282696840285347], 125 | [2.7364450625162093, -1.4804293758899, 2.3449644944575945, -1.8241268282369218, 2.295022887019592, 2.634656372868091, -2.357621156287847, -2.3759311533525147, -2.8726209958495392, -0.030764101098648133, 1.7477583825770275, 0.6661904676565276, 2.8925935942128285, 0.5016242514520788, -0.8393768333410856, 2.8318586096005025, 0.9476680056897604, -2.0984665285721937, -0.6364859649935615, -2.4372038136858114, 0.41510535351636557, -1.819521334684037, 2.9592667579412413, 2.089531878287825, -1.2108739131442412, 0.35087157482443354, -0.6282696840285347], 126 | [-0.4796817763134116, 2.550442308247694, -1.3461200878793176, 1.4538877412171343, -2.3848771152149033, -3.037387056610661, 2.8421633473301573, 2.4433997195850634, -2.436300151093138, 1.018084680537577, -1.542138822300317, 0.6312516894379772, 1.3019996289959805, -2.6872518711520126, -3.0214084136512707, 1.4270891982515468, -3.086351429775178, -1.4526508069631214, -0.5338361782536127, -1.6680061995542634, 1.2349638869443553, 1.96173543854704, 1.194760487087747, 1.2998929911940684, 0.35068435171745493, 2.705259270207009, -1.7281041665883825]] 127 | 128 | */ 129 | let third_input = inputs.row(2); 130 | let thirteenth_neuron = weights.column(12); 131 | // println!("Third input: \n{}", third_input); 132 | // println!("Thirteenth neuron: \n{}", thirteenth_neuron); 133 | let neuron_val = third_input.dot(&thirteenth_neuron); 134 | println!("13th neuron firing on 3rd input {}", res[[2, 12]]); 135 | println!("Neuron value verified by dot product: {}", neuron_val); 136 | } 137 | 138 | fn ex5() { 139 | let (xs, ys) = input_output_pairs(1); 140 | 141 | // Set of inputs to be fed into the neural net. 142 | let inputs = one_hot(&xs, 27); 143 | 144 | // weights for each of the 27 neurons. 145 | let weights = randn(27, 27); 146 | 147 | // for each input what is the value of each of the 27 neurons 148 | // 5 x 27 149 | // Interpret: X dot W, as log counts or logits. 150 | let logits = inputs.dot(&weights); 151 | // println!("{}", res) 152 | 153 | // If we exponentiate then we can interpret them as counts 154 | // So this matrix equivalent to our 2d char matrix that we create using create_char_matrix 155 | let counts = logits.exp(); 156 | // dbg!(&counts); 157 | 158 | // Now to get the probabilities like in our char matrix 159 | let prob = probabiity_row_wise(&counts); 160 | // dbg!(&prob); 161 | println!("{}", prob.row(0).sum()); 162 | } 163 | 164 | fn ex6() { 165 | // ndarray api explorations 166 | 167 | // 2 x 3 matrix 168 | let a = arr2(&[[1., 2., 3.], [4., 5., 6.]]); 169 | let mut xs = Vec::new(); 170 | for row in a.rows() { 171 | let sum = row.sum(); 172 | let new_row = row.mapv(|e| e / sum); 173 | xs.push(new_row); 174 | } 175 | let xs: Vec<_> = xs.iter().map(|r| r.view()).collect(); 176 | let a1 = stack(Axis(0), &xs).unwrap(); 177 | dbg!(&a1); 178 | } 179 | 180 | fn ex7() { 181 | // Rough calc 182 | let xs = [ 183 | 9.489309669402608, 184 | 0.13125712870354542, 185 | 2.925142047537846, 186 | 1.0059390165304172, 187 | 9.278091884400373, 188 | 0.0754846633095178, 189 | 1.296102016519838, 190 | 4.786387470159512, 191 | 2.577201356724872, 192 | 1.382037567031469, 193 | 0.2654712204372306, 194 | 0.3615618334072086, 195 | 0.2199932013834451, 196 | 5.502815071258198, 197 | 9.44850250687406, 198 | 0.2690937339965065, 199 | 0.13325850812268905, 200 | 0.200961135799917, 201 | 4.517666126512665, 202 | 0.10964306268307805, 203 | 7.0953902334609635, 204 | 3.8108544650483362, 205 | 0.15610612772999363, 206 | 5.614646996336443, 207 | 0.11316566217358716, 208 | 0.11959632979313718, 209 | 0.9425025089400019, 210 | ]; 211 | let sum: f64 = xs.iter().sum(); 212 | println!("{}", xs[0] / sum); 213 | println!("{}", xs[1] / sum); 214 | } 215 | 216 | fn ex8() { 217 | let (xs, ys) = input_output_pairs(1); 218 | 219 | let num_classes = 27_usize; 220 | 221 | let inputs = one_hot(&xs, num_classes); 222 | let weights = randn(num_classes, num_classes); 223 | 224 | // forward pass of neural net starts here 225 | // Interpret: X dot W, as log counts or logits. 226 | let logits = inputs.dot(&weights); 227 | let counts = logits.exp(); 228 | 229 | let probs = probabiity_row_wise(&counts); 230 | // forward pass - everything is differentiable so we can do backpropagation! 231 | 232 | // println!("{:?}", probs.shape()); 233 | 234 | // Because we are starting on back propagation we will use Burn Tensors now! 235 | let inputs_t = ndarr2_to_tensor(&inputs); 236 | let weights_t = ndarr2_to_tensor(&weights); 237 | 238 | // WARNING: Do not set gradient on computed i.e. non-leaf tensor 239 | let logits_t = inputs_t.matmul(weights_t); 240 | let counts_t = logits_t.exp(); 241 | 242 | // Probability calculation Tensor style (now thatis Gangname style) 243 | // Burn supports auto broadcasting! 244 | let row_sums = counts_t.clone().sum_dim(1); 245 | let probs_t = counts_t.clone() / row_sums; 246 | } 247 | 248 | fn ex9() { 249 | let ctoi = ctoi(); 250 | let itoc = itoc(&ctoi); 251 | 252 | let (xs, ys) = input_output_pairs(1); 253 | 254 | // We have already written this using ndarray, so we will convert these to tensors 255 | let inputs = one_hot(&xs, 27); 256 | let weights = randn(27, 27); 257 | 258 | // Now we have the tensors for each of the above 259 | let inputs_t = ndarr2_to_tensor(&inputs); 260 | let weights_t = ndarr2_to_tensor(&weights); 261 | 262 | let logits_t = inputs_t.matmul(weights_t); 263 | let counts_t = logits_t.exp(); 264 | 265 | let row_sums = counts_t.clone().sum_dim(1); 266 | let probs_t = counts_t.clone() / row_sums; 267 | 268 | let mut nlls = create_empty_2d_tensor(xs.len(), 1); 269 | 270 | let num_cols = probs_t.dims()[1]; 271 | 272 | // dbg!(&probs_t); 273 | for i in 0..5 { 274 | // ith-bigram 275 | let x = xs[i]; // input character index 276 | let y = ys[i]; // label character index 277 | println!("-------------"); 278 | println!( 279 | "bigram example {}: {}{} (indexes {},{})", 280 | i + 1, 281 | itoc[&x], 282 | itoc[&y], 283 | x, 284 | y 285 | ); 286 | println!("input to the neural net: {}", x); 287 | let prob_i = get_row(&probs_t, i); 288 | println!("output probabilities from the neural net: {:?}", &prob_i); 289 | println!("index (actual next character): {}", y); 290 | let p = get_elem(&prob_i, y); 291 | println!( 292 | "probability assigned by the neural net to the correct character: {}", 293 | p.clone().into_scalar() 294 | ); 295 | // Remember log likelihood goes negative if probability goes towards zero 296 | let logp = p.log(); 297 | println!("log likelihood: {}", logp.clone().into_scalar()); 298 | let nll = logp.neg(); 299 | println!("negative log likelihood: {}", nll.clone().into_scalar()); 300 | nlls = nlls.slice_assign([i..i + 1, 0..1], nll); 301 | } 302 | println!("{}", nlls.clone()); 303 | println!("=========="); 304 | let avg_nll = nlls.mean(); 305 | println!("average negative log likelihood, i.e. loss = {}", avg_nll); 306 | } 307 | 308 | fn ex10() { 309 | let ctoi = ctoi(); 310 | let itoc = itoc(&ctoi); 311 | 312 | let (xs, ys) = input_output_pairs(1); 313 | 314 | let inputs = one_hot(&xs, 27); 315 | let weights = randn(27, 27); 316 | 317 | let inputs_t = ndarr2_to_tensor(&inputs); 318 | let mut weights_t = ndarr2_to_tensor(&weights); 319 | 320 | // let null_grad = weights_t.zeros_like(); 321 | 322 | let logits_t = inputs_t.matmul(weights_t.clone()); 323 | let counts_t = logits_t.exp(); 324 | 325 | let row_sums = counts_t.clone().sum_dim(1); 326 | let probs_t = counts_t.clone() / row_sums; 327 | 328 | let mut tgt_probs = create_empty_2d_tensor(xs.len(), 1); 329 | 330 | for i in 0..(xs.len()) { 331 | let row = get_row(&probs_t, i); 332 | let tgt_index = ys[i]; 333 | let p = get_elem(&row, tgt_index); 334 | tgt_probs = tgt_probs.slice_assign([i..i + 1, 0..1], p); 335 | } 336 | 337 | // println!("{}", tgt_probs); 338 | let loss = tgt_probs.log().neg().mean(); 339 | println!("Loss: {}", loss); 340 | 341 | // let node_ref = loss 342 | 343 | // backward pass 344 | // let mut grads = Gradients::new(root_node, root_tensor) 345 | // weights_t = weights_t.set_require_grad(true); 346 | let mut grads = loss.backward(); 347 | let g = weights_t.grad(&grads).unwrap(); 348 | dbg!(&g); 349 | let ng = g.zeros_like(); 350 | weights_t.grad_replace(&mut grads, ng); 351 | let g = weights_t.grad(&grads).unwrap(); 352 | dbg!(&g); 353 | } 354 | 355 | fn ex11() { 356 | // Showtime 357 | 358 | let names = get_names(); 359 | let total_words = names.len(); 360 | println!("total words: {}", total_words); 361 | 362 | // Prepare data 363 | // Putting total words gives a huge number of input pairs 2lakh plus 364 | // and my machine crawls. Time for update. 365 | // So spiffy speed we put 20 366 | // NOte, I am not using GPU backend in Burn. 367 | // Plain NdArray 368 | let (xs, ys) = input_output_pairs(20); 369 | // let total_inputs = xs.len(); 370 | // println!("total inputs: {}", total_inputs); 371 | 372 | let inputs = one_hot(&xs, 27); 373 | let weights = randn(27, 27); 374 | 375 | let inputs_t = ndarr2_to_tensor(&inputs); 376 | 377 | // this is going to change 378 | let mut weights_t = ndarr2_to_tensor(&weights); 379 | 380 | for k in 0..100 { 381 | let inputs_t = inputs_t.clone(); 382 | let logits_t = inputs_t.matmul(weights_t.clone()); 383 | let counts_t = logits_t.exp(); 384 | 385 | let row_sums = counts_t.clone().sum_dim(1); 386 | let probs_t = counts_t.clone() / row_sums; 387 | 388 | let mut tgt_probs = create_empty_2d_tensor(xs.len(), 1); 389 | 390 | // We have to find the probability assigned to bigram pairs. 391 | // Probability has to be high or nll should be least. 392 | // Actually we will look at mean nll 393 | for i in 0..(xs.len()) { 394 | let row = get_row(&probs_t, i); 395 | let tgt_index = ys[i]; 396 | let p = get_elem(&row, tgt_index); 397 | tgt_probs = tgt_probs.slice_assign([i..i + 1, 0..1], p); 398 | } 399 | 400 | // println!("{}", tgt_probs); 401 | let loss = tgt_probs.log().neg().mean(); 402 | println!("loss: {}", loss.clone().into_scalar()); 403 | let mut grads = loss.backward(); 404 | let wg = weights_t.grad(&grads); 405 | if let Some(wg) = wg { 406 | let nudge = (wg.clone() * -10.0); 407 | let nudge = convert_nd_to_autodiff(&nudge); 408 | weights_t = weights_t.clone() + nudge; 409 | let ng = wg.zeros_like(); 410 | weights_t.grad_replace(&mut grads, ng); 411 | } else { 412 | // println!("no gradient. Weights remain same"); 413 | weights_t = weights_t.clone(); 414 | } 415 | } 416 | 417 | // WORD GENERATION (based on our trained weights) 418 | 419 | // Now we will take the weight_t as it comes from the training 420 | // We used bigrams from just 20 words and did 100 passes to get the weights 421 | // But we will now use those weights for probability distribution of all the bigrams! Fidgety :-) 422 | // If you have a powerful machine then you can use all the bigram pairs to train and 423 | // use even more passes to get lowest loss! 424 | 425 | let (xs, _) = input_output_pairs(total_words); 426 | // println!("Total bigram pairs: {}", xs.len()); 427 | 428 | let inputs = one_hot(&xs, 27); 429 | let inputs_t = ndarr2_to_tensor(&inputs); 430 | 431 | let logits_t = inputs_t.matmul(weights_t.clone()); 432 | let counts_t = logits_t.exp(); 433 | 434 | let row_sums = counts_t.clone().sum_dim(1); 435 | 436 | let probs_t = counts_t.clone() / row_sums; 437 | // println!("Trained probability dim: {:?}", probs_t.dims()); 438 | 439 | // I have already written a multinomial in numr module using NdArray 440 | // so I am going to reuse it. Later we will create a tensor version. 441 | // which is really not required. 442 | // Once you have trained the neural net and have the calculation then 443 | // all we need is the trained probabilities in any structure. 444 | let probs_nd = tensor2d_to_ndarr2(&probs_t); 445 | let pd = probability_distrib_matrix(&probs_nd); 446 | 447 | let ctoi = ctoi(); 448 | let itoc = itoc(&ctoi); 449 | let mut rng = thread_rng(); 450 | 451 | // The moment we were waiting for! 452 | for i in 0..5 { 453 | let mut row_num = 0_usize; 454 | let mut chs = Vec::new(); 455 | 456 | loop { 457 | row_num = multinomial_distrib(1, &pd[row_num], &mut rng)[0]; // remember we get Array so extract 458 | let ch = itoc[&row_num]; 459 | if row_num == 0 { 460 | break; 461 | } 462 | chs.push(ch); 463 | } 464 | 465 | let name: String = chs.iter().collect(); 466 | 467 | println!("{}", name); 468 | } 469 | } 470 | 471 | fn rough_calc() {} 472 | 473 | pub fn main() { 474 | println!("Notebook 005"); 475 | ex11(); 476 | // rough_calc() 477 | } 478 | 479 | // 31:20 480 | -------------------------------------------------------------------------------- /src/numr.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | // This is like Numpy equivalent - just wrappers using ndarray crate. 4 | 5 | use std::cell::RefCell; 6 | use std::collections::HashMap; 7 | use std::rc::Rc; 8 | 9 | use ndarray::prelude::*; 10 | use ndarray::{stack, Array, Array1, Array2, Axis}; 11 | 12 | use rand::distributions::WeightedIndex; 13 | use rand::prelude::*; 14 | 15 | use num_traits::{Bounded, Num, ToPrimitive}; 16 | 17 | use crate::utils::rand_normal_distrib; 18 | 19 | pub fn arange(start: f64, stop: f64, step: f64) -> Array1 { 20 | Array::range(start, stop, step) 21 | } 22 | 23 | pub fn max_array1(xs: &Array1) -> f64 { 24 | xs.iter().cloned().fold(f64::MIN, |a, b| a.max(b)) 25 | } 26 | 27 | pub fn min_array1(xs: &Array1) -> f64 { 28 | xs.iter().cloned().fold(f64::MAX, |a, b| a.min(b)) 29 | } 30 | 31 | pub fn zeros_float(num_rows: usize, num_cols: usize) -> Array2 { 32 | Array2::zeros((num_rows, num_cols)) 33 | } 34 | 35 | pub fn zeros_int(num_rows: usize, num_cols: usize) -> Array2 { 36 | Array2::zeros((num_rows, num_cols)) 37 | } 38 | 39 | // pub fn multinomial_distrib(num_samples: usize, input: &ArrayView1, rng: &mut ThreadRng) -> Array1 { 40 | pub fn multinomial_distrib( 41 | num_samples: usize, 42 | input: &Array1, 43 | rng: &mut ThreadRng, 44 | ) -> Array1 { 45 | // let input = Array1::from_vec(vec![0.2, 0.5, 0.3]); 46 | // let num_samples = 10; 47 | 48 | // pass the weights 49 | let dist = WeightedIndex::new(input.to_vec()).unwrap(); 50 | 51 | let mut samples = vec![0_usize; num_samples]; 52 | for i in 0..num_samples { 53 | samples[i] = dist.sample(rng); 54 | } 55 | 56 | Array1::from(samples) 57 | 58 | // let mut rng = thread_rng(); 59 | 60 | // Sample from the multinomial distribution 61 | // let mut counts = vec![0usize; input.len() ]; 62 | // for _ in 0..num_samples { 63 | // let sample = dist.sample(rng); 64 | // counts[sample] += 1; 65 | // } 66 | 67 | // println!("{:?}", counts); 68 | 69 | // let xs = Array1::from(counts); 70 | // xs 71 | } 72 | 73 | // pub fn multinomial_char_index(input: &Array1) -> usize { 74 | // let samples = multinomial_distrib(1, input); 75 | // let idx = (0usize..).zip(samples.iter()).find(|(idx, &value)|value == 1).unwrap().0; 76 | // idx 77 | // } 78 | 79 | pub fn probability_distrib(data: &Array2, row_num: usize) -> Array1 80 | where 81 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 82 | { 83 | let row_n = data.row(row_num); 84 | let row_n_f = row_n.mapv(|e| (e.to_f64()).unwrap()); 85 | let total = row_n_f.sum(); 86 | 87 | let probabilities = row_n_f.mapv(|e| e / total); 88 | probabilities 89 | } 90 | 91 | pub fn probability_distrib_matrix(data: &Array2) -> Vec> 92 | where 93 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 94 | { 95 | let data = data.mapv(|e| (e.to_f64()).unwrap()); 96 | 97 | let mut pd_vec = Vec::new(); 98 | 99 | for row in data.rows() { 100 | let total = row.sum(); 101 | let probs = row.mapv(|e| e / total); 102 | pd_vec.push(probs); 103 | } 104 | 105 | // let xs = Array2::from_shape_vec( 106 | // (data.nrows(), data.ncols()), 107 | // pd_vec.into_iter().flatten().collect(), 108 | // ).unwrap(); 109 | 110 | // let mut res = Vec::new(); 111 | 112 | pd_vec 113 | } 114 | 115 | pub fn ones_distrib(num_cols: usize) -> Array1 { 116 | // let x: Array1 = Array1::::ones(27); 117 | // let ones = Array::::ones((1, num_cols)); // dim is 2 118 | // let ones = ones.row(0); 119 | let ones: Array1 = Array1::::ones(num_cols); 120 | let d = num_cols as f64; 121 | let p = ones.mapv(|n| n / d); 122 | p 123 | } 124 | 125 | // Return type could have been u8 too! 126 | pub fn one_hot_vec(xs: &[usize], num_classes: usize) -> Vec> { 127 | let mut res = Vec::new(); 128 | for &x in xs { 129 | let mut v = vec![0.0_f64; num_classes]; 130 | v[x] = 1.0; 131 | res.push(v); 132 | } 133 | res 134 | } 135 | 136 | pub fn one_hot(xs: &[usize], num_classes: usize) -> Array2 { 137 | let v = one_hot_vec(xs, num_classes); 138 | vec_to_ndarr2(&v, v.len(), v[0].len()) 139 | } 140 | 141 | pub fn vec_to_ndarr2(xs: &Vec>, num_rows: usize, num_cols: usize) -> Array2 142 | where 143 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 144 | { 145 | let v: Vec = xs.iter().cloned().flatten().collect(); 146 | // let v1: Vec = v.iter().map(|e| (e.to_i64()).unwrap()).collect(); 147 | Array2::from_shape_vec((num_rows, num_cols), v).unwrap() 148 | } 149 | 150 | pub fn randn(num_rows: usize, num_cols: usize) -> Array2 { 151 | let total_elems = num_rows * num_cols; 152 | let xs = rand_normal_distrib(total_elems); 153 | Array2::from_shape_vec((num_rows, num_cols), xs).unwrap() 154 | } 155 | 156 | pub fn probabiity_row_wise(a: &Array2) -> Array2 { 157 | let mut xs = Vec::new(); 158 | for row in a.rows() { 159 | let sum = row.sum(); 160 | let new_row = row.mapv(|e| e / sum); 161 | xs.push(new_row); 162 | } 163 | let xs: Vec<_> = xs.iter().map(|r| r.view()).collect(); 164 | let a1 = stack(Axis(0), &xs).unwrap(); 165 | a1 166 | } 167 | 168 | fn explore1() { 169 | let mut rng = thread_rng(); 170 | let input = Array1::from_vec(vec![0.2, 0.5, 0.3]); 171 | let res = multinomial_distrib(100, &input, &mut rng); 172 | dbg!(&res); 173 | } 174 | 175 | fn explore2() { 176 | let array = Array2::from_shape_vec((2, 3), vec![1, 2, 3, 4, 5, 6]).unwrap(); 177 | 178 | let new_array = Array2::from_shape_vec( 179 | (2, 3), 180 | array 181 | .axis_iter(Axis(0)) 182 | .flat_map(|row| row.mapv(|x| x * 2)) 183 | .collect(), 184 | ) 185 | .unwrap(); 186 | 187 | dbg!(new_array); 188 | } 189 | 190 | fn explore3() { 191 | let array = Array2::from_shape_vec((2, 3), vec![1, 2, 3, 4, 5, 6]).unwrap(); 192 | let shape = array.shape(); 193 | let (num_rows, num_cols) = (shape[0], shape[1]); 194 | println!("row: {}, cols: {}", num_rows, num_cols); 195 | } 196 | 197 | pub fn main() { 198 | println!("NumRust explore"); 199 | explore3(); 200 | } 201 | -------------------------------------------------------------------------------- /src/plot.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | // This is for plotting graphs like matplotlib. 4 | // We use plotters crate for actual rendering. 5 | 6 | use std::fmt::Debug; 7 | use std::fmt::Display; 8 | use std::i64; 9 | use std::rc::Rc; 10 | 11 | use crate::numr::*; 12 | use full_palette::DEEPPURPLE; 13 | use full_palette::GREY; 14 | use ndarray::{Array, Array1, Array2, Axis}; 15 | use plotters::coord::types::RangedCoordusize; 16 | use plotters::prelude::*; 17 | use plotters::style::colors::colormaps; 18 | use plotters::style::text_anchor::HPos; 19 | use plotters::style::text_anchor::Pos; 20 | use plotters::style::text_anchor::VPos; 21 | 22 | // use ndarray::prelude::*; 23 | // use ndarray::Array; 24 | use crate::utils::*; 25 | use num_traits::{Bounded, Num, ToPrimitive}; 26 | use std::collections::HashMap; 27 | 28 | // plotting points 29 | pub fn plot_to_file(xs: &Array1, ys: &Array1, file_name: &str) { 30 | let xmin = min_array1(xs); 31 | let xmax = max_array1(xs) + 0.1; 32 | let xrange = xmin..xmax; 33 | 34 | let ymin = min_array1(ys); 35 | let ymax = max_array1(ys) + 0.1; 36 | let yrange = ymin..ymax; 37 | 38 | let root = BitMapBackend::new(file_name, (640, 480)); 39 | let draw = root.into_drawing_area(); 40 | draw.fill(&WHITE); 41 | 42 | let mut chart = ChartBuilder::on(&draw) 43 | .caption("Simple Plot", ("sans-serif", 40).into_font()) 44 | .margin(20) 45 | .x_label_area_size(20) 46 | .y_label_area_size(20) 47 | .build_cartesian_2d(xrange, yrange) 48 | .unwrap(); 49 | 50 | chart.configure_mesh().draw().unwrap(); 51 | 52 | chart 53 | .draw_series(LineSeries::new( 54 | xs.iter().zip(ys.iter()).map(|(&x, &y)| (x, y)), 55 | &RED, 56 | )) 57 | .unwrap(); 58 | } 59 | 60 | // fn ndarray_to_normalized_image_data(data: &Array2) -> (Vec>, f64, f64) 61 | // where 62 | // T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 63 | // { 64 | // let shape = data.shape(); 65 | // let (num_rows, num_cols) = (shape[0], shape[1]); 66 | // let mut image_data = Vec::new(); 67 | // let mut min_value = T::max_value(); 68 | // let mut max_value = T::min_value(); 69 | // for i in 0..num_rows { 70 | // let mut row_data = Vec::new(); 71 | // for j in 0..num_cols { 72 | // let v = data[[i,j]]; 73 | // if v > max_value { 74 | // max_value = v; 75 | // } 76 | // if v < min_value { 77 | // min_value = v; 78 | // } 79 | // let v = v.to_f64(); 80 | // row_data.push(v.unwrap()); // [row, col] 81 | // } 82 | // image_data.push(row_data); 83 | // } 84 | 85 | // let min = min_value.to_f64().unwrap(); 86 | // let max = max_value.to_f64().unwrap(); 87 | // let range = max - min; 88 | 89 | // // Normalize the data 90 | // let image_data_normalized: Vec> = image_data.iter() 91 | // .map(|row|{ 92 | // row.iter() 93 | // .map(|&value|{ 94 | // (value - min) / range 95 | // }).collect() 96 | // }).collect(); 97 | 98 | // (image_data_normalized, min, max) 99 | 100 | // } 101 | 102 | fn normalize_image_data(image_data: &Vec>, min: T, max: T) -> Vec> 103 | where 104 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 105 | { 106 | let min = min.to_f64().unwrap(); 107 | let max = max.to_f64().unwrap(); 108 | let range = max - min; 109 | let xs: Vec> = image_data 110 | .iter() 111 | .map(|row| { 112 | row.iter() 113 | .map(|value| { 114 | let v = value.to_f64().unwrap(); 115 | (v - min) / range 116 | }) 117 | .collect() 118 | }) 119 | .collect(); 120 | xs 121 | } 122 | 123 | pub fn ndarray_to_image_data(data: &Array2) -> (Vec>, T, T) 124 | where 125 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 126 | { 127 | let shape = data.shape(); 128 | let (num_rows, num_cols) = (shape[0], shape[1]); 129 | let mut image_data: Vec> = Vec::new(); 130 | 131 | let mut min_value = T::max_value(); 132 | let mut max_value = T::min_value(); 133 | 134 | for i in 0..num_rows { 135 | let mut row_data = Vec::new(); 136 | for j in 0..num_cols { 137 | let v = data[[i, j]]; // [row, col] 138 | if v > max_value { 139 | max_value = v; 140 | } 141 | if v < min_value { 142 | min_value = v; 143 | } 144 | row_data.push(v); 145 | } 146 | image_data.push(row_data); 147 | } 148 | (image_data, min_value, max_value) 149 | } 150 | 151 | enum ChartType { 152 | HeatMap, 153 | Text, 154 | } 155 | 156 | type RenderContext<'a> = 157 | ChartContext<'a, BitMapBackend<'a>, Cartesian2d>; 158 | 159 | fn prepare_chart_data<'a, 'b: 'a, T>( 160 | image_data: &Vec>, 161 | file_name: &'b str, 162 | chart_type: ChartType, 163 | ) -> RenderContext<'a> 164 | where 165 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 166 | { 167 | let ifactor: usize = match chart_type { 168 | ChartType::HeatMap => 10, 169 | ChartType::Text => 40, 170 | }; 171 | 172 | let width = (image_data[0].len() * ifactor) as u32; 173 | let height = (image_data.len() * ifactor) as u32; 174 | 175 | let root = BitMapBackend::new(file_name, (width, height)).into_drawing_area(); 176 | root.fill(&WHITE); 177 | 178 | let caption: &str = match chart_type { 179 | ChartType::HeatMap => "Heat Map", 180 | ChartType::Text => "Data Plot", 181 | }; 182 | 183 | let mut chart = ChartBuilder::on(&root) 184 | .caption(caption, ("sans-serif", 20).into_font()) 185 | .margin(20) 186 | .build_cartesian_2d(0..image_data[0].len(), (image_data.len()..0)) 187 | .unwrap(); 188 | 189 | chart.configure_mesh().draw().unwrap(); 190 | chart 191 | } 192 | 193 | pub fn plot_heat_map(data: &Array2, file_name: &str) 194 | where 195 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 196 | { 197 | let (image_data, min, max) = ndarray_to_image_data(&data); 198 | let mut chart = prepare_chart_data(&image_data, file_name, ChartType::HeatMap); 199 | 200 | // Since this is heat map we have to normalize the value. 201 | let image_data = normalize_image_data(&image_data, min, max); 202 | 203 | chart 204 | .draw_series(image_data.iter().enumerate().flat_map(|(y, row)| { 205 | row.iter().enumerate().map(move |(x, &value)| { 206 | let color = colormaps::ViridisRGB::get_color(value); 207 | Rectangle::new([(x, y), (x + 1, y + 1)], color.filled()) 208 | }) 209 | })) 210 | .unwrap(); 211 | } 212 | 213 | fn blue_colormap(value: T, max: T) -> RGBColor 214 | where 215 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd + Debug + Display, 216 | { 217 | let value = value.to_f64().unwrap(); 218 | let max = max.to_f64().unwrap(); 219 | 220 | // clamping 221 | let t = value / max; 222 | 223 | // from light blue to dark blue 224 | let r = (173.0 * (1.0 - t)) as u8; 225 | let g = (216.0 * (1.0 - t)) as u8; 226 | let b = (230.0 * (1.0 - t) + 139.0 * t) as u8; 227 | 228 | // let blue = (normal_value * 255.0) as u8; 229 | RGBColor(r, g, b) 230 | } 231 | 232 | pub fn plot_data(data: &Array2, file_name: &str) 233 | where 234 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd + Debug + Display, 235 | { 236 | let (image_data, min, max) = ndarray_to_image_data(&data); 237 | let mut chart = prepare_chart_data(&image_data, file_name, ChartType::Text); 238 | 239 | // dbg!(&image_data); 240 | 241 | let ctoi = ctoi(); 242 | let itoc: HashMap = ctoi.iter().map(|(&k, &v)| (v, k)).collect(); 243 | 244 | // Not required - much better option which works. 245 | // let pos_label = Pos::new(HPos::Center, VPos::Top); 246 | // let pos_val = Pos::new(HPos::Center, VPos::Center); 247 | 248 | let root = chart.plotting_area(); 249 | let (width_px, height_px) = root.dim_in_pixel(); 250 | let rect_width = (width_px as f64) / (image_data[0].len() as f64); 251 | let rect_height = (height_px as f64) / (image_data.len() as f64); 252 | 253 | let x_loc = ((rect_width / 2.0) - 10.0) as i32; 254 | let y_val = ((rect_height / 2.0) - 10.0) as i32; 255 | let y_lbl = ((rect_height / 2.0) - 4.0) as i32; 256 | 257 | let text_el_val = |v: T| { 258 | Text::new( 259 | format!("{}", v), 260 | (x_loc, y_val), // 15, 15 when we hard coded for testing 261 | ("sans-serif", 10).into_font().color(&BLACK), // .pos(pos_val) 262 | ) 263 | }; 264 | 265 | let text_el_label = |v: String| { 266 | Text::new( 267 | format!("{}", v), 268 | (x_loc, y_lbl), // 15, 25 269 | ("sans-serif", 15).into_font().color(&DEEPPURPLE), // .pos(pos_val) 270 | ) 271 | }; 272 | 273 | // Draw the background 274 | for (y, row) in image_data.iter().enumerate() { 275 | for (x, &value) in row.iter().enumerate() { 276 | let color = blue_colormap(value, max); 277 | chart 278 | .draw_series(std::iter::once(Rectangle::new( 279 | [(x, y), (x + 1, y + 1)], 280 | color.filled(), 281 | ))) 282 | .unwrap(); 283 | } 284 | } 285 | 286 | // Overlay the text 287 | for (y, row) in image_data.iter().enumerate() { 288 | for (x, &value) in row.iter().enumerate() { 289 | let chstr = format!("{}{}", itoc[&y], itoc[&x]); 290 | let e1 = EmptyElement::at((x, y)) + text_el_val(value); 291 | let e2 = EmptyElement::at((x, y)) + text_el_label(chstr); 292 | chart.draw_series(vec![e1, e2]).unwrap(); 293 | } 294 | } 295 | } 296 | 297 | // pub fn plot_data_3(data: &Array2, file_name: &str) 298 | // where 299 | // T: Copy + Num + Bounded + ToPrimitive + PartialOrd + Debug + Display, 300 | // { 301 | // let (image_data, min, max) = ndarray_to_image_data(&data); 302 | // let mut chart = prepare_chart_data(&image_data, file_name, ChartType::Text); 303 | 304 | // // dbg!(&image_data); 305 | 306 | // // I know we use little bit of advanced Rust 307 | // // that is because we are using th maps inside closure 308 | // // with move semantics and we don't want expensive cloning! 309 | // let ctoi = Rc::new(ctoi()); 310 | // let itoc: HashMap = ctoi.iter().map(|(&k, &v)| (v, k)).collect(); 311 | // let itoc = Rc::new(itoc); 312 | 313 | // let pos_label = Pos::new(HPos::Center, VPos::Top); 314 | // let pos_val = Pos::new(HPos::Center, VPos::Bottom); 315 | 316 | // let max_row = image_data.len() - 1; 317 | 318 | // chart.draw_series( 319 | // image_data.iter().enumerate().flat_map(|(y, row)| { 320 | // let y = max_row - y; 321 | // println!("{y}"); 322 | // let ctoi = ctoi.clone(); 323 | // let itoc = itoc.clone(); 324 | // row.iter().enumerate().flat_map(move |(x, &value)| { 325 | // let val_str = value.to_string(); 326 | // let chstr = format!("{}{}", itoc[&y], itoc[&x]); 327 | 328 | // let tcell1 = Text::new(chstr, (x * TEXT_SCALE_FACTOR, y * TEXT_SCALE_FACTOR), 329 | // ("sans-serif", 15).into_font() 330 | // .color(&GREY) 331 | // .pos(pos_label) 332 | // ); 333 | // let tcell2 = Text::new(val_str, 334 | // (x * TEXT_SCALE_FACTOR, y * TEXT_SCALE_FACTOR), 335 | // ("sans-serif", 10).into_font() 336 | // .color(&BLACK) 337 | // .pos(pos_val) 338 | // ); 339 | // vec![tcell1, tcell2] 340 | 341 | // // let color = colormaps::ViridisRGB::get_color(value); 342 | // // Rectangle::new([(x, y), (x+1, y+1)], color.filled()) 343 | 344 | // }) 345 | // }), 346 | // ).unwrap(); 347 | // } 348 | 349 | // fn plot_data_old(data: &Array2, file_name: &str) 350 | // where 351 | // T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 352 | // { 353 | // let (image_data, min, max) = ndarray_to_normalized_image_data(data); 354 | 355 | // let width = (image_data[0].len() * 10) as u32; 356 | // let height = (image_data.len() * 10) as u32; 357 | 358 | // let root = 359 | // BitMapBackend::new(file_name, (width, height)).into_drawing_area(); 360 | // root.fill(&WHITE); 361 | 362 | // let mut chart = ChartBuilder::on(&root) 363 | // .caption("Heat Map", ("sans-serif", 20).into_font()) 364 | // .margin(20) 365 | // .build_cartesian_2d(0..image_data[0].len(), 0..image_data.len()).unwrap(); 366 | // // TODO: Think how to make the cartesian x & y range to be more flexible. 367 | 368 | // chart.configure_mesh().draw().unwrap(); 369 | 370 | // chart.draw_series( 371 | // image_data.iter().rev().enumerate().flat_map(|(y, row)| { 372 | // row.iter().enumerate().map(move|(x, &value)| { 373 | // let color = colormaps::ViridisRGB::get_color(value); 374 | // Rectangle::new([(x, y), (x+1, y+1)], color.filled()) 375 | // }) 376 | // }), 377 | // ).unwrap(); 378 | 379 | // } 380 | 381 | // fn plot_heat_map_old(data: &Array2, file_name: &str) { 382 | // let shape = data.shape(); 383 | // let (num_rows, num_cols) = (shape[0], shape[1]); 384 | // let mut image_data = Vec::new(); 385 | // let mut min_value = i64::MAX; 386 | // let mut max_value = i64::MIN; 387 | // for i in 0..num_rows { 388 | // let mut row_data = Vec::new(); 389 | // for j in 0..num_cols { 390 | // let v = data[[i,j]]; 391 | // if v > max_value { 392 | // max_value = v; 393 | // } 394 | // if v < min_value { 395 | // min_value = v; 396 | // } 397 | // row_data.push(v as f64); // [row, col] 398 | // } 399 | // image_data.push(row_data); 400 | // } 401 | // // dbg!(&image_data); 402 | // println!("min {}", min_value); 403 | // println!("max {}", max_value); 404 | 405 | // let min = min_value as f64; 406 | // let max = max_value as f64; 407 | // let range = max - min; 408 | 409 | // // Normalize the data 410 | // let image_data_normalized: Vec> = image_data.iter() 411 | // .map(|row|{ 412 | // row.iter() 413 | // .map(|&value|{ 414 | // (value - min) / range 415 | // }).collect() 416 | // }).collect(); 417 | 418 | // let width = (image_data[0].len() * 10) as u32; 419 | // let height = (image_data.len() * 10) as u32; 420 | // println!("{}, {}", width, height); 421 | 422 | // let root = 423 | // BitMapBackend::new(file_name, (width, height)).into_drawing_area(); 424 | // root.fill(&WHITE); 425 | 426 | // let mut chart = ChartBuilder::on(&root) 427 | // .caption("Heat Map", ("sans-serif", 20).into_font()) 428 | // .margin(20) 429 | // .build_cartesian_2d(0..image_data[0].len(), 0..image_data.len()).unwrap(); 430 | 431 | // chart.configure_mesh().draw().unwrap(); 432 | 433 | // // we start from the last row upwards ! Exact heatmap as Andrej did using 434 | // // matplotlib.pyplot.imshow() 435 | // chart.draw_series( 436 | // image_data_normalized.iter().rev().enumerate().flat_map(|(y, row)| { 437 | // row.iter().enumerate().map(move|(x, &value)| { 438 | // let color = colormaps::ViridisRGB::get_color(value); 439 | // Rectangle::new([(x, y), (x+1, y+1)], color.filled()) 440 | // }) 441 | // }), 442 | // ).unwrap(); 443 | 444 | // } 445 | -------------------------------------------------------------------------------- /src/rust_mllib.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | // These are wrappers over Rust Burn library to look more like PyTorch 4 | // that Andrej used in his examples. 5 | 6 | // use burn::backend::ndarray::NdArrayDevice; 7 | // use burn::tensor::{Shape, Tensor, TensorData}; 8 | 9 | use std::cell::RefCell; 10 | use std::rc::Rc; 11 | 12 | use burn::backend::autodiff::grads::Gradients; 13 | use burn::backend::{ndarray::NdArrayDevice, Autodiff, NdArray}; 14 | use burn::prelude::*; 15 | use burn::tensor::backend::Backend; 16 | 17 | use ndarray::Array2; 18 | 19 | use num_traits::{Bounded, Num, ToPrimitive}; 20 | 21 | use crate::utils::create_char_matrix_ndarr; 22 | 23 | const DEVICE: NdArrayDevice = NdArrayDevice::Cpu; 24 | 25 | type BckAutoDiff = Autodiff>; // this is for f32 and f64 only 26 | // we choose f64 27 | type BckAutoDiffFloat = BckAutoDiff; 28 | 29 | pub type FloatTensor2d = Tensor; 30 | pub type FloatTensor1d = Tensor; 31 | 32 | pub type IntTensor2d = Tensor; 33 | pub type IntTensor1d = Tensor; 34 | 35 | pub fn tensor1df(data: &[f64]) -> FloatTensor1d { 36 | Tensor::::from_data(data, &DEVICE) 37 | } 38 | 39 | pub fn tensor2df(data: &[f64], num_rows: usize, num_cols: usize) -> FloatTensor2d { 40 | let shape = &[num_rows, num_cols]; 41 | let tensor_data = TensorData::new(data.to_vec(), shape); // unfortunately vec is reqd. 42 | Tensor::::from_data(tensor_data, &DEVICE) 43 | } 44 | 45 | pub fn ndarr2_to_tensor(arr: &Array2) -> FloatTensor2d { 46 | let shape = arr.shape(); 47 | let raw_vec: Vec = arr.iter().cloned().collect(); 48 | // let raw_vec: Vec = arr.into_raw_vec_and_offset(); 49 | let tensor_data = TensorData::new(raw_vec, shape); 50 | // This is assuming a leaf tensor! 51 | Tensor::::from_data(tensor_data, &DEVICE).require_grad() 52 | } 53 | 54 | pub fn len1df(tensor: &FloatTensor1d) -> usize { 55 | tensor.dims()[0] 56 | } 57 | 58 | pub fn zeros2d(num_rows: usize, num_cols: usize) -> FloatTensor2d { 59 | let shape = Shape::new([num_rows, num_cols]); 60 | let mut tensor = Tensor::::zeros(shape, &DEVICE); 61 | tensor 62 | } 63 | 64 | pub fn tensor2d_to_nested_vec(tensor: &FloatTensor2d) -> Vec> { 65 | let shape = tensor.dims(); 66 | let num_cols = shape[1]; 67 | let data = tensor.to_data(); 68 | let xs: Vec = data.to_vec().unwrap(); 69 | let ys: Vec> = xs.chunks(num_cols).map(|row| row.to_vec()).collect(); 70 | ys 71 | } 72 | 73 | pub fn zeros1d(num_elems: usize) -> FloatTensor1d { 74 | let shape = Shape::new([num_elems]); 75 | Tensor::::zeros(shape, &DEVICE) 76 | } 77 | 78 | pub fn ndarray_matrix_to_tensor(matrix: &Array2) -> FloatTensor2d 79 | where 80 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 81 | { 82 | let v: Vec = matrix.iter().map(|&e| (e.to_f64()).unwrap()).collect(); 83 | let shape = &[matrix.nrows(), matrix.ncols()]; 84 | let tensor_data = TensorData::new(v, shape); 85 | Tensor::::from_data(tensor_data, &DEVICE) 86 | } 87 | 88 | pub fn one_hot_tensor(indices: &FloatTensor1d, num_classes: usize) -> FloatTensor2d { 89 | let depth = len1df(indices); 90 | // Tensor2d dim = depth x num_classes 91 | let mut zero_tensor = zeros2d(depth, num_classes); 92 | 93 | let indices: Vec = indices.clone().into_data().to_vec().unwrap(); 94 | 95 | let xs: [usize; 2] = zero_tensor.shape().dims(); 96 | println!("DIMS: {:?}", &xs); 97 | 98 | // zero_tensor.iter_dim(1).for_each(|e|); 99 | // zero_tensor.select_assign(dim, indices, values) 100 | 101 | zero_tensor 102 | } 103 | 104 | pub fn get_row(tensor: &FloatTensor2d, i: usize) -> FloatTensor2d { 105 | let num_cols = tensor.dims()[1]; 106 | get_tensor(tensor, i, i + 1, 0, num_cols) 107 | } 108 | 109 | pub fn get_elem(tensor: &FloatTensor2d, i: usize) -> FloatTensor2d { 110 | // Assume there is only one row. We are just using 2d tensors instead of 1d tensor. 111 | get_tensor(tensor, 0, 1, i, i + 1) 112 | } 113 | 114 | fn get_tensor(tensor: &FloatTensor2d, a1: usize, a2: usize, b1: usize, b2: usize) -> FloatTensor2d { 115 | tensor.clone().slice([a1..a2, b1..b2]) 116 | } 117 | 118 | pub fn create_empty_2d_tensor(num_rows: usize, num_cols: usize) -> FloatTensor2d { 119 | let shape = Shape::new([num_rows, 1]); 120 | Tensor::::empty(shape, &DEVICE) 121 | } 122 | 123 | pub fn null_grad(num_rows: usize, num_cols: usize) -> Tensor, 2> { 124 | let shape = Shape::new([num_rows, num_cols]); 125 | let t = Tensor::, 2>::zeros(shape, &DEVICE); 126 | t 127 | } 128 | 129 | pub fn vec_to_tensor1d(xs: &Vec) -> FloatTensor1d 130 | where 131 | T: Copy + Num + Bounded + ToPrimitive + PartialOrd, 132 | { 133 | let shape = Shape::new([xs.len()]); 134 | let xs: Vec = xs.iter().map(|&e| (e.to_f64()).unwrap()).collect(); 135 | let tensor_data = TensorData::new(xs, shape); 136 | Tensor::::from_data(tensor_data, &DEVICE) 137 | } 138 | 139 | pub fn convert_nd_to_autodiff( 140 | tensor: &Tensor, 2>, 141 | ) -> Tensor>, 2> { 142 | let tensor_data = tensor.to_data(); 143 | Tensor::::from_data(tensor_data, &DEVICE) 144 | } 145 | 146 | pub fn tensor2d_to_ndarr2(tensor: &FloatTensor2d) -> Array2 { 147 | let dims = tensor.dims(); 148 | let data: Vec = tensor.to_data().to_vec().unwrap(); 149 | Array2::from_shape_vec((dims[0], dims[1]), data).unwrap() 150 | } 151 | 152 | fn ex1() { 153 | let data = create_char_matrix_ndarr(); 154 | let v: Vec = data.iter().cloned().collect(); 155 | v.iter().take(10).for_each(|e| println!("{e}")); 156 | let shape = data.shape(); 157 | dbg!(&shape); 158 | println!("rows: {}", data.nrows()); 159 | println!("cols: {}", data.ncols()); 160 | } 161 | 162 | fn ex2() { 163 | // Since tensors of Burn libs are all floats we convert our word matrix too into floats 164 | let data = create_char_matrix_ndarr(); 165 | let v: Vec = data.iter().map(|&e| e as f64).collect(); 166 | 167 | let t1 = tensor2df(&v, data.nrows(), data.ncols()); 168 | } 169 | 170 | fn ex3() { 171 | let narr = Array2::from_shape_vec((2, 3), vec![1, 2, 3, 4, 5, 6]).unwrap(); 172 | 173 | let tensor = ndarray_matrix_to_tensor(&narr); 174 | let t2 = tensor.clone() + 1.; 175 | dbg!(&t2); 176 | } 177 | 178 | fn ex4() { 179 | let indices = tensor1df(&[1.0, 2.0, 3.0]); 180 | let num_classes = 27; 181 | let depth = len1df(&indices); 182 | let mut zero_tensor = zeros2d(depth, num_classes); 183 | 184 | let indices: Vec = indices.clone().into_data().to_vec().unwrap(); 185 | 186 | let xs: [usize; 2] = zero_tensor.shape().dims(); 187 | println!("DIMS: {:?}", &xs); 188 | 189 | // zero_tensor.select_assign(1, , values) 190 | 191 | // Tensor 192 | } 193 | 194 | trait MLTensor {} 195 | 196 | #[derive(Debug)] 197 | pub struct TensorInt { 198 | tensor: Tensor, 199 | } 200 | 201 | impl TensorInt { 202 | pub fn new(xs: &[i64], shape: &[usize]) -> Self { 203 | if D == 1 { 204 | Self::create1d(xs) 205 | } else { 206 | assert!(shape.len() == 2); 207 | let num_rows = shape[0]; 208 | let num_cols = shape[1]; 209 | let total_elems = num_rows * num_cols; 210 | assert_eq!(xs.len(), total_elems); 211 | Self::create2d(xs, num_rows, num_cols) 212 | } 213 | } 214 | fn create1d(xs: &[i64]) -> Self { 215 | let xs = xs.to_vec(); 216 | let shape = Shape::new([xs.len()]); 217 | let tensor_data = TensorData::new(xs, shape); 218 | let tensor = Tensor::::from_data(tensor_data, &DEVICE); 219 | Self { tensor } 220 | } 221 | 222 | fn create2d(xs: &[i64], num_rows: usize, num_cols: usize) -> Self { 223 | let xs = xs.to_vec(); 224 | let shape = Shape::new([num_rows, num_cols]); 225 | let tensor_data = TensorData::new(xs, shape); 226 | let tensor = Tensor::::from_data(tensor_data, &DEVICE); 227 | Self { tensor } 228 | } 229 | 230 | pub fn tensor(&self) -> &Tensor { 231 | &self.tensor 232 | } 233 | } 234 | 235 | impl MLTensor for TensorInt {} 236 | 237 | impl std::fmt::Display for TensorInt { 238 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 239 | self.tensor.fmt(f) 240 | } 241 | } 242 | 243 | // This is an autograd tensor. 244 | // For time and simplicity purpose from user perspective there is some duplication. 245 | pub struct TensorFloat { 246 | tensor: Tensor>, D>, 247 | } 248 | 249 | impl TensorFloat { 250 | pub fn new(xs: &[f64], shape: &[usize]) -> Self { 251 | if D == 1 { 252 | Self::create1d(xs) 253 | } else { 254 | assert!(shape.len() == 2); 255 | let num_rows = shape[0]; 256 | let num_cols = shape[1]; 257 | let total_elems = num_rows * num_cols; 258 | assert_eq!(xs.len(), total_elems); 259 | Self::create2d(xs, num_rows, num_cols) 260 | } 261 | } 262 | 263 | fn create1d(xs: &[f64]) -> Self { 264 | let xs = xs.to_vec(); 265 | let shape = Shape::new([xs.len()]); 266 | let tensor_data = TensorData::new(xs, shape); 267 | let tensor = Tensor::>, D>::from_data(tensor_data, &DEVICE); 268 | Self { tensor } 269 | } 270 | 271 | fn create2d(xs: &[f64], num_rows: usize, num_cols: usize) -> Self { 272 | let xs = xs.to_vec(); 273 | let shape = Shape::new([num_rows, num_cols]); 274 | let tensor_data = TensorData::new(xs, shape); 275 | let tensor = Tensor::>, D>::from_data(tensor_data, &DEVICE); 276 | Self { tensor } 277 | } 278 | 279 | pub fn tensor(&self) -> &Tensor>, D> { 280 | &self.tensor 281 | } 282 | } 283 | 284 | impl std::fmt::Display for TensorFloat { 285 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 286 | self.tensor.fmt(f) 287 | } 288 | } 289 | 290 | impl MLTensor for TensorFloat {} 291 | 292 | // // Trying to wrap both the types of tensor into a common one 293 | // // so that we can call the methods without duplication. 294 | // enum BackendDType { 295 | // IntType, 296 | // FloatType 297 | // } 298 | 299 | // pub struct RTensor { 300 | // tensor: Rc>, 301 | // } 302 | 303 | // impl RTensor { 304 | // pub fn new(tensor_type: BackendDType) -> Self { 305 | // todo!() 306 | // } 307 | // } 308 | 309 | fn ex5() { 310 | // This backend has support for Int 311 | let l1: Tensor = Tensor::from_ints([1, 2, 3], &DEVICE); 312 | let l2: Tensor = Tensor::from_floats([1.0, 2.0], &DEVICE); 313 | let l2: Tensor, 1> = Tensor::from_floats([1.0, 2.0], &DEVICE); 314 | 315 | // i64 is supported! 316 | let xs: Vec = vec![1, 2, 3]; // usize is not supported for trait bound Element 317 | let shape = Shape::new([xs.len()]); 318 | let tdata = TensorData::new(xs, shape); 319 | 320 | let l3 = Tensor::::from_data(tdata, &DEVICE); 321 | println!("{}", l3); 322 | 323 | let ys: Vec = vec![1., 2., 3.]; 324 | let shape = Shape::new([ys.len()]); 325 | let tdata = TensorData::new(ys, shape); 326 | // dtype still will be f32. For f64 see below 327 | let l4 = Tensor::::from_data(tdata, &DEVICE); 328 | println!("{}", l4); 329 | 330 | let ys: Vec = vec![1., 2., 3.]; 331 | let shape = Shape::new([ys.len()]); 332 | let tdata = TensorData::new(ys, shape); 333 | let l4 = Tensor::, 1>::from_data(tdata, &DEVICE); 334 | println!("{}", l4); 335 | } 336 | 337 | fn ex6() { 338 | let t = TensorInt::<1>::new(&[1, 2, 3], &[]); 339 | println!("{}", t); 340 | let v = vec![1_i64, 2, 3, 4, 5, 6]; 341 | let t1 = TensorInt::<2>::new(&v, &[2, 3]); 342 | println!("{}", t1); 343 | } 344 | 345 | fn ex7() { 346 | // let t: Tensor = Tensor::::from_ints([1,2,3], &DEVICE); 347 | } 348 | 349 | pub fn main() { 350 | println!("Exploring Burn API"); 351 | ex6(); 352 | } 353 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused)] 2 | 3 | use ndarray::Array2; 4 | use std::collections::{HashMap, HashSet}; 5 | use std::fs; 6 | 7 | use rand::distributions::Uniform; 8 | use rand::Rng; 9 | 10 | use crate::numr::*; 11 | use crate::rust_mllib::{IntTensor2d, TensorInt}; 12 | 13 | pub fn get_names() -> Vec { 14 | let names = fs::read_to_string("names.txt").unwrap(); 15 | let names: Vec<_> = names.lines().map(|e| e.to_string()).collect(); 16 | names 17 | } 18 | 19 | fn old_ctoi() -> HashMap { 20 | let names = get_names(); 21 | let mut chs: HashSet = names.join("").chars().collect(); 22 | let mut chs = Vec::from_iter(chs); 23 | chs.sort(); 24 | chs.push('<'); 25 | chs.push('>'); 26 | let xs: HashMap = (0..).zip(chs).map(|e| (e.1, e.0)).collect(); 27 | xs 28 | } 29 | 30 | pub fn ctoi() -> HashMap { 31 | let names = get_names(); 32 | let mut chs: HashSet = names.join("").chars().collect(); 33 | let mut chs = Vec::from_iter(chs); 34 | chs.sort(); 35 | let mut chs1 = vec!['.']; // we need this to be at index 0 36 | chs1.extend_from_slice(&chs); 37 | let xs: HashMap = (0..).zip(chs1).map(|e| (e.1, e.0)).collect(); 38 | xs 39 | } 40 | 41 | pub fn itoc(ctoi: &HashMap) -> HashMap { 42 | let h = ctoi.iter().map(|(&k, &v)| (v, k)).collect(); 43 | h 44 | } 45 | 46 | // Returns an NdArray object not Burn Tensor 47 | // pub fn create_char_matrix_ndarr() -> Array2 { 48 | // let ctoi = ctoi(); 49 | // let num_chars = ctoi.len(); 50 | // let mut n = zeros_int(num_chars, num_chars); 51 | // let names = get_names(); 52 | // for w in &names { 53 | // let w = format!(".{}.", w); 54 | // for (ch1, ch2) in w.chars().zip(w.chars().skip(1)) { 55 | // let ix1 = ctoi[&ch1]; 56 | // let ix2 = ctoi[&ch2]; 57 | // n[[ix1, ix2]] += 1; 58 | // } 59 | // } 60 | // n 61 | // } 62 | 63 | pub fn create_char_matrix_ndarr() -> Array2 { 64 | let matrix_vec = create_char_matrix_vec(); 65 | let num_rows = matrix_vec.len(); 66 | let num_cols = matrix_vec[0].len(); 67 | let raw_data: Vec = matrix_vec.into_iter().flatten().collect(); 68 | Array2::from_shape_vec((num_rows, num_cols), raw_data).unwrap() 69 | } 70 | 71 | pub fn create_char_matrix_tensor() -> TensorInt<2> { 72 | let matrix_vec = create_char_matrix_vec(); 73 | let num_rows = matrix_vec.len(); 74 | let num_cols = matrix_vec[0].len(); 75 | let raw_data: Vec = matrix_vec.into_iter().flatten().collect(); 76 | let t = TensorInt::<2>::new(&raw_data, &[num_rows, num_cols]); 77 | t 78 | } 79 | 80 | pub fn create_char_matrix_vec() -> Vec> { 81 | let ctoi = ctoi(); 82 | let num_chars = ctoi.len(); 83 | let words = get_names(); 84 | 85 | // create z zeroed 2d vector 86 | let mut matrix: Vec> = vec![vec![0; num_chars]; num_chars]; 87 | 88 | for w in &words { 89 | let w = format!(".{}.", w); 90 | for (ch1, ch2) in w.chars().zip(w.chars().skip(1)) { 91 | let ix1 = ctoi[&ch1]; 92 | let ix2 = ctoi[&ch2]; 93 | matrix[ix1][ix2] += 1; 94 | } 95 | } 96 | 97 | matrix 98 | } 99 | 100 | pub fn rand_uniform_nums(n: usize, low: f64, high: f64) -> Vec { 101 | let mut rng = rand::thread_rng(); 102 | 103 | let uniform_range = Uniform::new(low, high); 104 | 105 | // 0..n is fine too :-). Just that I like this more. Sounds natural! 106 | (1..=n).map(|_| rng.sample(uniform_range)).collect() 107 | } 108 | 109 | pub fn rand_normal_distrib(n: usize) -> Vec { 110 | rand_uniform_nums(n, -3.1, 3.1) 111 | } 112 | --------------------------------------------------------------------------------