#[deprecated(
note = "JL projection at m=8 is mathematically unsound (Issue 139). Zero runtime consumers. Use region centroids for shard similarity."
)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ShardEmbedding(pub [f32; 8]);
#[allow(deprecated)]
impl ShardEmbedding {
pub const ZERO: Self = Self([0.0; 8]);
pub const DIM: usize = 8;
#[inline]
pub fn cosine_similarity(&self, other: &Self) -> f32 {
let dot = crate::simd::simd_dot_f32(&self.0, &other.0, Self::DIM);
let sq_a = crate::simd::simd_sum_sq(&self.0, Self::DIM);
let sq_b = crate::simd::simd_sum_sq(&other.0, Self::DIM);
let denom = sq_a * sq_b;
if denom < 1e-16 {
return 0.0;
}
let inv_norm = 1.0 / denom.sqrt();
dot * inv_norm
}
#[inline]
pub fn dist_sq(&self, other: &Self) -> f32 {
crate::simd::simd_dist_sq(&self.0, &other.0, 8)
}
}
#[allow(deprecated)]
impl Default for ShardEmbedding {
fn default() -> Self {
Self::ZERO
}
}
#[allow(deprecated)]
impl std::hash::Hash for ShardEmbedding {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
state.write(unsafe { std::slice::from_raw_parts(self.0.as_ptr() as *const u8, 32) });
}
}
#[allow(deprecated)]
impl Eq for ShardEmbedding {}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum SenseKind {
CommonSense = 0,
FighterSense = 1,
GameTheorySense = 2,
#[default]
SpatialSense = 3,
SocialSense = 4,
SkillSense = 5,
#[cfg(feature = "spectral_threat")]
SpectralThreat = 6,
Reserved = 7,
}
#[derive(Clone, Copy, Debug)]
#[repr(C)]
pub struct TernaryDir {
pub pos_bits: u64,
pub neg_bits: u64,
pub row_scale: f32,
}
impl TernaryDir {
pub const SIZE: usize = 20;
pub fn zero() -> Self {
Self {
pos_bits: 0,
neg_bits: 0,
row_scale: 0.0,
}
}
#[inline(always)]
pub fn zero_padding(&mut self) {
unsafe {
let ptr = self as *mut Self as *mut u8;
(ptr.add(20) as *mut u32).write(0);
}
}
}
#[derive(Clone, Debug)]
#[repr(C)]
pub struct SenseModule {
pub octree_bits: [u64; 4],
pub directions: [TernaryDir; 8],
pub confidence: f32,
pub kind: SenseKind,
pub version: u8,
pub octree_depth: u8,
pub n_directions: u8,
pub _reserved: u8,
pub commitment: [u8; 32],
}
impl SenseModule {
#[inline(always)]
pub fn project(&self, belief_state: &[f32; 8]) -> f32 {
let n = self.n_directions as usize;
let mut dot = 0.0f32;
for (i, (belief_val, dir)) in belief_state
.iter()
.zip(self.directions.iter())
.enumerate()
.take(n)
{
let pos = ((dir.pos_bits >> i) & 1) as u32 as f32;
let neg = ((dir.neg_bits >> i) & 1) as u32 as f32;
let sign = pos - neg;
dot = (sign * belief_val).mul_add(dir.row_scale, dot);
}
self.confidence * crate::simd::fast_sigmoid(dot)
}
pub fn query_octree(&self, level: u8, index: u8) -> Option<bool> {
let nodes_at_level = 1usize << (level * 2); if index as usize >= nodes_at_level || level > self.octree_depth {
return None;
}
let flat_idx = index as usize;
let word = flat_idx / 64;
let bit = flat_idx % 64;
if word >= self.octree_bits.len() {
return None;
}
Some(self.octree_bits[word] & (1 << bit) != 0)
}
pub fn commit(&mut self) {
self.commitment = [0u8; 32];
for dir in &mut self.directions {
dir.zero_padding();
}
let size_before_commit = std::mem::offset_of!(SenseModule, commitment);
let bytes: &[u8] = unsafe {
std::slice::from_raw_parts(self as *const Self as *const u8, size_before_commit)
};
self.commitment = *blake3::hash(bytes).as_bytes();
}
pub fn verify(&self) -> bool {
let size_before_commit = std::mem::offset_of!(SenseModule, commitment);
let mut buf = [0u8; std::mem::size_of::<SenseModule>()];
unsafe {
std::ptr::copy_nonoverlapping(
self as *const Self as *const u8,
buf.as_mut_ptr(),
size_before_commit,
);
}
buf[size_before_commit..].fill(0);
let dirs_offset = std::mem::offset_of!(SenseModule, directions);
let dir_size = std::mem::size_of::<TernaryDir>();
for i in 0..8 {
let dir_start = dirs_offset + i * dir_size;
buf[dir_start + 20..dir_start + dir_size].fill(0);
}
let bytes = &buf[..size_before_commit];
let expected = blake3::hash(bytes);
self.commitment == *expected.as_bytes()
}
}
impl Default for SenseModule {
fn default() -> Self {
Self {
octree_bits: [0; 4],
directions: [TernaryDir::zero(); 8],
confidence: 0.0,
kind: SenseKind::default(),
version: 1,
octree_depth: 3,
n_directions: 0,
_reserved: 0,
commitment: [0u8; 32],
}
}
}
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum DilationConfig {
D1 = 1, D2 = 2,
D4 = 4,
D8 = 8,
D16 = 16,
D32 = 32,
D64 = 64,
}
impl DilationConfig {
#[inline]
pub fn stride(&self) -> usize {
*self as usize
}
pub fn from_qps(qps: f32) -> Self {
match qps {
..1.0 => Self::D1,
1.0..5.0 => Self::D4,
5.0..20.0 => Self::D16,
_ => Self::D64,
}
}
}