//! Model families.
//!
//! Each transformer family (Llama, Qwen, Mistral, Gemma 1/2/3, Gemma 4, …)
//! diverges from the LlamaStyle baseline along a small number of concrete
//! axes: normalisation formula, embedding scaling, attention scaling,
//! V-norm, per-layer dim switching, etc. Rather than scatter
//! `model_type.starts_with("gemma")` branches through the runtime, each
//! family gets its own file here that returns a `FamilyProfile`.
//!
//! Adding a new family:
//! 1. Drop a new file into `families/` with `pub fn profile(...) -> FamilyProfile`.
//! 2. Add one match arm to `for_model_type` below.
//! 3. Done — the runtime reads the profile through `config.family.*`.
//!
//! Adding a new variant axis (e.g. `shared_qk_weight`):
//! 1. Add a field to `FamilyProfile`.
//! 2. Set it in each family's `profile()`.
//! 3. Read `config.family.shared_qk_weight` at the one site that cares.
//!
//! Spec: specs/arch.md §LlamaStyle / §LlamaStyle+.
/// How Q·K^T is scaled before softmax.
/// Per-family deviations from the LlamaStyle baseline.
///
/// Populated once at config parse time by `for_model_type`. All runtime
/// code reads fields here — no string matching on `model_type` anywhere
/// outside the family files.
Homonyms
cyb/evy/forks/naga/src/back/hlsl/mod.rs
struct Baz { m: mat3x2, } struct Baz { float2 m_0; float2 m_1; float2 m_2; }; float3x2 GetMatmOnBaz(Baz obj) { return float3x2(obj.m_0, obj.m_1, obj.m_2); }