use alloc::vec::Vec;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EngramGeometry {
pub slots: usize,
pub sub_dim: usize,
pub num_tables: usize,
pub conv_taps: usize,
pub conv_dilation: usize,
pub orders: Vec<usize>,
pub sites: Vec<usize>,
}
impl EngramGeometry {
pub fn heads(&self) -> usize {
if self.orders.is_empty() {
0
} else {
self.num_tables / self.orders.len()
}
}
pub fn fetched_dim(&self) -> usize {
self.num_tables * self.sub_dim
}
pub fn window(&self) -> usize {
if self.sites.is_empty() {
0
} else {
self.conv_taps * self.conv_dilation
}
}
pub fn site_of_layer(&self, layer: usize) -> Option<usize> {
self.sites.iter().position(|&l| l == layer)
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct V2Config {
pub vocab_size: usize,
pub d_model: usize,
pub num_heads: usize,
pub num_kv_heads: usize,
pub num_layers: usize,
pub head_dim: usize,
pub max_seq_len: usize,
pub hada_n: usize,
pub mhc_lanes: usize,
pub rope_theta: f32,
pub kv_window: usize,
pub engram: EngramGeometry,
}
impl V2Config {
pub fn attn_dim(&self) -> usize {
self.num_heads * self.head_dim
}
pub fn kv_dim(&self) -> usize {
self.num_kv_heads * self.head_dim
}
pub fn kv_repeat(&self) -> usize {
self.num_heads / self.num_kv_heads
}
pub fn mhc_width(&self) -> usize {
self.mhc_lanes * self.d_model
}
pub fn active_lane(&self, layer: usize) -> usize {
layer % self.mhc_lanes
}
pub fn pre_off(&self, layer: usize, lane: usize) -> f32 {
if lane == self.active_lane(layer) {
4.0
} else {
-4.0
}
}
pub fn post_off(&self, layer: usize, lane: usize) -> f32 {
if lane == self.active_lane(layer) {
0.0
} else {
-4.0
}
}
pub fn validate(&self) -> Result<(), &'static str> {
if self.num_heads == 0 || self.num_kv_heads == 0 {
return Err("head counts must be non-zero");
}
if !self.num_heads.is_multiple_of(self.num_kv_heads) {
return Err("num_heads must be divisible by num_kv_heads");
}
if self.head_dim == 0 || !self.head_dim.is_multiple_of(2) {
return Err("head_dim must be even (RoPE rotates half-splits)");
}
if self.d_model == 0 || self.mhc_lanes == 0 || self.num_layers == 0 {
return Err("d_model, mhc_lanes and num_layers must be non-zero");
}
if !self.hada_n.is_power_of_two() || self.hada_n < self.d_model {
return Err("hada_n must be a power of two at or above d_model");
}
if self.vocab_size == 0 || self.max_seq_len == 0 {
return Err("vocab_size and max_seq_len must be non-zero");
}
if !self.engram.sites.is_empty() {
let e = &self.engram;
if e.orders.is_empty() || e.num_tables == 0 || e.sub_dim == 0 || e.slots == 0 {
return Err("engram geometry incomplete");
}
if !e.num_tables.is_multiple_of(e.orders.len()) {
return Err("num_tables must be divisible by the order count");
}
if e.sites.iter().any(|&l| l >= self.num_layers) {
return Err("engram site beyond num_layers");
}
if e.fetched_dim() != self.d_model {
return Err("engram fetched_dim must equal d_model");
}
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::vec;
fn cfg() -> V2Config {
V2Config {
vocab_size: 8192,
d_model: 512,
num_heads: 8,
num_kv_heads: 4,
num_layers: 27,
head_dim: 64,
max_seq_len: 2048,
hada_n: 512,
mhc_lanes: 4,
rope_theta: 100000.0,
kv_window: 256,
engram: EngramGeometry {
slots: 8192,
sub_dim: 128,
num_tables: 4,
conv_taps: 4,
conv_dilation: 3,
orders: vec![2, 3],
sites: vec![2, 15],
},
}
}
#[test]
fn shipped_geometry_validates() {
let c = cfg();
assert_eq!(c.validate(), Ok(()));
assert_eq!(c.attn_dim(), 512);
assert_eq!(c.kv_dim(), 256);
assert_eq!(c.kv_repeat(), 2);
assert_eq!(c.mhc_width(), 2048);
assert_eq!(c.engram.heads(), 2);
assert_eq!(c.engram.fetched_dim(), 512);
assert_eq!(c.engram.window(), 12);
assert_eq!(c.engram.site_of_layer(2), Some(0));
assert_eq!(c.engram.site_of_layer(15), Some(1));
assert_eq!(c.engram.site_of_layer(3), None);
}
#[test]
fn mhc_lane_offsets_match_reference_formulas() {
let c = cfg();
for layer in 0..c.num_layers {
for lane in 0..c.mhc_lanes {
let onehot = f32::from(lane == layer % c.mhc_lanes);
assert_eq!(c.pre_off(layer, lane), 8.0 * onehot - 4.0);
assert_eq!(c.post_off(layer, lane), -4.0 * (1.0 - onehot));
}
}
}
#[test]
fn validate_rejects_broken_geometry() {
let mut c = cfg();
c.num_kv_heads = 3;
assert!(c.validate().is_err());
let mut c = cfg();
c.head_dim = 63;
assert!(c.validate().is_err());
let mut c = cfg();
c.hada_n = 256; assert!(c.validate().is_err());
let mut c = cfg();
c.engram.sites = vec![2, 99];
assert!(c.validate().is_err());
let mut c = cfg();
c.engram.sub_dim = 64; assert!(c.validate().is_err());
}
}