File size: 20,919 Bytes
ebd2ca7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
#!/usr/bin/env python3
"""Isolated v6 SQ3.25 scale/INT4 clipping variants and causal diagnostics.

The packed kernel is derived from the frozen Apache-2.0 state_codec.py kernel.
It retains that kernel's16/64/48 coordinate reductions and per-token ordering.
Legacy+clip1 delegates it directly. Diagnostics intentionally persist FP32 dense
carry to avoid rounding q*FP16scale products; they are NOT3.25-bit candidates.
See reference/statequant/LICENSE and docs/THIRD_PARTY_NOTICES.md.
"""
from __future__ import annotations
from pathlib import Path
import sys
import torch
import triton
import triton.language as tl
from triton.language.extra.cuda import libdevice

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from mamba2_recall import state_codec as legacy_codec
from mamba2_recall.state_quant import StateQuant, _LayerCache

SCALE_MODES = ('legacy', 'stored_scale')
CLIP_FACTORS = (1.0, .95, .90, .80)
DIAGNOSTICS = ('prune_only', 'quant_only', 'legacy_emulation')
RP = 16
PROTOCOL_SHA = '86d4e8dc85d79c2c867ce15a846c5938893c86d27e67ad174472975e654e9bff'


def validate_options(scale_mode='legacy', int4_clip=1.0, diagnostic=None):
    if scale_mode not in SCALE_MODES or type(int4_clip) not in (float, int) or int4_clip not in CLIP_FACTORS:
        raise ValueError('Unknown frozen scale mode or INT4 clipping factor')
    if diagnostic is not None and diagnostic not in DIAGNOSTICS:
        raise ValueError('Unknown diagnostic')
    if scale_mode == 'legacy' and int4_clip != 1.:
        raise ValueError('Legacy means exact unchanged codec; clipping requires stored_scale')
    if diagnostic is not None and (scale_mode != 'legacy' or int4_clip != 1.):
        raise ValueError('Diagnostics isolate the unchanged legacy factor1 baseline')


def allocate_state(batch, heads, dim, dstate, device, *, diagnostic=None):
    validate_options(diagnostic=diagnostic)
    if diagnostic is None:
        return legacy_codec.allocate_state(batch, heads, dim, dstate, 'sq3p25', device)
    if dstate != 128 or min(batch, heads, dim) <= 0:
        raise ValueError('Positive dimensions and128 state coordinates required')
    shape = (batch, heads, dim, dstate)
    return legacy_codec.PackedState('diagnostic_'+diagnostic,
        {'dense': torch.zeros(shape, dtype=torch.float32, device=device)}, shape)


@triton.jit
def _stored_quantize(value, scale, LIMIT: tl.constexpr):
    # Approximate reciprocal division can move an EXACT half tie (e.g.3.5)
    # below the boundary. Correctly rounded FP32 division implements the
    # declared nearest/half-away rule using the actual stored FP16 scale.
    safe = tl.where(scale > 0., scale, 1.)
    quotient = tl.div_rn(value, safe)
    rounded = libdevice.round(quotient)
    clipped = tl.minimum(tl.maximum(rounded, -LIMIT), LIMIT)
    return tl.where(scale > 0., clipped, 0.).to(tl.int32)


@triton.jit
def _stored_probe(X, S, Q, COUNT: tl.constexpr, LIMIT: tl.constexpr):
    i = tl.program_id(0)*128+tl.arange(0, 128)
    value = tl.load(X+i, mask=i < COUNT, other=0.).to(tl.float32)
    scale = tl.load(S+i, mask=i < COUNT, other=0.).to(tl.float32)
    tl.store(Q+i, _stored_quantize(value, scale, LIMIT), mask=i < COUNT)


def quantize_stored_probe(values, scales, limit):
    """Diagnostic only: exercise the exact production rounding primitive."""
    if (not values.is_cuda or values.dtype != torch.float32 or scales.dtype != torch.float16
            or scales.device != values.device or values.shape != scales.shape or limit not in (7, 127)):
        raise ValueError('Probe expects CUDA FP32 values and same-shape FP16 scales')
    values, scales = values.contiguous(), scales.contiguous()
    result = torch.empty_like(values, dtype=torch.int32)
    _stored_probe[(triton.cdiv(values.numel(), 128),)](values, scales, result, values.numel(), limit)
    return result


@triton.jit
def _variant_scan(X, DT, A, B, C, D, DB, Perm, Lo, Hi, Q4, S8, S4, Dense, Y,
             L: tl.constexpr, H: tl.constexpr, P: tl.constexpr, G: tl.constexpr,
             TILE: tl.constexpr, STORED_SCALE: tl.constexpr, CLIP4: tl.constexpr, DIAG: tl.constexpr):
    b, h, tile = tl.program_id(0), tl.program_id(1), tl.program_id(2)
    p = tile * TILE + tl.arange(0, TILE)
    mp = p < P
    row = (b * H + h) * P + p
    n8 = tl.arange(0, 16)
    n4 = tl.arange(0, 64)
    nd = tl.arange(0, 64)
    if DIAG == 0:
        lo = (tl.load(Lo + row[:, None] * 8 + n8[None, :] // 2,
                      mask=mp[:, None], other=0).to(tl.int32) >> ((n8[None, :] % 2) * 4)) & 15
        hi = (tl.load(Hi + row[:, None] * 8 + n8[None, :] // 2,
                      mask=mp[:, None], other=0).to(tl.int32) >> ((n8[None, :] % 2) * 4)) & 15
        ub = (hi << 4) | lo
        q8 = ub - 256 * (ub > 127).to(tl.int32)
        nib = (tl.load(Q4 + row[:, None] * 32 + n4[None, :] // 2,
                       mask=mp[:, None], other=0).to(tl.int32) >> ((n4[None, :] % 2) * 4)) & 15
        q4 = nib - 16 * (nib > 7).to(tl.int32)
        scale8 = tl.load(S8 + row, mask=mp, other=0).to(tl.float32)
        scale4 = tl.load(S4 + row, mask=mp, other=0).to(tl.float32)
        state8 = q8.to(tl.float32) * scale8[:, None]
        state4 = q4.to(tl.float32) * scale4[:, None]
    else:
        state8 = tl.load(Dense + row[:, None] * 128 + n8[None, :], mask=mp[:, None], other=0)
        state4 = tl.load(Dense + row[:, None] * 128 + 16 + n4[None, :], mask=mp[:, None], other=0)
        q8 = tl.full((TILE, 16), 0, tl.int32)
        q4 = tl.full((TILE, 64), 0, tl.int32)
        scale8 = tl.full((TILE,), 0., tl.float32)
        scale4 = tl.full((TILE,), 0., tl.float32)
    if DIAG == 2:
        stated = tl.load(Dense + row[:, None] * 128 + 80 + nd[None, :],
                        mask=mp[:, None] & (nd[None, :] < 48), other=0)
    av = tl.load(A + h).to(tl.float32)
    dv = tl.load(D + h).to(tl.float32)
    bias = tl.load(DB + h).to(tl.float32)
    group = h // (H // G)
    pos8 = tl.load(Perm + group * 128 + n8).to(tl.int32)
    pos4 = tl.load(Perm + group * 128 + 16 + n4).to(tl.int32)
    posd = tl.load(Perm + group * 128 + 80 + nd, mask=nd < 48, other=0).to(tl.int32)
    for t in range(L):
        xoff = ((b * L + t) * H + h) * P + p
        x = tl.load(X + xoff, mask=mp, other=0).to(tl.float32)
        dt = tl.load(DT + (b * L + t) * H + h).to(tl.float32) + bias
        dt = tl.where(dt <= 20., tl.math.log(tl.math.exp(dt) + 1.), dt)
        decay = tl.exp(av * dt)
        bbase = ((b * L + t) * G + group) * 128
        bv8 = tl.load(B + bbase + pos8).to(tl.float32)
        cv8 = tl.load(C + bbase + pos8).to(tl.float32)
        bv4 = tl.load(B + bbase + pos4).to(tl.float32)
        cv4 = tl.load(C + bbase + pos4).to(tl.float32)
        bvd = tl.load(B + bbase + posd, mask=nd < 48, other=0).to(tl.float32)
        cvd = tl.load(C + bbase + posd, mask=nd < 48, other=0).to(tl.float32)
        state8 = state8 * decay + (bv8[None, :] * dt) * x[:, None]
        state4 = state4 * decay + (bv4[None, :] * dt) * x[:, None]
        if DIAG == 2:
            stated = stated * decay + (bvd[None, :] * dt) * x[:, None]
        else:
            stated = (bvd[None, :] * dt) * x[:, None]
        out = tl.sum(state8 * cv8[None, :], 1)
        out += tl.sum(state4 * cv4[None, :], 1)
        out += tl.sum(stated * cvd[None, :], 1) + x * dv
        tl.store(Y + xoff, out, mask=mp)
        if DIAG == 1:
            state8 = state8.to(tl.float16).to(tl.float32)
            state4 = state4.to(tl.float16).to(tl.float32)
        else:
            if STORED_SCALE:
                # Preserve two FP32 operations (clip multiplication, division)
                # before the FP16 cast, including exact FP16 halfway cases.
                den8 = tl.maximum(tl.div_rn(tl.max(tl.abs(state8), 1), 127.), 1e-8)
                den4 = tl.maximum(tl.div_rn(tl.max(tl.abs(state4), 1) * CLIP4, 7.), 1e-8)
                scale8 = den8.to(tl.float16).to(tl.float32)
                scale4 = den4.to(tl.float16).to(tl.float32)
                q8 = _stored_quantize(state8, scale8[:, None], 127)
                q4 = _stored_quantize(state4, scale4[:, None], 7)
            else:
                # Preserve the original legacy expression and statement order.
                den8 = tl.maximum(tl.max(tl.abs(state8), 1) / 127., 1e-8)
                den4 = tl.maximum(tl.max(tl.abs(state4), 1) / 7., 1e-8)
                q8 = tl.minimum(tl.maximum(libdevice.round(state8 / den8[:, None]), -127.), 127.).to(tl.int32)
                q4 = tl.minimum(tl.maximum(libdevice.round(state4 / den4[:, None]), -7.), 7.).to(tl.int32)
                scale8 = den8.to(tl.float16).to(tl.float32)
                scale4 = den4.to(tl.float16).to(tl.float32)
            state8 = q8.to(tl.float32) * scale8[:, None]
            state4 = q4.to(tl.float32) * scale4[:, None]
        if DIAG == 2:
            stated = stated.to(tl.float16).to(tl.float32)
    if DIAG == 0:
        qlo = (q8 & 15).to(tl.uint8)
        qhi = ((q8 >> 4) & 15).to(tl.uint8)
        lo0, lo1 = tl.split(tl.reshape(qlo, (TILE, 8, 2)))
        hi0, hi1 = tl.split(tl.reshape(qhi, (TILE, 8, 2)))
        pairs8 = tl.arange(0, 8)
        tl.store(Lo + row[:, None] * 8 + pairs8[None, :], lo0 | (lo1 << 4), mask=mp[:, None])
        tl.store(Hi + row[:, None] * 8 + pairs8[None, :], hi0 | (hi1 << 4), mask=mp[:, None])
        qn = (q4 & 15).to(tl.uint8)
        f0, f1 = tl.split(tl.reshape(qn, (TILE, 32, 2)))
        pairs4 = tl.arange(0, 32)
        tl.store(Q4 + row[:, None] * 32 + pairs4[None, :], f0 | (f1 << 4), mask=mp[:, None])
        tl.store(S8 + row, scale8, mask=mp)
        tl.store(S4 + row, scale4, mask=mp)
    else:
        tl.store(Dense + row[:, None] * 128 + n8[None, :], state8, mask=mp[:, None])
        tl.store(Dense + row[:, None] * 128 + 16 + n4[None, :], state4, mask=mp[:, None])
        if DIAG == 2:
            final_dead = stated
        else:
            final_dead = tl.full((TILE, 64), 0., tl.float32)
        tl.store(Dense + row[:, None] * 128 + 80 + nd[None, :], final_dead,
                 mask=mp[:, None] & (nd[None, :] < 48))


@torch.no_grad()
def scan(x, dt, A, B, C, D, dt_bias, state, permutation, *, scale_mode='legacy',
         int4_clip=1.0, diagnostic=None):
    """Return(FP16 readout,None), mutating carried state after EVERY token.

    Current readout always uses the FP32 update before its carry is quantized.
    Clipping changes only the INT4 denominator, never INT8 or current readout.
    Stored-scale zero underflow deterministically writes integer0/carry0.
    """
    validate_options(scale_mode, int4_clip, diagnostic)
    if diagnostic is None and scale_mode == 'legacy' and int4_clip == 1.:
        return legacy_codec.scan(x, dt, A, B, C, D, dt_bias, state, permutation)
    if x.ndim != 4 or x.dtype != torch.float16 or not x.is_cuda:
        raise ValueError('x must be CUDA FP16[batch,tokens,heads,dim]')
    batch, length, heads, dim = x.shape
    if length < 1 or state.shape != (batch, heads, dim, 128):
        raise ValueError('Positive sequence and matching state geometry required')
    if diagnostic is None:
        legacy_codec._validate_state(state, x.device)
        if state.mode != 'sq3p25': raise ValueError('Packed SQ3.25 state required')
    else:
        dense = state.tensors.get('dense')
        if (state.mode != 'diagnostic_'+diagnostic or set(state.tensors) != {'dense'}
                or dense.dtype != torch.float32 or tuple(dense.shape) != state.shape
                or dense.device != x.device or not dense.is_contiguous()):
            raise ValueError('Diagnostic must use the declared dense FP32 backing storage')
    if B.ndim != 4: raise ValueError('B must have4 axes')
    groups = B.shape[2]
    if groups < 1 or heads % groups: raise ValueError('Heads must be divisible by groups')
    shapes = ((dt, (batch, length, heads)), (A, (heads,)),
        (B, (batch, length, groups, 128)), (C, (batch, length, groups, 128)),
        (D, (heads,)), (dt_bias, (heads,)))
    for tensor, shape in shapes:
        if tuple(tensor.shape) != shape or tensor.device != x.device:
            raise ValueError('Input device/geometry differs')
    if A.dtype != torch.float32 or any(v.dtype != torch.float16 for v in (dt, B, C)):
        raise ValueError('A must be FP32; dt/B/C must be FP16')
    if any(v.dtype not in (torch.float16, torch.float32) for v in (D, dt_bias)):
        raise ValueError('D/dt_bias must be FP16 or FP32')
    if (permutation.dtype != torch.uint8 or tuple(permutation.shape) != (groups, 128)
            or permutation.device != x.device):
        raise ValueError('Permutation must be CUDA uint8[groups,128]')
    x, dt, A, B, C, D, dt_bias, permutation = (
        v.contiguous() for v in (x, dt, A, B, C, D, dt_bias, permutation))
    output = torch.empty_like(x)
    if diagnostic is None:
        buffers = [state.tensors[k] for k in ('lo', 'hi', 'q4', 's8', 's4')]
        dense = output  # Compile-time-unused pointer, no additional allocation.
    else:
        dense = state.tensors['dense']
        buffers = [dense]*5  # Compile-time-unused packed pointers.
    diag = 0 if diagnostic is None else DIAGNOSTICS.index(diagnostic)+1
    with torch.cuda.device(x.device):
        _variant_scan[(batch, heads, triton.cdiv(dim, RP))](x, dt, A, B, C, D,
            dt_bias, permutation, *buffers, dense, output, length, heads, dim,
            groups, RP, scale_mode == 'stored_scale', float(int4_clip), diag, num_warps=4)
    return output, None


@torch.no_grad()
def decode_state(state, permutation=None):
    if state.mode == 'sq3p25':
        return legacy_codec.decode_state(state, permutation)
    if state.mode not in tuple('diagnostic_'+v for v in DIAGNOSTICS):
        raise ValueError('Unknown state mode')
    values = state.tensors['dense'].clone()
    if permutation is None: return values
    groups = permutation.shape[0]
    legacy_codec.validate_permutation(permutation, groups)
    batch, heads, dim, _ = state.shape
    if heads % groups: raise ValueError('Invalid permutation grouping')
    indices = permutation.long().repeat_interleave(heads//groups, 0)[None, :, None, :].expand(batch, heads, dim, 128)
    return torch.zeros_like(values).scatter_(-1, indices, values)


def validate_finite_result(state, output=None):
    values = [v for v in state.tensors.values() if v.is_floating_point()]
    if output is not None: values.append(output)
    if values and not bool(torch.stack([torch.isfinite(v).all() for v in values]).all()):
        raise FloatingPointError('Nonfinite state scale, diagnostic carry or readout')
    return True


class StatePPLQuant(StateQuant):
    """Native orchestration plus one unchanged57,344-byte permutation table."""
    def __init__(self, model, permutations, *, scale_mode='legacy', int4_clip=1.0, diagnostic=None):
        validate_options(scale_mode, int4_clip, diagnostic)
        self.scale_mode, self.int4_clip, self.diagnostic = scale_mode, float(int4_clip), diagnostic
        super().__init__(model, mode='sq3p25', permutations=permutations, collect_stats=False)
        if diagnostic is not None: self.mode = 'diagnostic_'+diagnostic

    @torch.no_grad()
    def reset(self, batch_size=1):
        if not self._installed: raise RuntimeError('Install controller before resetting')
        if type(batch_size) is not int or batch_size <= 0: raise ValueError('Positive integer batch required')
        self.clear()
        for _ in self._mixers:
            conv = torch.zeros(batch_size, 4, 10240, device=self.device, dtype=torch.float16).transpose(1, 2)
            state = allocate_state(batch_size, 128, 64, 128, self.device, diagnostic=self.diagnostic)
            self._cache.append(_LayerCache(conv=conv, state=state))
        self._batch_size = batch_size
        return self

    @torch.no_grad()
    def _forward(self, index, mx, u, seqlen, seq_idx, cu_seqlens, inference_params):
        if not self._installed or self._failed:
            raise RuntimeError("Controller is inactive or failed; reset before reusing it")
        if any(value is not None for value in (seqlen, seq_idx, cu_seqlens, inference_params)):
            raise ValueError("Use controller-owned caches; native InferenceParams/varlen are unsupported")
        if (not isinstance(u, torch.Tensor) or u.ndim != 3 or u.dtype != torch.float16
                or u.device != self.device or u.shape[-1] != 4096 or u.shape[1] == 0):
            raise ValueError("Mixer input must be CUDA FP16 [batch,tokens,4096]")
        if not self._cache:
            if index != 0:
                raise RuntimeError("A new request must start with backbone layer zero")
            self.reset(u.shape[0])
        if u.shape[0] != self._batch_size or index != self._expected_layer:
            raise RuntimeError("Batch shape or backbone layer order changed without a reset")
        length = u.shape[1]
        if index == 0:
            if len({entry.tokens for entry in self._cache}) != 1:
                raise RuntimeError("Per-layer cache positions disagree; reset the request")
            self._call_length = length
        elif length != self._call_length:
            raise RuntimeError("Backbone layers received different token counts")
        entry = self._cache[index]
        try:
            is_step = entry.tokens > 0 and length == 1
            # Native step uses rank-two linear/norm inputs; retain those GEMM
            # and adapter-hook shapes as well as its convolution arithmetic.
            projected = mx.in_proj(u.squeeze(1) if is_step else u)
            zxbcdt = projected.unsqueeze(1) if is_step else projected
            z, xbc, dt = torch.split(zxbcdt, (8192, 10240, 128), dim=-1)
            xbc = self._convolution(mx, xbc, entry)
            x, bm, cm = torch.split(xbc, (8192, 1024, 1024), dim=-1)
            batch = u.shape[0]
            x = x.reshape(batch, length, 128, 64)
            bm = bm.reshape(batch, length, 8, 128)
            cm = cm.reshape(batch, length, 8, 128)
            aa = -torch.exp(mx.A_log.float())
            permutation = None if self.permutations is None else self.permutations[index]
            y, stats = scan(x, dt, aa, bm, cm, mx.D, mx.dt_bias, entry.state,
                            permutation=permutation, scale_mode=self.scale_mode,
                            int4_clip=self.int4_clip, diagnostic=self.diagnostic)
            if y.dtype != torch.float16 or tuple(y.shape) != (batch, length, 128, 64):
                raise RuntimeError("State codec returned unexpected readout dtype/shape")
            # Keep this module call intact: the external Resurface norm prehook
            # adds its post-D correction here, using the matching mixer input.
            y = y.reshape(batch, length, 8192)
            if is_step:
                y = mx.norm(y[:, 0], z[:, 0])
                out = mx.out_proj(y).unsqueeze(1)
            else:
                y = mx.norm(y, z)
                out = mx.out_proj(y)
            entry.tokens += length
            self._expected_layer = (index + 1) % len(self._mixers)
            if self._expected_layer == 0:
                self._call_length = None
            return out
        except Exception:
            self._failed = True
            raise

    def assert_finite_cache(self):
        values = [v.conv for v in self._cache]
        values += [t for v in self._cache for t in v.state.tensors.values() if t.is_floating_point()]
        if values and not bool(torch.stack([torch.isfinite(t).all() for t in values]).all()):
            raise FloatingPointError('Nonfinite persistent scale, convolution or diagnostic carry')
        return True

    def cache_breakdown(self):
        conv = sum(v.conv.untyped_storage().nbytes() for v in self._cache)
        state = sum(v.state.nbytes for v in self._cache)
        scales = 0 if self.diagnostic else sum(
            v.state.tensors[k].untyped_storage().nbytes() for v in self._cache for k in ('s8', 's4'))
        table = self.permutations.untyped_storage().nbytes()
        return {'mode': self.mode, 'scale_mode': self.scale_mode, 'int4_clip': self.int4_clip,
            'diagnostic': self.diagnostic, 'is_3p25_candidate': self.diagnostic is None,
            'batch_size': self._batch_size, 'allocated_layers': len(self._cache),
            'conv_fp16_bytes': conv, 'ssm_payload_bytes': state-scales,
            'ssm_scale_bytes': scales, 'ssm_total_bytes': state, 'permutation_bytes': table,
            'total_bytes': conv+state+table, 'calibration_workspace_bytes': 0,
            'diagnostic_dense_fp32_bytes': state if self.diagnostic else 0,
            'row_bytes': 512 if self.diagnostic else 52,
            'tokens_per_layer': [v.tokens for v in self._cache],
            'scope': 'Actual persistent request cache and permutation table; diagnostics use dense FP32 backing storage and are not3.25-bit. Weights, activations, registers and allocator reserve excluded.'}