Yeah, whether or not to use a more traditional structure is always a question, but it seems to me that you should try to be as sparse as your noise and error tolerance allows for associative recall. A P=20 SDR with N=1000 starts to fall apart almost immediately:
$ time cargo run --release --example=sequence -- -s 1 -l 10000 -N 1000 -P 20 |rg -v 'distance: 0'
Finished release [optimized] target(s) in 0.01s
Running `target/x86_64-unknown-linux-gnu/release/examples/sequence -s 1 -l 10000 -N 1000 -P 20`
Sequence 0, SDR 3: distance: 3, overlap: 19
Sequence 0, SDR 6: distance: 2, overlap: 19
Sequence 0, SDR 101: distance: 2, overlap: 19
Sequence 0, SDR 156: distance: 2, overlap: 19
Sequence 0, SDR 207: distance: 3, overlap: 19
Sequence 0, SDR 552: distance: 2, overlap: 19
Sequence 0, SDR 656: distance: 3, overlap: 19
Sequence 0, SDR 887: distance: 3, overlap: 19
Sequence 0, SDR 957: distance: 2, overlap: 19
Sequence 0, SDR 1017: distance: 2, overlap: 19
Sequence 0, SDR 1425: distance: 2, overlap: 19
Sequence 0, SDR 2056: distance: 2, overlap: 19
Sequence 0, SDR 2155: distance: 2, overlap: 19
Sequence 0, SDR 2379: distance: 2, overlap: 19
Sequence 0, SDR 3000: distance: 2, overlap: 19
Sequence 0, SDR 3399: distance: 3, overlap: 19
Sequence 0, SDR 3414: distance: 2, overlap: 19
Sequence 0, SDR 3627: distance: 2, overlap: 19
Sequence 0, SDR 3673: distance: 2, overlap: 19
Sequence 0, SDR 4034: distance: 2, overlap: 19
Sequence 0, SDR 4429: distance: 2, overlap: 19
Sequence 0, SDR 4556: distance: 2, overlap: 19
Sequence 0, SDR 4627: distance: 2, overlap: 19
Sequence 0, SDR 4834: distance: 2, overlap: 19
Sequence 0, SDR 4847: distance: 2, overlap: 19
Sequence 0, SDR 4885: distance: 2, overlap: 19
Sequence 0, SDR 5161: distance: 2, overlap: 19
Sequence 0, SDR 5541: distance: 2, overlap: 19
Sequence 0, SDR 5718: distance: 2, overlap: 19
Sequence 0, SDR 6015: distance: 2, overlap: 19
Sequence 0, SDR 6543: distance: 2, overlap: 19
Sequence 0, SDR 6578: distance: 2, overlap: 19
Sequence 0, SDR 6679: distance: 2, overlap: 19
Sequence 0, SDR 6882: distance: 4, overlap: 18
Sequence 0, SDR 7221: distance: 2, overlap: 19
Sequence 0, SDR 7415: distance: 2, overlap: 19
Sequence 0, SDR 7781: distance: 3, overlap: 19
Sequence 0, SDR 7866: distance: 2, overlap: 19
Sequence 0, SDR 7931: distance: 2, overlap: 19
Sequence 0, SDR 7943: distance: 2, overlap: 19
Sequence 0, SDR 8091: distance: 2, overlap: 19
Sequence 0, SDR 9575: distance: 3, overlap: 19
Sequence 0, SDR 9686: distance: 2, overlap: 19
cargo run --release --example=sequence -- -s 1 -l 10000 -N 1000 -P 20 40.22s user 0.65s system 100% cpu 40.726 total
I’m imagining that a triadic-based system would have hierarchical layers, with sparsity tending to be greater as you go deeper, because by the time you get there, your inputs should be cleaned up/autoencoded/etc.