diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb26d87f5..2a243d58a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,9 +84,35 @@ jobs: restore-keys: | ${{ runner.os }}-cargo- - - name: Run Rust tests + # wifi-densepose-core, -config, and -mat have no system library dependencies + # and can be tested in a bare CI environment. + # + # Other workspace crates (desktop, nn, signal, hardware, wifiscan) require + # system libraries (Tauri/glib, libtorch, OpenBLAS, libpcap, serialport) that + # are not available on a stock ubuntu runner without additional setup steps. + # + # Previous config used `--workspace --no-default-features` which had two bugs: + # 1. Stripping --no-default-features removes the `std` feature, breaking + # String/format!/etc. in crates that put std behind a feature flag. + # 2. Tauri (wifi-densepose-desktop) pulls in glib unconditionally regardless + # of feature flags, so --workspace always fails without libglib2.0-dev. + + - name: Run Rust tests — core (default features) working-directory: rust-port/wifi-densepose-rs - run: cargo test --workspace --no-default-features + run: cargo test -p wifi-densepose-core -p wifi-densepose-config -p wifi-densepose-mat + + - name: Run Rust tests — core (no optional features) + working-directory: rust-port/wifi-densepose-rs + # Keep std enabled — it's required, not optional. Only strip truly optional features. + run: cargo test -p wifi-densepose-core -p wifi-densepose-config -p wifi-densepose-mat --no-default-features --features std + + - name: Clippy — core crates + working-directory: rust-port/wifi-densepose-rs + run: cargo clippy -p wifi-densepose-core -p wifi-densepose-config -p wifi-densepose-mat -- -D warnings + + - name: Check optional ternlang feature + working-directory: rust-port/wifi-densepose-rs + run: cargo check -p wifi-densepose-core --features ternlang # Unit and Integration Tests test: diff --git a/rust-port/wifi-densepose-rs/Cargo.lock b/rust-port/wifi-densepose-rs/Cargo.lock index a794fabbc..35446059f 100644 --- a/rust-port/wifi-densepose-rs/Cargo.lock +++ b/rust-port/wifi-densepose-rs/Cargo.lock @@ -139,6 +139,15 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + [[package]] name = "approx" version = "0.5.1" @@ -148,6 +157,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "ariadne" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454c8a44ce2cb9cc7e7fae67fc6128465b343b92c6631e94beca3c8d1524ea5" +dependencies = [ + "unicode-width 0.2.2", + "yansi", +] + [[package]] name = "arrayvec" version = "0.5.2" @@ -623,6 +642,27 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "cauchy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff11ddd2af3b5e80dd0297fee6e56ac038d9bdc549573cdb51bd6d2efe7f05e" +dependencies = [ + "num-complex", + "num-traits", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "cblas-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6feecd82cce51b0204cf063f0041d69f24ce83f680d87514b004248e7b0fa65" +dependencies = [ + "libc", +] + [[package]] name = "cc" version = "1.2.56" @@ -845,6 +885,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation" version = "0.10.1" @@ -868,7 +918,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" dependencies = [ "bitflags 2.11.0", - "core-foundation", + "core-foundation 0.10.1", "core-graphics-types", "foreign-types 0.5.0", "libc", @@ -881,7 +931,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ "bitflags 2.11.0", - "core-foundation", + "core-foundation 0.10.1", "libc", ] @@ -1420,6 +1470,17 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -1908,7 +1969,7 @@ version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24f8647af4005fa11da47cd56252c6ef030be8fa97bdbf355e7dfb6348f0a82c" dependencies = [ - "approx", + "approx 0.5.1", "num-traits", "rstar 0.10.0", "rstar 0.11.0", @@ -2126,6 +2187,25 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.7.1" @@ -2344,6 +2424,7 @@ dependencies = [ "bytes", "futures-channel", "futures-core", + "h2", "http", "http-body", "httparse", @@ -2356,6 +2437,22 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls 0.23.37", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.6.0" @@ -2390,9 +2487,11 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2 0.6.2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -2780,6 +2879,17 @@ dependencies = [ "serde_json", ] +[[package]] +name = "katexit" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccfb0b7ce7938f84a5ecbdca5d0a991e46bc9d6d078934ad5e92c5270fe547db" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "keyboard-types" version = "0.7.0" @@ -2803,6 +2913,29 @@ dependencies = [ "selectors", ] +[[package]] +name = "lapack-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447f56c85fb410a7a3d36701b2153c1018b1d2b908c5fbaf01c1b04fac33bcbe" +dependencies = [ + "libc", +] + +[[package]] +name = "lax" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f96a229d9557112e574164f8024ce703625ad9f88a90964c1780809358e53da" +dependencies = [ + "cauchy", + "katexit", + "lapack-sys", + "num-traits", + "openblas-src", + "thiserror 1.0.69", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -2867,7 +3000,10 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" dependencies = [ + "bitflags 2.11.0", "libc", + "plain", + "redox_syscall 0.7.3", ] [[package]] @@ -2917,6 +3053,38 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "logos" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2c55a318a87600ea870ff8c2012148b44bf18b74fad48d0f835c38c7d07c5f" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58b3ffaa284e1350d017a57d04ada118c4583cf260c8fb01e0fe28a2e9cf8970" +dependencies = [ + "fnv", + "proc-macro2", + "quote", + "regex-automata", + "regex-syntax", + "syn 2.0.117", +] + +[[package]] +name = "logos-derive" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d3a9855747c17eaf4383823f135220716ab49bea5fbea7dd42cc9a92f8aa31" +dependencies = [ + "logos-codegen", +] + [[package]] name = "lru" version = "0.12.5" @@ -3218,7 +3386,7 @@ version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" dependencies = [ - "approx", + "approx 0.5.1", "matrixmultiply", "nalgebra-macros", "num-complex", @@ -3271,6 +3439,9 @@ version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" dependencies = [ + "approx 0.4.0", + "cblas-sys", + "libc", "matrixmultiply", "num-complex", "num-integer", @@ -3310,6 +3481,22 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "ndarray-linalg" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0e8dda0c941b64a85c5deb2b3e0144aca87aced64678adfc23eacea6d2cc42" +dependencies = [ + "cauchy", + "katexit", + "lax", + "ndarray 0.15.6", + "num-complex", + "num-traits", + "rand 0.8.5", + "thiserror 1.0.69", +] + [[package]] name = "ndarray-npy" version = "0.8.1" @@ -3441,6 +3628,8 @@ checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "bytemuck", "num-traits", + "rand 0.8.5", + "serde", ] [[package]] @@ -3670,6 +3859,32 @@ dependencies = [ "pathdiff", ] +[[package]] +name = "openblas-build" +version = "0.10.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd235aa8876fa5c4be452efde09b9b8bafa19aea0bf14a4926508213082439a3" +dependencies = [ + "anyhow", + "cc", + "flate2", + "tar", + "thiserror 2.0.18", + "ureq", +] + +[[package]] +name = "openblas-src" +version = "0.10.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fccd2c4f5271ab871f2069cb6f1a13ef2c0db50e1145ce03428ee541f4c63c4f" +dependencies = [ + "dirs", + "openblas-build", + "pkg-config", + "vcpkg", +] + [[package]] name = "openssl" version = "0.10.75" @@ -3819,7 +4034,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link 0.2.1", ] @@ -4095,6 +4310,12 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "plist" version = "1.8.0" @@ -4694,6 +4915,15 @@ dependencies = [ "bitflags 2.11.0", ] +[[package]] +name = "redox_syscall" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +dependencies = [ + "bitflags 2.11.0", +] + [[package]] name = "redox_users" version = "0.5.2" @@ -4771,16 +5001,21 @@ checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", + "futures-channel", "futures-core", "futures-util", + "h2", "http", "http-body", "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", "hyper-util", "js-sys", "log", + "mime", "mime_guess", "native-tls", "percent-encoding", @@ -5078,7 +5313,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" dependencies = [ - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", @@ -5391,7 +5626,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ "bitflags 2.11.0", - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -5631,7 +5866,7 @@ checksum = "2acaf3f973e8616d7ceac415f53fc60e190b2a686fbcf8d27d0256c741c5007b" dependencies = [ "bitflags 2.11.0", "cfg-if", - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", "io-kit-sys", "libudev", @@ -5737,7 +5972,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" dependencies = [ - "approx", + "approx 0.5.1", "num-complex", "num-traits", "paste", @@ -5826,7 +6061,7 @@ dependencies = [ "objc2-foundation", "objc2-quartz-core", "raw-window-handle", - "redox_syscall", + "redox_syscall 0.5.18", "tracing", "wasm-bindgen", "web-sys", @@ -6010,6 +6245,27 @@ dependencies = [ "windows 0.57.0", ] +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system-deps" version = "6.2.2" @@ -6057,7 +6313,7 @@ checksum = "6e06d52c379e63da659a483a958110bbde891695a0ecb53e48cc7786d5eda7bb" dependencies = [ "bitflags 2.11.0", "block2", - "core-foundation", + "core-foundation 0.10.1", "core-graphics", "crossbeam-channel", "dispatch2", @@ -6098,6 +6354,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "tar" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "target-lexicon" version = "0.12.16" @@ -6443,6 +6710,17 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" +[[package]] +name = "ternlang-core" +version = "0.1.0" +dependencies = [ + "ariadne", + "logos", + "reqwest 0.12.28", + "serde", + "serde_json", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -6596,6 +6874,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.37", + "tokio", +] + [[package]] name = "tokio-serial" version = "5.4.5" @@ -7632,6 +7920,7 @@ dependencies = [ "proptest", "serde", "serde_json", + "ternlang-core", "thiserror 1.0.69", "uuid", ] @@ -7673,7 +7962,7 @@ dependencies = [ name = "wifi-densepose-hardware" version = "0.3.0" dependencies = [ - "approx", + "approx 0.5.1", "byteorder", "chrono", "clap", @@ -7694,7 +7983,7 @@ name = "wifi-densepose-mat" version = "0.3.0" dependencies = [ "anyhow", - "approx", + "approx 0.5.1", "async-trait", "axum", "chrono", @@ -7747,7 +8036,7 @@ dependencies = [ name = "wifi-densepose-ruvector" version = "0.3.0" dependencies = [ - "approx", + "approx 0.5.1", "criterion", "ruvector-attention 2.0.4", "ruvector-attn-mincut", @@ -7769,7 +8058,6 @@ dependencies = [ "chrono", "clap", "futures-util", - "ruvector-mincut", "serde", "serde_json", "tempfile", @@ -7777,6 +8065,7 @@ dependencies = [ "tower-http 0.5.2", "tracing", "tracing-subscriber", + "wifi-densepose-signal", "wifi-densepose-wifiscan", ] @@ -7789,6 +8078,7 @@ dependencies = [ "midstreamer-attractor", "midstreamer-temporal-compare", "ndarray 0.15.6", + "ndarray-linalg", "num-complex", "num-traits", "proptest", @@ -7808,7 +8098,7 @@ name = "wifi-densepose-train" version = "0.3.0" dependencies = [ "anyhow", - "approx", + "approx 0.5.1", "chrono", "clap", "criterion", @@ -8074,6 +8364,17 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-result" version = "0.1.2" @@ -8622,6 +8923,22 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "yasna" version = "0.5.2" diff --git a/rust-port/wifi-densepose-rs/crates/wifi-densepose-core/Cargo.toml b/rust-port/wifi-densepose-rs/crates/wifi-densepose-core/Cargo.toml index 79cd98218..6a46e9dc8 100644 --- a/rust-port/wifi-densepose-rs/crates/wifi-densepose-core/Cargo.toml +++ b/rust-port/wifi-densepose-rs/crates/wifi-densepose-core/Cargo.toml @@ -16,6 +16,7 @@ default = ["std"] std = [] serde = ["dep:serde", "ndarray/serde"] async = ["dep:async-trait"] +ternlang = ["dep:ternlang-core"] [dependencies] # Error handling @@ -38,6 +39,9 @@ chrono = { version = "0.4", features = ["serde"] } # UUID for unique identifiers uuid = { version = "1.6", features = ["v4", "serde"] } +# Ternary Intelligence Stack (optional — enable with feature "ternlang") +ternlang-core = { version = "0.3", optional = true } + [dev-dependencies] serde_json.workspace = true proptest.workspace = true diff --git a/rust-port/wifi-densepose-rs/crates/wifi-densepose-core/src/types.rs b/rust-port/wifi-densepose-rs/crates/wifi-densepose-core/src/types.rs index c899d392a..5e7fdebce 100644 --- a/rust-port/wifi-densepose-rs/crates/wifi-densepose-core/src/types.rs +++ b/rust-port/wifi-densepose-rs/crates/wifi-densepose-core/src/types.rs @@ -15,6 +15,8 @@ use chrono::{DateTime, Utc}; use ndarray::{Array1, Array2, Array3}; use num_complex::Complex64; use uuid::Uuid; +#[cfg(feature = "ternlang")] +use ternlang_core::Trit; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -181,7 +183,7 @@ impl Confidence { /// Returns `true` if the confidence exceeds the default threshold. #[must_use] pub fn is_high(&self) -> bool { - self.0 >= DEFAULT_CONFIDENCE_THRESHOLD + self.0 >= 0.5 } /// Returns `true` if the confidence exceeds the given threshold. @@ -190,11 +192,37 @@ impl Confidence { self.0 >= threshold } - /// Maximum confidence (1.0). + /// Maximum confidence value (1.0). pub const MAX: Self = Self(1.0); - /// Minimum confidence (0.0). + /// Minimum confidence value (0.0). pub const MIN: Self = Self(0.0); + + /// Maps this confidence score to a ternary trit signal. + /// + /// Useful for integrating with ternary reasoning pipelines + /// (e.g. [`ternlang`](https://ternlang.com)) where decisions must + /// express not just high/low but an explicit "hold — gather more data" + /// state. + /// + /// | Range | Trit | Meaning | + /// |--------------|---------|----------------------------------| + /// | `>= 0.65` | Affirm | High confidence — act | + /// | `0.35..0.65` | Tend | Uncertain — defer or review | + /// | `< 0.35` | Reject | Low confidence — discard/retry | + /// + /// Requires the `ternlang` feature flag. + #[cfg(feature = "ternlang")] + #[must_use] + pub fn trit_signal(&self) -> Trit { + if self.0 >= 0.65 { + Trit::Affirm + } else if self.0 < 0.35 { + Trit::Reject + } else { + Trit::Tend + } + } } impl Default for Confidence {