{
  "_comment": [
    "Cohere ASR per-tensor tolerances for compare_tensors.py.",
    "",
    "Reference: native Transformers (CohereAsrFeatureExtractor +",
    "CohereAsrForConditionalGeneration) running bf16 inference on CPU.",
    "C++: ggml CPU compute, weights stored as bf16 in GGUF.",
    "",
    "Encoder: the subsampling conv (pre_encode) shows max_abs ~9 at",
    "frame 137 (last frame, padding boundary artifact). Interior",
    "frames are ~0.22 max_abs. The errors attenuate through the",
    "48-layer conformer: block 0 = 4.5, block 23 = 3.2, block 47 =",
    "0.20. Root cause is bf16 accumulation order differences between",
    "ggml im2col and PyTorch native conv.",
    "",
    "Decoder: per-layer max_abs grows through layers (block values",
    "are large, ~1e3, so relative error is small) then the final",
    "LayerNorm stabilizes dec.out_before_head to ~0.25.",
    "",
    "dec.logits (post-log-softmax) uses inf tolerance because",
    "log(softmax(x)) produces -inf at different positions when",
    "weights differ slightly. Use dec.logits_raw (pre-softmax) for",
    "meaningful numerical comparison.",
    "",
    "Remaining mel diff (~0.27 max_abs) is from dither: Transformers",
    "applies dither=1e-5 unconditionally, C++ does not."
  ],

  "enc.mel.in":            {"max_abs": 0.5,   "mean_abs": 0.01},
  "enc.pos_emb":           {"max_abs": 5e-3,  "mean_abs": 1e-3},
  "enc.pre_encode.out":    {"max_abs": 10.0,  "mean_abs": 0.05},
  "enc.block.0.out":       {"max_abs": 5.0,   "mean_abs": 0.03},
  "enc.block.23.out":      {"max_abs": 4.0,   "mean_abs": 0.05},
  "enc.block.47.out":      {"max_abs": 0.5,   "mean_abs": 0.01},
  "enc.final":             {"max_abs": 0.5,   "mean_abs": 0.01},
  "enc_dec_proj.out":      {"max_abs": 0.5,   "mean_abs": 0.02},

  "dec.token_emb":         {"max_abs": 1e-6,  "mean_abs": 1e-7},
  "dec.pos_emb":           {"max_abs": 1e-6,  "mean_abs": 1e-7},
  "dec.embed_norm":        {"max_abs": 0.2,   "mean_abs": 0.005},
  "dec.block.0.out":       {"max_abs": 5.0,   "mean_abs": 0.05},
  "dec.block.1.out":       {"max_abs": 10.0,  "mean_abs": 0.05},
  "dec.block.2.out":       {"max_abs": 15.0,  "mean_abs": 0.06},
  "dec.block.3.out":       {"max_abs": 20.0,  "mean_abs": 0.08},
  "dec.block.4.out":       {"max_abs": 30.0,  "mean_abs": 0.08},
  "dec.block.5.out":       {"max_abs": 40.0,  "mean_abs": 0.10},
  "dec.block.6.out":       {"max_abs": 40.0,  "mean_abs": 0.15},
  "dec.block.7.out":       {"max_abs": 40.0,  "mean_abs": 0.15},
  "dec.out_before_head":   {"max_abs": 0.5,   "mean_abs": 0.02},
  "dec.logits_raw":        {"max_abs": 1.0,   "mean_abs": 0.05},
  "dec.logits":            {"max_abs": "inf",  "mean_abs": "inf"}
}
