diff --git a/Cargo.lock b/Cargo.lock index 8d7dc25..f018b5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -154,16 +154,6 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "atomic-wait" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55b94919229f2c42292fd71ffa4b75e83193bffdd77b1e858cd55fd2d0b0ea8" -dependencies = [ - "libc", - "windows-sys 0.42.0", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -358,20 +348,6 @@ name = "bytemuck" version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] [[package]] name = "byteorder" @@ -710,19 +686,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -751,15 +714,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -794,12 +748,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - [[package]] name = "crypto-common" version = "0.1.7" @@ -854,12 +802,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "defer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930c7171c8df9fb1782bdf9b918ed9ed2d33d1d22300abb754f9085bc48bf8e8" - [[package]] name = "deltae" version = "0.3.2" @@ -960,22 +902,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "dyn-stack" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4713e43e2886ba72b8271aa66c93d722116acf7a75555cce11dcde84388fe8" -dependencies = [ - "bytemuck", - "dyn-stack-macros", -] - -[[package]] -name = "dyn-stack-macros" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d926b4d407d372f141f93bb444696142c29d32962ccbd3531117cf3aa0bfa9" - [[package]] name = "either" version = "1.15.0" @@ -988,73 +914,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equator" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35da53b5a021d2484a7cc49b2ac7f2d840f8236a286f84202369bd338d761ea" -dependencies = [ - "equator-macro 0.2.1", -] - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro 0.4.2", -] - -[[package]] -name = "equator" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02da895aab06bbebefb6b2595f6d637b18c9ff629b4cd840965bb3164e4194b0" -dependencies = [ - "equator-macro 0.6.0", -] - -[[package]] -name = "equator-macro" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equator-macro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b14b339eb76d07f052cdbad76ca7c1310e56173a138095d3bf42a23c06ef5d8" - [[package]] name = "equivalent" version = "1.0.2" @@ -1080,49 +939,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "faer" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d2ecfb80b6f8b0c569e36988a052e64b14d8def9d372390b014e8bf79f299a" -dependencies = [ - "bytemuck", - "dyn-stack", - "equator 0.6.0", - "faer-traits", - "gemm", - "generativity", - "libm", - "nano-gemm", - "npyz", - "num-complex", - "num-traits", - "private-gemm-x86", - "pulp", - "rand 0.9.2", - "rand_distr", - "rayon", - "reborrow", - "spindle", -] - -[[package]] -name = "faer-traits" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87d23ed7ab1f26c0cba0e5b9e061a796fbb7dc170fa8bee6970055a1308bb0f" -dependencies = [ - "bytemuck", - "dyn-stack", - "generativity", - "libm", - "num-complex", - "num-traits", - "pulp", - "qd", - "reborrow", -] - [[package]] name = "fancy-regex" version = "0.11.0" @@ -1329,146 +1145,6 @@ dependencies = [ "slab", ] -[[package]] -name = "gemm" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa0673db364b12263d103b68337a68fbecc541d6f6b61ba72fe438654709eacb" -dependencies = [ - "dyn-stack", - "gemm-c32", - "gemm-c64", - "gemm-common", - "gemm-f16", - "gemm-f32", - "gemm-f64", - "num-complex", - "num-traits", - "paste", - "raw-cpuid", - "seq-macro", -] - -[[package]] -name = "gemm-c32" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "086936dbdcb99e37aad81d320f98f670e53c1e55a98bee70573e83f95beb128c" -dependencies = [ - "dyn-stack", - "gemm-common", - "num-complex", - "num-traits", - "paste", - "raw-cpuid", - "seq-macro", -] - -[[package]] -name = "gemm-c64" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c8aeeeec425959bda4d9827664029ba1501a90a0d1e6228e48bef741db3a3f" -dependencies = [ - "dyn-stack", - "gemm-common", - "num-complex", - "num-traits", - "paste", - "raw-cpuid", - "seq-macro", -] - -[[package]] -name = "gemm-common" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88027625910cc9b1085aaaa1c4bc46bb3a36aad323452b33c25b5e4e7c8e2a3e" -dependencies = [ - "bytemuck", - "dyn-stack", - "half", - "libm", - "num-complex", - "num-traits", - "once_cell", - "paste", - "pulp", - "raw-cpuid", - "rayon", - "seq-macro", - "sysctl", -] - -[[package]] -name = "gemm-f16" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3df7a55202e6cd6739d82ae3399c8e0c7e1402859b30e4cb780e61525d9486e" -dependencies = [ - "dyn-stack", - "gemm-common", - "gemm-f32", - "half", - "num-complex", - "num-traits", - "paste", - "raw-cpuid", - "rayon", - "seq-macro", -] - -[[package]] -name = "gemm-f32" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0b8c9da1fbec6e3e3ab2ce6bc259ef18eb5f6f0d3e4edf54b75f9fd41a81c" -dependencies = [ - "dyn-stack", - "gemm-common", - "num-complex", - "num-traits", - "paste", - "raw-cpuid", - "seq-macro", -] - -[[package]] -name = "gemm-f64" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056131e8f2a521bfab322f804ccd652520c79700d81209e9d9275bbdecaadc6a" -dependencies = [ - "dyn-stack", - "gemm-common", - "num-complex", - "num-traits", - "paste", - "raw-cpuid", - "seq-macro", -] - -[[package]] -name = "generativity" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5881e4c3c2433fe4905bb19cfd2b5d49d4248274862b68c27c33d9ba4e13f9ec" - -[[package]] -name = "generator" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows-link", - "windows-result", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -1553,19 +1229,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "bytemuck", - "cfg-if", - "crunchy", - "num-traits", - "zerocopy", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1614,12 +1277,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -1940,17 +1597,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "interpol" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb58032ba748f4010d15912a1855a8a0b1ba9eaad3395b0c171c09b3b356ae50" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "ipnet" version = "2.12.0" @@ -2112,12 +1758,6 @@ version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - [[package]] name = "libredox" version = "0.1.14" @@ -2175,19 +1815,6 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", -] - [[package]] name = "lru" version = "0.16.3" @@ -2292,76 +1919,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "nano-gemm" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e04345dc84b498ff89fe0d38543d1f170da9e43a2c2bcee73a0f9069f72d081" -dependencies = [ - "equator 0.2.2", - "nano-gemm-c32", - "nano-gemm-c64", - "nano-gemm-codegen", - "nano-gemm-core", - "nano-gemm-f32", - "nano-gemm-f64", - "num-complex", -] - -[[package]] -name = "nano-gemm-c32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0775b1e2520e64deee8fc78b7732e3091fb7585017c0b0f9f4b451757bbbc562" -dependencies = [ - "nano-gemm-codegen", - "nano-gemm-core", - "num-complex", -] - -[[package]] -name = "nano-gemm-c64" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9af49a20d58816e6b5ee65f64142e50edb5eba152678d4bb7377fcbf63f8437a" -dependencies = [ - "nano-gemm-codegen", - "nano-gemm-core", - "num-complex", -] - -[[package]] -name = "nano-gemm-codegen" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cc8d495c791627779477a2cf5df60049f5b165342610eb0d76bee5ff5c5d74c" - -[[package]] -name = "nano-gemm-core" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d998dfa644de87a0f8660e5ea511d7cb5c33b5a2d9847b7af57a2565105089f0" - -[[package]] -name = "nano-gemm-f32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879d962e79bc8952e4ad21ca4845a21132540ed3f5e01184b2ff7f720e666523" -dependencies = [ - "nano-gemm-codegen", - "nano-gemm-core", -] - -[[package]] -name = "nano-gemm-f64" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9a513473dce7dc00c7e7c318481ca4494034e76997218d8dad51bd9f007a815" -dependencies = [ - "nano-gemm-codegen", - "nano-gemm-core", -] - [[package]] name = "nix" version = "0.29.0" @@ -2394,17 +1951,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "npyz" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f0e759e014e630f90af745101b614f761306ddc541681e546649068e25ec1b9" -dependencies = [ - "byteorder", - "num-bigint", - "py_literal", -] - [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -2414,27 +1960,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "bytemuck", - "num-traits", - "rand 0.8.5", -] - [[package]] name = "num-conv" version = "0.2.0" @@ -2452,15 +1977,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -2468,17 +1984,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", ] [[package]] @@ -2790,7 +2295,6 @@ dependencies = [ "clap", "crossterm", "dirs", - "faer", "figment", "futures", "glob", @@ -2874,22 +2378,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "private-gemm-x86" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0af8c3e5087969c323f667ccb4b789fa0954f5aa650550e38e81cf9108be21b5" -dependencies = [ - "crossbeam", - "defer", - "interpol", - "num_cpus", - "raw-cpuid", - "rayon", - "spindle", - "sysctl", -] - [[package]] name = "proc-macro-crate" version = "3.5.0" @@ -3011,54 +2499,6 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" -[[package]] -name = "pulp" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" -dependencies = [ - "bytemuck", - "cfg-if", - "libm", - "num-complex", - "paste", - "pulp-wasm-simd-flag", - "raw-cpuid", - "reborrow", - "version_check", -] - -[[package]] -name = "pulp-wasm-simd-flag" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" - -[[package]] -name = "py_literal" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102df7a3d46db9d3891f178dcc826dc270a6746277a9ae6436f8d29fd490a8e1" -dependencies = [ - "num-bigint", - "num-complex", - "num-traits", - "pest", - "pest_derive", -] - -[[package]] -name = "qd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1304a5aecdcfe9ee72fbba90aa37b3aa067a69d14cb7f3d9deada0be7c07c" -dependencies = [ - "bytemuck", - "libm", - "num-traits", - "pulp", -] - [[package]] name = "quick-xml" version = "0.38.4" @@ -3204,16 +2644,6 @@ dependencies = [ "getrandom 0.3.4", ] -[[package]] -name = "rand_distr" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" -dependencies = [ - "num-traits", - "rand 0.9.2", -] - [[package]] name = "ratatui" version = "0.30.0" @@ -3299,15 +2729,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "raw-cpuid" -version = "11.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" -dependencies = [ - "bitflags 2.11.0", -] - [[package]] name = "rayon" version = "1.11.0" @@ -3328,12 +2749,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "reborrow" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" - [[package]] name = "redb" version = "2.6.3" @@ -3657,12 +3072,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -3704,12 +3113,6 @@ version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -[[package]] -name = "seq-macro" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" - [[package]] name = "serde" version = "1.0.228" @@ -3875,19 +3278,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "spindle" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aaca3d8aa5387a6eba861fbf984af5348d9df5d940c25c6366b19556fdf64" -dependencies = [ - "atomic-wait", - "crossbeam", - "equator 0.4.2", - "loom", - "rayon", -] - [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -3996,20 +3386,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "sysctl" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" -dependencies = [ - "bitflags 2.11.0", - "byteorder", - "enum-as-inner", - "libc", - "thiserror 1.0.69", - "walkdir", -] - [[package]] name = "tap" version = "1.0.1" @@ -5011,21 +4387,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-sys" version = "0.45.0" diff --git a/Cargo.toml b/Cargo.toml index 51cb4ef..f8cbf2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,6 @@ regex = "1" chrono = "0.4" clap = { version = "4", features = ["derive"] } libc = "0.2" -faer = "0.24.0" rkyv = { version = "0.7", features = ["validation", "std"] } memchr = "2" memmap2 = "0.9" diff --git a/channels/irc/Cargo.toml b/channels/irc/Cargo.toml index f91d760..c338e25 100644 --- a/channels/irc/Cargo.toml +++ b/channels/irc/Cargo.toml @@ -15,6 +15,6 @@ serde = { version = "1", features = ["derive"] } tokio = { version = "1", features = ["full"] } tokio-rustls = "0.26" tokio-util = { version = "0.7", features = ["compat"] } -tracing = "0.1" +tracing = { version = "0.1", default-features = false } tracing-subscriber = { version = "0.3", features = ["env-filter"] } webpki-roots = "1" diff --git a/channels/socat/Cargo.toml b/channels/socat/Cargo.toml index a0a4461..7335317 100644 --- a/channels/socat/Cargo.toml +++ b/channels/socat/Cargo.toml @@ -11,5 +11,5 @@ futures = "0.3" poc-memory = { path = "../.." } tokio = { version = "1", features = ["full"] } tokio-util = { version = "0.7", features = ["compat"] } -tracing = "0.1" +tracing = { version = "0.1", default-features = false } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/channels/telegram/Cargo.toml b/channels/telegram/Cargo.toml index 94c4050..42d0924 100644 --- a/channels/telegram/Cargo.toml +++ b/channels/telegram/Cargo.toml @@ -14,5 +14,5 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" tokio = { version = "1", features = ["full"] } tokio-util = { version = "0.7", features = ["compat"] } -tracing = "0.1" +tracing = { version = "0.1", default-features = false } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/channels/tmux/Cargo.toml b/channels/tmux/Cargo.toml index 8ebeb23..fe927a9 100644 --- a/channels/tmux/Cargo.toml +++ b/channels/tmux/Cargo.toml @@ -15,5 +15,5 @@ poc-memory = { path = "../.." } serde = { version = "1", features = ["derive"] } tokio = { version = "1", features = ["full"] } tokio-util = { version = "0.7", features = ["compat"] } -tracing = "0.1" +tracing = { version = "0.1", default-features = false } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/src/cli/graph.rs b/src/cli/graph.rs index 2b9790f..8712af4 100644 --- a/src/cli/graph.rs +++ b/src/cli/graph.rs @@ -5,7 +5,7 @@ // triangle-close, cap-degree, normalize-strengths, differentiate, // trace, spectral-*, organize, interference. -use crate::{store, graph, neuro, spectral}; +use crate::{store, graph, neuro}; use crate::store::StoreView; pub fn cmd_graph() -> Result<(), String> { @@ -385,134 +385,6 @@ pub fn cmd_trace(key: &[String]) -> Result<(), String> { Ok(()) } -pub fn cmd_spectral(k: usize) -> Result<(), String> { - let store = store::Store::load()?; - let g = graph::build_graph(&store); - let result = spectral::decompose(&g, k); - spectral::print_summary(&result, &g); - Ok(()) -} - -pub fn cmd_spectral_save(k: usize) -> Result<(), String> { - let store = store::Store::load()?; - let g = graph::build_graph(&store); - let result = spectral::decompose(&g, k); - let emb = spectral::to_embedding(&result); - spectral::save_embedding(&emb)?; - Ok(()) -} - -pub fn cmd_spectral_neighbors(key: &str, n: usize) -> Result<(), String> { - let emb = spectral::load_embedding()?; - - let dims = spectral::dominant_dimensions(&emb, &[key]); - println!("Node: {} (embedding: {} dims)", key, emb.dims); - println!("Top spectral axes:"); - for &(d, loading) in dims.iter().take(5) { - println!(" axis {:<2} (λ={:.4}): loading={:.5}", d, emb.eigenvalues[d], loading); - } - - println!("\nNearest neighbors in spectral space:"); - let neighbors = spectral::nearest_neighbors(&emb, key, n); - for (i, (k, dist)) in neighbors.iter().enumerate() { - println!(" {:>2}. {:.5} {}", i + 1, dist, k); - } - Ok(()) -} - -pub fn cmd_spectral_positions(n: usize) -> Result<(), String> { - let store = store::Store::load()?; - let emb = spectral::load_embedding()?; - - let g = store.build_graph(); - let communities = g.communities().clone(); - - let positions = spectral::analyze_positions(&emb, &communities); - - println!("Spectral position analysis — {} nodes", positions.len()); - println!(" outlier: dist_to_center / median (>1 = unusual position)"); - println!(" bridge: dist_to_center / dist_to_nearest_other_community"); - println!(); - - let mut bridges: Vec<&spectral::SpectralPosition> = Vec::new(); - let mut outliers: Vec<&spectral::SpectralPosition> = Vec::new(); - - for pos in positions.iter().take(n) { - match spectral::classify_position(pos) { - "bridge" => bridges.push(pos), - _ => outliers.push(pos), - } - } - - if !bridges.is_empty() { - println!("=== Bridges (between communities) ==="); - for pos in &bridges { - println!(" [{:.2}/{:.2}] c{} → c{} {}", - pos.outlier_score, pos.bridge_score, - pos.community, pos.nearest_community, pos.key); - } - println!(); - } - - println!("=== Top outliers (far from own community center) ==="); - for pos in positions.iter().take(n) { - let class = spectral::classify_position(pos); - println!(" {:>10} outlier={:.2} bridge={:.2} c{:<3} {}", - class, pos.outlier_score, pos.bridge_score, - pos.community, pos.key); - } - - Ok(()) -} - -pub fn cmd_spectral_suggest(n: usize) -> Result<(), String> { - let store = store::Store::load()?; - let emb = spectral::load_embedding()?; - let g = store.build_graph(); - let communities = g.communities(); - - let min_degree = 3; - let well_connected: std::collections::HashSet<&str> = emb.coords.keys() - .filter(|k| g.degree(k) >= min_degree) - .map(|k| k.as_str()) - .collect(); - - let filtered_emb = spectral::SpectralEmbedding { - dims: emb.dims, - eigenvalues: emb.eigenvalues.clone(), - coords: emb.coords.iter() - .filter(|(k, _)| well_connected.contains(k.as_str())) - .map(|(k, v)| (k.clone(), v.clone())) - .collect(), - }; - - let mut linked: std::collections::HashSet<(String, String)> = - std::collections::HashSet::new(); - for rel in &store.relations { - linked.insert((rel.source_key.clone(), rel.target_key.clone())); - linked.insert((rel.target_key.clone(), rel.source_key.clone())); - } - - eprintln!("Searching {} well-connected nodes (degree >= {})...", - filtered_emb.coords.len(), min_degree); - let pairs = spectral::unlinked_neighbors(&filtered_emb, &linked, n); - - println!("{} closest unlinked pairs (candidates for extractor agents):", pairs.len()); - for (i, (k1, k2, dist)) in pairs.iter().enumerate() { - let c1 = communities.get(k1) - .map(|c| format!("c{}", c)) - .unwrap_or_else(|| "?".into()); - let c2 = communities.get(k2) - .map(|c| format!("c{}", c)) - .unwrap_or_else(|| "?".into()); - let cross = if c1 != c2 { " [cross-community]" } else { "" }; - println!(" {:>2}. dist={:.4} {} ({}) ↔ {} ({}){}", - i + 1, dist, k1, c1, k2, c2, cross); - } - - Ok(()) -} - pub fn cmd_organize(term: &str, threshold: f32, key_only: bool, create_anchor: bool) -> Result<(), String> { let mut store = store::Store::load()?; diff --git a/src/hippocampus/spectral.rs b/src/hippocampus/spectral.rs index 8b90fb6..10b8be0 100644 --- a/src/hippocampus/spectral.rs +++ b/src/hippocampus/spectral.rs @@ -16,7 +16,6 @@ use crate::graph::Graph; -use faer::Mat; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::path::PathBuf; @@ -52,91 +51,6 @@ pub fn embedding_path() -> PathBuf { /// normalized Laplacian L_sym = I - D^{-1/2} A D^{-1/2}. /// /// We compute the full decomposition (it's only 2000×2000, takes <1s) -/// and return the bottom k. -pub fn decompose(graph: &Graph, k: usize) -> SpectralResult { - // Only include nodes with edges (filter isolates) - let mut keys: Vec = graph.nodes().iter() - .filter(|k| graph.degree(k) > 0) - .cloned() - .collect(); - keys.sort(); - let n = keys.len(); - let isolates = graph.nodes().len() - n; - if isolates > 0 { - eprintln!("note: filtered {} isolated nodes, decomposing {} connected nodes", isolates, n); - } - - let key_to_idx: HashMap<&str, usize> = keys.iter() - .enumerate() - .map(|(i, k)| (k.as_str(), i)) - .collect(); - - // Build weighted degree vector and adjacency - let mut degree = vec![0.0f64; n]; - let mut adj_entries: Vec<(usize, usize, f64)> = Vec::new(); - - for (i, key) in keys.iter().enumerate() { - for (neighbor, strength) in graph.neighbors(key) { - if let Some(&j) = key_to_idx.get(neighbor.as_str()) - && j > i { // each edge once - let w = strength as f64; - adj_entries.push((i, j, w)); - degree[i] += w; - degree[j] += w; - } - } - } - - // Build normalized Laplacian: L_sym = I - D^{-1/2} A D^{-1/2} - let mut laplacian = Mat::::zeros(n, n); - - // Diagonal = 1 for nodes with edges, 0 for isolates - for i in 0..n { - if degree[i] > 0.0 { - laplacian[(i, i)] = 1.0; - } - } - - // Off-diagonal: -w / sqrt(d_i * d_j) - for &(i, j, w) in &adj_entries { - if degree[i] > 0.0 && degree[j] > 0.0 { - let val = -w / (degree[i] * degree[j]).sqrt(); - laplacian[(i, j)] = val; - laplacian[(j, i)] = val; - } - } - - // Eigendecompose - let eig = laplacian.self_adjoint_eigen(faer::Side::Lower) - .expect("eigendecomposition failed"); - let s = eig.S(); - let u = eig.U(); - - let mut eigenvalues = Vec::with_capacity(k); - let mut eigvecs = Vec::with_capacity(k); - - let s_col = s.column_vector(); - - // Skip trivial eigenvalues (near-zero = null space from disconnected components). - // The number of zero eigenvalues equals the number of connected components. - let mut start = 0; - while start < n && s_col[start].abs() < 1e-8 { - start += 1; - } - - let k = k.min(n.saturating_sub(start)); - for col in start..start + k { - eigenvalues.push(s_col[col]); - let mut vec = Vec::with_capacity(n); - for row in 0..n { - vec.push(u[(row, col)]); - } - eigvecs.push(vec); - } - - SpectralResult { keys, eigenvalues, eigvecs } -} - /// Print the spectral summary: eigenvalue spectrum, then each axis with /// its extreme nodes (what the axis "means"). pub fn print_summary(result: &SpectralResult, graph: &Graph) { diff --git a/src/main.rs b/src/main.rs index 1e73f3c..e1b527e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -423,42 +423,6 @@ enum GraphCmd { }, /// Show graph structure overview Overview, - /// Spectral decomposition of the memory graph - Spectral { - /// Number of eigenvectors (default: 30) - #[arg(default_value_t = 30)] - k: usize, - }, - /// Compute and save spectral embedding - #[command(name = "spectral-save")] - SpectralSave { - /// Number of eigenvectors (default: 20) - #[arg(default_value_t = 20)] - k: usize, - }, - /// Find spectrally nearest nodes - #[command(name = "spectral-neighbors")] - SpectralNeighbors { - /// Node key - key: String, - /// Number of neighbors (default: 15) - #[arg(default_value_t = 15)] - n: usize, - }, - /// Show nodes ranked by outlier/bridge score - #[command(name = "spectral-positions")] - SpectralPositions { - /// Number of nodes to show (default: 30) - #[arg(default_value_t = 30)] - n: usize, - }, - /// Find spectrally close but unlinked pairs - #[command(name = "spectral-suggest")] - SpectralSuggest { - /// Number of pairs (default: 20) - #[arg(default_value_t = 20)] - n: usize, - }, /// Diagnose duplicate/overlapping nodes for a topic cluster Organize { /// Search term (matches node keys; also content unless --key-only) @@ -864,11 +828,6 @@ impl Run for GraphCmd { Self::Interference { threshold } => cli::graph::cmd_interference(threshold), Self::Communities { top_n, min_size } => cli::graph::cmd_communities(top_n, min_size), Self::Overview => cli::graph::cmd_graph(), - Self::Spectral { k } => cli::graph::cmd_spectral(k), - Self::SpectralSave { k } => cli::graph::cmd_spectral_save(k), - Self::SpectralNeighbors { key, n } => cli::graph::cmd_spectral_neighbors(&key, n), - Self::SpectralPositions { n } => cli::graph::cmd_spectral_positions(n), - Self::SpectralSuggest { n } => cli::graph::cmd_spectral_suggest(n), Self::Organize { term, threshold, key_only, anchor } => cli::graph::cmd_organize(&term, threshold, key_only, anchor), }