From f38effbbd93a8e93974a8fbfddaa1503671a4915 Mon Sep 17 00:00:00 2001 From: a9lim Date: Tue, 10 Nov 2026 13:49:17 -0500 Subject: [PATCH 1/4] Type manifold frames: write rows are vectors, read rows their dual covectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The whitened fit took the Fisher directions Σ⁻¹Xᵀa, QR'd them into a Euclidean-orthonormal basis and both read and wrote along it. Σ⁻¹δ is the LDA read covector, not a write: a 2-node push went along Σ⁻¹δ instead of the difference of means (cos 0.26–0.83 on cached SmolLM2, Qwen3.5-4B and Gemma-3-4B fits), the `!` ablation left 18–46% of the concept's Mahalanobis norm in the class-mean gap, and the monitor read with Σ⁻²δ. A LayerSubspace now carries `basis` (write rows, Mahalanobis-orthonormal) and `read` (their Σ⁻¹ images, exactly dual). The whitened fit is PCA in the whitened space mapped back with the right types: rows Xᵀa/√μ, reads aᵀ(Σ⁻¹X)/√μ. A 2-node fit writes δ and reads Σ⁻¹δ (PCA@2 ≡ DiM holds again), a full `!` is LEACE against neutral, and reduced coordinates are whitened coordinates, so the foot solve, σ tube and share are Mahalanobis. The kernel, AffineOp, synthesis (Gram-Schmidt on write/read pairs), the curved-overlap lowering, fold, DLS, node statistics, the monitor's curved reads and topology scoring read through `read` and write through `basis`. Transfer re-orthonormalizes in the target metric (Cholesky), and a non-isometric map rescales a curved fit's scalar tube to the volume-preserving isotropic value instead of refusing. Fitted tensors gain `layer_.read`; MANIFOLD_FIT_POLICY_VERSION 1 → 2, so every fit refits. Browser seam: affine-fisher-fit and affine-ablation-lowering move to -v2 (new `read` field) with a regenerator in the parity module. --- AGENTS.md | 5 + ARCHITECTURE.md | 68 +++-- README.md | 15 +- drowse/fit/AGENTS.md | 8 +- drowse/fit/capture.py | 13 +- drowse/fit/naturalness.py | 2 +- drowse/fit/node_stats.py | 4 +- drowse/fit/pipeline.py | 8 +- drowse/geometry/AGENTS.md | 114 ++++--- drowse/geometry/fold.py | 61 ++-- drowse/geometry/inject.py | 279 +++++++++++------- drowse/geometry/invert.py | 2 +- drowse/geometry/manifold.py | 6 +- drowse/geometry/subspace.py | 235 +++++++++------ drowse/geometry/topology.py | 16 +- drowse/geometry/transfer.py | 144 ++++----- drowse/readout/AGENTS.md | 12 +- drowse/readout/geometry.py | 2 +- drowse/readout/monitor_attach.py | 14 +- drowse/steering/AGENTS.md | 18 +- drowse/steering/hooks.py | 104 ++++--- drowse/store/AGENTS.md | 4 +- drowse/store/archive.py | 9 +- drowse/store/manifold_tensors.py | 22 +- tests/browser/test_browser_parity.py | 138 ++++++++- tests/fit/test_dls_narration.py | 1 + tests/fit/test_manifold_extraction.py | 4 +- ....json => affine-ablation-lowering-v2.json} | 8 +- .../browser/affine-fisher-fit-v1.json | 93 ------ .../browser/affine-fisher-fit-v2.json | 58 ++++ tests/geometry/test_fold.py | 2 +- tests/geometry/test_manifold_math.py | 116 +++++++- tests/geometry/test_packing.py | 3 +- tests/geometry/test_synthesize_subspace.py | 56 +++- tests/gpu/test_model_numerics_gpu.py | 2 +- tests/model/test_model_numerics.py | 2 +- tests/readout/test_manifold_monitor.py | 4 +- tests/server/test_drowse_api.py | 4 +- tests/server/test_server_manifold_eviction.py | 3 +- tests/session/test_artifact_registry.py | 5 +- tests/steering/test_hooks_triggers.py | 32 +- tests/steering/test_layer_scoped_steering.py | 8 +- .../test_steering_context_ablation.py | 48 ++- tests/store/test_drowse_archive.py | 3 +- tests/store/test_manifolds_io.py | 67 ++++- tests/support/artifacts.py | 1 + 46 files changed, 1191 insertions(+), 632 deletions(-) rename tests/fixtures/browser/{affine-ablation-lowering-v1.json => affine-ablation-lowering-v2.json} (68%) delete mode 100644 tests/fixtures/browser/affine-fisher-fit-v1.json create mode 100644 tests/fixtures/browser/affine-fisher-fit-v2.json diff --git a/AGENTS.md b/AGENTS.md index deff6b53c..34fcb953c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -186,6 +186,11 @@ few massive-activation channels, so a fallback would be a wrong answer, not a degraded one. The deliberate Euclidean exceptions are listed in `drowse/geometry/AGENTS.md`. Neutral activations are cached fp32: fp16 overflows late layers, and `covers_all` must mean finite factors everywhere. +Frames are typed: a `LayerSubspace`'s `basis` rows are write vectors +(Mahalanobis-orthonormal) and its `read` rows the dual covectors (`Σ⁻¹` of +them), so a 2-node push is DiM, a full `!` is LEACE and the monitor reads the +LDA score. Never write along a read row or read with a write row +(ARCHITECTURE §5.3). **Exclusive GPU.** One reentrant `_gen_lock` serializes all model work, because MPS's single global command buffer is not thread-safe. Collaborators that run diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index f1b8b5505..edb39ba6a 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -86,10 +86,10 @@ A manifold is a set of labeled nodes, a domain or discovered layout, and a per-model fit at selected residual-stream layers. A fitted layer is a `LayerSubspace` (`geometry/subspace.py`) in one of two geometries: -- **Flat**: a neutral-anchored affine frame (`mean`, orthonormal `basis`, real - per-layer node coordinates). A rank-1, 2-node flat fit is the ordinary - bipolar steering vector; a 1-node flat fit is a monopolar ray from the - neutral mean. +- **Flat**: a neutral-anchored affine frame (`mean`, a Mahalanobis-orthonormal + `basis` of write rows with their dual `read` rows, real per-layer node + coordinates). A rank-1, 2-node flat fit is the ordinary bipolar steering + vector; a 1-node flat fit is a monopolar ray from the neutral mean. - **Curved**: the same enclosing frame plus an `r³` polyharmonic RBF surface through the node centroids, a neutral-origin foot, and optionally a learned tube thickness σ(z). @@ -299,9 +299,26 @@ the neutral mean into the span, node coordinates are measured from it, and coordinate 0 means neutral. The basis comes from the node-centroid scatter around the nodes' own mean, never around neutral: anchor-centering would inject the neutral offset as a spurious axis and break PCA@2 ≡ difference-of-means. -With a whitener the basis maximizes `vᵀS_b v / vᵀΣv` (the Fisher/LDA -objective), which divides each direction by its background variance so the -rogue channels cancel the way they cancel in a difference of means. + +**Frames are typed: writes are vectors, reads are covectors.** A frame's +`basis` rows are what steering adds to the residual stream, and its `read` +rows are what measures a coordinate (`(h − mean)·readᵀ`). The two are +different objects whenever the metric is not Euclidean: the read that best +separates two classes is the LDA covector `Σ⁻¹δ`, while the write that moves +that reading furthest per unit of Mahalanobis displacement is `Σ·Σ⁻¹δ = δ`, +the difference of means itself. So the whitened fit is PCA in the whitened +space mapped back with the right types. The eigenvectors `a` of the whitened +Gram `G = XΣ⁻¹Xᵀ` rank the axes by whitened between-node variance (the +Fisher/LDA objective `vᵀS_b v / vᵀΣv`, which is what keeps the rogue channels +from choosing the axes). The write rows are `Xᵀa/√μ`, combinations of the node +displacements, Mahalanobis-orthonormal by construction, and the read rows are +their `Σ⁻¹` images, exactly dual (`read·basisᵀ = I`). A 2-node fit therefore +writes along `δ` (its push is DiM), reads with `Σ⁻¹δ`, and its full ablation +is LEACE. Every frame obeys the same contract: fitted, folded, synthesized +and transferred. Reduced coordinates are whitened coordinates, so every +reduced norm (the foot solve, the σ tube, the share) is a Mahalanobis norm. +Before fit policy 2 the basis was the QR of the covector rows `Σ⁻¹Xᵀa`, so +steering wrote along LDA directions and the monitor read with `Σ⁻²δ`. ### 5.4 Discovering and fitting geometry @@ -323,8 +340,8 @@ curved fits learn the σ tube from the retained rows. Each fit bakes a per-layer Mahalanobis `share`, the cross-layer budget the hooks normalize at apply time. Discriminative layer selection (Selective Steering, Dang & Ngo 2026) keeps a flat axis at a layer only when the node -projections relative to neutral straddle zero: same-side layers encode -intensity, not polarity. `--no-dls` opts out. Curved fits have no polarity and +readings relative to neutral (through the axis's read row) straddle zero: +same-side layers encode intensity, not polarity. `--no-dls` opts out. Curved fits have no polarity and skip DLS. A monopolar concept (`extract(concept)` with no baseline) is a genuine 1-node @@ -345,7 +362,7 @@ in `drowse/steering/AGENTS.md`. In brief: |---|---| | `0.3 warm` | push toward a pole or label | | `a~b`, `a\|b` | keep / remove the Mahalanobis component of `a` shared with `b` | -| `!a` | mean-ablate `a` (`h' = h − α(h·d̂ − μ·d̂)d̂`) | +| `!a` | LEACE-ablate `a` toward neutral (`h' = h − α((h − μ)·Σ⁻¹d / d·Σ⁻¹d)·d`) | | `along[,onto] M%label`, `M%x,y` | move toward a node or coordinates of a manifold | | `x{12-20}`, `x{4-8,20}`, `x{workspace}` | act only at these layers (any term kind) | | `@response`, `@after`, `@first:N`, … | restrict the token phase or window | @@ -379,8 +396,10 @@ collapse axes, and affine `%` terms contribute their fitted basis and target. All affine terms of one trigger become one `SynthesizedSubspace` per layer (`geometry/inject.py::synthesize_subspace`), so terms sharing a layer superpose instead of colliding; partial, repeated, negative and non-orthogonal -ablations get exact per-axis coefficients. Each curved `%` term stays its own -term. Two curved spans may share a layer only when they are orthogonal +ablations get exact per-axis coefficients. All of it runs in the Mahalanobis +metric: one Woodbury `Σ⁻¹` gives each row's read, and Gram-Schmidt works on +(write, read) pairs. Each curved `%` term stays its own term. Two curved spans +may share a layer only when they are Mahalanobis-orthogonal (`OverlappingManifoldError` otherwise), and the merged affine span is orthogonalized against them, the curved term owning the overlap. @@ -407,9 +426,11 @@ in-subspace residual, off-subspace residual) and applies two operations: `onto = 1` lands on the surface's typical set rather than its zero-thickness wire. It is vacuous for flat terms. -`H_o`, the off-subspace residual, is always kept verbatim. It contains every -composing neighbor's span, which is why a vector and several orthogonal -manifolds compose with zero cross-talk. +The split reads with the frame's `read` rows and writes back along its +`basis` rows, so `H_o`, the off-subspace residual, is the +Mahalanobis-orthogonal complement `(I − basisᵀ·read)(h − mean)`. It is always +kept verbatim. It contains every composing neighbor's span, which is why a +vector and several orthogonal manifolds compose with zero cross-talk. On a flat subspace the foot is the projected coordinate and the kernel reduces to an analytic slide, with no foot solve, RBF or norm cap (a flat fit cannot @@ -838,9 +859,9 @@ references are: |---|---|---| | expression grammar | `steering/grammar.py` | `tests/fixtures/browser_steering_expression.json` | | sampler | `generation/decode.py` | `sampling-parity-v1.json` | -| affine lowering and the kernel | `steering/hooks.py`, `geometry/inject.py` | `affine-*-lowering-v1.json`, `post-block-rank-one-v2.json` | +| affine lowering and the kernel | `steering/hooks.py`, `geometry/inject.py` | `affine-rank-one-lowering-v1.json`, `affine-composed-lowering-v1.json`, `affine-ablation-lowering-v2.json`, `post-block-rank-one-v2.json` | | curved kernel, SAE and lens token directions, gates | `geometry/inject.py`, `sae/backend.py`, `lens/jlens.py`, `steering/triggers.py` | `structured-program-parity-v1.json` | -| Fisher fit, DLS, topology and RBF | `geometry/subspace.py`, `fit/capture.py::compute_dls_axes`, `geometry/topology.py`, `geometry/rbf.py` | `affine-fisher-fit-v1.json`, `dls-axes-v1.json`, `topology-rbf-parity-v1.json`, `topology-adversarial-v1.csv` | +| Fisher fit, DLS, topology and RBF | `geometry/subspace.py`, `fit/capture.py::compute_dls_axes`, `geometry/topology.py`, `geometry/rbf.py` | `affine-fisher-fit-v2.json`, `dls-axes-v1.json`, `topology-rbf-parity-v1.json`, `topology-adversarial-v1.csv` | | measurement envelope | `readout/measurements.py` | `measurement-envelope-v2.json` | | loom ops and events | `loom/tree.py`, `loom/ops.py` | `loom-operation-transcript-v1.json` | | generation-settings composition | `loom/recipe.py::compose_call` | `recipe-compose-v1.json` | @@ -910,15 +931,18 @@ publisher identity. Cross-model transfer (`geometry/procrustes.py`, `geometry/transfer.py`) fits a per-layer affine alignment from shared neutral activations, maps means as -points and bases as directions, re-bakes the share in the target model's -Mahalanobis metric, and writes the `from-` variant. Curved transfer -rejects maps that would make a scalar tube anisotropic. Discover layouts are +points and write rows as directions, re-orthonormalizes the frame in the +target model's Mahalanobis metric (recomputing its reads there), re-bakes the +share in that metric, and writes the `from-` variant. A curved fit's +scalar tube becomes the volume-preserving isotropic approximation when the map +is not an isometry between the two metrics. Discover layouts are model-specific, so transfer maps fitted activation geometry, not a universal coordinate system. A fitted 2-node flat manifold exports as a llama.cpp control-vector GGUF -(`folded_directions = δ̂_L · share_L`). llama.cpp's uniform scale reproduces -that share profile, which approximates but does not equal drowse's live affine +(`folded_directions`: each layer's difference-of-means write row scaled to +Mahalanobis norm `share_L`). llama.cpp's uniform scale reproduces that share +profile, which approximates but does not equal drowse's live affine injection. Multi-rank and curved fits are rejected. ## 13. Concurrency and consistency diff --git a/README.md b/README.md index 92c11463d..c692f01d3 100644 --- a/README.md +++ b/README.md @@ -109,8 +109,10 @@ assigns steering to roles; raw mode is one buffer for base models. In Drowse, you extract concepts as **manifolds** or **subspaces**. -- A 1D flat subspace is just a steering vector. -- A higher-rank flat subspace is a group of orthogonal steering vectors. +- A 1D flat subspace is just a steering vector: the difference of the two + poles' means. +- A higher-rank flat subspace is a group of steering vectors, orthogonal in + the model's Mahalanobis metric. - A curved manifold fits a nonlinear surface and lets you steer along it. ### Bundled concepts @@ -162,7 +164,7 @@ across Python, YAML, OpenAI, Ollama, or the native API. | leading number | Steering coefficient; omitted terms default to `0.5` | | `~` | Keep the component shared with another direction (Mahalanobis) | | `\|` | Remove the component shared with another direction (Mahalanobis) | -| `!` | Mean-ablate a direction or a unit; a bare `!x` ablates fully | +| `!` | Ablate a direction toward neutral (LEACE: reads with the whitened covector, edits along the direction) or mean-ablate a unit; a bare `!x` ablates fully | | `%label` or `%x,y,…` | Choose a named node or coordinates on a manifold | | `{12-20}`, `{4-8,20}`, `{workspace}` | Act only at these layers (after the selector, before `@`) | | `@prompt`, `@response`, `@after`, `@thinking`, … | Restrict the token phase where a term applies | @@ -204,7 +206,12 @@ Drowse first has the model answer a shared set of baseline prompts as each conce then it takes the resulting hidden states and fits them to either a curved manifold or a flat subspace. -Layer allocation uses a Mahalanobis metric estimated from neutral activations. +Fitting, layer allocation and reads use a Mahalanobis metric estimated from +neutral activations. Each fitted frame keeps two row sets: write rows, the +directions steering adds (for a two-pole concept, the difference of means), +and read rows, the whitened covectors that measure a coordinate (the LDA +direction). A full `!` ablation reads with one and edits along the other, +which is LEACE. Discriminative layer selection removes flat axes that fail to straddle the neutral baseline across the fitted nodes. diff --git a/drowse/fit/AGENTS.md b/drowse/fit/AGENTS.md index 41f65ff1c..21d3219bb 100644 --- a/drowse/fit/AGENTS.md +++ b/drowse/fit/AGENTS.md @@ -106,7 +106,7 @@ must stay deterministic. | Constant | Bump invalidates | |---|---| | `MANIFOLD_CAPTURE_VERSION = 3` (`pipeline.py`) | all fitted tensors and all cached captures | -| `MANIFOLD_FIT_POLICY_VERSION = 1` (`geometry/manifold.py`) | fitted tensors only | +| `MANIFOLD_FIT_POLICY_VERSION = 2` (`geometry/manifold.py`; 2 typed the frames: vector write rows, dual read rows) | fitted tensors only | | `CAPTURE_CACHE_FORMAT = "5"` (`capture_cache.py`) | capture shards | | `NEUTRAL_CAPTURE_VERSION = 2` (`store/neutral.py`; 2 added the mid means) | neutral caches | @@ -180,7 +180,8 @@ identity, but never uses them. **Flat**: `fit_affine_subspace` with `n_components` = the layout width (a flat subspace *is* its layout span, so `max_subspace_dim` does not apply) and -`orient_to=0` (node 0 positive, so a 2-node fit is `+δ̂`: PCA@2 ≡ DiM). DLS +`orient_to=0` (node 0 positive, so a 2-node fit writes `+δ` and reads +`Σ⁻¹δ`: PCA@2 ≡ DiM). DLS then prunes axes and `subspace_share` is baked on the survivors. The display layout is translated onto neutral (`_neutral_centered_layout`) so `% 0,…,0` reads as neutral; steering is unchanged. No origin is stored (neutral's foot @@ -194,7 +195,8 @@ the σ-field, and each layer stores `origin`, the neutral foot that seeds the solve. There is no DLS, since a curved fit has no polarity. **DLS** (`compute_dls_axes`; Dang & Ngo 2026, Selective Steering, Eq. 9) keeps -axis `d̂_r` at layer L iff `{(c_i − ν_L)·d̂_r}` straddles zero. Same-side axes +axis `r` at layer L iff the node readings `{(c_i − ν_L)·p_r}` through its read +row `p_r` (`LayerSubspace.read`) straddle zero. Same-side axes encode intensity, not polarity, and at K=2 this is exactly the bipolar opposite-sign test. Edge cases: `layer_means=None` (`dls=False`) keeps every axis; a zero-norm axis drops; a layer with no ν keeps every checkable axis; if diff --git a/drowse/fit/capture.py b/drowse/fit/capture.py index bd24e133a..4c2dd224a 100644 --- a/drowse/fit/capture.py +++ b/drowse/fit/capture.py @@ -655,11 +655,12 @@ def compute_dls_axes( The N-node generalization of the bipolar opposite-sign test (Dang & Ngo 2026, Eq. 9) — the form a flat *subspace* of any node count uses. Each - layer carries a basis ``[R, D]`` (its ``LayerSubspace.basis`` rows) and - ``node_centroids[L]`` is the ``[K, D]`` stack of that layer's per-node - mean activations. Every row ``d̂_r`` is kept iff the node projections - relative to the neutral baseline, ``{(c_i − ν)·d̂_r : i}``, **straddle - zero** (both a negative and a positive present) — the axis then + layer carries its read rows ``[R, D]`` (``LayerSubspace.read``, the + covectors that read an axis's coordinate) and ``node_centroids[L]`` is + the ``[K, D]`` stack of that layer's per-node mean activations. Every + axis ``r`` is kept iff the node readings relative to the neutral + baseline, ``{(c_i − ν)·p_r : i}``, **straddle zero** (both a negative and + a positive present) — the axis then discriminates node *position* across the baseline rather than encoding a common offset / intensity every node shares. @@ -682,7 +683,7 @@ def compute_dls_axes( Args: node_centroids: per-layer ``[K, D]`` stack of node mean activations. - bases: per-layer ``[R, D]`` basis (rows are the candidate axes). + bases: per-layer ``[R, D]`` read rows (one per candidate axis). layer_means: per-layer neutral baseline; ``None``/empty disables. """ if layer_means is None or not layer_means: diff --git a/drowse/fit/naturalness.py b/drowse/fit/naturalness.py index 135872ea3..f1ababad7 100644 --- a/drowse/fit/naturalness.py +++ b/drowse/fit/naturalness.py @@ -142,7 +142,7 @@ def trajectory_naturalness( ``node_coords`` ``(K, n)`` seed the inverse map. Returns ``(T,)``. """ h = to_hellinger(traj_dists) # (T, V) - coords = (h - behavior.mean) @ behavior.basis.T # (T, R) + coords = (h - behavior.mean) @ behavior.read.T # (T, R) pos, _ = invert_parameterization(behavior, domain, coords, node_coords) curve_h = behavior.eval_at(domain.embed(pos)) # (T, V) # In Hellinger space ||h_a - h_b||^2 = 2 - 2*BC, so the Bhattacharyya diff --git a/drowse/fit/node_stats.py b/drowse/fit/node_stats.py index af2c0fb7f..020bb8fbd 100644 --- a/drowse/fit/node_stats.py +++ b/drowse/fit/node_stats.py @@ -214,7 +214,7 @@ def compute_store_reduced_covariances( for offset, size in zip(store.offsets, store.node_sizes, strict=True) ] for idx, sub in layer_subs.items(): - basis_t = sub.basis.to(device="cpu", dtype=torch.float32).transpose(0, 1) + read_t = sub.read.to(device="cpu", dtype=torch.float32).transpose(0, 1) rank = sub.rank rows = store.flat_rows(idx) reduced_rows = torch.empty(store.total_rows, rank, dtype=torch.float32) @@ -230,7 +230,7 @@ def compute_store_reduced_covariances( # the operation bounded and out-of-place even when the source row # store is already fp32 (where ``.to(float32)`` would alias it). torch.sub(rows[start:end], mean, out=centered) - reduced_rows[start:end] = centered @ basis_t + reduced_rows[start:end] = centered @ read_t for k, (start, end) in enumerate(boundaries): size = end - start diff --git a/drowse/fit/pipeline.py b/drowse/fit/pipeline.py index 79ddb4d9e..bb6bccb5c 100644 --- a/drowse/fit/pipeline.py +++ b/drowse/fit/pipeline.py @@ -485,7 +485,9 @@ class _ResolvedGeometry: #: bases, carried out of topology scoring so the final layer fit doesn't #: repeat the layout QR/eigh/LU. rbf_plan: Any = None - fisher_bases: dict[int, torch.Tensor] = field(default_factory=dict) + fisher_bases: dict[int, tuple[torch.Tensor, torch.Tensor]] = field( + default_factory=dict, + ) def _resolve_fit_geometry( @@ -538,7 +540,7 @@ def _resolve_fit_geometry( # and the topology ``select_topology`` picks for ``fit_mode="auto"``. effective_fit_mode = mf.fit_mode auto_rbf_plan = None - auto_fisher_bases: dict[int, torch.Tensor] = {} + auto_fisher_bases: dict[int, tuple[torch.Tensor, torch.Tensor]] = {} if mf.fit_mode == "authored": domain = domain_from_spec(mf.domain) node_coords = torch.tensor(mf.node_coords, dtype=torch.float32) @@ -1503,7 +1505,7 @@ def _fit_affine_layers( raw_fits[idx] = (fit.subspace, fit.mu_coords) kept = compute_dls_axes( {idx: stacks[idx] for idx in raw_fits}, - {idx: sub.basis for idx, (sub, _mu) in raw_fits.items()}, + {idx: sub.read for idx, (sub, _mu) in raw_fits.items()}, means if dls else None, ) layer_subs: dict[int, LayerSubspace] = {} diff --git a/drowse/geometry/AGENTS.md b/drowse/geometry/AGENTS.md index d5c17af75..4151de00b 100644 --- a/drowse/geometry/AGENTS.md +++ b/drowse/geometry/AGENTS.md @@ -24,12 +24,12 @@ Internal order: `domains`, `rbf` → `subspace` → `invert`, `manifold`, `tube` |---|---| | `domains.py` | `ManifoldDomain`; `BoxDomain`/`BoxAxis`, `SphereDomain`, `KleinBottleDomain`, `ProjectivePlaneDomain`, `CustomDomain`; the `manifold.json` domain union (`validate_domain_spec`, `normalize_domain_spec`, `domain_from_spec`). | | `rbf.py` | `RbfFitPlan` (the one layout factorization: exact, fixed-λ, GCV), `RbfFit`, `eval_rbf`/`eval_rbf_jacobian`/`eval_rbf_jet` (one layer's parameters, or a stack of them against an `(L, X, m)` query), `rbf_cardinal_weights`. | -| `subspace.py` | `LayerSubspace`, `StackedRbf` (several curved layers' surfaces and σ-fields of one rank, stacked), `pca_basis`, `fit_affine_subspace`, `fit_curved_subspace`, `LayerFit`, `subspace_share`, `DEFAULT_N_COMPONENTS = 64`. | +| `subspace.py` | `LayerSubspace`, `StackedRbf` (several curved layers' surfaces and σ-fields of one rank, stacked), `pca_basis`, `dual_read`, `fit_affine_subspace`, `fit_curved_subspace`, `LayerFit`, `subspace_share`, `DEFAULT_N_COMPONENTS = 64`. | | `manifold.py` | `Manifold`, `MANIFOLD_FIT_POLICY_VERSION`. | | `packing.py` | `pack_to_device`: moves an object tree's tensors to a device as one buffer per dtype (what `Manifold.to` and probe attach use off the CPU). | | `invert.py` | `_gn_step` (the one damped Gauss-Newton step), `invert_parameterization`, `invert_stacked`, `neutral_origin`. | | `tube.py` | The σ-field: `off_surface_vars`, `fit_sigma_field`. | -| `inject.py` | `synthesize_subspace`/`SynthesizedSubspace` (composition) and `subspace_inject` (the kernel). | +| `inject.py` | `synthesize_subspace`/`SynthesizedSubspace` (composition), `_ortho_frame` (Gram-Schmidt on write/read pairs, shared with the curved-overlap lowering) and `subspace_inject` (the kernel). | | `topology.py` | `derive_pca_coords`, `derive_spectral_coords`, `discover_coords`, `neutral_layout_coord`, `select_topology`. | | `whitener.py` | `LayerWhitener`, `DEFAULT_RIDGE_SCALE`. | | `fold.py` | `fold_directions_to_subspace`, `folded_directions`, `is_foldable_vector_manifold`, `project_profile`. | @@ -55,6 +55,13 @@ Internal order: `domains`, `rbf` → `subspace` → `invert`, `manifold`, `tube` neuron-lens's definition of a head's firing, a scalar read only in units of that head's own neutral `act_top` and never compared geometrically across units or against a direction (`drowse/units/AGENTS.md`). +- **Frames are typed.** `basis` rows are write vectors and `read` rows their + dual covectors (`read @ basisᵀ = I`). A fitted, folded, synthesized or + transferred frame is Mahalanobis-orthonormal with `read = basis Σ⁻¹`, so + `basisᵀ read` is the Mahalanobis-orthogonal projector and reduced norms are + Mahalanobis norms. Code that reads a coordinate uses `read`; code that + writes one uses `basis`. Without a whitener (tests, the behavior-space fit) + the frame is Euclidean-orthonormal and `read == basis`. - **μ-center the scatter, never anchor-center it.** `pca_basis` takes centroids minus their own mean. Centering on neutral injects the neutral offset as a spurious axis and breaks PCA@2 ≡ difference-of-means. @@ -86,9 +93,10 @@ Internal order: `domains`, `rbf` → `subspace` → `invert`, `manifold`, `tube` ## Frames: `LayerSubspace` and `Manifold` -`LayerSubspace` is one layer's frame: `mean (D,)`, orthonormal `basis (R, D)`, -unit-box normalization `coord_offset`/`coord_scale (m,)`, and one of two exact -shapes (`validate_structure`): +`LayerSubspace` is one layer's frame: `mean (D,)`, the write rows `basis (R, D)` +and their dual read rows `read (R, D)` (`validate_structure` checks the shape +and `read @ basisᵀ ≈ I`), unit-box normalization +`coord_offset`/`coord_scale (m,)`, and one of two exact shapes: - **Affine (flat)**, `is_affine ⇔ node_params is None`: `node_coords (K, R)` holds the real neutral-anchored per-layer node positions (the steering @@ -134,25 +142,33 @@ shape; `normalize_domain_spec` fills authoring defaults first. ## Fitting a frame -`pca_basis(X, whitener=, layer=)` with a covering whitener solves the Fisher -(LDA) problem `(S_b, Σ)`: eigenvectors `a` of `G = X Σ⁻¹ Xᵀ` give directions -`Σ⁻¹ Xᵀ a`, re-orthonormalized by QR so the runtime sees a Euclidean-orthonormal -basis. Dividing by background variance cancels the rogue channels raw PCA -chases, the same cancellation DiM gets by differencing. -`R = min(n_components, K − 1, rank)`. `whitened_gram`/`whitened_rows` let one -Woodbury apply serve Gram, basis and layout anchoring; `basis_override` reuses -the Fisher bases `select_topology` computed. +`pca_basis(X, whitener=, layer=)` with a covering whitener is PCA in the +whitened space mapped back with the right types (equivalently the Fisher/LDA +problem `(S_b, Σ)`). Eigenvectors `a` of `G = X Σ⁻¹ Xᵀ` (eigenvalues `μ`) rank +the axes by whitened between-node variance, which keeps the rogue channels +raw PCA chases from choosing them. The write rows are `Xᵀa/√μ` (node +displacements, Mahalanobis-orthonormal since `aᵀGa = μ`); the read rows are +`aᵀ(Σ⁻¹X)/√μ`, the LDA covectors, made exactly dual by `dual_read` (one +`(R, R)` solve against the fp32 Woodbury drift). It returns +`(basis, read, ev_ratio)`. `R = min(n_components, K − 1, rank)`. +`whitened_gram`/`whitened_rows` let one Woodbury apply serve Gram, frame and +layout anchoring; `basis_override` reuses the `(basis, read)` frames +`select_topology` computed. A consequence worth knowing: a flat fit's node +coordinates are the discover layout's whitened PCA coordinates. - `fit_affine_subspace` (flat: `fit_mode=pca`, every steering vector as K = 2): - `node_coords = (centroids − ν)·basisᵀ`; `orient_to=0` makes node 0 project - non-negative, so a 2-node axis is `+δ̂`. + `node_coords = (centroids − ν)·readᵀ`; `orient_to=0` makes node 0's + coordinate non-negative, so a 2-node axis writes `+δ` (PCA@2 ≡ DiM) and + reads `Σ⁻¹δ`. - `fit_curved_subspace` (authored/spectral, K ≥ 3): the same frame plus an RBF to the neutral-anchored reduced coordinates. `smoothing=None` is exact (the authored contract: a node is an exact steering target); `"auto"`/float fits the penalized surface and records λ/edf/GCV on `LayerFit.rbf`. - `subspace_share = sqrt(Σ_k c_kᵀ (B Σ⁻¹ Bᵀ) c_k)` over μ-centered coordinates: - the per-layer budget is signal spread, independent of where neutral sits. At - K = 2 it is `‖δ_L‖_M / √2`, so the mean-1 profile equals DiM's. The monitor + the per-layer budget is signal spread, independent of where neutral sits. The + Gram is `≈ I` for a fitted frame and keeps the formula exact for one measured + in another metric (transfer). At K = 2 it is `‖δ_L‖_M / √2`, so the mean-1 + profile equals DiM's. The monitor weights its cross-layer read by the same share (normalized to sum 1). ## RBF surface @@ -212,11 +228,16 @@ affine term of one trigger group (vectors, poles, `~`/`|` results, `!`, affine superpose instead of colliding. On CPU fp32, per layer: - Push rows `(basis_rows, coord_target, coeff)` and ablation rows `(dirs, coeff)` - are orthonormalized push-first (`_ortho_basis`); push wins a shared direction. + (all write vectors) get their reads from one batched Woodbury `Σ⁻¹` and are + orthonormalized push-first in the Mahalanobis metric (`_ortho_frame`, ordered + Gram-Schmidt on (write, read) pairs); push wins a shared direction. An + ablation axis reads with `Σ⁻¹d` and writes along `d`: a full `!` is LEACE + against the neutral mean. - The leftover ablation operator `A = Σ coeffᵢ uᵢuᵢᵀ` is diagonalized, so partial, repeated, negative and non-orthogonal ablations get exact per-axis `kappa` (0 on push axes). -- **Whitened along-normalization.** `target = B @ Σ coeffᵢ·wdᵢ/‖wdᵢ‖_M`, and +- **Whitened along-normalization.** `target = P @ Σ coeffᵢ·wdᵢ/‖wdᵢ‖_M` (`P` + the merged read rows), and `share = ‖Δ‖_M` of the raw coefficient-weighted displacement. Every target gets the same whitened budget (`Σ_L eff_along_L = gain·n_layers`, linear in α), spread by where its signal lives (the rationale is `ARCHITECTURE.md` @@ -228,8 +249,10 @@ superpose instead of colliding. On CPU fp32, per layer: `subspace_inject(h, subspace, domain, target, foot_seed, along, onto, …)` splits `h = mean + H_m + H_n + H_o` (surface foot, off-surface in-subspace residual, -off-subspace residual) and works in reduced coordinates (orthonormal basis, so -norms are exact and cost is O(R)): +off-subspace residual) and works in reduced coordinates: `read` rows read +them, `basis` rows write the displacement back, and the frame is +Mahalanobis-orthonormal, so reduced norms are Mahalanobis norms and cost is +O(R): - **along** translates the foot by `along·(target − origin)` via `domain.translate_foot`. A fixed offset preserves the per-token in-subspace @@ -245,13 +268,17 @@ norms are exact and cost is O(R)): lands on the wire), or toward σ(z) with one (onto = 1 lands one σ off the wire, on the typical set; direction kept; a residual inside the tube is never expanded). Order is fixed: along, then onto. -- **`H_o` is kept verbatim.** It is every composing neighbor's span, so a vector +- **`H_o` is kept verbatim.** It is the Mahalanobis-orthogonal complement + `(I − basisᵀ read)(h − mean)`, every composing neighbor's span, so a vector and N orthogonal manifolds compose with zero cross-talk. -- **Affine shortcut.** On a flat subspace the foot is `q`, `H_n ≡ 0`, `onto` is - vacuous: `p_new = q + along·(target − κ·q)`, `h_new = h + (p_new − q)·B`. No - foot solve, no RBF, no norm cap (a flat fit cannot extrapolate). +- **Affine shortcut.** On a flat subspace the foot is `q = (h − mean)·Pᵀ`, + `H_n ≡ 0`, `onto` is vacuous: `p_new = q + along·(target − κ·q)`, + `h_new = h + (p_new − q)·B`. No foot solve, no RBF, no norm cap (a flat fit + cannot extrapolate). - **Curved norm cap** `‖h_new‖ ≤ norm_cap·‖h‖` (3) guards off-domain RBF - extrapolation. When it fires it scales the whole output, `H_o` included. + extrapolation. It is a raw-norm guard, so Euclidean (through the frame's + `B Bᵀ` Gram, since the frame is not Euclidean-orthonormal). When it fires + it scales the whole output, `H_o` included. The kernel returns fp32 (the hook's `copy_` downcasts) plus this token's refined pre-slide foot, which seeds the next token. It applies no gain and no clamp: @@ -336,10 +363,12 @@ the monitor's on-device per-token apply). A steering vector is the R = 1 affine manifold. `fold_directions_to_subspace` folds a per-layer direction (a merge, a `~`/`|` result, a registered profile, a -monopolar `concept − ν`) into a neutral-anchored one-pole ray: `basis = d̂`, -pole at coordinate `‖d_L‖`, share `‖d_L‖_M` (not the √2 form; one direction has -no node cloud), no DLS, no origin. `folded_directions` reads an R = 1 fit back -as `{L: δ̂_L · share_L}`: the `Profile` behind `extract()`, `manifold +monopolar `concept − ν`) into a neutral-anchored one-pole ray: `basis = +d/‖d‖_M`, `read = Σ⁻¹d/‖d‖_M`, pole at coordinate `‖d_L‖_M` (so it sits at +`ν + d`), share `‖d_L‖_M` (not the √2 form; one direction has no node cloud), +no DLS, no origin. `folded_directions` reads an R = 1 fit back as `{L: +basis_L · share_L}` (the write row at Mahalanobis norm `share_L`): the +`Profile` behind `extract()`, `manifold compare`/`why`, merges and GGUF export, exact for scale-invariant reads and proportional for magnitudes. `is_foldable_vector_manifold` gates its callers. `project_profile` is the per-layer LEACE `~`/`|` (`|` passes layers missing from @@ -357,9 +386,10 @@ merges over the union of layers (`strict=True` requires equal coverage). `gguf.py` reads and writes llama.cpp control vectors (`controlvector.model_hint`, `direction.` fp32; `gguf` is an optional lazy import). `store/gguf.py::export_gguf_manifold` exports 2-node flat fits as -`folded_directions`. llama.cpp applies one uniform scale, so the exported -per-layer weighting is the Mahalanobis share: an approximation of drowse's -injection, which budgets by the whitened neutral→node displacement. Unit-norm +`folded_directions` (difference-of-means directions). llama.cpp applies one +uniform scale, so the exported per-layer weighting is the Mahalanobis share: +an approximation of drowse's injection, which budgets by the whitened +neutral→node displacement. Unit-norm repeng files load and inject uniformly. ## Cross-model transfer @@ -373,13 +403,17 @@ points only. Fewer than 10 shared layers raises `AlignmentError`. `alignment_quality` is per-layer centered R²; its median is the sidecar's `transfer_quality_estimate`. -`transfer_manifold_subspaces` maps means as points and bases as directions, -QR-reparameterizes back to an orthonormal basis and folds the companion matrix -into `affine_map` or the RBF coefficients, so world points are preserved. It -rejects rank-collapsing maps and, on curved layers, non-isometric companions (a -scalar σ cannot represent an anisotropic tube). It re-bakes the share with the -target whitener (required) and re-solves curved origins against the target -neutral means. Uncovered layers drop. +`transfer_manifold_subspaces` maps means as points and write rows as +directions (source reads are source-metric covectors and do not transfer), +re-orthonormalizes the frame in the target whitener's metric (`B_tgt = +L⁻¹B_raw`, `L Lᵀ = B_raw Σ_tgt⁻¹ B_rawᵀ`, reads recomputed there) and folds +the companion `L` into `affine_map` or the RBF coefficients, so world points +are preserved. It rejects rank-collapsing maps. `L` is orthogonal only where +the alignment carries one metric exactly onto the other; otherwise a curved +layer's scalar σ becomes the volume-preserving isotropic approximation +`σ·(Π sᵢ)^(1/R)` (`sᵢ` the singular values of `L`). It re-bakes the share +with the target whitener (required) and re-solves curved origins against the +target neutral means. Uncovered layers drop. ## Testing diff --git a/drowse/geometry/fold.py b/drowse/geometry/fold.py index fc1113db6..8d3483757 100644 --- a/drowse/geometry/fold.py +++ b/drowse/geometry/fold.py @@ -7,7 +7,8 @@ neutral-anchored one-pole ray (a derived direction: a merge, a ``~``/``|`` projection, a registered profile read as a probe); - :func:`is_foldable_vector_manifold` / :func:`folded_directions` read a - fitted ray back as per-layer directions (``δ̂_L · share_L``); + fitted ray back as per-layer directions (its write row scaled to + ``‖·‖_M = share_L``); - :func:`project_profile` is the LEACE ``~``/``|`` projection of one direction profile against another in the Mahalanobis metric. """ @@ -46,16 +47,18 @@ def fold_directions_to_subspace( pole centroids, a derived direction (a ``merge`` linear-combination, a `~`/`|` projection of one concept onto another) has no pole pair — just a direction to push along. - So the subspace is neutral-anchored at ``mean = P_basis(ν_L) = (ν_L·d̂)d̂`` - (the neutral mean projected into the 1-D span, §5) with a single ``+`` pole - node; steering ``along`` toward the pole pushes the running activation's - ``d̂`` component away from neutral, and ``!`` (``along``-to-coord-0) slides - it back to neutral, i.e. ablates the direction. - - Per layer: ``basis = d̂_L``; ``LayerSubspace.node_coords = [[‖d_L‖]]`` — - the real coord of the pole, a step of ``‖d_L‖`` along ``d̂`` from the - neutral origin (coord 0). ``share = ‖d_L‖_M``: the whitened direction - magnitude itself is the budget (a single + The direction is a write vector: the ray writes along ``d`` and reads + with its covector ``Σ⁻¹d``, in a Mahalanobis-unit frame + (``basis = d/‖d‖_M``, ``read = Σ⁻¹d/‖d‖_M``). So the subspace is + neutral-anchored at ``mean = P_basis(ν_L) = (ν_L·read)·basis`` (the + neutral mean projected into the 1-D span, §5) with a single ``+`` pole + node; steering ``along`` toward the pole pushes the running activation + along ``d`` away from neutral, and ``!`` (``along``-to-coord-0) slides its + ``Σ⁻¹d`` reading back to neutral, i.e. LEACE-erases the direction. + + Per layer: ``LayerSubspace.node_coords = [[‖d_L‖_M]]`` — the real coord + of the pole, so the pole sits exactly at ``ν + d`` in the span. + ``share = ‖d_L‖_M``: the whitened direction magnitude itself is the budget (a single direction has no node cloud to take a μ-centered spread over, so this is *not* :func:`~drowse.geometry.subspace.subspace_share`'s √2-scaled form; the apply-time normalization handles the cross-layer scale). No @@ -90,19 +93,25 @@ def fold_directions_to_subspace( mahalanobis_share: dict[int, float] = {} for idx in present: d = directions[idx].to(torch.float32).reshape(-1) - norm = float(d.norm()) - if norm <= 1e-12: + if float(d.norm()) <= 1e-12: + continue + sinv_d = whitener.apply_inv(idx, d).to(device=d.device, dtype=torch.float32) + norm_m = float((d @ sinv_d).clamp_min(0.0).sqrt()) + if norm_m <= 1e-12: continue - basis = (d / norm).reshape(1, -1) # (1, D) unit d̂ + basis = (d / norm_m).reshape(1, -1) # (1, D) Mahalanobis-unit write + read = (sinv_d / norm_m).reshape(1, -1) # (1, D) its dual read nu = neutral_means[idx].to( device=d.device, dtype=torch.float32, ).reshape(-1) # Neutral-anchored: mean = P_basis(ν) (off-span part of ν dropped); - # the pole sits at the real coord ‖d‖ along d̂ from the origin. - mean = (nu @ basis.T) @ basis - node_coords_L = torch.tensor([[norm]], dtype=torch.float32, device=d.device) - layers[idx] = LayerSubspace.affine(mean, basis, node_coords=node_coords_L) - mahalanobis_share[idx] = float(whitener.mahalanobis_norm(idx, d)) + # the pole sits at the real coord ‖d‖_M from the origin, i.e. at ν + d. + mean = (nu @ read.T) @ basis + node_coords_L = torch.tensor([[norm_m]], dtype=torch.float32, device=d.device) + layers[idx] = LayerSubspace.affine( + mean, basis, read, node_coords=node_coords_L, + ) + mahalanobis_share[idx] = norm_m if not layers: raise ValueError("cannot fold a direction profile containing only zero vectors") @@ -148,12 +157,14 @@ def is_foldable_vector_manifold(manifold: Manifold) -> bool: def folded_directions(manifold: Manifold) -> dict[int, torch.Tensor]: """Direction view of a folded (affine ``R = 1``) vector manifold. - Returns ``{L: δ̂_L · share_L}`` — each layer's unit direction scaled by its - Mahalanobis share — the in-memory steering-vector shape behind - ``extract()``'s :class:`Profile`, ``manifold compare``/``why``, ``merge``, - and GGUF export. The manifold stays the only stored artifact. Exact for - scale-invariant reads (per-layer and aggregate cosine); proportional for - cross-concept magnitude. + Returns ``{L: basis_L · share_L}`` — each layer's Mahalanobis-unit write + row (a fitted ray's difference-of-means direction ``δ``) scaled so its + Mahalanobis norm is the layer's share — the in-memory steering-vector + shape behind ``extract()``'s :class:`Profile`, ``manifold + compare``/``why``, ``merge``, and GGUF export. The manifold stays the only + stored artifact. Exact for scale-invariant reads (per-layer and aggregate + cosine); proportional for cross-concept magnitude, and proportional to the + per-layer displacement drowse's injection writes. Raises :class:`ValueError` on a curved or multi-dim manifold — the single-direction view is only meaningful for an ``R = 1`` ray. diff --git a/drowse/geometry/inject.py b/drowse/geometry/inject.py index 599cb0fd1..f21c3fc2a 100644 --- a/drowse/geometry/inject.py +++ b/drowse/geometry/inject.py @@ -21,7 +21,7 @@ from drowse.geometry.domains import ManifoldDomain from drowse.geometry.invert import DEFAULT_INVERSION_DAMPING, _gn_step from drowse.geometry.rbf import eval_rbf, eval_rbf_jet -from drowse.geometry.subspace import LayerSubspace +from drowse.geometry.subspace import LayerSubspace, dual_read if TYPE_CHECKING: from drowse.geometry.whitener import LayerWhitener @@ -33,18 +33,23 @@ _ROTATE_EPSILON: float = 1e-6 -def _ortho_basis( - rows: torch.Tensor, *, eps: float = 1e-6, -) -> tuple[torch.Tensor, list[int]]: - """Ordered Gram-Schmidt orthonormalization of ``rows`` ``(N, D)``. - - Processes rows in order; each is unit-normalized first (a basis of the - *span* — magnitudes are irrelevant), and a row whose residual after - removing its projection onto the accepted rows falls below ``eps`` is - dropped (collinear / duplicate directions add no axis). Unit space makes - ``eps`` a scale-free tolerance (fp32 leaves ~1e-7 on a truly parallel - row). Returns ``(B, kept)``: the ``(R, D)`` orthonormal basis on the input - device and the indices of the rows that became axes, in order. +def _ortho_frame( + rows: torch.Tensor, reads: torch.Tensor, *, eps: float = 1e-6, +) -> tuple[torch.Tensor, torch.Tensor, list[int]]: + """Ordered Gram-Schmidt of write ``rows`` in the metric their ``reads`` define. + + ``rows`` ``(N, D)`` are write vectors and ``reads`` ``(N, D)`` the metric's + image of each (``Σ⁻¹`` of the row), so ``⟨u, v⟩_M = u · read(v)``: the + Mahalanobis inner product without a ``D × D`` matrix. Every operation + applied to a row is applied to its read, so the result stays dual. Rows + are processed in order; each is unit-normalized first (a basis of the + *span*: magnitudes are irrelevant), and a row whose residual after removing + its projection onto the accepted rows falls below ``eps`` is dropped + (collinear / duplicate directions add no axis). Unit space makes ``eps`` + scale-free. Returns ``(B, P, kept)``: the ``(R, D)`` orthonormal write + rows, their dual read rows (``P Bᵀ = I``) on the input device, and the + indices of the rows that became axes, in order. ``reads = rows`` is the + Euclidean case. Ordering is load-bearing for :func:`synthesize_subspace`: push rows before ablation rows keep the push displacement inside the earlier axes, so the @@ -54,25 +59,33 @@ def _ortho_basis( """ device = rows.device work = rows.detach().to(device="cpu", dtype=torch.float32) - accepted: list[torch.Tensor] = [] + work_r = reads.detach().to(device="cpu", dtype=torch.float32) + accepted: list[tuple[torch.Tensor, torch.Tensor]] = [] kept: list[int] = [] - for i, d in enumerate(work): - dn = float(torch.linalg.vector_norm(d)) - if dn < 1e-12: # exact-zero input — no direction + for i in range(int(work.shape[0])): + b, r = work[i], work_r[i] + n2 = float(b @ r) + if n2 < 1e-24: # exact-zero input — no direction continue - v = d / dn - for b in accepted: - v = v - (v @ b) * b - nv = float(torch.linalg.vector_norm(v)) - if nv < eps: # collinear with an accepted row + n = math.sqrt(n2) + b, r = b / n, r / n + for ab, ar in accepted: + c = ar @ b # ⟨accepted, b⟩_M + b = b - c * ab + r = r - c * ar + n2 = float(b @ r) + if n2 < eps * eps: # collinear with an accepted row continue - accepted.append(v / nv) + n = math.sqrt(n2) + accepted.append((b / n, r / n)) kept.append(i) - basis = ( - torch.stack(accepted) if accepted - else work.new_zeros((0, work.shape[-1])) - ) - return basis.to(device), kept + if accepted: + basis = torch.stack([b for b, _r in accepted]) + read = dual_read(basis, torch.stack([r for _b, r in accepted])) + else: + basis = work.new_zeros((0, work.shape[-1])) + read = work.new_zeros((0, work.shape[-1])) + return basis.to(device), read.to(device), kept @dataclass @@ -88,7 +101,8 @@ class SynthesizedSubspace: collide at shared layers, ``OverlappingManifoldError``). Per layer the subspace spans the union of every active term's directions - (push + ablation). The ``along`` step **translates** the foot by the + (push + ablation), as a Mahalanobis-orthonormal frame: write rows + ``basis`` and their dual ``read`` rows. The ``along`` step **translates** the foot by the ``target_coord`` offset on each *push* axis (preserving the per-token spread → coherent strong steer) and **collapses** the foot toward ``0`` on each *ablation* axis (removing the requested fraction of that component). @@ -109,7 +123,7 @@ class SynthesizedSubspace: non-degenerate active direction (and present in ``neutral_means``) appear. """ - layers: dict[int, "LayerSubspace"] # affine: mean = neutral_L, basis = ortho span + layers: dict[int, "LayerSubspace"] # affine: mean = neutral_L, M-orthonormal frame target_coord: dict[int, torch.Tensor] # (R_L,) the along target (poles / 0) share: dict[int, float] # ‖Δ_L‖, un-normalized budget weight kappa: dict[int, torch.Tensor] = field( # (R_L,) per-axis requested ablation coefficient @@ -133,7 +147,7 @@ def __post_init__(self) -> None: # with one host read per device, not several per layer. (They avoid # ``torch.cat``: the MPS Metal blit path can segfault on the mixed # view/stride shapes dispatch-time synthesis produces.) - not_orthonormal: dict[torch.device, torch.Tensor] = {} + not_dual: dict[torch.device, torch.Tensor] = {} not_finite: dict[torch.device, torch.Tensor] = {} for layer, sub in self.layers.items(): if not sub.is_affine: @@ -146,6 +160,8 @@ def __post_init__(self) -> None: dim = int(sub.basis.shape[1]) if sub.mean.shape != (dim,): raise ValueError("synthesized mean width must match basis width") + if sub.read.shape != sub.basis.shape: + raise ValueError("synthesized read rows must have the basis shape") if sub.coord_offset.shape != (rank,) or sub.coord_scale.shape != (rank,): raise ValueError( "synthesized coord_offset/coord_scale must have shape (R,)" @@ -177,28 +193,33 @@ def __post_init__(self) -> None: "SynthesizedSubspace shares must be finite and positive" ) device = sub.basis.device - gram = sub.basis @ sub.basis.T + # The kernel's invariant is duality (``read @ basisᵀ = I``): reads + # recover the coordinates the basis writes. Mahalanobis + # orthonormality is the synthesizer's construction, not checkable + # here without ``Σ``. + gram = sub.read @ sub.basis.T identity = torch.eye(rank, dtype=gram.dtype, device=device) - bad_gram = ~torch.isclose(gram, identity, atol=1e-5, rtol=1e-5).all() + bad_gram = ~torch.isclose(gram, identity, atol=1e-3, rtol=1e-3).all() bad_values = ~( torch.isfinite(sub.mean).all() & torch.isfinite(sub.basis).all() + & torch.isfinite(sub.read).all() & torch.isfinite(self.target_coord[layer]).all().to(device) & torch.isfinite(self.kappa[layer]).all().to(device) ) - not_orthonormal[device] = ( - bad_gram if device not in not_orthonormal - else not_orthonormal[device] | bad_gram + not_dual[device] = ( + bad_gram if device not in not_dual + else not_dual[device] | bad_gram ) not_finite[device] = ( bad_values if device not in not_finite else not_finite[device] | bad_values ) - for device, bad_gram in not_orthonormal.items(): + for device, bad_gram in not_dual.items(): # One host read per device encodes both flags. flags = int((bad_gram.to(torch.uint8) * 2 + not_finite[device].to(torch.uint8)).item()) if flags & 2: - raise ValueError("synthesized basis rows must be orthonormal") + raise ValueError("synthesized read rows must be dual to the basis") if flags & 1: raise ValueError("SynthesizedSubspace tensors must be finite") @@ -219,7 +240,7 @@ def synthesize_subspace( Each **push** term is an affine subspace fragment ``(basis_rows, coord_target, coeff)``: - - ``basis_rows`` — per-layer ``(R_i, D)`` orthonormal rows (a steering + - ``basis_rows`` — per-layer ``(R_i, D)`` write rows (a steering *vector* is rank-1, ``(1, D)``; ``personas%pirate`` is rank-8, ``(8, D)``). - ``coord_target`` — per-layer ``(R_i,)`` target position *in that fragment's own basis* (a pole / node coordinate, origin-relative). @@ -230,18 +251,23 @@ def synthesize_subspace( is the origin (``0``). ``neutral_means`` supplies each layer's anchor (``mean``); it must cover every participating layer. - Per layer (over the union of layers any term touches): + Per layer (over the union of layers any term touches), all in the + Mahalanobis metric (one batched Woodbury ``Σ⁻¹`` over the layer's rows, + then :func:`_ortho_frame` on write/read pairs): - Orthonormalize the push span, project ablation directions out of it (push wins a shared direction), and build the reduced symmetric ablation operator ``A = Σ coeffᵢ uᵢuᵢᵀ`` on the remaining span. Diagonalizing ``A`` gives an orthonormal ablation basis and one exact collapse coefficient per axis, including partial, repeated, and negative terms. + An ablation axis writes along the direction and reads with its ``Σ⁻¹`` + covector, so a full ``!`` is LEACE against the neutral mean. - World push displacement ``Δ = Σ_push coeffᵢ·(coord_targetᵢ @ basis_rowsᵢ)`` — each fragment's own ``(R_i,) @ (R_i, D) = (D,)`` world vector, scaled by - its coeff. ``target = B @ Δ`` is its coordinate in the merged basis. - Because ``Δ`` lives in the push span and the ablation-only axes are its - orthogonal complement, those axes get ``target ≈ 0``. + its coeff. ``target = P @ Δ`` (the merged read rows) is its coordinate + in the merged frame. Because ``Δ`` lives in the push span and the + ablation-only axes are its Mahalanobis-orthogonal complement, those axes + get ``target ≈ 0``. - Per-axis ``kappa`` ``(R,)`` — ``0`` on the push span and the eigenvalues of ``A`` on the ablation-only complement. The apply path gain-compensates these coefficients before the kernel evaluates @@ -252,13 +278,13 @@ def synthesize_subspace( **Whitened normalization (Mahalanobis-only).** ``whitener`` is required and must cover every synthesized layer; the push is normalized in the Mahalanobis - metric ``M_R = B Σ⁻¹ Bᵀ`` (the engine-wide read/fit metric): + metric (the engine-wide read/fit metric): - ``share = ‖Δ‖_M`` (whitened displacement) — the cross-layer profile weights by *whitened* signal, matching the baked ``mahalanobis_share`` rather than the raw activation distance. - - ``target = (B @ Δ) / ‖Δ‖_M`` — a **whitened-unit** direction (``‖B@target‖_M - = 1``), so the apply path's ``eff_along_L = mean1(share)·gain`` puts the same + - ``target = (P @ Δ) / ‖Δ‖_M`` — a **whitened-unit** coordinate + (``‖target‖ = ‖target @ B‖_M = 1``), so the apply path's ``eff_along_L = mean1(share)·gain`` puts the same *whitened* slide on every target. The push still aims at the node centroid (whitening a direction toward a fixed point is metric-invariant — only the calibration changes), it is just measured in std-units instead of the @@ -306,7 +332,9 @@ def _cpu(t: torch.Tensor) -> torch.Tensor: target_coord: dict[int, torch.Tensor] = {} share: dict[int, float] = {} kappa: dict[int, torch.Tensor] = {} - finished: list[tuple[int, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]] = [] + finished: list[ + tuple[int, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor] + ] = [] for L in present_layers: # Every fragment is co-located on CPU: fitted manifolds follow the @@ -360,25 +388,31 @@ def _cpu(t: torch.Tensor) -> torch.Tensor: raw_delta = zeros for cf, wd in push_frags: raw_delta = raw_delta + cf * wd - # One batched Woodbury apply for every Mahalanobis norm this layer - # needs: the ablation rows, each push world direction, and the raw - # coeff-weighted push displacement (last row). - m_norms = whitener.mahalanobis_norms(L, torch.stack( - [row for _cf, row in ablate_rows] - + [wd for _cf, wd in push_frags] - + [raw_delta] - )).tolist() + # One batched Woodbury apply for every Σ⁻¹ this layer needs: the push + # rows (their reads), the ablation rows, each push world direction and + # the raw coeff-weighted push displacement (last row). Mahalanobis + # norms are ``sqrt(v · Σ⁻¹v)`` of the same rows. + n_push_rows = sum(int(block.shape[0]) for block in push_blocks) n_ab = len(ablate_rows) - frag_norms = m_norms[n_ab:n_ab + len(push_frags)] + stacked = torch.cat( + push_blocks + + [row.reshape(1, -1) for _cf, row in ablate_rows] + + [wd.reshape(1, -1) for _cf, wd in push_frags] + + [raw_delta.reshape(1, -1)] + ) + sinv = whitener.apply_inv(L, stacked) + m_norms = (stacked * sinv).sum(dim=-1).clamp_min(0.0).sqrt().tolist() + push_rows, push_reads = stacked[:n_push_rows], sinv[:n_push_rows] + ab_rows = stacked[n_push_rows:n_push_rows + n_ab] + ab_reads = sinv[n_push_rows:n_push_rows + n_ab] + ab_norms = m_norms[n_push_rows:n_push_rows + n_ab] + frag_norms = m_norms[n_push_rows + n_ab:n_push_rows + n_ab + len(push_frags)] # A strictly positive proxy is sufficient for a pure-ablation share: # hook-time gain compensation cancels share from the ablation amount. ablate_share = sum( - abs(cf) * max(m_norms[i], eps) for i, (cf, _row) in enumerate(ablate_rows) + abs(cf) * max(ab_norms[i], eps) for i, (cf, _row) in enumerate(ablate_rows) ) - ablate_frags = [ - (cf, row / float(torch.linalg.vector_norm(row))) for cf, row in ablate_rows - ] # The active push target in world coordinates. If all pushes cancel, # they must not suppress an ablation on the same axis. @@ -389,41 +423,51 @@ def _cpu(t: torch.Tensor) -> torch.Tensor: has_push = float(torch.linalg.vector_norm(world_target)) >= eps if has_push: - B_push, _ = _ortho_basis(torch.cat(push_blocks)) + B_push, P_push, _ = _ortho_frame(push_rows, push_reads) else: - B_push = zeros.new_zeros((0, width)) + B_push = P_push = zeros.new_zeros((0, width)) # Push wins shared directions. The remaining ablation operator is # diagonalized in its own small span so coefficients survive exactly; - # a per-axis mask cannot represent unequal non-orthogonal terms. - projected_ablate: list[tuple[float, torch.Tensor]] = [] - for coeff_f, unit in ablate_frags: - residual = unit + # a per-axis mask cannot represent unequal non-orthogonal terms. Each + # ablation row is Mahalanobis-unit, and its push-span component is + # removed Mahalanobis-orthogonally (coefficients ``P_push @ u``). + projected_ablate: list[tuple[float, torch.Tensor, torch.Tensor]] = [] + for i, (coeff_f, _row) in enumerate(ablate_rows): + norm_i = ab_norms[i] + if norm_i < eps: + continue + residual, residual_read = ab_rows[i] / norm_i, ab_reads[i] / norm_i if B_push.shape[0]: - residual = residual - (residual @ B_push.T) @ B_push - rn = float(torch.linalg.vector_norm(residual)) + coef = P_push @ residual + residual = residual - coef @ B_push + residual_read = residual_read - coef @ P_push + rn = math.sqrt(max(float(residual @ residual_read), 0.0)) if rn >= eps: - projected_ablate.append((coeff_f, residual / rn)) + projected_ablate.append((coeff_f, residual / rn, residual_read / rn)) - B_ab = zeros.new_zeros((0, width)) + B_ab = P_ab = zeros.new_zeros((0, width)) ablate_eigenvalues = zeros.new_zeros((0,)) if projected_ablate: - B_ab_span, _ = _ortho_basis( - torch.stack([row for _cf, row in projected_ablate]), + B_ab_span, P_ab_span, _ = _ortho_frame( + torch.stack([row for _cf, row, _read in projected_ablate]), + torch.stack([read for _cf, _row, read in projected_ablate]), ) reduced = B_ab_span.new_zeros((B_ab_span.shape[0], B_ab_span.shape[0])) - for coeff_f, row in projected_ablate: - coord = B_ab_span @ row + for coeff_f, row, _read in projected_ablate: + coord = P_ab_span @ row reduced = reduced + coeff_f * torch.outer(coord, coord) eigenvalues, eigenvectors = torch.linalg.eigh(reduced) keep = eigenvalues.abs() >= eps if bool(keep.any()): ablate_eigenvalues = eigenvalues[keep] B_ab = eigenvectors[:, keep].T @ B_ab_span + P_ab = eigenvectors[:, keep].T @ P_ab_span if B_push.shape[0] == 0 and B_ab.shape[0] == 0: continue basis = torch.cat((B_push, B_ab), dim=0) + read = torch.cat((P_push, P_ab), dim=0) if has_push: # The (whitened) raw displacement magnitude is the per-layer @@ -432,34 +476,40 @@ def _cpu(t: torch.Tensor) -> torch.Tensor: share_L = m_norms[-1] if share_L < eps: share_L = sum(abs(cf) * wn for (cf, _wd), wn in zip(push_frags, frag_norms)) - target = basis @ world_target # ablation axes ≈ 0 + target = read @ world_target # ablation axes ≈ 0 else: share_L = ablate_share target = basis.new_zeros(basis.shape[0]) if share_L < eps: continue axis_kappa = torch.cat((basis.new_zeros(B_push.shape[0]), ablate_eigenvalues)) - finished.append((L, neutral, basis, target, axis_kappa)) + finished.append((L, neutral, basis, read, target, axis_kappa)) share[L] = float(share_L) # One host→device transfer per device: pack every finished layer's - # (basis, target, kappa) into a flat CPU buffer and slice views back out. - by_device: dict[torch.device, list[tuple[int, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]]] = {} + # (basis, read, target, kappa) into a flat CPU buffer and slice views back out. + by_device: dict[ + torch.device, + list[tuple[int, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]], + ] = {} for item in finished: by_device.setdefault(item[1].device, []).append(item) for device, items in by_device.items(): packed = torch.cat([ - torch.cat((basis.reshape(-1), target, axis_kappa)) - for _L, _neutral, basis, target, axis_kappa in items + torch.cat((basis.reshape(-1), read.reshape(-1), target, axis_kappa)) + for _L, _neutral, basis, read, target, axis_kappa in items ]).to(device) offset = 0 - for L, neutral, basis, target, axis_kappa in items: + for L, neutral, basis, read, target, axis_kappa in items: rank, width = basis.shape span = rank * width + frame_basis = packed[offset:offset + span].view(rank, width) + offset += span + frame_read = packed[offset:offset + span].view(rank, width) + offset += span layers[L] = LayerSubspace.affine( - mean=neutral, basis=packed[offset:offset + span].view(rank, width), + mean=neutral, basis=frame_basis, read=frame_read, ) - offset += span target_coord[L] = packed[offset:offset + rank] offset += rank kappa[L] = packed[offset:offset + rank] @@ -701,15 +751,17 @@ def subspace_inject( fills its subspace (``H_n ≈ 0``, every affine term). The off-*subspace* residual ``H_o`` is **always kept verbatim**. That is the - composition invariant: ``H_o`` is the orthogonal complement of *this* - subspace, i.e. every composing neighbor's span, so touching it would couple - otherwise-orthogonal terms. ``~``/``|`` semantics live inside the subspace - instead, as push/ablation axes of the merged affine basis. - - All subspace arithmetic runs in **reduced (R-dim) coordinates**; because - ``basis`` is orthonormal, ``‖H_n_reduced‖ = ‖H_n‖`` exactly, so the - transport's norm-preservation holds and the cost is ``O(R)`` not ``O(D)``. - fp32 throughout (fp16 sum-of-squares overflows at large ``D``). + composition invariant: ``H_o`` is the Mahalanobis-orthogonal complement of + *this* subspace, i.e. every composing neighbor's span, so touching it would + couple otherwise-orthogonal terms. ``~``/``|`` semantics live inside the + subspace instead, as push/ablation axes of the merged affine basis. + + All subspace arithmetic runs in **reduced (R-dim) coordinates**: ``read`` + rows read them and ``basis`` rows write them back. The frame is + Mahalanobis-orthonormal, so ``‖H_n_reduced‖ = ‖H_n‖_M`` exactly, the + transport's norm-preservation holds in that metric, and the cost is + ``O(R)`` not ``O(D)``. fp32 throughout (fp16 sum-of-squares overflows at + large ``D``). ``foot_seed`` ``(.., n)`` is the warm start for the nearest-point foot — the previous token's foot on the hot path, refined by ``gn_steps`` shared @@ -726,30 +778,32 @@ def subspace_inject( """ h_f32 = h.to(torch.float32) mean = subspace.mean.to(torch.float32) # (D,) - basis = subspace.basis.to(torch.float32) # (R, D) + basis = subspace.basis.to(torch.float32) # (R, D) write rows + read = subspace.read.to(torch.float32) # (R, D) read rows target = target_coord.to(device=h_f32.device, dtype=torch.float32) if subspace.is_affine: # --- flat (folded-vector) shortcut -------------------------------- # The surface fills the subspace, so the injected target is already in - # the layer's orthonormal reduced frame: the foot is ``q`` exactly, + # the layer's reduced frame: the foot is ``q`` exactly, # ``H_n ≡ 0`` and ``onto`` is vacuous (ignored). Ordinary fits have an # identity authoring→reduced map; rectangular transfers bake their # explicit map into the resolved per-layer target before this kernel. # No GN solve, no RBF eval, no tangent Gram-solve — the cost the common # steering case can't pay. # - # ``q = (h − mean)·basisᵀ = h·basisᵀ − mean·basisᵀ`` is computed + # ``q = (h − mean)·readᵀ = h·readᵀ − mean·readᵀ`` is computed # **without** the full-width ``centered = h − mean`` temporary: the - # ``(R,)`` ``mean_proj = mean·basisᵀ`` is a tiny reduced-space constant + # ``(R,)`` ``mean_proj = mean·readᵀ`` is a tiny reduced-space constant # (one dot product at R=1). Hot callers (the single-affine fast hook) # precompute it once at ``recompose`` and thread it in; everyone else - # gets the inline ``mean @ basis.T``. ALONG translates ``q`` by the - # fixed offset ``along·target``; the off-subspace residual ``H_o`` is - # kept verbatim (``h_new = h + Δ·basis`` is a fresh tensor, never an + # gets the inline ``mean @ read.T``. ALONG translates ``q`` by the + # fixed offset ``along·target``; the off-subspace residual ``H_o`` (the + # Mahalanobis-orthogonal complement, ``(I − basisᵀ read)(h − mean)``) + # is kept verbatim (``h_new = h + Δ·basis`` is a fresh tensor, never an # in-place mutation of ``h``). - mp = mean_proj if mean_proj is not None else (mean @ basis.T) # (R,) - q = h_f32 @ basis.T - mp # (.., R) + mp = mean_proj if mean_proj is not None else (mean @ read.T) # (R,) + q = h_f32 @ read.T - mp # (.., R) # Per-axis κ-blend of the foot toward ``target`` (``origin`` is span-coord # 0 in the ν-anchored affine frame; an affine fit is always on the flat # ``CustomDomain`` — identity clamp — so this analytic is exact): @@ -779,10 +833,12 @@ def subspace_inject( return h_new, q # Reduced coords of ``h`` without a full-width ``h − mean`` temporary: the - # basis is orthonormal, so ``q = h·Bᵀ − mean·Bᵀ`` and the whole update is - # one reduced displacement ``δ`` added back as ``h + δ·B``. - mp = mean_proj if mean_proj is not None else (mean @ basis.T) # (R,) - q = h_f32 @ basis.T - mp # (.., R) + # read rows are dual to the basis, so ``q = h·Pᵀ − mean·Pᵀ`` and the whole + # update is one reduced displacement ``δ`` added back as ``h + δ·B``. + # Reduced coordinates are Mahalanobis-orthonormal, so the foot solve, + # the residual transport and the σ-tube below all measure in that metric. + mp = mean_proj if mean_proj is not None else (mean @ read.T) # (R,) + q = h_f32 @ read.T - mp # (.., R) np_, rw, pc = subspace.rbf_params() np_ = np_.to(torch.float32) @@ -845,14 +901,17 @@ def subspace_inject( # The off-subspace residual ``H_o`` rides ``h`` untouched: it is every # composing neighbor's span, so only the in-subspace displacement is added. delta = foot_new_red + Hn_final - q # (.., R) - # Soft cap ``‖h_new‖ ≤ norm_cap·‖h‖`` against off-domain RBF extrapolation, - # with ``‖h + δ·B‖² = ‖h‖² + 2 (q + mp)·δ + ‖δ‖²`` evaluated in reduced - # space (orthonormal ``B``): one full-width reduction, one full-width write. + # Soft cap ``‖h_new‖ ≤ norm_cap·‖h‖`` against off-domain RBF extrapolation: + # a guard on the raw residual norm, so Euclidean. ``‖h + δ·B‖² = ‖h‖² + # + 2 (h·Bᵀ)·δ + δ (B Bᵀ) δᵀ`` evaluated in reduced space (the frame is + # Mahalanobis-, not Euclidean-orthonormal, hence the ``B Bᵀ`` Gram): one + # full-width reduction and one ``R``-wide product, one full-width write. norm_pre = torch.linalg.vector_norm(h_f32, dim=-1, keepdim=True) # (.., 1) + h_on_basis = h_f32 @ basis.T # (.., R) norm_post_sq = ( norm_pre * norm_pre - + 2.0 * ((q + mp) * delta).sum(dim=-1, keepdim=True) - + (delta * delta).sum(dim=-1, keepdim=True) + + 2.0 * (h_on_basis * delta).sum(dim=-1, keepdim=True) + + ((delta @ (basis @ basis.T)) * delta).sum(dim=-1, keepdim=True) ) cap = _soft_norm_cap_scale(norm_pre, norm_post_sq, norm_cap) # (.., 1) h_new = (delta @ basis).add_(h_f32).mul_(cap) # (.., D) diff --git a/drowse/geometry/invert.py b/drowse/geometry/invert.py index 6d865845d..44809f633 100644 --- a/drowse/geometry/invert.py +++ b/drowse/geometry/invert.py @@ -261,7 +261,7 @@ def neutral_origin( f"neutral mean has shape {tuple(mean.shape)}, expected " f"{tuple(sub.mean.shape)}" ) - query = (mean - sub.mean) @ sub.basis.T + query = (mean - sub.mean) @ sub.read.T origin, _distance = invert_parameterization( sub, domain, query, node_coords.to(device="cpu", dtype=torch.float32), ) diff --git a/drowse/geometry/manifold.py b/drowse/geometry/manifold.py index 294a15e97..364da3610 100644 --- a/drowse/geometry/manifold.py +++ b/drowse/geometry/manifold.py @@ -28,8 +28,10 @@ # Numerical fitting semantics are independent of the folder/tensor wire # format. Bump this whenever PCA/Fisher selection, topology choice, RBF/sigma -# fitting, DLS, or share allocation changes incompatibly. -MANIFOLD_FIT_POLICY_VERSION = 1 +# fitting, DLS, or share allocation changes incompatibly. 2: typed frames — +# write rows are vectors (Mahalanobis-orthonormal), with their dual read rows +# stored beside them. +MANIFOLD_FIT_POLICY_VERSION = 2 class _OmittedNodeRoster(list[str | None]): diff --git a/drowse/geometry/subspace.py b/drowse/geometry/subspace.py index b75c27df5..acfa88c90 100644 --- a/drowse/geometry/subspace.py +++ b/drowse/geometry/subspace.py @@ -1,10 +1,21 @@ """Per-layer manifold subspaces and the fits that produce them. -A :class:`LayerSubspace` is one layer's frame: an affine PCA subspace of the -activation space (``mean`` + orthonormal ``basis`` rows), optionally carrying -an RBF surface from the manifold's embedded domain coordinates into that -subspace's reduced coordinates (a curved fit), and optionally a -fuzzy-manifold sigma field (the within-node tube thickness). +A :class:`LayerSubspace` is one layer's frame: an affine subspace of the +activation space (``mean`` + ``basis`` write rows + their dual ``read`` rows), +optionally carrying an RBF surface from the manifold's embedded domain +coordinates into that subspace's reduced coordinates (a curved fit), and +optionally a fuzzy-manifold sigma field (the within-node tube thickness). + +**Writes and reads are typed.** ``basis`` rows are activation-space +*vectors*: a reduced coordinate ``c`` writes ``c @ basis`` into the residual +stream. ``read`` rows are the dual *covectors*: ``(h − mean) @ readᵀ`` reads +``h``'s reduced coordinate. A fitted frame is Mahalanobis-orthonormal +(``basis Σ⁻¹ basisᵀ = I``) with ``read = basis Σ⁻¹``, so ``read @ basisᵀ = I``, +``basisᵀ read`` is the Mahalanobis-orthogonal projector onto the span, and +every reduced-coordinate norm is a Mahalanobis norm. A two-node fit writes +along the difference of means ``δ`` and reads with the LDA covector ``Σ⁻¹δ``; +ablating its axis is LEACE. Without a whitener (tests, the behavior-space fit) +the frame is Euclidean-orthonormal and ``read == basis``. The two fits share the basis selection (:func:`pca_basis`, whitened/Fisher when a covering whitener is supplied) and the neutral-anchored frame; only @@ -43,8 +54,10 @@ class LayerSubspace: """Per-layer reduced frame and RBF interpolant for one manifold. - ``mean`` and ``basis`` define an affine PCA subspace of the - activation space; ``node_params`` / ``rbf_weights`` / ``poly_coeffs`` + ``mean`` and ``basis`` define an affine subspace of the activation space + (``basis`` rows are the write vectors, ``read`` rows their dual covectors, + ``read @ basisᵀ = I``; see the module docstring); ``node_params`` / + ``rbf_weights`` / ``poly_coeffs`` define the ``r**3`` RBF interpolant from the manifold's embedded domain coordinates to that subspace's reduced coordinates. ``coord_offset`` / ``coord_scale`` carry the unit-box normalization @@ -57,7 +70,7 @@ class LayerSubspace: ``n = R``). Ordinary fits use the identity authoring→reduced map; rectangular cross-model transfers may carry an explicit ``affine_map`` so ``manifold_point(c) = mean + c @ affine_map @ basis`` while ``basis`` stays - orthonormal. The + Mahalanobis-orthonormal. The affine case has ``H_n ≡ 0`` (the surface fills its subspace), so ``subspace_inject`` takes an analytic shortcut that skips the Gauss-Newton foot solve, the RBF eval, and the tangent Gram-solve — @@ -67,8 +80,9 @@ class LayerSubspace: :attr:`is_affine`. """ - mean: torch.Tensor # (D,) centering mean over the node centroids - basis: torch.Tensor # (R, D) orthonormal PCA rows + mean: torch.Tensor # (D,) the anchor's projection into the span + basis: torch.Tensor # (R, D) write rows (vectors), M-orthonormal + read: torch.Tensor # (R, D) read rows (covectors), read @ basisᵀ = I node_params: torch.Tensor | None # (K, m) normalized embedded coords; None = affine rbf_weights: torch.Tensor | None # (K, R) RBF weights; None = affine poly_coeffs: torch.Tensor | None # (m+1, R) affine polynomial coeffs; None = affine @@ -76,7 +90,7 @@ class LayerSubspace: coord_scale: torch.Tensor # (m,) unit-box normalization scale node_coords: torch.Tensor | None = None # (K, R) per-layer **real, neutral-anchored** reduced node coordinates - # ``(c_i − ν*)·basisᵀ`` — affine (flat) subspaces only; ``None`` on a + # ``(c_i − ν*)·readᵀ`` — affine (flat) subspaces only; ``None`` on a # curved subspace (which carries the shared ``Manifold.node_coords`` + # RBF instead). This is the per-layer steer target source: a flat # subspace's pole / node sits at distance ∝ ‖δ_L‖ from the neutral @@ -86,9 +100,9 @@ class LayerSubspace: affine_map: torch.Tensor | None = None # (m, R) authoring-to-reduced coordinate map for affine subspaces. ``None`` # is the canonical identity map (m == R). Cross-model transfer may need a - # non-isometric map after orthonormalizing a rectangular mapped basis; this - # explicit factor preserves the exact world surface without weakening the - # runtime's orthonormal-basis invariant. + # non-isometric map after re-orthonormalizing a mapped basis in the target + # metric; this explicit factor preserves the exact world surface without + # weakening the runtime's orthonormal-frame invariant. sigma_rbf_weights: torch.Tensor | None = None sigma_poly_coeffs: torch.Tensor | None = None # The **fuzzy-manifold σ-field** (raw curved subspaces only). A separate @@ -131,6 +145,20 @@ def validate_structure( rank, dim = self.basis.shape if self.mean.shape[0] != dim: raise ValueError("LayerSubspace mean dimension must match basis width") + if self.read.shape != self.basis.shape: + raise ValueError("LayerSubspace read rows must have the basis shape (R, D)") + # Duality is the frame's structural invariant (reads recover the + # coordinates the basis writes). Non-finite values are a different + # corruption, rejected by the finiteness guards at load and export. + biorth = self.read.to(torch.float32) @ self.basis.to(torch.float32).T + error = ( + biorth - torch.eye(rank, dtype=biorth.dtype, device=biorth.device) + ).abs().max() + if bool(torch.isfinite(error)) and float(error) > 1e-3: + raise ValueError( + "LayerSubspace read rows must be dual to its basis " + f"(max |read·basisᵀ − I| = {float(error):.3g})" + ) if self.coord_offset.ndim != 1 or self.coord_scale.ndim != 1: raise ValueError("LayerSubspace coordinate normalization must be vectors") if self.coord_offset.shape != self.coord_scale.shape: @@ -191,17 +219,18 @@ def affine( cls, mean: torch.Tensor, basis: torch.Tensor, + read: torch.Tensor, *, node_coords: torch.Tensor | None = None, affine_map: torch.Tensor | None = None, ) -> "LayerSubspace": - """Build a flat (affine, no-RBF) subspace from ``mean`` + ``basis``. + """Build a flat (affine, no-RBF) subspace from ``mean`` + ``basis``/``read``. By default authoring coordinates map to reduced coordinates by identity (``coord_offset = 0``, ``coord_scale = 1``), so ``eval_at(c) = c @ basis + mean`` exactly. ``affine_map`` optionally supplies an ``(m, R)`` map after cross-model reparameterization. - ``basis`` is ``(R, D)``; + ``basis`` and its dual ``read`` are ``(R, D)``; the implied intrinsic dimension is ``n = R`` (the surface fills the span). Backs the folded-vector / flat-subspace representation. ``node_coords`` ``(K, R)`` carries the per-layer real @@ -220,6 +249,7 @@ def affine( return cls( mean=mean, basis=basis, + read=read, node_params=None, rbf_weights=None, poly_coeffs=None, @@ -232,11 +262,12 @@ def affine( def select_axes(self, kept: Sequence[int]) -> "LayerSubspace": """Restrict an affine subspace to a subset of its basis rows (DLS prune). - Slices ``basis`` + ``node_coords`` to the ``kept`` axis indices and - recomputes ``mean`` as the projection of the *same* anchor into the + Slices ``basis``/``read`` + ``node_coords`` to the ``kept`` axis indices + and recomputes ``mean`` as the projection of the *same* anchor into the reduced span (``mean' = P_{basis[kept]}(anchor)``) — recovered from the stored ``mean`` without the raw anchor, since the anchor's per-axis - coords are ``mean @ basisᵀ`` (the basis is orthonormal). Affine only + coords are ``mean @ readᵀ``. Kept rows of an orthonormal frame stay + orthonormal and dual, so no re-orthonormalization runs. Affine only — a curved subspace's per-axis pruning would force an RBF re-fit, so the split is flat-yes / curved-no. ``kept`` indexes into ``[0, rank)``; an empty ``kept`` is a caller error (drop the layer). @@ -263,7 +294,8 @@ def select_axes(self, kept: Sequence[int]) -> "LayerSubspace": f"select_axes: kept axes must be unique indices in [0, {self.rank})" ) basis_k = self.basis[idx].contiguous() # (|kept|, D) - anchor_coords = self.mean @ self.basis.T # (R,) anchor coords + read_k = self.read[idx].contiguous() # (|kept|, D) + anchor_coords = self.mean @ self.read.T # (R,) anchor coords mean_k = anchor_coords[idx] @ basis_k # P_{basis[kept]}(anchor) nc_k = ( self.node_coords[:, idx].contiguous() @@ -280,7 +312,7 @@ def select_axes(self, kept: Sequence[int]) -> "LayerSubspace": else: amap_k = None return LayerSubspace.affine( - mean_k, basis_k, node_coords=nc_k, affine_map=amap_k, + mean_k, basis_k, read_k, node_coords=nc_k, affine_map=amap_k, ) def rbf_params(self) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: @@ -308,6 +340,7 @@ def _cast(t: torch.Tensor | None) -> torch.Tensor | None: return LayerSubspace( mean=self.mean.to(device=device, dtype=dtype), basis=self.basis.to(device=device, dtype=dtype), + read=self.read.to(device=device, dtype=dtype), node_params=_cast(self.node_params), rbf_weights=_cast(self.rbf_weights), poly_coeffs=_cast(self.poly_coeffs), @@ -350,8 +383,8 @@ def sigma_at( Interpolates the per-node ``log σ`` field through the σ-RBF over the same normalized ``node_params``, then exponentiates — so the result is a positive ``(..,)`` thickness in the layer's reduced-coordinate units - (the same units ``H_n`` is measured in, since the basis is - orthonormal). ``normalized=True`` takes coords already mapped through + (the same units ``H_n`` is measured in: Mahalanobis, since the frame + is Mahalanobis-orthonormal). ``normalized=True`` takes coords already mapped through :meth:`_normalize` (the injection kernel has them in hand). Returns an all-zeros ``(..,)`` when the subspace carries no σ-field (:attr:`has_sigma` false): affine and SAE-curved fits. Hot-path safe @@ -456,6 +489,20 @@ def sigma_at(self, embedded: torch.Tensor) -> torch.Tensor: return torch.exp(rbf_part + poly_part).reshape(-1) +def dual_read(basis: torch.Tensor, read: torch.Tensor) -> torch.Tensor: + """``read`` corrected to be exactly dual to ``basis`` (``read @ basisᵀ = I``). + + A frame's reads come from a Woodbury ``Σ⁻¹``, whose fp32 relative error + grows along the high-variance directions it divides out, so + ``read @ basisᵀ`` drifts from ``I`` by ~1e-3 on real activations. One + small ``(R, R)`` solve, ``(read @ basisᵀ)⁻¹ read``, restores duality while + keeping the reads in their own span and the write rows untouched. + Compose- and fit-time only. + """ + gram = read @ basis.transpose(0, 1) + return torch.linalg.solve(gram, read).contiguous() + + def pca_basis( X: torch.Tensor, *, @@ -464,27 +511,34 @@ def pca_basis( layer: int | None = None, whitened_gram: torch.Tensor | None = None, whitened_rows: torch.Tensor | None = None, -) -> tuple[torch.Tensor, float]: - """μ-centered PCA basis — whitened/Fisher, or Euclidean without a whitener. +) -> tuple[torch.Tensor, torch.Tensor, float]: + """μ-centered PCA frame — whitened, or Euclidean without a whitener. ``X`` is the ``(K, D)`` **μ-centered** centroid scatter (never the neutral anchor: anchor-centering injects the neutral offset as a spurious axis and - breaks PCA@2 ≡ DiM). Returns ``(basis, ev_ratio)``: ``basis`` is ``(R, D)`` - orthonormal rows, ``R = min(n_components, K-1, rank)``. - - With ``whitener``/``layer`` the basis is the Fisher discriminant — the - generalized eigenproblem ``(S_b, Σ)`` via the Woodbury ``Σ⁻¹``: eigvecs - ``a`` of ``G = X Σ⁻¹ Xᵀ`` give directions ``Σ⁻¹ Xᵀ a``, re-expressed in a - Euclidean-orthonormal basis by QR (span-preserving) so the hot path is - unchanged. Dividing by background variance cancels the rogue - (massive-activation) dims raw PCA chases. ``ev_ratio`` is the retained - fraction of whitened between-variance. ``whitened_gram`` / ``whitened_rows`` - may supply a precomputed ``X Σ⁻¹ Xᵀ`` / ``Σ⁻¹X`` so a fit shares one - Woodbury application across Gram, basis, and layout anchoring. - - Without a whitener: ordinary SVD of ``X`` (raw inter-node variance). Only - tests and offline diagnostics take this branch; every activation-space fit - in the pipeline passes a covering whitener. + breaks PCA@2 ≡ DiM). Returns ``(basis, read, ev_ratio)``: ``basis`` the + ``(R, D)`` write rows, ``read`` their dual ``(R, D)`` read rows + (``read @ basisᵀ = I``), ``R = min(n_components, K-1, rank)``. + + With ``whitener``/``layer`` this is PCA in the whitened space mapped back + with the right types — equivalently the Fisher discriminant of + ``(S_b, Σ)``. The eigenvectors ``a`` of ``G = X Σ⁻¹ Xᵀ`` (eigenvalues + ``μ``) give the write rows ``Xᵀa/√μ``: combinations of the node + displacements themselves, Mahalanobis-orthonormal by construction + (``aᵀ G a = μ``). The read rows are ``Σ⁻¹`` of those, ``aᵀ(Σ⁻¹X)/√μ``: + the Fisher/LDA covectors. At ``K = 2`` the frame writes along the + difference of means ``δ`` and reads with ``Σ⁻¹δ``. Dividing by background + variance is what ranks the axes (rogue, massive-activation channels carry + little whitened between-variance); it never changes a write direction into + a covector. ``ev_ratio`` is the retained fraction of whitened + between-variance. ``whitened_gram`` / ``whitened_rows`` may supply a + precomputed ``X Σ⁻¹ Xᵀ`` / ``Σ⁻¹X`` so a fit shares one Woodbury + application across Gram, frame, and layout anchoring. + + Without a whitener: ordinary SVD of ``X`` (raw inter-node variance), an + orthonormal frame with ``read = basis``. Only tests and the + behavior-space fit take this branch; every activation-space fit in the + pipeline passes a covering whitener. """ K = int(X.shape[0]) if whitener is not None and layer is not None: @@ -510,15 +564,11 @@ def pca_basis( f"whitened_rows shape {tuple(sinv_x.shape)} does not match " f"centered scatter shape {tuple(X.shape)}" ) - directions = A[:, top].transpose(0, 1) @ sinv_x else: - XtA = X.transpose(0, 1) @ A[:, top] # (D, R) = Xᵀ a_r - directions = whitener.apply_inv( - layer, XtA.transpose(0, 1).contiguous(), - ) # (R, D) = Σ⁻¹ Xᵀ a_r - basis = torch.linalg.qr( - directions.transpose(0, 1) - ).Q.transpose(0, 1).contiguous() # (R, D) + sinv_x = whitener.apply_inv(layer, X.contiguous()) # (K, D) = Σ⁻¹ X + coeff = A[:, top].transpose(0, 1) / mu_pos[top].clamp_min(1e-30).sqrt().unsqueeze(1) + basis = (coeff @ X.to(dtype=torch.float32, device="cpu")).contiguous() # aᵀX/√μ + read = dual_read(basis, coeff @ sinv_x) # (R, D) = aᵀΣ⁻¹X/√μ total_w = float(mu_pos.sum().item()) retained_w = float(mu_pos[top].sum().item()) ev_ratio = retained_w / total_w if total_w > 1e-12 else 1.0 @@ -527,10 +577,11 @@ def pca_basis( rank = int((1e-6 * S[0].clamp(min=1e-12) < S).sum().item()) R = max(1, min(n_components, K - 1, rank)) basis = Vh[:R].contiguous() # (R, D) + read = basis.clone() total_var = float(S.pow(2).sum().item()) retained_var = float(S[:R].pow(2).sum().item()) ev_ratio = retained_var / total_var if total_var > 1e-12 else 1.0 - return basis, ev_ratio + return basis, read, ev_ratio @dataclass(frozen=True) @@ -559,30 +610,33 @@ def _frame( neutral_mean: torch.Tensor | None, whitened_gram: torch.Tensor | None, whitened_rows: torch.Tensor | None, - basis_override: torch.Tensor | None, -) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, float]: - """Shared basis + anchor of both fits: ``(mu, X, basis, anchor, ev_ratio)``. - - The basis comes from the μ-centered scatter (the PCA@2 ≡ DiM caveat); the - frame anchors at ``neutral_mean`` when given, else at the centroid mean. + basis_override: "tuple[torch.Tensor, torch.Tensor] | None", +) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, float]: + """Shared frame + anchor of both fits: ``(mu, X, basis, read, anchor, ev_ratio)``. + + The frame comes from the μ-centered scatter (the PCA@2 ≡ DiM caveat); it + anchors at ``neutral_mean`` when given, else at the centroid mean. + ``basis_override`` is a precomputed ``(basis, read)`` pair (the frames + :func:`~drowse.geometry.topology.select_topology` already solved). """ mu = centroids.mean(dim=0) X = centroids - mu if basis_override is None: - basis, ev_ratio = pca_basis( + basis, read, ev_ratio = pca_basis( X, n_components=n_components, whitener=whitener, layer=layer, whitened_gram=whitened_gram, whitened_rows=whitened_rows, ) else: - basis = basis_override[: min(n_components, basis_override.shape[0])].to( - device="cpu", dtype=torch.float32, - ).contiguous() - ev_ratio = 1.0 # the planned Fisher basis carries no diagnostic + planned_basis, planned_read = basis_override + width = min(n_components, int(planned_basis.shape[0])) + basis = planned_basis[:width].to(device="cpu", dtype=torch.float32).contiguous() + read = planned_read[:width].to(device="cpu", dtype=torch.float32).contiguous() + ev_ratio = 1.0 # the planned frame carries no diagnostic anchor = ( neutral_mean.to(device=centroids.device, dtype=torch.float32).reshape(-1) if neutral_mean is not None else mu ) - return mu, X, basis, anchor, ev_ratio + return mu, X, basis, read, anchor, ev_ratio def fit_affine_subspace( @@ -595,40 +649,42 @@ def fit_affine_subspace( whitened_gram: torch.Tensor | None = None, whitened_rows: torch.Tensor | None = None, orient_to: int | None = 0, - basis_override: torch.Tensor | None = None, + basis_override: "tuple[torch.Tensor, torch.Tensor] | None" = None, ) -> LayerFit: """Fit a flat (affine, no-RBF) subspace from per-node centroids ``(K, D)``. ``fit_mode=pca`` produces these, and a steering vector is the ``K = 2`` - case. The basis is the μ-centered PCA (:func:`pca_basis`); the frame is + case. The frame is the μ-centered PCA (:func:`pca_basis`), **neutral-anchored**: - - ``mean = P_basis(anchor)`` — the anchor's projection into the span; - - ``node_coords = (centroids − anchor)·basisᵀ`` — real, anchor-relative - reduced coords (neutral sits at coord 0, a node at distance ∝ ‖δ_L‖). + - ``mean = P_basis(anchor)`` — the anchor's projection into the span + (Mahalanobis-orthogonal, through the read rows); + - ``node_coords = (centroids − anchor)·readᵀ`` — real, anchor-relative + reduced coords (neutral sits at coord 0, a node at distance ∝ ‖δ_L‖_M). - ``orient_to`` flips each basis row so node ``orient_to``'s μ-centered - projection is non-negative (the ``K = 2`` node-0-is-pos case reproduces - DiM's ``+δ̂``); ``None`` keeps the raw SVD/QR sign. + ``orient_to`` flips each axis so node ``orient_to``'s μ-centered + coordinate is non-negative (the ``K = 2`` node-0-is-pos case reproduces + DiM's ``+δ``); ``None`` keeps the raw eigenvector sign. """ centroids = centroids.to(torch.float32) K = int(centroids.shape[0]) if K < 2: raise ManifoldSpecError(f"an affine subspace needs >= 2 nodes, got {K}") - mu, X, basis, anchor, ev_ratio = _frame( + mu, X, basis, read, anchor, ev_ratio = _frame( centroids, n_components=n_components, whitener=whitener, layer=layer, neutral_mean=neutral_mean, whitened_gram=whitened_gram, whitened_rows=whitened_rows, basis_override=basis_override, ) if orient_to is not None: - proj = basis @ (centroids[orient_to] - mu) # (R,) - signs = torch.where(proj < 0, -1.0, 1.0) # flip rows facing away - basis = (basis * signs.unsqueeze(1)).contiguous() - mean = (anchor @ basis.T) @ basis # P_basis(anchor) (D,) - node_coords = (centroids - anchor) @ basis.T # (K, R) anchor-relative + proj = read @ (centroids[orient_to] - mu) # (R,) + signs = torch.where(proj < 0, -1.0, 1.0).unsqueeze(1) # flip axes facing away + basis = (basis * signs).contiguous() + read = (read * signs).contiguous() + mean = (anchor @ read.T) @ basis # P_basis(anchor) (D,) + node_coords = (centroids - anchor) @ read.T # (K, R) anchor-relative return LayerFit( - subspace=LayerSubspace.affine(mean, basis, node_coords=node_coords), - mu_coords=X @ basis.T, + subspace=LayerSubspace.affine(mean, basis, read, node_coords=node_coords), + mu_coords=X @ read.T, explained_variance=ev_ratio, ) @@ -647,8 +703,12 @@ def subspace_share( spread of the node centroids around their *own* mean, restricted to the subspace and measured in the Mahalanobis metric. Anchor-independent — the budget measures signal spread, not where neutral sits. The apply path - normalizes it to mean 1 across layers. At ``K = 2`` / ``R = 1`` this is - ``‖δ_L‖_M / √2``, so the normalized profile is the DiM one exactly. + normalizes it to mean 1 across layers. ``basis`` must be the write rows + (vectors). A fitted frame is Mahalanobis-orthonormal, so ``M_R ≈ I`` and + this is the node spread's Frobenius norm; the Gram keeps the formula exact + for a frame measured in another metric (transfer re-bakes in the target + one). At ``K = 2`` / ``R = 1`` it is ``‖δ_L‖_M / √2``, so the normalized + profile is the DiM one exactly. """ mu_coords = mu_coords.to(torch.float32) if mu_coords.ndim == 1: @@ -669,7 +729,7 @@ def fit_curved_subspace( neutral_mean: torch.Tensor | None = None, whitened_gram: torch.Tensor | None = None, whitened_rows: torch.Tensor | None = None, - basis_override: torch.Tensor | None = None, + basis_override: "tuple[torch.Tensor, torch.Tensor] | None" = None, ) -> LayerFit: """Fit a PCA subspace + ``r**3`` RBF surface for one layer (curved). @@ -694,21 +754,21 @@ def fit_curved_subspace( layout if isinstance(layout, RbfFitPlan) else RbfFitPlan.build(layout, smoothing=smoothing) ) - mu, X, basis, anchor, ev_ratio = _frame( + mu, X, basis, read, anchor, ev_ratio = _frame( centroids, n_components=n_components, whitener=whitener, layer=layer, neutral_mean=neutral_mean, whitened_gram=whitened_gram, whitened_rows=whitened_rows, basis_override=basis_override, ) - mean = (anchor @ basis.T) @ basis # P_basis(anchor) (D,) - # Project the μ-centered roster once; the anchor-relative RBF targets + mean = (anchor @ read.T) @ basis # P_basis(anchor) (D,) + # Read the μ-centered roster once; the anchor-relative RBF targets # differ only by one reduced offset. - mu_coords = X @ basis.T - coords = mu_coords + ((mu - anchor) @ basis.T) + mu_coords = X @ read.T + coords = mu_coords + ((mu - anchor) @ read.T) fit = plan.fit(coords, smoothing=smoothing) sub = LayerSubspace( # Each layer's persistent payload owns these tiny tensors: safetensors # rejects aliases across keys. - mean=mean, basis=basis, node_params=plan.node_params.clone(), + mean=mean, basis=basis, read=read, node_params=plan.node_params.clone(), rbf_weights=fit.weights, poly_coeffs=fit.poly, coord_offset=plan.coord_offset.clone(), coord_scale=plan.coord_scale.clone(), @@ -724,6 +784,7 @@ def fit_curved_subspace( "LayerFit", "LayerSubspace", "StackedRbf", + "dual_read", "fit_affine_subspace", "fit_curved_subspace", "pca_basis", diff --git a/drowse/geometry/topology.py b/drowse/geometry/topology.py index 01ed4914f..18b4bfe77 100644 --- a/drowse/geometry/topology.py +++ b/drowse/geometry/topology.py @@ -608,7 +608,11 @@ class TopologyChoice: # spends this work while scoring the candidate; the final per-layer fit can # reuse it instead of repeating QR/eigh/LU over the same node geometry. rbf_plan: "RbfFitPlan | None" = None - fisher_bases: "dict[int, torch.Tensor]" = field(default_factory=dict) + # The per-layer whitened ``(basis, read)`` frames the scoring solved; + # the final fit reuses them (``basis_override``). + fisher_bases: "dict[int, tuple[torch.Tensor, torch.Tensor]]" = field( + default_factory=dict, + ) def _gcv_value(rss: float, edf: float, K: int) -> float: @@ -1237,7 +1241,7 @@ def select_topology( **(a) flat vs curved** — compare the flat affine fit (``pca`` mode, at its PCA variance-threshold dim) against the curved RBF fit (``spectral`` mode, floored to the *same* dim) by **GCV** in a shared per-layer whitened / Fisher - reduced metric (``targets[L] = X̃_L · basis_Lᵀ``). GCV's ``(K − edf)²`` + reduced metric (``targets[L] = X̃_L · read_Lᵀ``, whitened coordinates). GCV's ``(K − edf)²`` denominator charges each mode for its own effective dof, so a more flexible candidate must earn its flexibility — a fair model-selection comparison rather than a coordinate-count race. The curved candidate's dim is floored @@ -1275,19 +1279,19 @@ def select_topology( # predicts the *same* y in the *same* metric, so the comparison isolates # the coordinate geometry + surface, not the basis (common-mode). targets: dict[int, torch.Tensor] = {} - fisher_bases: dict[int, torch.Tensor] = {} + fisher_bases: dict[int, tuple[torch.Tensor, torch.Tensor]] = {} for L in fit_layers: X = stacks[L].to(torch.float32) X = X - X.mean(dim=0, keepdim=True) - basis, _ev = pca_basis( + basis, read, _ev = pca_basis( X, n_components=R, whitener=whitener, layer=L, whitened_gram=layer_grams[L], whitened_rows=( whitened_rows.get(L) if whitened_rows is not None else None ), ) - fisher_bases[L] = basis - targets[L] = (X @ basis.transpose(0, 1)).contiguous() # (K, R) + fisher_bases[L] = (basis, read) + targets[L] = (X @ read.transpose(0, 1)).contiguous() # (K, R) candidates: list[TopologyCandidate] = [] diff --git a/drowse/geometry/transfer.py b/drowse/geometry/transfer.py index d6f835a9c..3e75c8e1c 100644 --- a/drowse/geometry/transfer.py +++ b/drowse/geometry/transfer.py @@ -2,9 +2,10 @@ The pure-tensor core of ``manifold transfer``: map each layer's frame through a per-layer affine alignment (source → target activation space), keep the -runtime basis orthonormal by QR reparameterization, re-bake the Mahalanobis -share in the target metric, and re-solve curved origins against the target -neutral mean. The alignment fit is :mod:`drowse.geometry.procrustes`; +runtime frame orthonormal in the *target* Mahalanobis metric by a Cholesky +reparameterization (with its dual read rows recomputed there), re-bake the +Mahalanobis share in the target metric, and re-solve curved origins against +the target neutral mean. The alignment fit is :mod:`drowse.geometry.procrustes`; folder I/O and orchestration live in :mod:`drowse.fit.transfer`. """ from __future__ import annotations @@ -19,7 +20,7 @@ from drowse.geometry.invert import neutral_origin from drowse.geometry.manifold import Manifold from drowse.geometry.rbf import eval_rbf -from drowse.geometry.subspace import LayerSubspace, subspace_share +from drowse.geometry.subspace import LayerSubspace, dual_read, subspace_share if TYPE_CHECKING: from drowse.geometry.whitener import LayerWhitener @@ -58,13 +59,18 @@ def transfer_manifold_subspaces( ``Manifold`` whose subspaces live in target space. Means and manifold points use the affine map (linear factor plus fitted - translation); basis rows and direction profiles use only its linear factor. - The mapped rows are QR-reparameterized to an orthonormal target frame and - every affine/RBF reduced-coordinate coefficient is transformed by the exact - companion matrix, preserving world points. A collapsed source span is - rejected. Curved transfer requires that companion map to be an isometry: - a non-isometric map turns the scalar tube thickness anisotropic, which the - current manifold representation cannot encode. Layers the alignment doesn't + translation); basis rows (write vectors) and direction profiles use only + its linear factor. The source read rows are source-metric covectors and + do not transfer: the mapped write rows ``B_raw`` are reparameterized to a + target-Mahalanobis-orthonormal frame ``B_tgt = L⁻¹ B_raw`` (``L Lᵀ = + B_raw Σ_tgt⁻¹ B_rawᵀ``) with reads ``L⁻¹ B_raw Σ_tgt⁻¹``, and every + affine/RBF reduced-coordinate coefficient is transformed by the exact + companion matrix ``L``, preserving world points. A collapsed source span + is rejected. ``L`` is orthogonal only where the alignment carries the + source metric exactly onto the target's; otherwise a curved fit's scalar + tube thickness turns anisotropic, which the σ-field cannot encode, so σ is + rescaled by ``(Π sᵢ)^(1/R)`` (``sᵢ`` the singular values of ``L``): the + volume-preserving isotropic approximation. Layers the alignment doesn't cover drop. **Target-metric share re-bake (mandatory).** The source fit's per-layer @@ -87,17 +93,34 @@ def transfer_manifold_subspaces( """ src.validate_runtime_geometry() + covered = [layer for layer in src.layers if layer in alignment] + if not covered: + raise ValueError( + f"alignment for {from_model!r} → {to_model!r} covered none of the " + f"source manifold's fitted layers ({sorted(src.layers)})" + ) + # The frame is orthonormal in the target metric and the source model's + # Mahalanobis share is per-model (Σ and the neutral activations are both + # ``from_model`` quantities), so the **target** whitener is mandatory and + # must cover every transferred layer (all-or-nothing, mirroring the fit + # gate). No Euclidean path — a missing / partial whitener is an error. + if whitener is None or not whitener.covers_all(covered): + raise WhitenerError( + "manifold transfer requires a Mahalanobis whitener covering every " + f"transferred layer {sorted(covered)}; generate neutral " + "activations for the TARGET model first (the Euclidean path is gone)" + ) + # Map each covered layer's subspace into target space. ``M_L`` is # ``(D_tgt, D_src)`` so ``mean_tgt = M_L @ mean_src`` and each basis row # transforms the same way → ``basis_tgt = basis_src @ M_L^T``. new_layers: dict[int, LayerSubspace] = {} - for layer, sub in src.layers.items(): - M_L = alignment.get(layer) - if M_L is None: - continue + for layer in covered: + sub = src.layers[layer] + M_L = alignment[layer] mean_f = sub.mean.to(torch.float32) basis_f = sub.basis.to(torch.float32) - raw_basis = M_L.apply_vectors(basis_f) + raw_basis = M_L.apply_vectors(basis_f).to(device="cpu", dtype=torch.float32) mean_tgt_f = M_L.apply_points(mean_f) rank = int(raw_basis.shape[0]) @@ -106,39 +129,43 @@ def transfer_manifold_subspaces( f"alignment for layer {layer} cannot carry rank-{rank} source " f"subspace into target shape {tuple(raw_basis.shape)}" ) - # Reparameterize B_raw = A @ B_ortho. Runtime projection/injection - # requires orthonormal basis rows, while multiplying every reduced output - # by A preserves each mapped world-space manifold point exactly. - raw_gram = raw_basis @ raw_basis.transpose(0, 1) + # Reparameterize B_raw = L @ B_tgt with B_tgt orthonormal in the target + # metric. Runtime projection/injection requires an orthonormal frame, + # while multiplying every reduced output by L preserves each mapped + # world-space manifold point exactly. + raw_read = whitener.apply_inv(layer, raw_basis) # Σ_tgt⁻¹ B_rawᵀ rows + raw_gram = raw_basis @ raw_read.transpose(0, 1) + raw_gram = 0.5 * (raw_gram + raw_gram.transpose(0, 1)) identity = torch.eye(rank, dtype=raw_gram.dtype, device=raw_gram.device) if torch.allclose(raw_gram, identity, atol=1e-5, rtol=1e-5): - # Preserve an already-orthonormal map byte-for-byte (identity and - # square Procrustes rotations need no coordinate change). + # Keep an already-orthonormal frame as is (an identity map within + # one model's metric needs no coordinate change). basis_tgt_f = raw_basis.contiguous() + read_tgt_f = raw_read.contiguous() reduced_map = identity else: - Q, R = torch.linalg.qr(raw_basis.transpose(0, 1), mode="reduced") - # Unpivoted QR diagonals are not rank-revealing for oblique - # dependencies. Rank-test only this small R×R factor with singular - # values before publishing a supposedly orthonormal frame. - singular_values = torch.linalg.svdvals(R) + eigenvalues = torch.linalg.eigvalsh(raw_gram) tol = ( - torch.finfo(R.dtype).eps * max(raw_basis.shape) - * float(singular_values.max()) + torch.finfo(raw_gram.dtype).eps * max(raw_basis.shape) + * float(eigenvalues.abs().max()) ) - if ( - singular_values.numel() != rank - or bool((singular_values <= tol).any()) - ): + if bool((eigenvalues <= tol).any()): raise ValueError( f"alignment for layer {layer} collapses the rank-{rank} manifold " "subspace; refusing a rank-deficient transfer" ) - basis_tgt_f = Q.transpose(0, 1).contiguous() - reduced_map = R.transpose(0, 1).contiguous() + chol = torch.linalg.cholesky(raw_gram) # L, lower + basis_tgt_f = torch.linalg.solve_triangular( + chol, raw_basis, upper=False, + ).contiguous() + read_tgt_f = dual_read(basis_tgt_f, torch.linalg.solve_triangular( + chol, raw_read, upper=False, + )) + reduced_map = chol.contiguous() kwargs: dict[str, Any] = { "mean": mean_tgt_f.to(dtype=sub.mean.dtype), - "basis": basis_tgt_f.to(dtype=sub.basis.dtype), + "basis": basis_tgt_f.to(device=sub.basis.device, dtype=sub.basis.dtype), + "read": read_tgt_f.to(device=sub.read.device, dtype=sub.read.dtype), } if sub.is_affine: source_map = ( @@ -167,40 +194,23 @@ def transfer_manifold_subspaces( kwargs["poly_coeffs"] = ( sub.poly_coeffs.to(torch.float32) @ reduced_map ).to(dtype=sub.poly_coeffs.dtype) - # A scalar isotropic tube thickness is invariant only under an - # isometry of this reduced frame. The current representation has no - # anisotropic tube field, so reject an unrepresentable transfer. - gram = reduced_map @ reduced_map.transpose(0, 1) - isometric = torch.allclose( - gram, torch.eye(rank, dtype=gram.dtype, device=gram.device), - atol=1e-4, rtol=1e-4, - ) - if not isometric: - raise ValueError( - f"alignment for layer {layer} is non-isometric in curved " - "manifold coordinates; anisotropic tube transfer is not " - "representable by the current scalar sigma field" + if sub.sigma_poly_coeffs is not None: + # The scalar tube thickness is exact only under an isometry of + # the reduced frame; the companion map is one only where the + # alignment carries the source metric onto the target's. The + # ball of radius σ maps to an ellipsoid with semi-axes σ·sᵢ + # (``sᵢ`` the companion's singular values); keep its volume: + # σ ← σ·(Π sᵢ)^(1/R), a shift of the log-σ field's constant term. + log_scale = float( + torch.linalg.svdvals(reduced_map).clamp_min(1e-30).log().mean() + ) + sigma_poly = sub.sigma_poly_coeffs.to(torch.float32).clone() + sigma_poly[0] += log_scale + kwargs["sigma_poly_coeffs"] = sigma_poly.to( + dtype=sub.sigma_poly_coeffs.dtype, ) new_layers[layer] = replace(sub, **kwargs) - if not new_layers: - raise ValueError( - f"alignment for {from_model!r} → {to_model!r} covered none of the " - f"source manifold's fitted layers ({sorted(src.layers)})" - ) - - # The source model's Mahalanobis share is per-model (Σ and the neutral - # activations are both ``from_model`` quantities), so it's invalid in - # ``to_model`` space. The **target** whitener is mandatory and must cover - # every transferred layer (all-or-nothing, mirroring the fit gate); - # recompute the share in target space. No Euclidean rebake — a missing / - # partial whitener is an error. - if whitener is None or not whitener.covers_all(new_layers.keys()): - raise WhitenerError( - "manifold transfer requires a Mahalanobis whitener covering every " - f"transferred layer {sorted(new_layers.keys())}; generate neutral " - "activations for the TARGET model first (the Euclidean path is gone)" - ) curved_layers = { layer for layer, subspace in new_layers.items() if not subspace.is_affine } diff --git a/drowse/readout/AGENTS.md b/drowse/readout/AGENTS.md index c5b1e246e..e2d9a5b56 100644 --- a/drowse/readout/AGENTS.md +++ b/drowse/readout/AGENTS.md @@ -234,8 +234,14 @@ fit's `mahalanobis_share`, normalized): | `nearest` | top-`top_n` by raw whitened distance, reported ÷ `label_scale` | same | | `assignment` | `softmax(−d²/2τ² − R·log τ)`, top-`top_n` | same | +- `M_R⁻¹ B Σ⁻¹(h − mean)` is the Mahalanobis-orthogonal projection's + coordinate in the frame's write rows `B` (vectors). A fitted frame is + Mahalanobis-orthonormal, so `M_R ≈ I` and this is the frame's `read` + (the LDA covector `Σ⁻¹δ` at K = 2); the session whitener keeps it exact if + the neutral cache changed since the fit. A curved fit's reduced node values + (`eval_at` and the overlay) read through `sub.read`. - Coordinates are domain-frame: each layer's reduced coord is mapped to the - domain before averaging (raw per-layer coords are in `‖δ_L‖` units). Rank-1 + domain before averaging (raw per-layer coords are in `‖δ_L‖_M` units). Rank-1 reads `1.0` at the positive node. Periodic, sphere, Klein and projective domains average in the embedding and map back; a near-zero mean falls back to the highest-share layer's coordinate instead of inventing a midpoint. @@ -250,7 +256,7 @@ fit's `mahalanobis_share`, normalized): precomputed at attach. - `neutral` (`NEUTRAL_LABEL`) is a virtual candidate: the frame anchor in the same whitened metric (zero for affine fits, the baked `origin` through - `eval_at → basis → chol` for curved). It rides `node_white_aug` as the last + `eval_at → read → chol` for curved). It rides `node_white_aug` as the last candidate in both paths, is never a stored node, and is suppressed when the manifold has a real node named `neutral`. - `depth_com`/`depth_spread` need `n_layers` at construction; mass is @@ -318,7 +324,7 @@ gates are the sole consumer and final readings are off. The binding freezes names only. `is_live` (default on) is the all-or-nothing per-token switch; `set_live` rejects extras with `TypeError`. `probe_hash` is sha256 over fp32 bytes: the folded direction for a foldable fit, else per-layer -mean/basis/node coords, recorded when the probe is attached or swapped (inside +mean/basis/read/node coords, recorded when the probe is attached or swapped (inside the exclusive section), so the lock-free transcript export only looks it up. Attach likewise takes the listing's node coords and the inspector's geometry payload (`monitor_attach.py::probe_geometry_payload`, served by diff --git a/drowse/readout/geometry.py b/drowse/readout/geometry.py index e885ea8b2..11964de79 100644 --- a/drowse/readout/geometry.py +++ b/drowse/readout/geometry.py @@ -615,7 +615,7 @@ def _record_digest(self, name: str, manifold: Any) -> None: except ValueError: per_layer = {} for layer_idx, sub in manifold.layers.items(): - tensors = [sub.mean, sub.basis] + tensors = [sub.mean, sub.basis, sub.read] if sub.node_coords is not None: tensors.append(sub.node_coords) per_layer[layer_idx] = tensors diff --git a/drowse/readout/monitor_attach.py b/drowse/readout/monitor_attach.py index 6398c1e3b..52806a5c4 100644 --- a/drowse/readout/monitor_attach.py +++ b/drowse/readout/monitor_attach.py @@ -207,7 +207,7 @@ class AttachedManifoldProbe: ``node_values_reduced`` is the per-layer ``(K, R)`` tensor of node activations in subspace coords — ``sub.node_coords`` for a flat fit (the M-projected node coords directly, pruned-basis-consistent), else - ``(sub.eval_at(domain.embed(node_coords)) - sub.mean) @ sub.basis.T`` for + ``(sub.eval_at(domain.embed(node_coords)) - sub.mean) @ sub.read.T`` for a curved fit (RBF surface eval) — pre-computed once at attach so per-token distance computations are one batched cdist in R-dim per layer. ``share_weights`` is the per-layer Mahalanobis share (the steering budget) @@ -429,7 +429,9 @@ def _build_whitened_factors( ) dev = v_reduced.device basis = sub.basis.to(device=torch.device("cpu"), dtype=torch.float32) - # M_R = B Σ⁻¹ Bᵀ (R, R), PD for an orthonormal B and ridge-PD Σ. + # M_R = B Σ⁻¹ Bᵀ (R, R): ≈ I for a fitted (Mahalanobis-orthonormal) + # frame under the fit's own whitener; computed so a regenerated + # neutral cache still reads the exact M-projection. m_r = whitener.subspace_gram(layer_idx, basis) # CPU fp32 R = m_r.shape[0] try: @@ -465,7 +467,7 @@ def _build_whitened_factors( v_centered = sub.eval_at(emb) - sub.mean.to( device=dev, dtype=torch.float32, ) - v_red = v_centered @ sub.basis.to( + v_red = v_centered @ sub.read.to( device=dev, dtype=torch.float32, ).T # (1, R) neutral_white = (v_red @ chol_dev).reshape(-1) @@ -585,7 +587,7 @@ def _sample_overlay( cpu = torch.device("cpu") sub_c = sub.to(device=cpu, dtype=torch.float32) chol = wh.chol.detach().to(torch.float32).cpu() # (R, R) - basis = sub_c.basis # (R, D) + read = sub_c.read # (R, D) mean = sub_c.mean # (D,) axes = domain.axes @@ -600,7 +602,7 @@ def _axis_grid(ax: Any) -> torch.Tensor: def _whiten(coords: torch.Tensor) -> torch.Tensor: world = sub_c.eval_at(domain.embed(domain.clamp_position(coords))) - reduced = (world - mean) @ basis.transpose(0, 1) # (.., R) + reduced = (world - mean) @ read.transpose(0, 1) # (.., R) return reduced @ chol # (.., R) whitened if n == 1: @@ -692,7 +694,7 @@ def _attach_on_host( ) v_world = sub_f32.eval_at(embedded_dev) # (K, D) v_centered = v_world - sub_f32.mean - v_reduced = v_centered @ sub_f32.basis.T # (K, R) + v_reduced = v_centered @ sub_f32.read.T # (K, R) node_values_reduced[layer_idx] = v_reduced.contiguous() share_weights_raw[layer_idx] = float(manifold.mahalanobis_share[layer_idx]) if any( diff --git a/drowse/steering/AGENTS.md b/drowse/steering/AGENTS.md index 7341204d1..3de19d82b 100644 --- a/drowse/steering/AGENTS.md +++ b/drowse/steering/AGENTS.md @@ -98,7 +98,7 @@ that never fires. |---|---|---| | `α x` | `ManifoldTerm` via the bare-atom ladder, else `α` / `(α, Trigger)` under `x` | push | | `α a~b` / `α a\|b` | `ProjectedTerm` under `a~b` / `a\|b` | Mahalanobis LEACE `project_profile`: keep / remove the component of `a` along `b`, then push | -| `α !x` | `AblationTerm` under `!x` | `h' = h − α(h·d̂ − μ·d̂)d̂`; bare `!x` is α = 1 | +| `α !x` | `AblationTerm` under `!x` | LEACE toward neutral, `h' = h − α((h − μ)·Σ⁻¹d / d·Σ⁻¹d)·d`: reads with the covector, writes along `d`; bare `!x` is α = 1 | | `α neuron/L8n344` | `α` / `(α, Trigger)` under `neuron/L8n344` | push along the neuron's `+`-pole write at its layer (a one-layer profile, folded and pushed like any vector); a negative α pushes along the `−` pole's | | `α !neuron/L8n344`, `α !head/L20h17` | `UnitAblationTerm(unit, coeff, trigger)` under `!neuron/L8n344` | a `UnitOp` pre-hook on the down / output projection: the unit's activation (a neuron's `act`, a head's `z_h`) becomes `(1 − α)·x + α·mean`, its neutral mean; never a residual direction ablation | | `along[,onto] m%pos` | `ManifoldTerm` under `m%pos` | affine fit: push fragment; curved fit: own term | @@ -374,12 +374,13 @@ checks for an installed plan itself). `SteeringPlan.lower(device, dtype)` places curved groups first at each layer (a curved term lowers only at the layers of its `shares`). Two curved spans -sharing a layer with max |cosine| above `_CURVED_ORTHO_TOL = 1e-3` raise +sharing a layer with max Mahalanobis |cosine| (`B_new · P_prevᵀ`) above `_CURVED_ORTHO_TOL = 1e-3` raise `OverlappingManifoldError` (422); disjoint layer clauses let one curved manifold appear twice (`m%a{0-3} + m%b{4-7}`). Each affine term then goes through `_lower_affine_subspaces`, the single affine lowering: mean-1 share normalization, `_orthogonalize_affine_against` the curved span at -that layer (the curved term owns shared directions; κ is carried through the +that layer (Mahalanobis-orthogonally, through the curved frames' read rows; +the curved term owns shared directions; κ is carried through the re-orthonormalization; a fully contained span drops the layer), `eff_along = share_L · _SUBSPACE_GAIN`, and `kappa = requested_κ / eff_along`, so `eff_along · κ` is exactly the user's ablation coefficient and ablation @@ -420,11 +421,11 @@ Recommended affine α is about 0.5, toward 1.0 for stronger expression. ### Hooks and installation -`AffineOp` applies `h += c − ((h·Bₐᵀ − μBₐᵀ) ⊙ s) Bₐ`, with the fixed push +`AffineOp` applies `h += c − ((h·Pₐᵀ − μPₐᵀ) ⊙ s) Bₐ`, with the fixed push `c = eff_along · target @ B` and the activation-dependent ablation restricted -to nonzero-κ rows `Bₐ` (`s = eff_along · κ`). A pure push is one `add_`; a -rank-1 ablation is a dot plus `addcmul_` (MPS dispatch makes this cheaper than -a tiny GEMM). Constants are built in fp32 and cast once to the residual dtype +to the nonzero-κ axes: read rows `Pₐ` measure, write rows `Bₐ` move +(`s = eff_along · κ`). A pure push is one `add_`; a rank-1 ablation is a dot +plus `addcmul_` (MPS dispatch makes this cheaper than a tiny GEMM). Constants are built in fp32 and cast once to the residual dtype (re-cast once if the residual is narrower). There is no norm cap on this path: a flat fit has no RBF to extrapolate. @@ -503,7 +504,8 @@ All CPU, in `tests/steering/`: grammar and round trips `test_steering_context_ablation.py`), installed state and offset buffers (`test_steering_install.py`), affine lowering, gain, κ compensation and compiled/eager parity (`test_subspace_steering.py`), `AffineOp` against -`subspace_inject` (`test_hooks_triggers.py`), curved lowering and foot state +`subspace_inject` on a frame whose reads differ from its writes +(`test_hooks_triggers.py`), curved lowering and foot state (`test_manifold_steering.py`), layer clauses through composition: coverage, ablation exactness, shares over the selection, 422s, curved restriction, compiled/eager parity and plan-cache keying (`test_layer_scoped_steering.py`). diff --git a/drowse/steering/hooks.py b/drowse/steering/hooks.py index e9f898af5..65cbef6a0 100644 --- a/drowse/steering/hooks.py +++ b/drowse/steering/hooks.py @@ -36,7 +36,7 @@ from drowse.geometry.domains import BoxDomain, ManifoldDomain from drowse.geometry.subspace import LayerSubspace from drowse.geometry.manifold import Manifold -from drowse.geometry.inject import SynthesizedSubspace, _ortho_basis, subspace_inject +from drowse.geometry.inject import SynthesizedSubspace, _ortho_frame, subspace_inject from drowse.steering.triggers import Trigger, TriggerContext @@ -155,31 +155,44 @@ def _orthogonalize_affine_against( sub: LayerSubspace, target: torch.Tensor, kappa: torch.Tensor, - curved_basis: torch.Tensor, + curved_frame: "tuple[torch.Tensor, torch.Tensor]", ) -> "tuple[LayerSubspace, torch.Tensor, torch.Tensor] | None": """Project a merged affine subspace out of the curved manifolds' span. The curved manifold wins the shared directions (ARCHITECTURE §6); the affine slide handles the complement. Strips the curved-span component - from the affine basis rows and the push displacement, and carries the - per-axis collapse mask through the re-orthonormalization (each new axis - inherits its squared projection onto the old ablate span). Returns - ``None`` when the affine span lies entirely inside the curved span. + from the affine write rows and the push displacement, Mahalanobis- + orthogonally (the curved frame's read rows give the coefficients, so no + ``Σ`` is needed here), and carries the per-axis collapse mask through the + re-orthonormalization (each new axis inherits its squared projection onto + the old ablate span). ``curved_frame`` is the ``(basis, read)`` pair of + every curved manifold at the layer, stacked. Returns ``None`` when the + affine span lies entirely inside the curved span. """ basis = sub.basis.to(torch.float32) # (R, D) - # The curved basis is the resident manifold's (on the session device); the + read = sub.read.to(torch.float32) # (R, D) + # The curved frame is the resident manifold's (on the session device); the # affine synthesis is host-side until AffineOp uploads it. - cb = curved_basis.to(device=basis.device, dtype=torch.float32) # (Rc, D) + cb, cr = ( + t.to(device=basis.device, dtype=torch.float32) for t in curved_frame + ) + cb, cr, _ = _ortho_frame(cb, cr) # (Rc, D) jointly orthonormal delta = basis.T @ target.to(torch.float32) # (D,) world push displacement - residual = basis - (basis @ cb.T) @ cb # (R, D) rows ⟂ curved span - new_basis, _kept = _ortho_basis(residual) + coef = basis @ cr.T # (R, Rc) ⟨bᵢ, cⱼ⟩_M + new_basis, new_read, _kept = _ortho_frame( + basis - coef @ cb, read - coef @ cr, # rows ⟂_M curved span + ) if new_basis.shape[0] == 0: return None - delta_perp = delta - (delta @ cb.T) @ cb - new_target = new_basis @ delta_perp # (R',) - M = new_basis @ basis.T # (R', R) + delta_perp = delta - (delta @ cr.T) @ cb + new_target = new_read @ delta_perp # (R',) + M = new_read @ basis.T # (R', R) ⟨newᵢ, oldⱼ⟩_M new_kappa = (M * M) @ kappa.to(torch.float32) # (R',) - return LayerSubspace.affine(sub.mean, new_basis), new_target, new_kappa + return ( + LayerSubspace.affine(sub.mean, new_basis, new_read), + new_target, + new_kappa, + ) @dataclass(frozen=True) @@ -213,7 +226,7 @@ def offset(self) -> torch.Tensor: def _lower_affine_subspaces( synth: SynthesizedSubspace, *, - curved_basis_by_layer: "dict[int, torch.Tensor] | None" = None, + curved_frame_by_layer: "dict[int, tuple[torch.Tensor, torch.Tensor]] | None" = None, ) -> dict[int, LoweredAffine]: """Lower one synthesized affine subspace to its per-layer runtime terms. @@ -238,8 +251,8 @@ def _lower_affine_subspaces( # division below then preserves the resulting operator exactly. requested_kappa = synth.kappa[L].to(torch.float32) curved = ( - curved_basis_by_layer.get(L) - if curved_basis_by_layer is not None + curved_frame_by_layer.get(L) + if curved_frame_by_layer is not None else None ) if curved is not None: @@ -260,36 +273,41 @@ def _lower_affine_subspaces( class AffineOp: - """One layer's affine injection: ``h += c − ((h·Bₐᵀ − μBₐᵀ) ⊙ s) Bₐ``. + """One layer's affine injection: ``h += c − ((h·Pₐᵀ − μPₐᵀ) ⊙ s) Bₐ``. The analytic affine slide of :func:`subspace_inject` split at compose time into its fixed push ``c = eff_along·target@B`` and its activation-dependent - ablation, restricted to the nonzero-κ rows ``Bₐ`` with ``s = eff_along·κ`` - (the requested ablation coefficient). A pure push is therefore one - in-place ``add_``; a rank-1 ablation is a dot plus an in-place ``addcmul_`` - (MPS dispatch dominates a rank-1 GEMM). Runs in the residual stream's - dtype; the constants are computed in fp32 and cast once. + ablation, restricted to the nonzero-κ axes (read rows ``Pₐ``, write rows + ``Bₐ``) with ``s = eff_along·κ`` (the requested ablation coefficient). A + full ablation reads with the ``Σ⁻¹`` covector and writes along the + direction: LEACE. A pure push is therefore one in-place ``add_``; a + rank-1 ablation is a dot plus an in-place ``addcmul_`` (MPS dispatch + dominates a rank-1 GEMM). Runs in the residual stream's dtype; the + constants are computed in fp32 and cast once. No ``norm_cap``: a flat fit has no RBF to extrapolate, so the bounded displacement cannot push ``‖h‖`` past the curved path's ``3·‖h‖`` guard. """ __slots__ = ( - "_dtype", "const", "mean_proj", "rows", "rows_t", "scale", "scaled_row", + "_dtype", "const", "mean_proj", "reads", "reads_t", "rows", "scale", + "scaled_row", ) def __init__( self, const: "torch.Tensor | None", rows: "torch.Tensor | None" = None, + reads: "torch.Tensor | None" = None, scale: "torch.Tensor | None" = None, mean_proj: "torch.Tensor | None" = None, ) -> None: self.const = const self.rows = rows + self.reads = reads self.scale = scale self.mean_proj = mean_proj - self.rows_t = None if rows is None else rows.T.contiguous() + self.reads_t = None if reads is None else reads.T.contiguous() self.scaled_row = ( None if rows is None or scale is None or rows.shape[0] != 1 else (scale[0] * rows[0]).contiguous() @@ -313,13 +331,16 @@ def from_lowered( if not bool(active.any()): return cls(const) basis = sub.basis.to(device=device, dtype=torch.float32) + read = sub.read.to(device=device, dtype=torch.float32) mean = sub.mean.to(device=device, dtype=torch.float32) - rows = basis[active] # (Ra, D) + rows = basis[active] # (Ra, D) writes + reads = read[active] # (Ra, D) reads return cls( const, rows=rows.to(dtype).contiguous(), + reads=reads.to(dtype).contiguous(), scale=(low.eff_along * kappa[active]).to(dtype), # (Ra,) - mean_proj=(mean @ rows.T).to(dtype), # (Ra,) + mean_proj=(mean @ reads.T).to(dtype), # (Ra,) ) def _recast(self, dtype: torch.dtype) -> None: @@ -330,9 +351,11 @@ def _recast(self, dtype: torch.dtype) -> None: if self.const is not None: self.const = self.const.to(dtype) if self.rows is not None: + assert self.reads is not None assert self.scale is not None and self.mean_proj is not None self.rows = self.rows.to(dtype) - self.rows_t = self.rows.T.contiguous() + self.reads = self.reads.to(dtype) + self.reads_t = self.reads.T.contiguous() self.scale = self.scale.to(dtype) self.mean_proj = self.mean_proj.to(dtype) if self.scaled_row is not None: @@ -348,16 +371,17 @@ def apply(self, hidden: torch.Tensor) -> None: hidden.add_(self.const) return mean_proj = self.mean_proj - assert mean_proj is not None + reads = self.reads + assert mean_proj is not None and reads is not None scaled_row = self.scaled_row if scaled_row is not None: - q = (hidden * rows[0]).sum(dim=-1, keepdim=True) - mean_proj + q = (hidden * reads[0]).sum(dim=-1, keepdim=True) - mean_proj if self.const is not None: hidden.add_(self.const) hidden.addcmul_(q, scaled_row, value=-1) return - assert self.rows_t is not None and self.scale is not None - q = hidden @ self.rows_t - mean_proj + assert self.reads_t is not None and self.scale is not None + q = hidden @ self.reads_t - mean_proj if self.const is not None: hidden.add_(self.const) hidden.sub_((q * self.scale) @ rows) @@ -729,7 +753,7 @@ def lower( return memo by_layer: dict[int, list[Group]] = {} curved_owner: dict[int, str] = {} - curved_basis_by_layer: dict[int, torch.Tensor] = {} + curved_frame_by_layer: dict[int, tuple[torch.Tensor, torch.Tensor]] = {} for term in self.curved: manifold = term.manifold domain = manifold.domain @@ -744,9 +768,11 @@ def lower( for layer_idx, share in term.shares.items(): sub = manifold.layers[layer_idx] B_new = sub.basis.to(torch.float32) - prev = curved_basis_by_layer.get(layer_idx) + P_new = sub.read.to(torch.float32) + prev = curved_frame_by_layer.get(layer_idx) if prev is not None: - cross = float((B_new @ prev.T).abs().max().item()) + # Mahalanobis cosines between the two orthonormal frames. + cross = float((B_new @ prev[1].T).abs().max().item()) if cross > _CURVED_ORTHO_TOL: raise OverlappingManifoldError( f"manifolds '{curved_owner[layer_idx]}' and " @@ -755,9 +781,11 @@ def lower( f"{cross:.3f} > {_CURVED_ORTHO_TOL}); curved " f"manifolds sharing a layer must be orthogonal" ) - curved_basis_by_layer[layer_idx] = torch.cat([prev, B_new]) + curved_frame_by_layer[layer_idx] = ( + torch.cat([prev[0], B_new]), torch.cat([prev[1], P_new]), + ) else: - curved_basis_by_layer[layer_idx] = B_new + curved_frame_by_layer[layer_idx] = (B_new, P_new) curved_owner[layer_idx] = term.name if layer_idx not in manifold.origin: raise ValueError( @@ -785,7 +813,7 @@ def lower( )) for affine in self.affine: lowered = _lower_affine_subspaces( - affine.synth, curved_basis_by_layer=curved_basis_by_layer, + affine.synth, curved_frame_by_layer=curved_frame_by_layer, ) for L, low in lowered.items(): by_layer.setdefault(L, []).append(AffineGroup( diff --git a/drowse/store/AGENTS.md b/drowse/store/AGENTS.md index 274143f95..057684068 100644 --- a/drowse/store/AGENTS.md +++ b/drowse/store/AGENTS.md @@ -74,7 +74,9 @@ recording it. `template_ref` is discover-only. A generated corpus aligns with `contexts[i]`. **Fitted pair.** `save_manifold` writes fp32: shared `node_coords`; per layer -`layer_.mean`/`.basis` plus either the affine fields (`node_coords`, optional +`layer_.mean`/`.basis`/`.read` (the write rows and their dual read rows, +same shape, required on every layer since fit policy 2) plus either the affine +fields (`node_coords`, optional `affine_map`) or the curved RBF set (plus the `sigma_*` pair, required on raw curved fits, absent on SAE-space ones). Missing `node_params` is the affine marker; one tensor never mixes the two. `ManifoldSidecar` is the one sidecar field diff --git a/drowse/store/archive.py b/drowse/store/archive.py index 43c1f2c96..84842d070 100644 --- a/drowse/store/archive.py +++ b/drowse/store/archive.py @@ -756,7 +756,7 @@ def validate_fitted_pair( f"fitted tensor {path.name} has invalid node_coords shape" ) fields = { - "mean", "basis", "node_coords", "affine_map", "node_params", + "mean", "basis", "read", "node_coords", "affine_map", "node_params", "rbf_weights", "poly_coeffs", "coord_offset", "coord_scale", "sigma_rbf_weights", "sigma_poly_coeffs", } @@ -792,9 +792,10 @@ def validate_fitted_pair( if ( mean is None or len(mean) != 1 or basis is None or len(basis) != 2 or basis[0] < 1 or mean[0] != basis[1] or basis[0] > basis[1] + or parts.get("read") != basis ): raise DrowseArchiveError( - f"fitted tensor {path.name} layer {layer} has invalid mean/basis" + f"fitted tensor {path.name} layer {layer} has invalid mean/basis/read" ) rank, dim = basis if hidden_dim is None: @@ -807,7 +808,7 @@ def validate_fitted_pair( if curved: curved_layers.add(layer) required = { - "mean", "basis", "node_params", "rbf_weights", "poly_coeffs", + "mean", "basis", "read", "node_params", "rbf_weights", "poly_coeffs", "coord_offset", "coord_scale", } sigma = {"sigma_rbf_weights", "sigma_poly_coeffs"} @@ -842,7 +843,7 @@ def validate_fitted_pair( f"fitted tensor {path.name} layer {layer} has invalid sigma shapes" ) else: - allowed = {"mean", "basis", "node_coords", "affine_map"} + allowed = {"mean", "basis", "read", "node_coords", "affine_map"} if set(parts) - allowed or parts.get("node_coords") != (node_count, rank): raise DrowseArchiveError( f"fitted tensor {path.name} layer {layer} has invalid affine fields" diff --git a/drowse/store/manifold_tensors.py b/drowse/store/manifold_tensors.py index da01e51cc..ca4a1b40a 100644 --- a/drowse/store/manifold_tensors.py +++ b/drowse/store/manifold_tensors.py @@ -237,7 +237,8 @@ def save_manifold( """Save a fitted manifold as ``.safetensors`` + a ``.json`` sidecar. The safetensors payload carries, per layer ``L``: ``layer_.mean``, - ``layer_.basis``, ``layer_.node_params``, + ``layer_.basis`` (write rows), ``layer_.read`` (their dual read + rows), ``layer_.node_params``, ``layer_.rbf_weights``, ``layer_.poly_coeffs``, ``layer_.coord_offset``, ``layer_.coord_scale``; plus a shared bare ``node_coords`` tensor. The sidecar carries the manifold identity @@ -246,7 +247,8 @@ def save_manifold( keyed by layer), plus the provenance fields in ``metadata``. **Affine (flat / folded-vector) layers** write ``layer_.mean`` + - ``layer_.basis`` and optional ``layer_.affine_map`` — there is no RBF + ``layer_.basis`` + ``layer_.read`` and optional + ``layer_.affine_map`` — there is no RBF triple and ordinary-fit coord normalization is identity (reconstructed by :meth:`LayerSubspace.affine` on load). The *absence* of ``node_params`` on disk is the read-side affine marker ``load_manifold`` keys on, so a @@ -274,10 +276,11 @@ def save_manifold( for idx, sub in manifold.layers.items(): tensors[f"layer_{idx}.mean"] = sub.mean.contiguous().to(torch.float32).cpu() tensors[f"layer_{idx}.basis"] = sub.basis.contiguous().to(torch.float32).cpu() + tensors[f"layer_{idx}.read"] = sub.read.contiguous().to(torch.float32).cpu() if sub.is_affine: # Flat (folded-vector / subspace) layer: no RBF surface, and the # coord normalization is identity — rebuilt from the basis shape - # by ``LayerSubspace.affine`` on load. Persist mean + basis (the + # by ``LayerSubspace.affine`` on load. Persist mean + frame (the # *absence* of ``node_params`` on disk is the affine marker), plus # the per-layer **real, neutral-anchored** node coords ``(K, R)`` # when present — the steer-target source (§5). @@ -431,7 +434,7 @@ def _load_manifold_locked( by_layer: dict[int, dict[str, torch.Tensor]] = {} allowed_fields = { - "mean", "basis", "node_coords", "affine_map", "node_params", + "mean", "basis", "read", "node_coords", "affine_map", "node_params", "rbf_weights", "poly_coeffs", "coord_offset", "coord_scale", "sigma_rbf_weights", "sigma_poly_coeffs", } @@ -459,24 +462,24 @@ def _load_manifold_locked( layers: dict[int, LayerSubspace] = {} for idx, parts in by_layer.items(): if "node_params" not in parts: - if not {"mean", "basis"}.issubset(parts) or set(parts) - { - "mean", "basis", "node_coords", "affine_map", + if not {"mean", "basis", "read"}.issubset(parts) or set(parts) - { + "mean", "basis", "read", "node_coords", "affine_map", }: raise ManifoldFormatError( f"affine manifold layer {idx} has invalid tensor fields" ) - # Affine (flat / folded-vector) layer — only mean + basis on disk + # Affine (flat / folded-vector) layer — only mean + frame on disk # (the coord normalization is identity, rebuilt from the basis # shape), plus the per-layer real node coords when the writer # stamped them. Read side of ``save_manifold``'s affine branch. layers[idx] = LayerSubspace.affine( - mean=parts["mean"], basis=parts["basis"], + mean=parts["mean"], basis=parts["basis"], read=parts["read"], node_coords=parts.get("node_coords"), affine_map=parts.get("affine_map"), ) continue required_curved = { - "mean", "basis", "node_params", "rbf_weights", "poly_coeffs", + "mean", "basis", "read", "node_params", "rbf_weights", "poly_coeffs", "coord_offset", "coord_scale", } sigma_fields = {"sigma_rbf_weights", "sigma_poly_coeffs"} @@ -491,6 +494,7 @@ def _load_manifold_locked( layers[idx] = LayerSubspace( mean=parts["mean"], basis=parts["basis"], + read=parts["read"], node_params=parts["node_params"], rbf_weights=parts["rbf_weights"], poly_coeffs=parts["poly_coeffs"], diff --git a/tests/browser/test_browser_parity.py b/tests/browser/test_browser_parity.py index 7235f272b..a13fdb074 100644 --- a/tests/browser/test_browser_parity.py +++ b/tests/browser/test_browser_parity.py @@ -179,11 +179,16 @@ def _profile(selector: list[str], *, folded: bool) -> dict[int, torch.Tensor]: ABLATION_LOWERING = json.loads( ( GOLDENS - / "affine-ablation-lowering-v1.json" + / "affine-ablation-lowering-v2.json" ).read_text() ) -def test_browser_rank_one_ablation_matches_python() -> None: +def _ablation_lowering_layers(fixture: dict[str, Any]) -> list[dict[str, Any]]: + """The ablation golden's per-layer frame and output, from its inputs. + + A ``!`` axis writes along the Mahalanobis-unit direction and reads with + its dual ``Σ⁻¹`` covector (LEACE against the neutral mean). + """ whitener, means = _whitener() directions = { row["layer"]: torch.tensor(row["basis"], dtype=torch.float32) @@ -192,25 +197,39 @@ def test_browser_rank_one_ablation_matches_python() -> None: } synthesized = synthesize_subspace( [], - [(directions, ABLATION_LOWERING["coefficient"])], + [(directions, fixture["coefficient"])], means, whitener=whitener, ) lowered = _lower_affine_subspaces(synthesized) - - for expected in ABLATION_LOWERING["layers"]: - actual = lowered[expected["layer"]] - assert actual.subspace.basis[0].tolist() == pytest.approx(expected["basis"]) - assert actual.subspace.mean.tolist() == pytest.approx(expected["neutral"]) + rows = [] + for row in fixture["layers"]: + actual = lowered[row["layer"]] assert actual.target.tolist() == pytest.approx([0.0]) collapse = actual.eff_along * actual.kappa - assert collapse.tolist() == pytest.approx([ABLATION_LOWERING["coefficient"]]) - residual = torch.tensor(expected["input"], dtype=torch.float32) - coordinate = actual.subspace.basis @ (residual - actual.subspace.mean) + assert collapse.tolist() == pytest.approx([fixture["coefficient"]]) + residual = torch.tensor(row["input"], dtype=torch.float32) + coordinate = actual.subspace.read @ (residual - actual.subspace.mean) output = residual + actual.eff_along * ( actual.target - actual.kappa * coordinate ) @ actual.subspace.basis - assert output.tolist() == pytest.approx(expected["expected"]) + rows.append({ + "layer": row["layer"], + "basis": actual.subspace.basis[0].tolist(), + "read": actual.subspace.read[0].tolist(), + "neutral": actual.subspace.mean.tolist(), + "input": row["input"], + "expected": output.tolist(), + }) + return rows + + +def test_browser_rank_one_ablation_matches_python() -> None: + actual_rows = _ablation_lowering_layers(ABLATION_LOWERING) + for expected, actual in zip(ABLATION_LOWERING["layers"], actual_rows, strict=True): + assert actual["layer"] == expected["layer"] + for key in ("basis", "read", "neutral", "expected"): + assert actual[key] == pytest.approx(expected[key]), key # --------------------------------------------------------------------------- @@ -262,7 +281,75 @@ def test_browser_affine_lowering_fixture_matches_python() -> None: # --------------------------------------------------------------------------- -AFFINE_FISHER = GOLDENS / "affine-fisher-fit-v1.json" +AFFINE_FISHER = GOLDENS / "affine-fisher-fit-v2.json" + +def _affine_fisher_expected(fixture: dict[str, Any]) -> dict[str, Any]: + """The Fisher golden's ``expected`` block, recomputed from its inputs.""" + columns = fixture["columns"] + neutral = torch.tensor(fixture["neutral"], dtype=torch.float32).reshape(-1, columns) + centroids = torch.tensor(fixture["centroids"], dtype=torch.float32).reshape(-1, columns) + neutral_mean = neutral.mean(dim=0) + whitener = LayerWhitener.from_neutral_activations( + {0: neutral}, {0: neutral_mean}, ridge_scale=fixture["ridgeScale"], + ) + centered = centroids - centroids.mean(dim=0, keepdim=True) + gram = whitener.subspace_gram(0, centered) + inverse_rows = whitener.apply_inv(0, centered) + fit = fit_affine_subspace( + centroids, neutral_mean=neutral_mean, n_components=fixture["maxComponents"], + whitener=whitener, layer=0, whitened_gram=gram, whitened_rows=inverse_rows, + orient_to=fixture["orientTo"], + ) + subspace, mu = fit.subspace, fit.mu_coords + assert subspace.node_coords is not None + neutral_cross_gram = inverse_rows @ (neutral_mean - centroids.mean(dim=0)) + layout, _diagnostics = derive_pca_coords(gram, max_dim=2, var_threshold=0.7) + neutral_layout = neutral_layout_coord(layout, neutral_cross_gram) + selected = subspace.select_axes([0]) + assert selected.node_coords is not None + return { + "neutralMean": neutral_mean.tolist(), + "centroidMean": centroids.mean(dim=0).tolist(), + "mean": subspace.mean.tolist(), + "basis": subspace.basis.flatten().tolist(), + "read": subspace.read.flatten().tolist(), + "nodeCoordinates": subspace.node_coords.flatten().tolist(), + "muCoordinates": mu.flatten().tolist(), + "explainedVariance": fit.explained_variance, + "mahalanobisShare": subspace_share(mu, subspace.basis, whitener=whitener, layer=0), + "neutralCrossGram": neutral_cross_gram.tolist(), + "layoutCoordinates": layout.flatten().tolist(), + "neutralLayoutCoordinate": neutral_layout.tolist(), + "anchoredLayoutCoordinates": (layout - neutral_layout).flatten().tolist(), + "axisZeroFinal": { + "mean": selected.mean.tolist(), + "basis": selected.basis.flatten().tolist(), + "read": selected.read.flatten().tolist(), + "nodeCoordinates": selected.node_coords.flatten().tolist(), + "muCoordinates": mu[:, [0]].flatten().tolist(), + "mahalanobisShare": subspace_share( + mu[:, [0]], selected.basis, whitener=whitener, layer=0, + ), + }, + "whitenedGram": gram.flatten().tolist(), + } + + +def regenerate_affine_goldens() -> None: + """Recompute the Fisher-fit and ablation-lowering goldens from their inputs.""" + # Only the ``expected`` block (the last key) is recomputed; the inputs + # above it keep their row-per-sample layout. + text = AFFINE_FISHER.read_text() + head, sep, _old = text.partition(' "expected": ') + assert sep, "affine Fisher golden lost its expected block" + head = head.replace('"schemaVersion": 1,', '"schemaVersion": 2,', 1) + expected = _affine_fisher_expected(json.loads(text)) + AFFINE_FISHER.write_text(head + sep + _golden_json(expected, " ") + "\n}\n") + path = GOLDENS / "affine-ablation-lowering-v2.json" + ablation = json.loads(path.read_text()) + ablation.update(schemaVersion=2, layers=_ablation_lowering_layers(ablation)) + path.write_text(_golden_json(ablation) + "\n") + def test_browser_affine_fisher_fixture_matches_python_source_of_truth() -> None: fixture = json.loads(AFFINE_FISHER.read_text()) @@ -295,6 +382,14 @@ def test_browser_affine_fisher_fixture_matches_python_source_of_truth() -> None: assert centroids.mean(dim=0).tolist() == pytest.approx(expected["centroidMean"], rel=1e-5, abs=1e-6) assert subspace.mean.tolist() == pytest.approx(expected["mean"], rel=1e-5, abs=1e-6) assert subspace.basis.flatten().tolist() == pytest.approx(expected["basis"], rel=1e-5, abs=1e-6) + assert subspace.read.flatten().tolist() == pytest.approx(expected["read"], rel=1e-4, abs=1e-5) + # Typed frame: Mahalanobis-orthonormal write rows, exactly dual reads. + assert torch.allclose( + whitener.subspace_gram(0, subspace.basis), torch.eye(subspace.rank), atol=1e-4, + ) + assert torch.allclose( + subspace.read @ subspace.basis.T, torch.eye(subspace.rank), atol=1e-5, + ) assert subspace.node_coords is not None # Eigensolve outputs carry fp32 BLAS-order noise (~2e-6 on macOS arm64). assert subspace.node_coords.flatten().tolist() == pytest.approx( @@ -328,6 +423,9 @@ def test_browser_affine_fisher_fixture_matches_python_source_of_truth() -> None: selected_expected = expected["axisZeroFinal"] assert selected.mean.tolist() == pytest.approx(selected_expected["mean"], rel=1e-5, abs=1e-6) assert selected.basis.flatten().tolist() == pytest.approx(selected_expected["basis"], rel=1e-5, abs=1e-6) + assert selected.read.flatten().tolist() == pytest.approx( + selected_expected["read"], rel=1e-4, abs=1e-5, + ) assert selected.node_coords is not None assert selected.node_coords.flatten().tolist() == pytest.approx( selected_expected["nodeCoordinates"], rel=1e-5, abs=1e-6, @@ -406,7 +504,7 @@ def test_browser_rank_one_hook_fixture_matches_python_fp32(case_index: int) -> N coordinate = torch.dot(residual - neutral, basis) result, _ = subspace_inject( residual, - LayerSubspace.affine(neutral, basis.reshape(1, -1)), + LayerSubspace.affine(neutral, basis.reshape(1, -1), basis.reshape(1, -1).clone()), CustomDomain(1), torch.tensor([case["target"]], dtype=torch.float32), torch.zeros(1, dtype=torch.float32), @@ -534,7 +632,9 @@ def _flat_manifold( basis = torch.tensor([row["basis"]], dtype=torch.float32) mean = (means[row["layer"]] @ basis.T) @ basis coords = torch.tensor([[c] for c in row["nodeCoordinates"]], dtype=torch.float32) - layers[row["layer"]] = LayerSubspace.affine(mean, basis, node_coords=coords) + layers[row["layer"]] = LayerSubspace.affine( + mean, basis, basis.clone(), node_coords=coords, + ) labels = spec["labels"] return Manifold( name=name, domain=CustomDomain(1), node_labels=labels, @@ -1197,6 +1297,7 @@ def _curve_subspace(curve: dict[str, Any]) -> LayerSubspace: return LayerSubspace( mean=torch.tensor(curve["neutral"], dtype=torch.float32), basis=torch.tensor(curve["basis"], dtype=torch.float32), + read=torch.tensor(curve["basis"], dtype=torch.float32), node_params=torch.tensor(curve["nodeParameters"], dtype=torch.float32), rbf_weights=torch.tensor(curve["rbfWeights"], dtype=torch.float32), poly_coeffs=torch.tensor(curve["polynomial"], dtype=torch.float32), @@ -1627,4 +1728,9 @@ def test_units_golden_matches_python(name: str, arch: str) -> None: if __name__ == "__main__": - regenerate_term_layers() + import sys + + if sys.argv[1:] == ["affine"]: + regenerate_affine_goldens() + else: + regenerate_term_layers() diff --git a/tests/fit/test_dls_narration.py b/tests/fit/test_dls_narration.py index 9a906e265..871e974ca 100644 --- a/tests/fit/test_dls_narration.py +++ b/tests/fit/test_dls_narration.py @@ -33,6 +33,7 @@ def _sub(*coords: float) -> LayerSubspace: return LayerSubspace.affine( mean=torch.zeros(2), basis=torch.tensor([[1.0, 0.0]]), + read=torch.tensor([[1.0, 0.0]]), node_coords=torch.tensor([[c] for c in coords]), ) diff --git a/tests/fit/test_manifold_extraction.py b/tests/fit/test_manifold_extraction.py index be2a0cae6..e10ac2c6f 100644 --- a/tests/fit/test_manifold_extraction.py +++ b/tests/fit/test_manifold_extraction.py @@ -1707,8 +1707,8 @@ def test_discover_subspace_inject_translates_by_target(tmp_path: Path) -> None: ) for pos in range(hidden.shape[1]): - h_in = (hidden[0, pos] - sub.mean) @ sub.basis.T - h_out = (out[0, pos] - sub.mean) @ sub.basis.T + h_in = (hidden[0, pos] - sub.mean) @ sub.read.T + h_out = (out[0, pos] - sub.mean) @ sub.read.T # along=1, κ=0 ⇒ the in-subspace coord is translated by the full target # offset: h_out == h_in + target (the per-token spread h_in is kept). assert torch.allclose(h_out, h_in + position, atol=1e-3), ( diff --git a/tests/fixtures/browser/affine-ablation-lowering-v1.json b/tests/fixtures/browser/affine-ablation-lowering-v2.json similarity index 68% rename from tests/fixtures/browser/affine-ablation-lowering-v1.json rename to tests/fixtures/browser/affine-ablation-lowering-v2.json index 8811382f9..12998b4ab 100644 --- a/tests/fixtures/browser/affine-ablation-lowering-v1.json +++ b/tests/fixtures/browser/affine-ablation-lowering-v2.json @@ -1,19 +1,21 @@ { - "schemaVersion": 1, + "schemaVersion": 2, "source": "drowse.core.manifold.synthesize_subspace+drowse.core.hooks._lower_affine_subspaces", "expression": "0.5 !alert", "coefficient": 0.5, "layers": [ { "layer": 0, - "basis": [1.0, 0.0], + "basis": [1.499999761581421, 0.0], + "read": [0.6666668057441711, 0.0], "neutral": [0.5, -0.5], "input": [2.5, -0.5], "expected": [1.5, -0.5] }, { "layer": 1, - "basis": [0.0, 1.0], + "basis": [0.0, 1.8708285093307495], + "read": [0.0, 0.534522533416748], "neutral": [1.5, -1.5], "input": [1.5, 2.5], "expected": [1.5, 0.5] diff --git a/tests/fixtures/browser/affine-fisher-fit-v1.json b/tests/fixtures/browser/affine-fisher-fit-v1.json deleted file mode 100644 index dac4bb2a3..000000000 --- a/tests/fixtures/browser/affine-fisher-fit-v1.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "schemaVersion": 1, - "neutral": [ - 1.0, 2.0, 0.0, - 2.0, 0.0, 1.0, - 4.0, 1.0, 3.0, - 3.0, 3.0, 2.0, - 5.0, 2.0, 4.0 - ], - "neutralRows": 5, - "centroids": [ - 1.0, 0.0, 2.0, - 3.0, 1.0, 1.0, - 5.0, 4.0, 3.0, - 2.0, 5.0, 6.0 - ], - "nodeCount": 4, - "columns": 3, - "ridgeScale": 1.0, - "maxComponents": 2, - "orientTo": 0, - "serializedWhitener": { - "columns": 3, - "rank": 2, - "ridge": 1.68, - "mean": [3.0, 1.6, 2.0], - "basis": [ - 0.7039573789341783, 0.0942762816844381, 0.7039573789341783, - -0.06666339808411931, 0.9955460726213311, -0.06666339808411931 - ], - "eigenvalues": [4.026784656146989, 1.013215343853011], - "inverseScales": [0.41860485168207623, 0.6093466950454748] - }, - "expected": { - "neutralMean": [3.0, 1.600000023841858, 2.0], - "centroidMean": [2.75, 2.5, 3.0], - "mean": [1.2346981763839722, 2.5237584114074707, 0.07898344099521637], - "basis": [ - 0.43905341625213623, -0.5828602313995361, -0.6837441325187683, - -0.6327729821205139, -0.7408590316772461, 0.22522473335266113 - ], - "nodeCoordinates": [ - 0.054469551891088486, 2.450920343399048, - 1.033460259437561, 0.21929070353507996, - -1.2045018672943115, -2.818382978439331, - -5.155755043029785, -0.9852488040924072 - ], - "muCoordinates": [ - 1.3725512027740479, 2.7342755794525146, - 2.3515419960021973, 0.5026458501815796, - 0.11357986927032471, -2.5350277423858643, - -3.8376729488372803, -0.7018935680389404 - ], - "explainedVariance": 0.9989494040944763, - "mahalanobisShare": 3.9487561597350385, - "neutralCrossGram": [ - 0.6783915758132935, 1.4169645309448242, - 0.22981590032577515, -2.325171947479248 - ], - "layoutCoordinates": [ - -0.9232547283172607, 1.453011393547058, - -1.581778883934021, -0.17626012861728668, - -0.07640095055103302, -1.6398866176605225, - 2.5814342498779297, 0.3631342053413391 - ], - "neutralLayoutCoordinate": [-0.8866155743598938, -0.09776829928159714], - "anchoredLayoutCoordinates": [ - -0.03663915395736694, 1.5507797002792358, - -0.6951633095741272, -0.07849182933568954, - 0.810214638710022, -1.5421183109283447, - 3.4680497646331787, 0.46090251207351685 - ], - "axisZeroFinal": { - "mean": [-0.4315475523471832, 0.572895884513855, 0.6720551252365112], - "basis": [0.43905341625213623, -0.5828602313995361, -0.6837441325187683], - "nodeCoordinates": [ - 0.054469551891088486, 1.033460259437561, - -1.2045018672943115, -5.155755043029785 - ], - "muCoordinates": [ - 1.3725512027740479, 2.3515419960021973, - 0.11357986927032471, -3.8376729488372803 - ], - "mahalanobisShare": 3.336000678650126 - }, - "whitenedGram": [ - 2.967418670654297, 1.1988532543182373, -2.308720588684082, -1.8575515747070312, - 1.1988532543182373, 2.5408809185028076, 0.4048459529876709, -4.144579887390137, - -2.308720588684082, 0.4048459529876709, 2.698334217071533, -0.7944599986076355, - -1.8575515747070312, -4.144579887390137, -0.7944599986076355, 6.796591758728027 - ] - } -} diff --git a/tests/fixtures/browser/affine-fisher-fit-v2.json b/tests/fixtures/browser/affine-fisher-fit-v2.json new file mode 100644 index 000000000..a761a9019 --- /dev/null +++ b/tests/fixtures/browser/affine-fisher-fit-v2.json @@ -0,0 +1,58 @@ +{ + "schemaVersion": 2, + "neutral": [ + 1.0, 2.0, 0.0, + 2.0, 0.0, 1.0, + 4.0, 1.0, 3.0, + 3.0, 3.0, 2.0, + 5.0, 2.0, 4.0 + ], + "neutralRows": 5, + "centroids": [ + 1.0, 0.0, 2.0, + 3.0, 1.0, 1.0, + 5.0, 4.0, 3.0, + 2.0, 5.0, 6.0 + ], + "nodeCount": 4, + "columns": 3, + "ridgeScale": 1.0, + "maxComponents": 2, + "orientTo": 0, + "serializedWhitener": { + "columns": 3, + "rank": 2, + "ridge": 1.68, + "mean": [3.0, 1.6, 2.0], + "basis": [ + 0.7039573789341783, 0.0942762816844381, 0.7039573789341783, + -0.06666339808411931, 0.9955460726213311, -0.06666339808411931 + ], + "eigenvalues": [4.026784656146989, 1.013215343853011], + "inverseScales": [0.41860485168207623, 0.6093466950454748] + }, + "expected": { + "neutralMean": [3.0, 1.600000023841858, 2.0], + "centroidMean": [2.75, 2.5, 3.0], + "mean": [1.8822275400161743, 2.184915781021118, 0.7836301922798157], + "basis": [0.08855901658535004, -1.0993337631225586, -1.1802712678909302, -1.3194433450698853, -0.991281270980835, -0.002233356237411499], + "read": [0.29533177614212036, -0.3920646607875824, -0.4599246382713318, -0.4960780739784241, -0.3491402268409729, 0.2879756987094879], + "nodeCoordinates": [0.03663991391658783, 1.5507805347442627, 0.6951634287834167, -0.07849155366420746, -0.8102163076400757, -1.5421169996261597, -3.468050241470337, 0.460904061794281], + "muCoordinates": [0.9232556819915771, 1.4530115127563477, 1.5817792415618896, -0.1762605905532837, 0.07639949023723602, -1.6398860216140747, -2.581434488296509, 0.36313506960868835], + "explainedVariance": 0.9989493407302187, + "mahalanobisShare": 3.8713648573157595, + "neutralCrossGram": [0.678391695022583, 1.4169647693634033, 0.22981593012809753, -2.325172185897827], + "layoutCoordinates": [-0.9232553243637085, 1.4530115127563477, -1.5817787647247314, -0.17626038193702698, -0.07639925181865692, -1.6398861408233643, 2.5814332962036133, 0.3631352484226227], + "neutralLayoutCoordinate": [-0.8866157531738281, -0.09776898473501205], + "anchoredLayoutCoordinates": [-0.03663957118988037, 1.5507805347442627, -0.6951630115509033, -0.07849139720201492, 0.81021648645401, -1.5421171188354492, 3.4680490493774414, 0.46090424060821533], + "axisZeroFinal": { + "mean": [-0.05855145677924156, 0.7268327474594116, 0.7803452014923096], + "basis": [0.08855901658535004, -1.0993337631225586, -1.1802712678909302], + "read": [0.29533177614212036, -0.3920646607875824, -0.4599246382713318], + "nodeCoordinates": [0.03663991391658783, 0.6951634287834167, -0.8102163076400757, -3.468050241470337], + "muCoordinates": [0.9232556819915771, 1.5817792415618896, 0.07639949023723602, -2.581434488296509], + "mahalanobisShare": 3.1660800859030025 + }, + "whitenedGram": [2.967418909072876, 1.1988534927368164, -2.308720588684082, -1.8575516939163208, 1.1988534927368164, 2.5408811569213867, 0.4048459827899933, -4.144579887390137, -2.308720588684082, 0.4048459827899933, 2.6983346939086914, -0.7944602370262146, -1.8575516939163208, -4.144579887390137, -0.7944602370262146, 6.796591758728027] + } +} diff --git a/tests/geometry/test_fold.py b/tests/geometry/test_fold.py index 5565c5621..12912ae3e 100644 --- a/tests/geometry/test_fold.py +++ b/tests/geometry/test_fold.py @@ -78,7 +78,7 @@ def test_is_foldable_vector_manifold_rejects_multinode_affine(): basis = basis.T.contiguous() # (R, D), orthonormal rows mean = torch.zeros(dim) node_coords = torch.randn(K, R) - sub = LayerSubspace.affine(mean, basis, node_coords=node_coords) + sub = LayerSubspace.affine(mean, basis, basis.clone(), node_coords=node_coords) assert sub.is_affine and sub.rank == R mfld = Manifold( name="fan", diff --git a/tests/geometry/test_manifold_math.py b/tests/geometry/test_manifold_math.py index ebe241074..801a15aa9 100644 --- a/tests/geometry/test_manifold_math.py +++ b/tests/geometry/test_manifold_math.py @@ -566,6 +566,109 @@ def apply_inv(self, *args: Any, **kwargs: Any) -> torch.Tensor: assert fit.explained_variance == pytest.approx(ref.explained_variance, abs=1e-6) +def _cosine(a: torch.Tensor, b: torch.Tensor) -> float: + return float(a @ b / (a.norm() * b.norm())) + + +def test_two_node_whitened_fit_writes_the_difference_of_means() -> None: + """Regression: under an anisotropic whitener the 2-node frame was the QR of + the LDA covector ``Σ⁻¹δ`` and steering wrote along it. The frame now writes + along ``δ`` (PCA@2 ≡ DiM), reads with ``Σ⁻¹δ``, is Mahalanobis-unit and + dual, puts the + pole at ``‖δ‖_M / 2`` and bakes the share ``‖δ‖_M / √2``.""" + from drowse.geometry.subspace import fit_affine_subspace, subspace_share + from tests.support.whitener import rogue_whitener + + D = 24 + whitener, clean = rogue_whitener([0], D, n=128) + rogue = sorted(set(range(D)) - set(clean)) + mean = whitener.layer_means[0] + gen = torch.Generator().manual_seed(3) + delta = torch.randn(D, generator=gen) + delta[rogue] += 3.0 # signal leaking into the rogue channels + centroids = torch.stack([mean + delta / 2, mean - delta / 2]) + fit = fit_affine_subspace(centroids, neutral_mean=mean, whitener=whitener, layer=0) + sub = fit.subspace + lda = whitener.apply_inv(0, delta) + assert _cosine(sub.basis[0], delta) == pytest.approx(1.0, abs=1e-5) + assert _cosine(sub.read[0], lda) == pytest.approx(1.0, abs=1e-4) + assert _cosine(lda, delta) < 0.95 # the two genuinely differ here + assert float(sub.read[0] @ sub.basis[0]) == pytest.approx(1.0, abs=1e-5) + norm_m = float((delta @ lda).sqrt()) + assert whitener.mahalanobis_norm(0, sub.basis[0]) == pytest.approx(1.0, rel=1e-4) + assert sub.node_coords is not None + assert sub.node_coords[0, 0].item() == pytest.approx(norm_m / 2, rel=1e-4) + share = subspace_share(fit.mu_coords, sub.basis, whitener=whitener, layer=0) + assert share == pytest.approx(norm_m / math.sqrt(2), rel=1e-4) + # A full push from neutral lands exactly on the + pole. + pushed = sub.eval_at(sub.node_coords[0].reshape(1, 1)).reshape(-1) + assert torch.allclose(pushed - sub.eval_at(torch.zeros(1, 1)).reshape(-1), delta / 2, atol=1e-3) + + +def test_k_node_whitened_frame_is_mahalanobis_orthonormal_and_dual() -> None: + """A K-node fit's write rows are node-displacement combinations, orthonormal + in the whitener's metric, with reads ``Σ⁻¹`` of them; reduced coordinates + are whitened coordinates (the node spread's Frobenius norm is the share).""" + from drowse.geometry.subspace import fit_affine_subspace, subspace_share + from tests.support.whitener import synthetic_whitener + + D, K = 20, 5 + whitener = synthetic_whitener([0], D) + mean = whitener.layer_means[0] + centroids = mean + torch.randn(K, D, generator=torch.Generator().manual_seed(8)) + fit = fit_affine_subspace(centroids, neutral_mean=mean, whitener=whitener, layer=0) + sub = fit.subspace + R = sub.rank + assert torch.allclose(whitener.subspace_gram(0, sub.basis), torch.eye(R), atol=1e-4) + assert torch.allclose(sub.read, whitener.apply_inv(0, sub.basis), atol=1e-4) + assert torch.allclose(sub.read @ sub.basis.T, torch.eye(R), atol=1e-5) + X = centroids - centroids.mean(dim=0) + # The write rows live in the span of the node displacements. + coeff = torch.linalg.lstsq(X.T, sub.basis.T).solution + assert torch.allclose(X.T @ coeff, sub.basis.T, atol=1e-4) + share = subspace_share(fit.mu_coords, sub.basis, whitener=whitener, layer=0) + assert share == pytest.approx(float(fit.mu_coords.norm()), rel=1e-4) + + +def test_full_ablation_is_leace_against_neutral() -> None: + """Regression: ``!d`` projected Euclidean-orthogonally off the LDA covector, + leaving the class-mean difference in other directions. It now reads with + ``Σ⁻¹d`` and writes along ``d``: the two classes' means coincide after it, + and the edit of every row is parallel to ``d``.""" + from drowse.geometry.inject import synthesize_subspace + from drowse.steering.hooks import AffineOp, _lower_affine_subspaces + from tests.support.whitener import rogue_whitener + + D = 24 + whitener, clean = rogue_whitener([0], D, n=128) + rogue = sorted(set(range(D)) - set(clean)) + mean = whitener.layer_means[0] + gen = torch.Generator().manual_seed(5) + d = torch.randn(D, generator=gen) + d[rogue] += 3.0 + synth = synthesize_subspace([], [({0: d}, 1.0)], {0: mean}, whitener=whitener) + op = AffineOp.from_lowered( + _lower_affine_subspaces(synth)[0], device=torch.device("cpu"), dtype=torch.float32, + ) + noise = torch.randn(2, 64, D, generator=gen) + pos, neg = mean + d / 2 + noise[0], mean - d / 2 + noise[1] + before = torch.cat([pos, neg]) + after = before.clone() + op.apply(after) + pos_after, neg_after = after[:64], after[64:] + lda = whitener.apply_inv(0, d) + # The LDA reading of every row is pinned to neutral's. + assert torch.allclose(after @ lda, torch.full((128,), float(mean @ lda)), atol=1e-3) + # The edit is along d. + edit = after - before + along = ((edit @ d) / (d @ d)).unsqueeze(-1) * d + assert torch.allclose(edit, along, atol=1e-3) + # The class means coincide up to the noise's own component off d. + gap = pos_after.mean(0) - neg_after.mean(0) + noise_gap = noise[0].mean(0) - noise[1].mean(0) + off_d = noise_gap - ((noise_gap @ lda) / (d @ lda)) * d + assert torch.allclose(gap, off_d, atol=1e-3) + + def test_fit_curved_subspace_rejects_too_few_nodes(): with pytest.raises(ValueError): fit_curved_subspace(torch.randn(2, 8), torch.rand(2, 1)).subspace @@ -1055,6 +1158,7 @@ def test_layer_major_store_covariances_match_node_reference() -> None: if layer == 2 else torch.randn(7) ), basis, + basis.clone(), ) before = { @@ -1345,7 +1449,7 @@ def _folded_vector(dim: int = 16, seed: int = 0): raw = torch.randn(dim) basis = (raw / raw.norm()).reshape(1, dim) # (1, D) unit direction mean = 20.0 + torch.randn(dim) # realistic DC offset - return LayerSubspace.affine(mean, basis), CustomDomain(1) + return LayerSubspace.affine(mean, basis, basis.clone()), CustomDomain(1) def test_affine_factory_and_is_affine(): @@ -1445,7 +1549,7 @@ def test_affine_manifold_point_round_trip(): diff = c_pos - c_neg s = float(diff.norm()) / 2.0 basis = (diff / diff.norm()).reshape(1, dim) - sub = LayerSubspace.affine(mean, basis) + sub = LayerSubspace.affine(mean, basis, basis.clone()) mfld = Manifold( name="folded", domain=CustomDomain(1), @@ -1531,7 +1635,7 @@ def test_affine_runtime_geometry_requires_exact_k_by_r( node_coords: torch.Tensor, ) -> None: sub = LayerSubspace.affine( - torch.zeros(4), torch.eye(2, 4), node_coords=node_coords, + torch.zeros(4), torch.eye(2, 4), torch.eye(2, 4), node_coords=node_coords, ) manifold = Manifold( name="bad-affine", domain=CustomDomain(2), @@ -1545,7 +1649,7 @@ def test_affine_runtime_geometry_requires_exact_k_by_r( def test_runtime_geometry_rejects_explicit_empty_node_roster() -> None: coords = torch.tensor([[1.0], [-1.0]]) sub = LayerSubspace.affine( - torch.zeros(4), torch.ones(1, 4) / 2, node_coords=coords, + torch.zeros(4), torch.ones(1, 4) / 2, torch.ones(1, 4) / 2, node_coords=coords, ) manifold = Manifold( name="bad-roster", domain=CustomDomain(1), @@ -1560,7 +1664,7 @@ def test_runtime_geometry_rejects_explicit_empty_node_roster() -> None: def test_runtime_geometry_rejects_wrong_shared_authoring_arity() -> None: per_layer = torch.tensor([[1.0], [-1.0]]) sub = LayerSubspace.affine( - torch.zeros(4), torch.ones(1, 4) / 2, node_coords=per_layer, + torch.zeros(4), torch.ones(1, 4) / 2, torch.ones(1, 4) / 2, node_coords=per_layer, ) manifold = Manifold( name="bad-domain", domain=CustomDomain(1), @@ -1575,7 +1679,7 @@ def test_runtime_geometry_rejects_wrong_shared_authoring_arity() -> None: def test_runtime_geometry_rejects_invalid_share_scalar(share: object) -> None: coords = torch.tensor([[1.0], [-1.0]]) sub = LayerSubspace.affine( - torch.zeros(4), torch.ones(1, 4) / 2, node_coords=coords, + torch.zeros(4), torch.ones(1, 4) / 2, torch.ones(1, 4) / 2, node_coords=coords, ) manifold = Manifold( name="bad-share", domain=CustomDomain(1), diff --git a/tests/geometry/test_packing.py b/tests/geometry/test_packing.py index 79c58865f..6cb3162d8 100644 --- a/tests/geometry/test_packing.py +++ b/tests/geometry/test_packing.py @@ -50,7 +50,8 @@ def _manifold() -> Manifold: for layer in range(3): q, _ = torch.linalg.qr(torch.randn(8, 2)) layers[layer] = LayerSubspace.affine( - torch.randn(8), q.T.contiguous(), node_coords=torch.randn(3, 2), + torch.randn(8), q.T.contiguous(), q.T.clone(), + node_coords=torch.randn(3, 2), ) return Manifold( name="packed", domain=CustomDomain(2), node_labels=["a", "b", "c"], diff --git a/tests/geometry/test_synthesize_subspace.py b/tests/geometry/test_synthesize_subspace.py index 16c83f3ad..49d0c2550 100644 --- a/tests/geometry/test_synthesize_subspace.py +++ b/tests/geometry/test_synthesize_subspace.py @@ -24,7 +24,7 @@ from drowse.geometry.subspace import LayerSubspace from drowse.geometry.inject import ( SynthesizedSubspace, - _ortho_basis, + _ortho_frame, subspace_inject, synthesize_subspace as _synthesize_subspace, ) @@ -56,7 +56,14 @@ def _row(v: torch.Tensor) -> torch.Tensor: return _unit(v).reshape(1, -1) -# --------------------------------------------------------------- _ortho_basis --- +def _ortho_basis(rows: torch.Tensor) -> tuple[torch.Tensor, list[int]]: + """The Euclidean case of :func:`_ortho_frame` (reads are the rows).""" + basis, read, kept = _ortho_frame(rows, rows) + assert torch.allclose(read, basis) + return basis, kept + + +# --------------------------------------------------------------- _ortho_frame --- def test_ortho_basis_orthonormal_and_ordered(): torch.manual_seed(0) @@ -84,6 +91,26 @@ def test_ortho_basis_all_degenerate_empty(): assert kept == [] +def test_ortho_frame_is_mahalanobis_orthonormal_and_dual() -> None: + """Under an anisotropic metric the frame is M-orthonormal, its reads are + ``Σ⁻¹`` of its rows (so ``read @ basisᵀ = I``), and it spans the inputs.""" + from tests.support.whitener import synthetic_whitener + + torch.manual_seed(4) + D = 16 + whitener = synthetic_whitener([0], D) + rows = torch.randn(3, D) + basis, read, kept = _ortho_frame(rows, whitener.apply_inv(0, rows)) + assert kept == [0, 1, 2] + assert torch.allclose(read, whitener.apply_inv(0, basis), atol=1e-4) + assert torch.allclose(read @ basis.T, torch.eye(3), atol=1e-4) + # same span: each input row is reproduced by its own coordinates + assert torch.allclose((rows @ read.T) @ basis, rows, atol=1e-4) + # order preserved: the first axis is the first row, Mahalanobis-normalized + first = rows[0] / float((rows[0] @ whitener.apply_inv(0, rows[0])).sqrt()) + assert torch.allclose(basis[0], first, atol=1e-4) + + # ---------------------------------------------------------- single push (fold) --- def test_single_push_reduces_to_r1_fold(): @@ -384,7 +411,7 @@ def test_synth_validation_does_not_concatenate_device_views( monkeypatch: pytest.MonkeyPatch, ) -> None: """Dispatch validation must avoid the MPS ``cat`` Metal-blit crash path.""" - sub = LayerSubspace.affine(torch.zeros(4), torch.eye(2, 4)) + sub = LayerSubspace.affine(torch.zeros(4), torch.eye(2, 4), torch.eye(2, 4)) def explode(*_args: object, **_kwargs: object) -> None: raise AssertionError("SynthesizedSubspace validation called torch.cat") @@ -395,7 +422,7 @@ def explode(*_args: object, **_kwargs: object) -> None: def test_synth_rejects_mean_basis_width_mismatch() -> None: - sub = LayerSubspace.affine(torch.zeros(4), torch.eye(2, 5)) + sub = LayerSubspace.affine(torch.zeros(4), torch.eye(2, 5), torch.eye(2, 5)) with pytest.raises(ValueError, match="mean width"): _synth_from_subspace(sub) @@ -404,7 +431,7 @@ def test_synth_rejects_wrong_coordinate_normalization_shape() -> None: from dataclasses import replace sub = replace( - LayerSubspace.affine(torch.zeros(4), torch.eye(2, 4)), + LayerSubspace.affine(torch.zeros(4), torch.eye(2, 4), torch.eye(2, 4)), coord_offset=torch.zeros(1), ) with pytest.raises(ValueError, match="coord_offset/coord_scale"): @@ -415,27 +442,26 @@ def test_synth_rejects_artifact_only_fields() -> None: from dataclasses import replace sub = replace( - LayerSubspace.affine(torch.zeros(4), torch.eye(2, 4)), + LayerSubspace.affine(torch.zeros(4), torch.eye(2, 4), torch.eye(2, 4)), affine_map=torch.eye(2), ) with pytest.raises(ValueError, match="artifact surface fields"): _synth_from_subspace(sub) -def test_synth_rejects_nonorthonormal_basis() -> None: - sub = LayerSubspace.affine( - torch.zeros(4), torch.tensor([ - [1.0, 0.0, 0.0, 0.0], - [1.0, 0.0, 0.0, 0.0], - ]), - ) - with pytest.raises(ValueError, match="orthonormal"): +def test_synth_rejects_reads_not_dual_to_the_basis() -> None: + rows = torch.tensor([ + [1.0, 0.0, 0.0, 0.0], + [1.0, 0.0, 0.0, 0.0], + ]) + sub = LayerSubspace.affine(torch.zeros(4), rows, rows.clone()) + with pytest.raises(ValueError, match="dual"): _synth_from_subspace(sub) @pytest.mark.parametrize("share", [0.0, -1.0, float("inf"), True, "1.0"]) def test_synth_rejects_invalid_share_scalar(share: object) -> None: - sub = LayerSubspace.affine(torch.zeros(4), torch.eye(2, 4)) + sub = LayerSubspace.affine(torch.zeros(4), torch.eye(2, 4), torch.eye(2, 4)) with pytest.raises(ValueError, match="finite and positive"): SynthesizedSubspace( layers={0: sub}, target_coord={0: torch.zeros(2)}, diff --git a/tests/gpu/test_model_numerics_gpu.py b/tests/gpu/test_model_numerics_gpu.py index 5be57d523..71f762352 100644 --- a/tests/gpu/test_model_numerics_gpu.py +++ b/tests/gpu/test_model_numerics_gpu.py @@ -105,7 +105,7 @@ def test_native_steering_matches_manual_intervention(loaded: tuple[Any, Any], ab mean = torch.zeros(dim) target = torch.tensor([.25, 0. if ablate else -.125]) kappa = torch.tensor([0., .5 if ablate else 0.]) - synth = SynthesizedSubspace({layer: LayerSubspace.affine(mean, basis)}, {layer: target}, {layer: 1.}, {layer: kappa}) + synth = SynthesizedSubspace({layer: LayerSubspace.affine(mean, basis, basis.clone())}, {layer: target}, {layer: 1.}, {layer: kappa}) plan = SteeringPlan() plan.add_subspace("check", synth) manager = SteeringManager() diff --git a/tests/model/test_model_numerics.py b/tests/model/test_model_numerics.py index a67da12c3..6fbd71ec8 100644 --- a/tests/model/test_model_numerics.py +++ b/tests/model/test_model_numerics.py @@ -141,7 +141,7 @@ def test_steering_manager_matches_independent_block_intervention(model: Any, abl mean = torch.linspace(-.1, .1, dim) target = torch.tensor([.03, 0. if ablate else -.02]) kappa = torch.tensor([0., .7 if ablate else 0.]) - sub = LayerSubspace.affine(mean, basis) + sub = LayerSubspace.affine(mean, basis, basis.clone()) synth = SynthesizedSubspace({1: sub}, {1: target}, {1: 1.}, {1: kappa}) plan = SteeringPlan() plan.add_subspace("test", synth) diff --git a/tests/readout/test_manifold_monitor.py b/tests/readout/test_manifold_monitor.py index a2db02884..bb0900d79 100644 --- a/tests/readout/test_manifold_monitor.py +++ b/tests/readout/test_manifold_monitor.py @@ -965,7 +965,9 @@ def _flat_manifold( q, _ = torch.linalg.qr(a) # (D, R) orthonormal columns basis = q[:, :R].T.contiguous() # (R, D) orthonormal rows mean = torch.randn(dim) * 0.1 + float(layer_idx + 1) - layers[layer_idx] = LayerSubspace.affine(mean, basis, node_coords=rc) + layers[layer_idx] = LayerSubspace.affine( + mean, basis, basis.clone(), node_coords=rc, + ) share[layer_idx] = 1.0 + 0.3 * layer_idx return Manifold( name=name, diff --git a/tests/server/test_drowse_api.py b/tests/server/test_drowse_api.py index 35b7e58aa..815539954 100644 --- a/tests/server/test_drowse_api.py +++ b/tests/server/test_drowse_api.py @@ -1587,11 +1587,11 @@ def wired( node_coords=node_coords, layers={ L: LayerSubspace.affine( - session.layer_means[L].clone(), - torch.linalg.qr(torch.randn(dim, R, generator=g))[0].T.contiguous(), + session.layer_means[L].clone(), q, q.clone(), node_coords=node_coords.clone(), ) for L in layers + for q in [torch.linalg.qr(torch.randn(dim, R, generator=g))[0].T.contiguous()] }, mahalanobis_share={L: 1.0 for L in layers}, ) diff --git a/tests/server/test_server_manifold_eviction.py b/tests/server/test_server_manifold_eviction.py index ce6e14f57..611b2cc61 100644 --- a/tests/server/test_server_manifold_eviction.py +++ b/tests/server/test_server_manifold_eviction.py @@ -150,7 +150,8 @@ def test_fit_route_refolds_probes_folded_from_the_profile( probe_layer = next(iter(after["local/mood"].layers)) basis = after["local/mood"].layers[probe_layer].basis.reshape(-1) direction = refit[probe_layer].to(basis).reshape(-1) - assert torch.allclose(basis, direction / direction.norm(), atol=1e-5) + # The fold writes along the refit direction (Mahalanobis-normalized). + assert torch.allclose(basis / basis.norm(), direction / direction.norm(), atol=1e-5) def _assert_evicted(session: Any) -> None: diff --git a/tests/session/test_artifact_registry.py b/tests/session/test_artifact_registry.py index 871c62f48..101a7ab97 100644 --- a/tests/session/test_artifact_registry.py +++ b/tests/session/test_artifact_registry.py @@ -180,7 +180,7 @@ def _ray(direction: torch.Tensor, *, share: float = 1.0) -> Any: unit = (direction / direction.norm()).reshape(1, -1) layer = LayerSubspace.affine( - torch.zeros(direction.numel()), unit, + torch.zeros(direction.numel()), unit, unit.clone(), node_coords=torch.tensor([[1.0]]), ) return Manifold( @@ -235,7 +235,8 @@ def test_adopt_fitted_drops_probe_folds_when_the_fit_no_longer_folds() -> None: fold = registry.fold_probe("local/mood", {0: torch.ones(2)}) rank2 = _ray(torch.tensor([1.0, 0.0])) rank2.layers[0] = type(rank2.layers[0]).affine( - torch.zeros(2), torch.eye(2), node_coords=torch.tensor([[1.0, 0.0]]), + torch.zeros(2), torch.eye(2), torch.eye(2), + node_coords=torch.tensor([[1.0, 0.0]]), ) registry.adopt_fitted("local/mood", rank2) assert seen.swaps == [{id(fold): None}] diff --git a/tests/steering/test_hooks_triggers.py b/tests/steering/test_hooks_triggers.py index 762e6ef3c..4569b7902 100644 --- a/tests/steering/test_hooks_triggers.py +++ b/tests/steering/test_hooks_triggers.py @@ -22,9 +22,9 @@ ) from drowse.geometry.domains import CustomDomain from drowse.geometry.subspace import LayerSubspace -from drowse.geometry.inject import subspace_inject, synthesize_subspace +from drowse.geometry.inject import _ortho_frame, subspace_inject, synthesize_subspace from drowse.steering.triggers import Trigger, TriggerContext -from tests.support.whitener import isotropic_whitener +from tests.support.whitener import isotropic_whitener, synthetic_whitener _DIM = 16 @@ -55,14 +55,24 @@ def _affine_group(layer: int, trigger: Trigger) -> AffineGroup: ) +def _oblique_frame(rank: int, seed: int) -> tuple[torch.Tensor, torch.Tensor]: + """A Mahalanobis-orthonormal frame under an anisotropic metric: its reads + differ from its rows, so the parity below exercises the typing.""" + whitener = synthetic_whitener([0], _DIM, seed=seed) + rows = torch.randn(rank, _DIM, generator=torch.Generator().manual_seed(seed)) + basis, read, kept = _ortho_frame(rows, whitener.apply_inv(0, rows)) + assert len(kept) == rank and not torch.allclose(read, basis, atol=1e-2) + return basis, read + + def _mixed_op(kappa: torch.Tensor, along: float, dtype: torch.dtype = torch.float32): - basis = torch.eye(2, _DIM) + basis, read = _oblique_frame(2, seed=5) mean = torch.linspace(-0.2, 0.3, _DIM) - sub = LayerSubspace.affine(mean, basis) + sub = LayerSubspace.affine(mean, basis, read) target = torch.tensor([0.7, -0.25]) low = LoweredAffine(subspace=sub, target=target, eff_along=along, kappa=kappa) op = AffineOp.from_lowered(low, device=torch.device("cpu"), dtype=dtype) - return op, sub, target, mean, basis + return op, sub, target, mean, read # ----------------------------------------------------------------- grouping --- @@ -102,11 +112,11 @@ def test_both_trigger_always_applies(): def test_affine_op_matches_unified_kernel(kappa: torch.Tensor) -> None: """The split push + compact ablation is algebraically the affine kernel.""" along = 0.65 - op, sub, target, mean, basis = _mixed_op(kappa, along) + op, sub, target, mean, read = _mixed_op(kappa, along) hidden = torch.randn(1, 3, _DIM) expected, _ = subspace_inject( hidden, sub, CustomDomain(2), target, torch.zeros(2), along, 0.0, - mean_proj=mean @ basis.T, kappa=kappa, + mean_proj=mean @ read.T, kappa=kappa, ) actual = hidden.clone() op.apply(actual) @@ -115,9 +125,9 @@ def test_affine_op_matches_unified_kernel(kappa: torch.Tensor) -> None: def test_rank_one_ablation_matches_unified_kernel() -> None: """The rank-1 dot + ``addcmul_`` path is the same projection.""" - basis = _unit(_DIM, seed=3).reshape(1, -1) + basis, read = _oblique_frame(1, seed=3) mean = torch.linspace(-0.2, 0.3, _DIM) - sub = LayerSubspace.affine(mean, basis) + sub = LayerSubspace.affine(mean, basis, read) target = torch.tensor([0.3]) kappa = torch.tensor([0.8]) low = LoweredAffine(subspace=sub, target=target, eff_along=1.5, kappa=kappa) @@ -142,13 +152,13 @@ def test_affine_op_recast_is_memoized_and_exact() -> None: """ kappa = torch.tensor([0.0, 1.0]) along = 0.65 - op, sub, target, mean, basis = _mixed_op(kappa, along) + op, sub, target, mean, read = _mixed_op(kappa, along) assert op.rows is not None and op.rows.dtype is torch.float32 hidden = torch.randn(1, 3, _DIM).to(torch.float16) expected, _ = subspace_inject( hidden.to(torch.float32), sub, CustomDomain(2), target, torch.zeros(2), - along, 0.0, mean_proj=mean @ basis.T, kappa=kappa, + along, 0.0, mean_proj=mean @ read.T, kappa=kappa, ) actual = hidden.clone() op.apply(actual) diff --git a/tests/steering/test_layer_scoped_steering.py b/tests/steering/test_layer_scoped_steering.py index 809122f84..01704b47b 100644 --- a/tests/steering/test_layer_scoped_steering.py +++ b/tests/steering/test_layer_scoped_steering.py @@ -146,16 +146,18 @@ def test_a_scoped_term_steers_exactly_its_layers( @pytest.mark.usefixtures("isolated_home") def test_a_scoped_ablation_keeps_its_exact_coefficient(tiny_session: Any) -> None: - """``0.4 !a{1,3}`` keeps 60% of the neutral-centered component along ``a`` - at layers 1 and 3, exactly as the unscoped ablation does everywhere.""" + """``0.4 !a{1,3}`` keeps 60% of the neutral-centered reading along ``a``'s + covector ``Σ⁻¹a`` at layers 1 and 3, exactly as the unscoped ablation does + everywhere.""" profile = register_vectors(tiny_session, "a")["a"] means = tiny_session.layer_means + whitener = tiny_session.whitener for expr, layers in (("0.4 !a{1,3}", (1, 3)), ("0.4 !a", (0, 1, 2, 3))): with tiny_session.steering(expr): captured = _capture(tiny_session) assert _touched(captured) == set(layers) for L in layers: - d = profile[L].to(torch.float32) + d = whitener.apply_inv(L, profile[L].to(torch.float32)).to(torch.float32) mu = means[L].to(torch.float32) @ d before, after = (captured[L][i].to(torch.float32) @ d - mu for i in (0, 1)) assert torch.allclose(after, 0.6 * before, rtol=1e-4, atol=1e-4), (expr, L) diff --git a/tests/steering/test_steering_context_ablation.py b/tests/steering/test_steering_context_ablation.py index 96291bd85..bbd7d86c1 100644 --- a/tests/steering/test_steering_context_ablation.py +++ b/tests/steering/test_steering_context_ablation.py @@ -122,13 +122,32 @@ def test_zero_ablation_coefficient_is_a_true_noop() -> None: def test_mean_ablation_pins_the_concept_coordinate_to_neutral(tiny_session: Any) -> None: - """``!a`` at alpha 1 replaces every position's component along the - concept direction with the neutral mean's: ``h'.d = mu.d`` (the - Euclidean operator ``h' = h - (h.d - mu.d) d``), read from the layer - outputs of a real forward.""" + """``!a`` at alpha 1 is LEACE against the neutral mean: every position's + reading along the concept covector ``Σ⁻¹d`` becomes the neutral mean's + (``h'·Σ⁻¹d = mu·Σ⁻¹d``), and the edit moves along ``d`` itself + (``h' = h - ((h - mu)·Σ⁻¹d / d·Σ⁻¹d) d``), read from the layer outputs of + a real forward.""" profile = register_vectors(tiny_session, "a")["a"] means = tiny_session.layer_means + whitener = tiny_session.whitener seen: dict[int, torch.Tensor] = {} + clean: dict[int, torch.Tensor] = {} + + def _record_clean(layer: int) -> Any: + def hook(_module: Any, _inputs: Any, output: Any) -> None: + hidden = output[0] if isinstance(output, tuple) else output + clean[layer] = hidden[0].detach().float().clone() + return hook + + handles = [ + module.register_forward_hook(_record_clean(layer)) + for layer, module in enumerate(tiny_session.layers) + ] + try: + forward_logits(tiny_session) + finally: + for handle in handles: + handle.remove() def _record(layer: int) -> Any: def hook(_module: Any, _inputs: Any, output: Any) -> None: @@ -148,9 +167,22 @@ def hook(_module: Any, _inputs: Any, output: Any) -> None: handle.remove() assert sorted(seen) == list(range(len(tiny_session.layers))) - for layer, hidden in seen.items(): - direction = profile[layer] / profile[layer].norm() - neutral = float(means[layer].float() @ direction) + layer = 0 + hidden = seen[layer] + direction = profile[layer].float() + covector = whitener.apply_inv(layer, direction).float() + neutral = float(means[layer].float() @ covector) + assert torch.allclose( + hidden @ covector, torch.full((hidden.shape[0],), neutral), + atol=1e-4, rtol=1e-4, + ) + # Layer 0 sees the clean input, so its edit is exactly along ``d``. + edit = hidden - clean[layer] + along = (edit @ direction / (direction @ direction)).unsqueeze(-1) * direction + assert torch.allclose(edit, along, atol=1e-4) + for later, h in seen.items(): + cov = whitener.apply_inv(later, profile[later].float()).float() assert torch.allclose( - hidden @ direction, torch.full((hidden.shape[0],), neutral), atol=1e-5, + h @ cov, torch.full((h.shape[0],), float(means[later].float() @ cov)), + atol=1e-4, rtol=1e-4, ) diff --git a/tests/store/test_drowse_archive.py b/tests/store/test_drowse_archive.py index d46ff0ed4..61fd8b8b1 100644 --- a/tests/store/test_drowse_archive.py +++ b/tests/store/test_drowse_archive.py @@ -91,7 +91,7 @@ def _fit(folder: Path, *, finite: bool = True) -> Path: node_coords=node_coords, layers={ 0: LayerSubspace.affine( - mean=torch.zeros(2), basis=basis, + mean=torch.zeros(2), basis=basis, read=basis.clone(), node_coords=node_coords.clone(), ), }, @@ -220,6 +220,7 @@ def test_monopolar_discover_fit_exports_and_installs(tmp_path: Path) -> None: 0: LayerSubspace.affine( mean=torch.zeros(2), basis=torch.tensor([[1.0, 0.0]]), + read=torch.tensor([[1.0, 0.0]]), node_coords=node_coords.clone(), ), }, diff --git a/tests/store/test_manifolds_io.py b/tests/store/test_manifolds_io.py index 90fd659d9..ff4366832 100644 --- a/tests/store/test_manifolds_io.py +++ b/tests/store/test_manifolds_io.py @@ -2285,7 +2285,7 @@ def test_rectangular_affine_transfer_preserves_points_frame_and_steering( name="rect-flat", domain=CustomDomain(2), node_labels=["a", "b", "c"], node_coords=node_coords, layers={0: LayerSubspace.affine( - torch.tensor([0.5, -1.0, 2.0, 0.25]), basis, + torch.tensor([0.5, -1.0, 2.0, 0.25]), basis, basis.clone(), node_coords=node_coords, )}, mahalanobis_share={0: 1.0}, ) @@ -2297,8 +2297,9 @@ def test_rectangular_affine_transfer_preserves_points_frame_and_steering( alignment = LayerAlignment( dense, torch.eye(4), torch.linspace(-0.5, 0.5, 6), ) + target_whitener = _target_whitener(dim=6, layers=(0,)) target = transfer_manifold_subspaces( - source, {0: alignment}, whitener=_target_whitener(dim=6, layers=(0,)), + source, {0: alignment}, whitener=target_whitener, target_layer_means={0: torch.zeros(6)}, from_model="src", to_model="tgt", ) @@ -2309,9 +2310,14 @@ def test_rectangular_affine_transfer_preserves_points_frame_and_steering( atol=1e-5, ) target_sub = target.layers[0] + # Orthonormal in the target's Mahalanobis metric, with exactly dual reads. assert torch.allclose( - target_sub.basis @ target_sub.basis.T, torch.eye(2), atol=1e-5, + target_whitener.subspace_gram(0, target_sub.basis), torch.eye(2), atol=1e-4, ) + assert torch.allclose( + target_sub.read, target_whitener.apply_inv(0, target_sub.basis), atol=1e-4, + ) + assert torch.allclose(target_sub.read @ target_sub.basis.T, torch.eye(2), atol=1e-5) assert target_sub.node_coords is not None assert torch.allclose( target_sub.node_coords[1] @ target_sub.basis, @@ -2346,7 +2352,7 @@ def test_monopolar_affine_transfer_rebakes_positive_world_direction_share() -> N name="ray", domain=CustomDomain(1), node_labels=["positive"], node_coords=torch.tensor([[1.0]]), layers={0: LayerSubspace.affine( - torch.zeros(3), basis, node_coords=real_coord, + torch.zeros(3), basis, basis.clone(), node_coords=real_coord, )}, mahalanobis_share={0: 1.0}, ) @@ -2366,7 +2372,10 @@ def test_monopolar_affine_transfer_rebakes_positive_world_direction_share() -> N assert transferred.mahalanobis_share[0] > 0.0 -def test_rectangular_curved_transfer_rejects_anisotropic_tube() -> None: +def test_rectangular_curved_transfer_keeps_the_surface_and_isotropizes_the_tube() -> None: + """A non-isometric companion map moves every surface point exactly and + rescales the scalar tube by the volume-preserving factor ``(Π sᵢ)^(1/R)`` + of its singular values (a uniform shift of the log-σ field).""" import torch from dataclasses import replace from drowse.geometry.domains import BoxAxis, BoxDomain @@ -2401,13 +2410,30 @@ def test_rectangular_curved_transfer_rejects_anisotropic_tube() -> None: [0.3, 0.0, 0.0, 0.0], [0.0, -0.2, 0.0, 0.0], ]) alignment = LayerAlignment(dense, torch.eye(4), torch.arange(6).float() / 10) - with pytest.raises(ValueError, match="anisotropic tube transfer"): - transfer_manifold_subspaces( - source, {0: alignment}, - whitener=_target_whitener(dim=6, layers=(0,)), - target_layer_means={0: torch.zeros(6)}, - from_model="src", to_model="tgt", + target = transfer_manifold_subspaces( + source, {0: alignment}, + whitener=_target_whitener(dim=6, layers=(0,)), + target_layer_means={0: torch.zeros(6)}, + from_model="src", to_model="tgt", + ) + moved = target.layers[0] + for point in (coords[1], torch.tensor([0.3])): + emb = domain.embed(point.reshape(1, -1)) + assert torch.allclose( + moved.eval_at(emb), alignment.apply_points(sub.eval_at(emb)), atol=1e-4, ) + # Recover the companion L from new = old @ L on the surface coefficients. + assert moved.rbf_weights is not None and moved.poly_coeffs is not None + assert sub.rbf_weights is not None and sub.poly_coeffs is not None + old = torch.cat([sub.rbf_weights, sub.poly_coeffs]) + new = torch.cat([moved.rbf_weights, moved.poly_coeffs]) + companion = torch.linalg.lstsq(old, new).solution + expected = float(torch.linalg.svdvals(companion).log().mean().exp()) + assert expected != pytest.approx(1.0, abs=1e-3) # genuinely non-isometric + for point in (coords[0], coords[2], torch.tensor([0.7])): + emb = domain.embed(point.reshape(1, -1)) + ratio = float(moved.sigma_at(emb)) / float(sub.sigma_at(emb)) + assert ratio == pytest.approx(expected, rel=1e-3) def test_rectangular_transfer_rejects_collapsed_subspace_rank() -> None: @@ -2423,6 +2449,7 @@ def test_rectangular_transfer_rejects_collapsed_subspace_rank() -> None: node_coords=torch.tensor([[0.0, 0.0], [1.0, 1.0]]), layers={0: LayerSubspace.affine( torch.zeros(3), torch.tensor([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]), + torch.tensor([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]), node_coords=torch.tensor([[0.0, 0.0], [1.0, 1.0]]), )}, mahalanobis_share={0: 1.0}, ) @@ -2450,7 +2477,7 @@ def test_rectangular_transfer_rejects_oblique_rank_collapse() -> None: name="oblique-collapse", domain=CustomDomain(3), node_labels=["a", "b", "c"], node_coords=torch.eye(3), layers={0: LayerSubspace.affine( - torch.zeros(3), torch.eye(3), node_coords=torch.eye(3), + torch.zeros(3), torch.eye(3), torch.eye(3), node_coords=torch.eye(3), )}, mahalanobis_share={0: 1.0}, ) generator = torch.Generator().manual_seed(30061) @@ -2715,8 +2742,9 @@ def test_strict_fitted_load_rejects_invalid_digest_before_hashing( def test_transfer_manifold_identity_alignment_preserves_geometry( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ): - """An identity alignment leaves the per-layer subspace unchanged and - writes the transferred tensor at the ``_from-`` filename.""" + """An identity alignment leaves the per-layer surface unchanged (the frame + is only re-normalized in the target metric) and writes the transferred + tensor at the ``_from-`` filename.""" import torch from drowse.store.manifold_tensors import load_manifold @@ -2751,7 +2779,16 @@ def test_transfer_manifold_identity_alignment_preserves_geometry( assert sorted(tgt_man.layers) == sorted(src_man.layers) for L in src_man.layers: assert torch.allclose(tgt_man.layers[L].mean, src_man.layers[L].mean, atol=1e-5) - assert torch.allclose(tgt_man.layers[L].basis, src_man.layers[L].basis, atol=1e-5) + src_basis, tgt_basis = src_man.layers[L].basis, tgt_man.layers[L].basis + # Same span: the target rows are combinations of the source rows ... + mixing = torch.linalg.lstsq(src_basis.T, tgt_basis.T).solution + assert torch.allclose(mixing.T @ src_basis, tgt_basis, atol=1e-4) + # ... and every surface point stays where it was. + for position in src_man.node_coords: + assert torch.allclose( + tgt_man.manifold_point(L, position), + src_man.manifold_point(L, position), atol=1e-4, + ) # The source's per-model Mahalanobis share is invalid in target space, so # it is RE-BAKED in the target metric (mandatory now — never dropped). assert src_man.mahalanobis_share # source had one diff --git a/tests/support/artifacts.py b/tests/support/artifacts.py index dd6073860..0e327f37c 100644 --- a/tests/support/artifacts.py +++ b/tests/support/artifacts.py @@ -39,6 +39,7 @@ def write_fitted_manifold( layers={ 0: LayerSubspace.affine( mean=torch.zeros(2), basis=torch.tensor([[1.0, 0.0]]), + read=torch.tensor([[1.0, 0.0]]), node_coords=node_coords.clone(), ), }, From 8de464a5a96d59c231cd807e456ac46913d5f183 Mon Sep 17 00:00:00 2001 From: a9lim Date: Tue, 10 Nov 2026 13:50:13 -0500 Subject: [PATCH 2/4] Lens atoms are reads: steer along their raised vectors, decompose them in the dual metric MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A `jlens/` atom (W_U[v] J_l) and an `slens/` atom (K_l ẽ_v) score a residual by a dot product: they are covectors. Registered as plain profiles under typed frames, `!jlens/` would pin the Σ⁻¹u reading rather than the token's own. The resolvers now register the raised vector Σu (LayerWhitener.apply), the write that moves the reading furthest per unit of Mahalanobis displacement; folded, it reads with u again, so a push raises the token's reading and `!` zeroes exactly that reading (LEACE). On real models Σu is mostly u restricted to the neutral span (cos about 0.15 with u; no concentration in the rogue channels), so jlens/slens push calibration moves. The token dictionaries of `decompose` take the same typing: atoms whiten by Σ^{+1/2} (LayerWhitener.whiten_dual) while targets and neuron writes whiten by Σ^{-1/2}, so a token's score is its reading of the residual over that reading's neutral spread, and a raised atom decomposes to its own token. Read atoms are nearly collinear in that metric, so the pursuit's k×k solve runs in fp64 and selection stops once the residual is negligible. Raising needs the whitener while resolving, so opening a steering scope now makes the neutral baseline resident first (through the composer's unguarded ensure); a cold session's generate(steering="... jlens/x") used to refuse. Browser seam: the slens and unit-reads units goldens regenerate (the S atom profile and `unit find` of a jlens atom). --- ARCHITECTURE.md | 2 +- README.md | 4 +- drowse/geometry/AGENTS.md | 9 ++- drowse/geometry/whitener.py | 35 +++++++++ drowse/lens/AGENTS.md | 31 +++++--- drowse/lens/decompose.py | 72 +++++++++++-------- drowse/lens/instrument.py | 51 ++++++++++--- drowse/steering/composer.py | 8 ++- tests/fixtures/browser/slens-gemma3-v1.json | 12 ++-- tests/fixtures/browser/slens-qwen3-v1.json | 12 ++-- .../browser/unit-reads-gemma3-v1.json | 44 +++++------- .../fixtures/browser/unit-reads-qwen3-v1.json | 65 +++++++++-------- tests/lens/test_jlens_decompose.py | 27 +++++-- tests/lens/test_jlens_grammar.py | 71 +++++++++++++++++- tests/lens/test_lens_runtime.py | 6 +- tests/lens/test_slens.py | 9 ++- 16 files changed, 325 insertions(+), 133 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index edb39ba6a..37b8c3c48 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -367,7 +367,7 @@ in `drowse/steering/AGENTS.md`. In brief: | `x{12-20}`, `x{4-8,20}`, `x{workspace}` | act only at these layers (any term kind) | | `@response`, `@after`, `@first:N`, … | restrict the token phase or window | | `@when:probe>t` | fire only while a read-side scalar holds | -| `jlens/`, `sae/` | instrument atoms in reserved namespaces | +| `jlens/`, `sae/` | instrument atoms in reserved namespaces (a lens atom is a read `u`, steered along its raised vector `Σu`) | | `neuron/L8n344`, `!head/L20h17` | model units: a neuron push along its write (a one-layer profile through the one kernel), a unit mean-ablation (`UnitAblationTerm` → a `UnitOp` pre-hook replacing the unit's activation by its neutral mean) | ### 6.2 Resolution and composition diff --git a/README.md b/README.md index c692f01d3..75b72bbd2 100644 --- a/README.md +++ b/README.md @@ -170,8 +170,8 @@ across Python, YAML, OpenAI, Ollama, or the native API. | `@prompt`, `@response`, `@after`, `@thinking`, … | Restrict the token phase where a term applies | | `@first:N`, `@after:N` | Restrict a term to a counted decode window | | `@when:` | Apply a term only while a live probe gate is true | -| `jlens/`, `jlens/#`, `sae/` | Steer toward saying a token (its R-lens direction) or along an SAE decoder row | -| `slens/`, `slens/#` | Steer toward having read a token: its S-lens footprint at each layer | +| `jlens/`, `jlens/#`, `sae/` | Steer toward saying a token (the whitener-raised vector of its R-lens read) or along an SAE decoder row | +| `slens/`, `slens/#` | Steer toward having read a token: its S-lens footprint at each layer, raised to a vector | | `neuron/L8n344`, `head/L20h17` | A unit: push along a neuron's write, or mean-ablate a neuron or head (`!head/L20h17`) | A bare pole or node label such as `formal` or `pirate` resolves to its concept diff --git a/drowse/geometry/AGENTS.md b/drowse/geometry/AGENTS.md index 4151de00b..2bd94567b 100644 --- a/drowse/geometry/AGENTS.md +++ b/drowse/geometry/AGENTS.md @@ -349,10 +349,15 @@ layer whose centered rows or `K` are non-finite is left out, which is why `store/neutral.py::load_neutral_whitener` from the fp32 neutral cache, or by the session's lazy neutral state. -Primitives: `apply_inv`, `whiten(layer, rows)` (the whitened coordinates +Primitives: `apply_inv` (`Σ⁻¹v`, lowering a vector to its covector), `apply` +(`Σv = λv + Xᵀ(Xv)/N`, raising a read to its write; the lens atoms), +`whiten(layer, rows)` (the whitened coordinates of vectors, `W v`, `W = Σ^{-1/2} = (1/√λ)(I − V diag(g) Vᵀ)` from the thin SVD of `X`, cached per layer, never D×D; whitened dot products are Mahalanobis, and the -lens decompositions fold `W` into their dictionaries), +lens decompositions fold `W` into their neuron dictionary and the target), +`whiten_dual(layer, rows)` (the whitened coordinates of covectors, +`Σ^{1/2} u = √λ(I + V diag(g/(1−g)) Vᵀ) u`, exactly inverse to `whiten`, so a +read pairs with a vector as before whitening; the token dictionaries), `mahalanobis_norm(s)`, `mahalanobis_cosine`, `leace_project` (Belrose et al. 2023; `~` keeps `⟨b, d⟩_M/⟨d, d⟩_M · d`, `|` erases it), `subspace_gram(layer, B) = B Σ⁻¹ Bᵀ` (the reduced metric behind the diff --git a/drowse/geometry/whitener.py b/drowse/geometry/whitener.py index b331bafdb..0c058f96b 100644 --- a/drowse/geometry/whitener.py +++ b/drowse/geometry/whitener.py @@ -316,6 +316,23 @@ def apply_inv(self, layer: int, v: torch.Tensor) -> torch.Tensor: out = (rows - KXv @ X) / lam # (B, D) return out.reshape(original_shape).to(dtype=v_in_dtype) + def apply(self, layer: int, v: torch.Tensor) -> torch.Tensor: + """Return ``Σ_L v`` (the regularized covariance), the inverse of :meth:`apply_inv`. + + ``Σ_reg = λI + XᵀX/N``, applied as ``λv + Xᵀ(Xv)/N``: ``O(ND)``, no + ``D × D`` matrix. This is the index-raising map from a read + (covector) to the write (vector) that moves it furthest per unit of + Mahalanobis displacement — the lens atoms' steering direction. + Promoted to fp32 on CPU like :meth:`apply_inv`; output keeps ``v``'s + dtype and shape. + """ + dim = self._require(layer, int(v.shape[-1])) + v_in_dtype = v.dtype + rows = v.to(dtype=torch.float32, device="cpu").reshape(-1, dim) + X = self._X[layer] + out = self._lambda[layer] * rows + (rows @ X.transpose(0, 1)) @ X / int(X.shape[0]) + return out.reshape(v.shape).to(dtype=v_in_dtype) + def woodbury_factors( self, layer: int, *, device: torch.device, dtype: torch.dtype, ) -> tuple[torch.Tensor, torch.Tensor, float]: @@ -423,6 +440,24 @@ def whiten(self, layer: int, rows: torch.Tensor) -> torch.Tensor: out = (flat - ((flat @ V) * g) @ V.transpose(0, 1)) / math.sqrt(self._lambda[layer]) return out.reshape(rows.shape).to(dtype=rows.dtype) + def whiten_dual(self, layer: int, rows: torch.Tensor) -> torch.Tensor: + """Whitened coordinates ``Σ_L^{1/2} u`` of each *covector* row ``u``. + + The dual of :meth:`whiten`: a read ``u`` pairs with a vector ``v`` as + ``u · v = (Σ^{1/2}u) · (Σ^{-1/2}v)``, so in whitened coordinates a + covector carries ``Σ^{1/2}``, and dot products of dual-whitened rows + are the dual metric ``uᵀ Σ u``. ``Σ^{1/2} = √λ (I + V diag(g/(1−g)) Vᵀ)`` + inverts :meth:`whiten`'s factor exactly; low rank on the identity, + never ``D × D``. Promoted to fp32 on CPU; output keeps ``rows``' + dtype and shape. + """ + dim = self._require(layer, int(rows.shape[-1])) + V, g = self._root_factors(layer) + h = g / (1.0 - g) + flat = rows.to(dtype=torch.float32, device="cpu").reshape(-1, dim) + out = (flat + ((flat @ V) * h) @ V.transpose(0, 1)) * math.sqrt(self._lambda[layer]) + return out.reshape(rows.shape).to(dtype=rows.dtype) + def mahalanobis_norms(self, layer: int, rows: torch.Tensor) -> torch.Tensor: """Row norms ``sqrt(vᵢᵀ Σ_L⁻¹ vᵢ)`` of ``rows`` ``(B, D)`` in one apply. diff --git a/drowse/lens/AGENTS.md b/drowse/lens/AGENTS.md index 1136383aa..d62f2bd71 100644 --- a/drowse/lens/AGENTS.md +++ b/drowse/lens/AGENTS.md @@ -568,10 +568,17 @@ the per-layer softmax probability `p_l(v)`. case-sensitive (`jlens/Paris` ≠ `jlens/paris`), take no `:variant`, skip the manifold tiers, and no manifold may be authored or installed under them. - **Steering atom.** `jlens/` or `jlens/#` resolves lazily through - the registry's `jlens` atom resolver into `register_direction`. That yields - `W_U[v] @ J_l` on every fitted layer (`W_U P J_l` under an OPT projection), - registered as an ordinary profile that pushes, ablates and composes like - any term. A word must be one token: the leading-space piece is tried first, + the registry's `jlens` atom resolver into `register_direction`. That takes + the token's read `u = W_U[v] @ J_l` on every fitted layer (`W_U P J_l` + under an OPT projection) and registers its raised vector `Σu` + (`LayerWhitener.apply`, the session whitener, required) as an ordinary + profile that pushes, ablates and composes like any term. A read is a + covector and a profile is a write: `Σu` is the write that moves the token's + reading furthest per unit of Mahalanobis displacement, and folded it reads + with `Σ⁻¹Σu = u` again, so `!jlens/` zeroes exactly the token's + reading (LEACE). On real models `Σu` is mostly `u` restricted to the + neutral activations' span (cosine about 0.15 with `u`), so the push + calibration below predates fit policy 2. A word must be one token: the leading-space piece is tried first, and the match must survive a decode round trip (else `MultiTokenWordError` lists the pieces). `#` is bounds-checked against the unembedding (`InvalidTokenIdError`). Lens atoms run hot. On gemma-3-4b α ≈ 0.3 was the @@ -580,7 +587,8 @@ the per-layer softmax probability `p_l(v)`. - **`slens/` atom.** `slens/` or `slens/#` resolves through the registry's `slens` resolver into `register_input_direction`: the footprint `K_l ẽ_v` at the S lens's `out` site on every layer it holds (steering - injects at block outputs), an ordinary profile that pushes, ablates, takes a + injects at block outputs), a read raised to `Σ K_l ẽ_v` as `jlens/` atoms + are, an ordinary profile that pushes, ablates, takes a `{…}` layer clause and goes through the whitener exactly as a `jlens/` atom does. `jlens/` steers toward saying a token, `slens/` toward having read it; they are different directions. No S lens is `LensNotFittedError` (404, names @@ -655,9 +663,16 @@ the per-layer softmax probability `p_l(v)`. `TokensOut` (`W_U J_l`, the R family) or `TokensIn` (`K_l ẽ_v` at the S lens's `out` site, masked tokens scoring `-inf`). It is Mahalanobis like every activation-space metric: a dictionary is built over the session's - `LayerWhitener` at its layer and holds its matrix whitened once (`J_l W`, - `W K_l`, `W = Σ^{-1/2}` from `LayerWhitener.whiten`), `coords` maps the - target there, so selection, the NNLS fit and `share` are all whitened. A + `LayerWhitener` at its layer and holds its matrix whitened once, `coords` + maps the target there (`Σ^{-1/2}`, the target is a vector), so selection, + the NNLS fit and `share` are all whitened. Atoms enter by type: token atoms + are reads and take `Σ^{+1/2}` (`J_l Σ^{1/2}`, `Σ^{1/2} K_l`, + `LayerWhitener.whiten_dual`), neuron writes are vectors and take + `Σ^{-1/2}`. So a token's selection score is its reading of the residual + over that reading's neutral standard deviation, and decomposing a raised + `jlens/`/`slens/` atom recovers its own token exactly. Read atoms share + their high-variance components, so the tiny `k × k` solve runs in fp64, + and selection stops once the residual is negligible. A whitener that is missing or misses a layer raises `WhitenerError` (`runtime.require_decompose_whitener`); the instrument takes the whitener getter by injection (`whitener=`, the session's lazy neutral state). The diff --git a/drowse/lens/decompose.py b/drowse/lens/decompose.py index 75721d4fd..d42065353 100644 --- a/drowse/lens/decompose.py +++ b/drowse/lens/decompose.py @@ -10,9 +10,15 @@ Every inner product is Mahalanobis: a dictionary is built over one layer's :class:`~drowse.geometry.whitener.LayerWhitener` and lives in its whitened -coordinates (``W = Σ^{-1/2}`` folded into the dictionary's matrix once), and -:func:`sparse_decompose` maps the target there too, so atom selection, the -NNLS fit and the share are all whitened. A whitener that does not cover the +coordinates, and :func:`sparse_decompose` maps the target there too +(``Σ^{-1/2}``: the target is a vector), so atom selection, the NNLS fit and +the share are all whitened. Atoms enter by their type. Neuron writes are +vectors and whiten by ``Σ^{-1/2}``. Token atoms (``W_U J_l`` rows, +footprints) are *reads* and whiten by ``Σ^{+1/2}`` +(:meth:`~drowse.geometry.whitener.LayerWhitener.whiten_dual`), so a token's +score against a target is the plain pairing ``u · t`` (its lens reading of +the target), and decomposing a ``jlens/``/``slens/`` atom (the raised vector +``Σu``) recovers its own token exactly. A whitener that does not cover the layer raises :class:`~drowse.errors.WhitenerError`; there is no Euclidean path. @@ -103,8 +109,9 @@ def token_atom_norms( class TokensOut: """``W_U J_l``: the tokens a layer-``l`` residual is disposed to say. - Held whitened: ``jacobian`` becomes ``J_l W`` (``W = Σ_l^{-1/2}`` of - ``whitener``), so atom ``v`` is ``W Jᵀ W_U[v]``. ``atom_norms`` may + Held whitened as reads: ``jacobian`` becomes ``J_l Σ_l^{1/2}`` (the + dual-whitened rows of ``whitener``), so atom ``v`` is ``Σ^{1/2} Jᵀ W_U[v]``. + ``atom_norms`` may carry cached whitened norms (the runtime caches them per lens, layer and whitener); otherwise they are computed in chunks on first use. """ @@ -119,7 +126,7 @@ class TokensOut: def __post_init__(self) -> None: _require_cover(self.whitener, self.layer) - self.jacobian = self.whitener.whiten( + self.jacobian = self.whitener.whiten_dual( self.layer, self.jacobian.to(dtype=torch.float32), ).to(device=self.unembed.device) @@ -166,8 +173,8 @@ def footprint_atom_norms( class TokensIn: """``K_l ẽ_v``: the footprint a token leaves at layer ``l`` (S family, ``out``). - Held whitened: ``matrix`` becomes ``W K_l`` (``W = Σ_l^{-1/2}`` of - ``whitener``), so atom ``v`` is ``W K_l ẽ_v``. Atoms run over the token + Held whitened as reads: ``matrix`` becomes ``Σ_l^{1/2} K_l`` (the + footprint is a covector), so atom ``v`` is ``Σ^{1/2} K_l ẽ_v``. Atoms run over the token mask of ``embeddings``; masked tokens score ``-inf`` and are never selected. ``atom_norms`` may carry cached whitened norms; otherwise they are computed in chunks on first use. @@ -183,8 +190,8 @@ class TokensIn: def __post_init__(self) -> None: _require_cover(self.whitener, self.layer) - # W K = (Kᵀ W)ᵀ: whiten the columns of K as rows of Kᵀ. - self.matrix = self.whitener.whiten( + # Σ^{1/2} K = (Kᵀ Σ^{1/2})ᵀ: dual-whiten the columns of K as rows of Kᵀ. + self.matrix = self.whitener.whiten_dual( self.layer, self.matrix.to(dtype=torch.float32).transpose(0, 1), ).transpose(0, 1).to(device=self.embeddings.device).contiguous() @@ -287,8 +294,12 @@ def sparse_decompose( are formed. After each selection the coefficients re-solve over the selected atoms — nonnegative least squares for a nonnegative dictionary (projected gradient with the exact Lipschitz step; the problem is tiny), - ordinary least squares for a signed one. Selection stops early when no - atom correlates with the residual in an admissible direction. + ordinary least squares for a signed one. The tiny ``k × k`` system is + solved in fp64: read atoms (token rows) share their high-variance + components, so in the dual metric they are nearly collinear and an fp32 + normal-equation solve mis-fits. Selection stops early when no atom + correlates with the residual in an admissible direction, or when the + residual is already negligible (an exact atom target). """ device = dictionary.device t = dictionary.coords(target).to(device=device, dtype=torch.float32) @@ -301,7 +312,10 @@ def sparse_decompose( rows: list[torch.Tensor] = [] coeffs = torch.zeros(0, device=device) residual = t.clone() + t64 = t.double() for _ in range(k): + if float(residual.pow(2).sum()) <= 1e-12 * t_norm_sq: + break scores = dictionary.scores(residual) / norms if not dictionary.nonneg: scores = scores.abs() @@ -313,23 +327,22 @@ def sparse_decompose( selected.append(best) rows.append(dictionary.atom(best)) A = torch.stack(rows) # [s, d] - gram = A @ A.T - b = A @ t + # fp64 on the host (MPS has no float64): the system is ≤ k×k. + A64 = A.detach().to("cpu", torch.float64) + gram = A64 @ A64.T + b = A64 @ t64.cpu() if dictionary.nonneg: - c = torch.cat([coeffs, coeffs.new_zeros(1)]) - solved = _try_unconstrained_nonnegative(gram, b, device=device) + c = torch.cat([coeffs.cpu().double(), gram.new_zeros(1)]) + solved = _try_unconstrained_nonnegative(gram, b) if solved is None: - # CPU hop: eigvalsh is unimplemented on MPS, and the gram is ≤ k×k. - lipschitz = float( - torch.linalg.eigvalsh(gram.cpu())[-1].clamp(min=1e-12) - ) + lipschitz = float(torch.linalg.eigvalsh(gram)[-1].clamp(min=1e-12)) for _ in range(nnls_iters): c = torch.clamp(c - (gram @ c - b) / lipschitz, min=0.0) else: c = solved else: - c = _solve_tiny(gram, b).to(device=device) - coeffs = c + c = _solve_tiny(gram, b) + coeffs = c.to(device=device, dtype=torch.float32) residual = t - A.T @ coeffs share = max(0.0, 1.0 - float(residual.pow(2).sum()) / t_norm_sq) @@ -344,17 +357,18 @@ def sparse_decompose( def _solve_tiny(gram: torch.Tensor, b: torch.Tensor) -> torch.Tensor: - """Ridge-stabilized normal-equation solve on CPU (the system is ≤ k×k).""" - g_cpu = gram.detach().to("cpu", torch.float32) - eye = torch.eye(g_cpu.shape[0], dtype=torch.float32) - return torch.linalg.solve(g_cpu + 1e-7 * eye, b.detach().to("cpu", torch.float32)) + """Ridge-stabilized normal-equation solve on the CPU in fp64 (the system + is ≤ k×k); the ridge is relative to the Gram's scale.""" + g_cpu = gram.detach().to("cpu", torch.float64) + eye = torch.eye(g_cpu.shape[0], dtype=torch.float64) + ridge = 1e-12 * float(g_cpu.diagonal().abs().max().clamp(min=1e-30)) + return torch.linalg.solve(g_cpu + ridge * eye, b.detach().to("cpu", torch.float64)) def _try_unconstrained_nonnegative( gram: torch.Tensor, b: torch.Tensor, *, - device: torch.device, tol: float = 1e-7, ) -> torch.Tensor | None: """Exact tiny least-squares solve when its coefficients are already >= 0. @@ -371,6 +385,6 @@ def _try_unconstrained_nonnegative( return None if not bool(torch.isfinite(sol).all()): return None - if bool((sol < -tol).any()): + if bool((sol < -tol * float(sol.abs().max().clamp(min=1e-30))).any()): return None - return sol.clamp(min=0.0).to(device=device, dtype=torch.float32) + return sol.clamp(min=0.0) diff --git a/drowse/lens/instrument.py b/drowse/lens/instrument.py index 4ffc1a2ba..077dc984e 100644 --- a/drowse/lens/instrument.py +++ b/drowse/lens/instrument.py @@ -1349,26 +1349,57 @@ def _decompose_tokens_in( ) return out - def register_direction(self, word: str) -> str: - """Register ``W_U[v] @ J_l`` for a single-token word (or ``#``) - as the profile ``jlens/`` and return its name. + def _raised(self, name: str, reads: dict[int, torch.Tensor]) -> dict[int, torch.Tensor]: + """A lens atom's steering profile: its read covectors raised to vectors. + + ``W_U[v] @ J_l`` and ``K_l ẽ_v`` are *reads* (they score a residual by + a dot product), while a profile is a write. The write that moves a + read ``u`` furthest per unit of Mahalanobis displacement is ``Σu``; + folded, it reads with ``Σ⁻¹Σu = u`` again, so a push raises the token's + reading and ``!`` zeroes exactly that reading (LEACE). Needs the + session whitener over every layer, like any steering composition. + """ + from drowse.errors import WhitenerError + + whitener = self._whitener() + layers = sorted(reads) + if whitener is None or not whitener.covers_all(layers): + raise WhitenerError( + f"{name} needs a Mahalanobis whitener covering its layers " + f"{layers}: a lens atom is a read, and steering writes along " + "its whitener-raised vector" + ) + return { + layer: whitener.apply(layer, u).to(device=u.device, dtype=u.dtype) + for layer, u in reads.items() + } - The direction steers and ablates exactly like an extracted vector; - this is the resolver behind the lazy ``jlens/`` steering atom. A - ``jlens/`` *probe* reads the readout channel instead. + def register_direction(self, word: str) -> str: + """Register the raised ``Σ (W_U[v] @ J_l)`` for a single-token word (or + ``#``) as the profile ``jlens/`` and return its name. + + ``W_U[v] @ J_l`` is the token's lens read; the profile is the vector + that read raises to (:meth:`_raised`), so it steers and ablates exactly + like an extracted vector and ``!jlens/`` zeroes the token's + reading. This is the resolver behind the lazy ``jlens/`` steering + atom. A ``jlens/`` *probe* reads the readout channel instead. Idempotent; every fitted layer. """ name = f"jlens/{word}" if name in self._registry.profiles: return name lens = self._require() - self._registry.put_profile(name, self.runtime.token_directions(lens, word)) + reads = self.runtime.token_directions(lens, word) + self._registry.put_profile(name, self._raised(name, reads)) self._on_change(()) return name def register_input_direction(self, word: str) -> str: - """Register the footprint ``K_l ẽ_v`` of a single-token word (or - ``#``) as the profile ``slens/`` and return its name. + """Register the raised footprint ``Σ (K_l ẽ_v)`` of a single-token + word (or ``#``) as the profile ``slens/`` and return its name. + + The footprint is the token's S read (a covector); the profile is the + vector it raises to (:meth:`_raised`). The S-family lens's ``out`` site, every layer it holds: steering injects at block outputs, so the atom pushes the residual toward @@ -1401,7 +1432,7 @@ def register_input_direction(self, word: str) -> str: ) for layer in layers } - self._registry.put_profile(name, directions) + self._registry.put_profile(name, self._raised(name, directions)) self._on_change(()) return name diff --git a/drowse/steering/composer.py b/drowse/steering/composer.py index 0c2718a93..8b590bb8d 100644 --- a/drowse/steering/composer.py +++ b/drowse/steering/composer.py @@ -568,8 +568,14 @@ def open_scope( "or Steering instance" ) # The role pass reads a resident manifold on its device (a coordinate - # ``%`` position's nearest node), so it runs in the section too. + # ``%`` position's nearest node), so it runs in the section too. The + # neutral baseline goes resident first, through the unguarded + # ``ensure`` (this section is the lock): a ``jlens/``/``slens/`` atom + # raises its read with the whitener while resolving, and a scope + # opened inside ``generate`` may not build it through the public + # getter. Composition needs it anyway. with self._lock: + self._neutral.ensure() entries = self.resolve(steering) role, notes = resolve_scope_role( entries, self._artifacts.manifolds, diff --git a/tests/fixtures/browser/slens-gemma3-v1.json b/tests/fixtures/browser/slens-gemma3-v1.json index f7803b50f..5381b308d 100644 --- a/tests/fixtures/browser/slens-gemma3-v1.json +++ b/tests/fixtures/browser/slens-gemma3-v1.json @@ -89,7 +89,7 @@ "atoms": [ { "atom": "slens/#72", - "layers": {"0": [1.6925893, 1.5350614, -0.094198436, 0.21244442, -3.4150834, -2.4704926, -1.3065481, -2.6676738, -2.3191047, 1.0935795, -2.9073296, -0.053557277, 1.9927285, -0.745071, -1.6099284, -1.3120704, -3.244435, -0.38864443, 0.51556623, 1.5928261, -2.4804182, 0.91360986, -2.8609743, 1.9751439, -1.9251013, 1.0550622, 1.5223241, 0.64034295, -1.8845149, -2.784228, -1.9744117, 0.11479241, 0.32875228, 2.3592234, 3.760532, -2.5834897, -0.884029, -3.0820563, 2.1589103, 0.83666366, 0.23596191, 0.20269358, 0.8956214, -1.518256, -0.42737657, -0.22362228, 0.4090534, 3.9442668, 0.1293146, -4.50217, 4.7175484, -1.2016245, -1.2119267, -0.08752236, -1.6477976, -1.6534635, -3.5490174, 2.9088132, -2.6205883, -0.99194324, 3.3594656, 3.1627555, 0.99288005, 1.2983944], "1": [1.6844442, 2.0062826, -2.3761387, 2.2306416, -0.7306939, -2.0633016, -3.3114498, -3.0795646, -2.5095468, 0.12058452, 2.5303977, 0.9491955, 1.1673143, -0.011885047, 0.16929676, -4.4541874, -2.0572362, -4.425851, 1.5036073, 1.5378773, -2.99698, 0.8756356, -1.405671, 2.9804583, -2.16972, 2.667428, 1.7242075, 0.23742878, -0.8857929, -3.6255808, -1.0365539, 1.0165048, 4.0552936, 0.10276008, 3.028455, -2.1230679, 0.87938184, -2.068292, 1.8642577, 0.497809, 0.15682676, -1.1150177, -2.620292, -0.8744489, -1.7662246, -0.4111813, -1.2580862, 2.9818554, -1.7325186, 0.6637614, 0.5474853, 0.26502293, -0.65418327, 0.9806961, -0.18689582, -0.96012104, -0.8952422, 2.0532243, -2.7102952, -1.7519363, 0.046599254, -3.415094, 0.46060288, -0.5867205]}, + "layers": {"0": [3.8394253, 5.4407573, 0.33422077, -0.29160002, -1.0356472, 1.5811386, -4.6200376, 1.5200242, -1.0737062, 1.465848, -8.396129, 1.7900795, 5.0954614, -2.555211, -11.494318, 4.084608, 1.0217396, 2.0035026, 2.960823, 3.9723039, 1.4216541, 0.9048511, -0.53331196, 3.335245, -1.1964241, 1.2877706, 6.840551, 5.5616474, -6.2034645, -2.8488755, -4.2939653, -6.2789116, 7.373697, 2.983193, 1.7505698, -3.999561, 4.627748, -2.9751272, 5.8294, 0.04855171, -1.129029, -2.9995768, 3.3836963, 2.1838968, -0.7444742, 2.2731977, 3.959363, -0.37762618, -3.4499156, -7.549076, 5.701413, -10.151494, 3.595504, -5.2817802, -2.5832896, -4.3866844, -6.938884, 3.8596969, -1.9419593, -0.91731197, 0.7153835, -5.227212, -7.8385572, 2.3951247], "1": [9.957744, 3.9375525, -9.15546, 5.7419443, -0.4367569, 5.5012426, -9.159107, -6.699706, -8.492522, 1.1863447, -3.0888467, 8.643755, 5.499272, -3.7480729, -18.790428, -4.3518343, -0.9636105, 5.568469, 8.027831, -0.057021976, -6.1877766, 2.3090768, 1.6638893, 3.2433434, 0.037863493, 3.3869371, 2.2056353, 3.422464, -7.9530153, -4.2349796, -6.9794273, -10.009787, 14.894718, 3.785944, 6.3643837, -7.470227, 8.298398, -3.9000125, 10.462064, 3.0594172, 4.586253, -0.8178898, 6.2127595, 6.2992735, -5.1986146, -3.0569313, 2.3651407, 3.8872523, -8.110653, -4.2204385, 0.13846377, -9.462242, 5.4385014, -0.9080597, -4.3006835, -12.20259, -7.8201237, 3.80822, -3.1948724, -1.1032329, -8.922091, -19.424576, -11.748089, 3.0945544]}, "pushes": [ { "expression": "0.3 slens/#72", @@ -97,15 +97,15 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 0, "basis": [0.1018594, 0.09237942, -0.005668827, 0.012784827, -0.20551845, -0.14867334, -0.07862759, -0.16053963, -0.13956288, 0.06581122, -0.17496201, -0.0032230571, 0.11992166, -0.044838097, -0.09688489, -0.07895991, -0.1952489, -0.023388477, 0.031026585, 0.09585568, -0.14927065, 0.054980703, -0.17217237, 0.118863426, -0.11585188, 0.06349325, 0.0916129, 0.038535602, -0.11340941, -0.16755381, -0.11881936, 0.0069081644, 0.019784192, 0.1419772, 0.22630742, -0.15547346, -0.05320054, -0.185477, 0.12992243, 0.05035011, 0.014200101, 0.012198024, 0.053898167, -0.09136808, -0.025719363, -0.013457506, 0.024616681, 0.23736452, 0.007782105, -0.27093896, 0.28390032, -0.072313316, -0.0729333, -0.005267063, -0.099163845, -0.09950483, -0.21357855, 0.1750513, -0.15770605, -0.05969478, 0.2021714, 0.19033346, 0.059751153, 0.078136906], "neutral": [2.5011036, -0.4328916, -0.22815919, 0.88161534, -0.82922167, 1.491485, 1.9539326, -3.9881096, -1.4245024, -2.1901445, -0.16345637, -2.71713, -1.2177546, -0.5948393, 2.36368, -1.9189181, -2.602368, -1.9446074, 1.5463581, 0.33549452, 0.7032369, -1.9593922, -0.65063, 1.5692993, -1.5085074, -1.6737885, -2.807972, 2.2502272, 2.972189, -0.03529877, 0.1057314, 3.2459009, -3.411113, 3.6565142, -1.2219691, 0.77729684, -1.2308892, -1.6396497, -1.736317, -1.9587177, -1.2799597, -3.049032, 0.20408136, -2.688755, 1.1541778, 0.7216564, -1.4041886, 2.2414868, 1.2284724, 0.47957373, 1.6112742, -0.015047793, -0.97778773, 0.08165591, -0.91091067, -3.4077399, 3.8692083, 0.13136284, 0.2638365, 2.9992876, -3.6165664, 2.2740467, 3.6357148, -1.6329161], "target": 0.24223368, "along": 17.947428, "delta": [0.44283083, 0.4016169, -0.024645062, 0.055581667, -0.8934856, -0.64635307, -0.34183118, -0.6979414, -0.6067456, 0.28611237, -0.76064235, -0.01401215, 0.521356, -0.19493234, -0.4212043, -0.34327596, -0.84883904, -0.10168074, 0.13488719, 0.41672987, -0.6489499, 0.23902704, -0.7485145, 0.51675534, -0.5036627, 0.2760351, 0.39828447, 0.16753243, -0.49304417, -0.7284354, -0.5165638, 0.030033046, 0.08601121, 0.61724186, 0.983865, -0.67591643, -0.23128782, -0.806356, 0.56483406, 0.21889566, 0.06173453, 0.053030565, 0.23432074, -0.39722013, -0.11181419, -0.058506124, 0.10702032, 1.0319355, 0.03383248, -1.1778994, 1.2342486, -0.31438008, -0.31707546, -0.022898408, -0.431112, -0.4325944, -0.92852664, 0.76103055, -0.6856225, -0.25952134, 0.8789344, 0.8274692, 0.25976643, 0.33969796]}, - {"layer": 1, "basis": [0.10592134, 0.12615922, -0.14941654, 0.14026737, -0.045947548, -0.1297447, -0.20823082, -0.1936494, -0.15780552, 0.0075826044, 0.15911666, 0.05968738, 0.07340315, -0.0007473564, 0.010645731, -0.28008854, -0.12936328, -0.2783067, 0.09454994, 0.096704915, -0.18845631, 0.055061787, -0.08839151, 0.1874174, -0.13643649, 0.16773342, 0.10842174, 0.0149300145, -0.055700496, -0.22798404, -0.06518066, 0.06391993, 0.25500527, 0.0064617665, 0.19043553, -0.13350292, 0.05529735, -0.1300585, 0.11722839, 0.031303264, 0.009861593, -0.07011463, -0.1647694, -0.054987162, -0.11106387, -0.025855932, -0.07911108, 0.18750525, -0.10894436, 0.041738693, 0.034427013, 0.016665192, -0.041136403, 0.061668202, -0.011752397, -0.0603744, -0.056294683, 0.129111, -0.17042899, -0.11016538, 0.0029302577, -0.21474819, 0.028963666, -0.036894206], "neutral": [2.5403802, -0.6107809, 0.062300798, 1.49499, -0.64720786, 2.2524116, 2.5358746, -5.168618, -3.499977, -1.0449457, 0.15478604, -2.34535, -2.5848777, -1.3628726, 1.8815207, -1.1110901, -3.9774685, -4.7597775, -0.6708746, 0.0017258171, 2.0631378, -3.0336688, -0.6227669, 2.474963, -2.6115007, 0.26991248, -1.9374989, 0.9526677, 5.328921, -2.6247644, 0.044735555, 2.2181914, -4.052362, 2.8750932, 0.7703316, -1.9708306, -0.3956953, -2.4062173, -2.3324852, -2.1703327, 0.35780063, -2.869667, -0.15014786, -1.6218642, 0.33910915, 0.54017884, -2.4443815, 2.6439462, 2.1077006, 2.679039, 2.529034, 0.14207181, 0.46443367, -0.9520941, 1.1665174, -1.7227926, 3.6997166, -0.25603804, 0.32729462, 3.2004669, -1.4965214, 1.621521, 3.3546197, -2.644725], "target": 0.29607618, "along": 14.052572, "delta": [0.44069973, 0.5249021, -0.6216672, 0.5836009, -0.19117083, -0.53981996, -0.8663718, -0.8057039, -0.6565707, 0.031548426, 0.6620258, 0.24833722, 0.3054035, -0.003109475, 0.044292968, -1.1653453, -0.538233, -1.1579317, 0.3933875, 0.40235355, -0.7840973, 0.22909182, -0.36776453, 0.7797748, -0.567662, 0.697877, 0.45110294, 0.06211829, -0.23174927, -0.9485577, -0.27119273, 0.2659473, 1.0609831, 0.02688503, 0.7923321, -0.55545646, 0.23007192, -0.54112554, 0.48774418, 0.13024136, 0.04103046, -0.29172117, -0.6855448, -0.22878134, -0.46209586, -0.10757702, -0.32915208, 0.7801403, -0.45327735, 0.17365934, 0.14323813, 0.06933773, -0.17115343, 0.25657868, -0.048897397, -0.25119567, -0.23422146, 0.5371834, -0.7090923, -0.4583576, 0.012191723, -0.89348817, 0.12050715, -0.15350321]} + {"layer": 0, "basis": [0.111408405, 0.15787417, 0.009698066, -0.008461342, -0.030051319, 0.045879815, -0.13405938, 0.04410646, -0.031155676, 0.04253443, -0.24363002, 0.05194264, 0.14785473, -0.07414442, -0.33353, 0.11852285, 0.02964776, 0.058135524, 0.085914046, 0.11526413, 0.04125206, 0.026256014, -0.015475084, 0.09677861, -0.034716576, 0.037367173, 0.1984919, 0.16138202, -0.1800056, -0.08266567, -0.12459776, -0.18219484, 0.21396217, 0.08656315, 0.05079619, -0.11605504, 0.13428311, -0.0863291, 0.16915138, 0.0014088221, -0.03276097, -0.08703856, 0.098184526, 0.06337002, -0.021602366, 0.06596126, 0.11488861, -0.010957559, -0.10010601, -0.21905112, 0.16543761, -0.29456535, 0.10433054, -0.15326114, -0.074959174, -0.12728818, -0.20134522, 0.11199662, -0.056349725, -0.026617592, 0.020758243, -0.15167773, -0.227451, 0.0694992], "neutral": [2.5011036, -0.4328916, -0.22815919, 0.88161534, -0.82922167, 1.491485, 1.9539326, -3.9881096, -1.4245024, -2.1901445, -0.16345637, -2.71713, -1.2177546, -0.5948393, 2.36368, -1.9189181, -2.602368, -1.9446074, 1.5463581, 0.33549452, 0.7032369, -1.9593922, -0.65063, 1.5692993, -1.5085074, -1.6737885, -2.807972, 2.2502272, 2.972189, -0.03529877, 0.1057314, 3.2459009, -3.411113, 3.6565142, -1.2219691, 0.77729684, -1.2308892, -1.6396497, -1.736317, -1.9587177, -1.2799597, -3.049032, 0.20408136, -2.688755, 1.1541778, 0.7216564, -1.4041886, 2.2414868, 1.2284724, 0.47957373, 1.6112742, -0.015047793, -0.97778773, 0.08165591, -0.91091067, -3.4077399, 3.8692083, 0.13136284, 0.2638365, 2.9992876, -3.6165664, 2.2740467, 3.6357148, -1.6329161], "target": 0.62881047, "along": 14.187488, "delta": [0.9939012, 1.4084334, 0.08651878, -0.07548567, -0.26809505, 0.4093049, -1.195976, 0.39348435, -0.27794728, 0.3794599, -2.1734822, 0.4633928, 1.3190477, -0.6614603, -2.9755013, 1.0573709, 0.2644948, 0.518641, 0.7664599, 1.0282991, 0.36801955, 0.23423623, -0.13805695, 0.86338526, -0.30971494, 0.33336154, 1.7707939, 1.4397279, -1.6058733, -0.7374803, -1.1115667, -1.625404, 1.9088079, 0.77225065, 0.45316502, -1.035355, 1.1979719, -0.7701627, 1.5090402, 0.012568441, -0.2922685, -0.77649194, 0.8759278, 0.5653392, -0.1927199, 0.5884563, 1.024949, -0.097755015, -0.8930698, -1.9542078, 1.4759086, -2.6278882, 0.9307579, -1.3672795, -0.6687288, -1.1355685, -1.7962492, 0.9991488, -0.50270945, -0.23746194, 0.18518929, -1.3531536, -2.029145, 0.62001914]}, + {"layer": 1, "basis": [0.17795312, 0.070367314, -0.16361566, 0.10261329, -0.0078052073, 0.09831176, -0.16368082, -0.11972929, -0.15176839, 0.021200962, -0.055200245, 0.15447105, 0.09827654, -0.06698116, -0.3358005, -0.07777088, -0.017220518, 0.09951315, 0.14346397, -0.00101903, -0.11058069, 0.04126511, 0.029735077, 0.057961233, 0.000676652, 0.060527373, 0.03941653, 0.061162263, -0.14212698, -0.075682595, -0.12472814, -0.17888317, 0.26618096, 0.067657955, 0.11373681, -0.13349913, 0.14829925, -0.069696456, 0.18696573, 0.05467432, 0.081960134, -0.014616368, 0.11102715, 0.11257323, -0.09290354, -0.054629892, 0.042267025, 0.069468416, -0.14494409, -0.07542273, 0.002474462, -0.1690981, 0.09719052, -0.016227778, -0.07685678, -0.21807039, -0.13975208, 0.06805604, -0.057095014, -0.019715685, -0.15944514, -0.34713322, -0.20994808, 0.05530225], "neutral": [2.5403802, -0.6107809, 0.062300798, 1.49499, -0.64720786, 2.2524116, 2.5358746, -5.168618, -3.499977, -1.0449457, 0.15478604, -2.34535, -2.5848777, -1.3628726, 1.8815207, -1.1110901, -3.9774685, -4.7597775, -0.6708746, 0.0017258171, 2.0631378, -3.0336688, -0.6227669, 2.474963, -2.6115007, 0.26991248, -1.9374989, 0.9526677, 5.328921, -2.6247644, 0.044735555, 2.2181914, -4.052362, 2.8750932, 0.7703316, -1.9708306, -0.3956953, -2.4062173, -2.3324852, -2.1703327, 0.35780063, -2.869667, -0.15014786, -1.6218642, 0.33910915, 0.54017884, -2.4443815, 2.6439462, 2.1077006, 2.679039, 2.529034, 0.14207181, 0.46443367, -0.9520941, 1.1665174, -1.7227926, 3.6997166, -0.25603804, 0.32729462, 3.2004669, -1.4965214, 1.621521, 3.3546197, -2.644725], "target": 0.813217, "along": 17.812513, "delta": [2.577729, 1.0193014, -2.3700445, 1.4863986, -0.113061845, 1.424089, -2.3709884, -1.7343313, -2.1984317, 0.30710524, -0.79959977, 2.237581, 1.4235787, -0.9702515, -4.8642178, -1.1265453, -0.24944675, 1.4414916, 2.0781386, -0.014761096, -1.6018097, 0.5977432, 0.43072563, 0.8395939, 0.009801601, 0.87676555, 0.5709657, 0.8859622, -2.0587714, -1.0962956, -1.8067418, -2.591201, 3.855748, 0.9800551, 1.6475276, -1.9337935, 2.1481795, -1.0095837, 2.7082808, 0.79198146, 1.1872284, -0.2117245, 1.608277, 1.6306726, -1.3457484, -0.79133797, 0.6122564, 1.0062804, -2.0995786, -1.0925312, 0.035843667, -2.44946, 1.4078473, -0.23506649, -1.1133041, -3.1588452, -2.0243702, 0.9858216, -0.82704633, -0.28559035, -2.3096328, -5.028377, -3.0411901, 0.8010773]} ] } ] }, { "atom": "slens/a", - "layers": {"0": [2.858605, -1.2925754, 1.2510165, 0.5493586, -1.1250442, -1.4568206, -1.263091, -0.8522444, 0.8278683, 2.5593996, -2.933697, -2.4168386, -2.1684046, 1.6470189, 3.314388, 2.4144921, 1.3361309, -0.5658908, -0.10943395, 1.184623, -2.8700666, 2.0586295, 2.8983028, -1.059524, 0.82734, 0.8382653, 2.016953, -0.48319218, 3.9655824, 1.4501469, -2.2356422, 3.8511205, 2.2701585, 1.9490674, -4.0607576, 0.9243226, 2.1809125, 1.283666, -2.6281993, 0.76586294, 4.189087, 1.3198812, 2.5123208, -3.7794864, -1.0352867, -0.8618058, -2.1217084, 4.1928015, -2.0059395, -0.30832207, -3.171612, 0.009313047, -3.745618, 3.239138, 1.5274951, 3.859232, -0.20136127, -1.6219485, -0.22801039, -4.199463, 3.0884695, -0.7845098, 2.528036, 2.2632384], "1": [4.872921, -1.9160807, 0.83479905, 1.3263445, -0.08518621, -3.9075403, -2.0150628, -2.24851, -0.8225349, 2.0619907, -2.861204, -4.074242, -0.27360377, -0.9010452, 1.7669531, 0.88077295, 2.3250878, -0.90729606, -0.011529297, -1.4425911, -3.615632, 2.7018073, 1.510833, -1.6064559, 1.4093816, 3.2348108, 0.6451057, -1.0379618, 2.3847148, 0.41397, 1.5108092, 2.0599616, 3.481563, 0.58957654, -0.5413692, 1.8744909, -2.7822392, 2.013251, -1.8027344, -0.14281583, 2.0801666, 0.59836125, 2.2288294, -2.0946634, -1.6094866, -0.022997588, -2.0754688, -0.20808566, -2.4234364, -1.9670978, -1.6868894, 1.1160972, -2.6844568, 4.5358715, 1.3189634, 4.652672, -3.6208286, 0.77050966, -1.3958423, -2.298811, 2.5495288, 1.5272892, 2.917634, -2.0886734]}, + "layers": {"0": [-1.4274447, -7.9921017, -5.2423177, -2.5839775, -2.1197324, -6.433641, 5.3959293, -7.6195865, 1.315694, 0.24528146, 10.423355, -4.656654, -7.2533617, 6.0829573, 15.9382925, -6.011859, -8.2273, -3.6295831, -2.23421, -4.5334263, -10.163075, -0.6720096, -0.024100304, -2.618337, -1.9065094, 1.9594792, -5.5524025, -9.664329, 10.715988, 1.6825953, 4.608786, 10.396527, -14.533535, -6.066208, -2.229677, 1.0808538, -4.657324, 0.07154328, -10.400985, 3.0836635, 7.566144, 5.4600716, -4.1058774, -8.464816, 0.7313064, -6.9505544, -10.147293, 5.3286, 2.4865937, 6.6248198, -7.389204, 17.731976, -10.044485, 10.222416, 5.852534, 6.749983, 8.613685, -3.400055, -2.331285, -4.020984, 4.801756, 8.288329, 16.778734, -0.31728113], "1": [2.7826147, -11.30981, -3.5070913, -9.589605, 1.9855978, -9.782772, 10.389842, -6.8827524, 4.3422318, 1.4865474, 15.05573, -11.227568, -4.270727, 7.6633453, 19.890556, -0.5701942, 0.1396817, -15.496838, -10.101164, -3.5642014, -3.5057364, 1.2045566, -8.759942, -0.23521161, -0.71334577, 9.268032, -0.28455502, -12.103386, 14.021502, 5.8789234, 12.457451, 12.276075, -20.455378, -7.1249895, -11.375074, 6.4915805, -8.967297, 1.2705847, -23.217922, -3.2260826, 8.911211, 9.788878, -7.994891, -12.337904, 4.3138266, -4.3639436, -19.75146, -1.974079, 10.020103, 3.6702964, -4.6071177, 26.163984, -14.790409, 11.287381, 12.130447, 16.656435, 6.97136, -1.673068, -8.948748, -7.4354367, 3.9190488, 21.32842, 17.471468, -3.175541]}, "pushes": [ { "expression": "0.3 slens/a", @@ -113,8 +113,8 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 0, "basis": [0.15638602, -0.070713066, 0.0684395, 0.030053822, -0.061547913, -0.07969844, -0.06910006, -0.046623826, 0.04529028, 0.14001736, -0.16049409, -0.13221826, -0.118627146, 0.09010364, 0.1813206, 0.13208988, 0.07309586, -0.030958248, -0.005986815, 0.064807296, -0.15701306, 0.112621665, 0.15855777, -0.057963498, 0.04526138, 0.045859072, 0.11034167, -0.026434047, 0.21694554, 0.07933335, -0.12230552, 0.21068366, 0.12419381, 0.10662784, -0.22215231, 0.050567016, 0.119311415, 0.070225656, -0.14378119, 0.041898146, 0.22917283, 0.072206885, 0.13744181, -0.20676477, -0.05663754, -0.047146905, -0.11607253, 0.22937605, -0.10973915, -0.01686741, -0.17350973, 0.0005094899, -0.20491193, 0.17720386, 0.08356485, 0.21112742, -0.011015893, -0.088732116, -0.012473789, -0.22974047, 0.16896124, -0.04291826, 0.13830155, 0.12381523], "neutral": [2.5011036, -0.4328916, -0.22815919, 0.88161534, -0.82922167, 1.491485, 1.9539326, -3.9881096, -1.4245024, -2.1901445, -0.16345637, -2.71713, -1.2177546, -0.5948393, 2.36368, -1.9189181, -2.602368, -1.9446074, 1.5463581, 0.33549452, 0.7032369, -1.9593922, -0.65063, 1.5692993, -1.5085074, -1.6737885, -2.807972, 2.2502272, 2.972189, -0.03529877, 0.1057314, 3.2459009, -3.411113, 3.6565142, -1.2219691, 0.77729684, -1.2308892, -1.6396497, -1.736317, -1.9587177, -1.2799597, -3.049032, 0.20408136, -2.688755, 1.1541778, 0.7216564, -1.4041886, 2.2414868, 1.2284724, 0.47957373, 1.6112742, -0.015047793, -0.97778773, 0.08165591, -0.91091067, -3.4077399, 3.8692083, 0.13136284, 0.2638365, 2.9992876, -3.6165664, 2.2740467, 3.6357148, -1.6329161], "target": 0.24219842, "along": 17.82547, "delta": [0.6751655, -0.3052896, 0.29547387, 0.12975138, -0.26572084, -0.34408215, -0.29832575, -0.20128909, 0.19553176, 0.6044971, -0.69290125, -0.570826, -0.51214904, 0.3890045, 0.7828155, 0.5702718, 0.3155768, -0.13365607, -0.02584688, 0.2797926, -0.6778726, 0.4862216, 0.6845416, -0.25024587, 0.19540699, 0.1979874, 0.47637817, -0.114123724, 0.9366191, 0.34250593, -0.52802974, 0.9095847, 0.53618205, 0.46034443, -0.9590983, 0.21831301, 0.5151032, 0.30318528, -0.6207466, 0.1808869, 0.989408, 0.31173885, 0.59337765, -0.8926657, -0.24452129, -0.20354737, -0.50112003, 0.9902854, -0.4737769, -0.07282168, -0.74909365, 0.0021996212, -0.8846664, 0.76504236, 0.36077458, 0.9115006, -0.047558922, -0.38308322, -0.0538531, -0.9918587, 0.7294565, -0.18529104, 0.59708935, 0.53454757]}, - {"layer": 1, "basis": [0.27738732, -0.10907144, 0.0475203, 0.07550115, -0.00484916, -0.22243376, -0.11470592, -0.12799472, -0.04682217, 0.11737725, -0.16287185, -0.23192313, -0.015574685, -0.051291313, 0.10058246, 0.05013733, 0.13235386, -0.051647138, -0.00065629644, -0.0821184, -0.2058171, 0.15379833, 0.08600302, -0.09144628, 0.08022798, 0.18413915, 0.03672215, -0.059085187, 0.13574807, 0.023564927, 0.086001664, 0.11726175, 0.19818532, 0.033561196, -0.03081703, 0.10670397, -0.15837684, 0.11460278, -0.10261928, -0.008129682, 0.1184119, 0.034061257, 0.12687442, -0.119237125, -0.0916188, -0.0013091202, -0.11814449, -0.011845117, -0.13795227, -0.11197554, -0.09602489, 0.063532986, -0.15281066, 0.25820103, 0.07508098, 0.2648498, -0.2061129, 0.043860674, -0.07945726, -0.13085806, 0.14513, 0.086939774, 0.1660841, -0.11889614], "neutral": [2.5403802, -0.6107809, 0.062300798, 1.49499, -0.64720786, 2.2524116, 2.5358746, -5.168618, -3.499977, -1.0449457, 0.15478604, -2.34535, -2.5848777, -1.3628726, 1.8815207, -1.1110901, -3.9774685, -4.7597775, -0.6708746, 0.0017258171, 2.0631378, -3.0336688, -0.6227669, 2.474963, -2.6115007, 0.26991248, -1.9374989, 0.9526677, 5.328921, -2.6247644, 0.044735555, 2.2181914, -4.052362, 2.8750932, 0.7703316, -1.9708306, -0.3956953, -2.4062173, -2.3324852, -2.1703327, 0.35780063, -2.869667, -0.15014786, -1.6218642, 0.33910915, 0.54017884, -2.4443815, 2.6439462, 2.1077006, 2.679039, 2.529034, 0.14207181, 0.46443367, -0.9520941, 1.1665174, -1.7227926, 3.6997166, -0.25603804, 0.32729462, 3.2004669, -1.4965214, 1.621521, 3.3546197, -2.644725], "target": 0.2927185, "along": 14.174529, "delta": [1.1509207, -0.45255342, 0.1971687, 0.31326538, -0.020119878, -0.92291033, -0.4759317, -0.53106886, -0.19427206, 0.4870155, -0.6757793, -0.96228313, -0.06462166, -0.2128152, 0.4173314, 0.20802714, 0.5491556, -0.21429156, -0.0027230703, -0.3407213, -0.8539654, 0.63813186, 0.35683918, -0.37942404, 0.33287767, 0.7640204, 0.1523656, -0.24515311, 0.5632387, 0.09777434, 0.35683355, 0.48653623, 0.8223, 0.13925032, -0.12786439, 0.44273043, -0.6571288, 0.47550377, -0.42578247, -0.03373125, 0.49130836, 0.14132516, 0.5264206, -0.49473235, -0.38013986, -0.005431732, -0.49019882, -0.049147133, -0.57238424, -0.46460298, -0.3984214, 0.26360768, -0.63403386, 1.071314, 0.311522, 1.0989008, -0.8551927, 0.18198438, -0.32967985, -0.5429493, 0.60216564, 0.3607259, 0.6891073, -0.49331754]} + {"layer": 0, "basis": [-0.02494292, -0.13965261, -0.09160335, -0.04515198, -0.037039842, -0.11242032, 0.094287544, -0.13314334, 0.02299021, 0.0042860056, 0.18213591, -0.08136957, -0.12674399, 0.106292546, 0.27850297, -0.105050184, -0.14376242, -0.06342271, -0.0390402, -0.07921631, -0.17758784, -0.01174258, -0.00042112457, -0.045752365, -0.033314016, 0.0342396, -0.097021714, -0.1688728, 0.18724933, 0.029401379, 0.08053313, 0.18166712, -0.2539565, -0.105999865, -0.03896099, 0.018886654, -0.08138127, 0.0012501349, -0.181745, 0.053883404, 0.1322095, 0.09540836, -0.071745396, -0.14791274, 0.012778723, -0.12145279, -0.17731203, 0.09311104, 0.04345031, 0.11576097, -0.1291177, 0.30984548, -0.17551559, 0.17862473, 0.10226616, 0.11794804, 0.15051404, -0.059411973, -0.04073647, -0.070261985, 0.083905056, 0.14482883, 0.2931887, -0.005544116], "neutral": [2.5011036, -0.4328916, -0.22815919, 0.88161534, -0.82922167, 1.491485, 1.9539326, -3.9881096, -1.4245024, -2.1901445, -0.16345637, -2.71713, -1.2177546, -0.5948393, 2.36368, -1.9189181, -2.602368, -1.9446074, 1.5463581, 0.33549452, 0.7032369, -1.9593922, -0.65063, 1.5692993, -1.5085074, -1.6737885, -2.807972, 2.2502272, 2.972189, -0.03529877, 0.1057314, 3.2459009, -3.411113, 3.6565142, -1.2219691, 0.77729684, -1.2308892, -1.6396497, -1.736317, -1.9587177, -1.2799597, -3.049032, 0.20408136, -2.688755, 1.1541778, 0.7216564, -1.4041886, 2.2414868, 1.2284724, 0.47957373, 1.6112742, -0.015047793, -0.97778773, 0.08165591, -0.91091067, -3.4077399, 3.8692083, 0.13136284, 0.2638365, 2.9992876, -3.6165664, 2.2740467, 3.6357148, -1.6329161], "target": 0.8290411, "along": 14.65924, "delta": [-0.3031341, -1.697214, -1.1132659, -0.54873705, -0.45014936, -1.3662568, 1.1458871, -1.618106, 0.2794026, 0.052088305, 2.2135181, -0.9888935, -1.540334, 1.2917852, 3.3846781, -1.2766868, -1.7471608, -0.7707833, -0.47445998, -0.9627247, -2.1582448, -0.1427089, -0.0051179742, -0.5560337, -0.404869, 0.41611773, -1.1791159, -2.0523303, 2.2756622, 0.35731828, 0.97872823, 2.207821, -3.0863616, -1.2882283, -0.4734973, 0.22953163, -0.9890357, 0.01519303, -2.2087674, 0.6548511, 1.6067569, 1.1595085, -0.8719298, -1.7976003, 0.15530126, -1.4760295, -2.1548932, 1.1315889, 0.5280565, 1.4068561, -1.5691819, 3.765587, -2.1330607, 2.1708465, 1.2428522, 1.4334358, 1.829214, -0.7220404, -0.4950749, -0.85390186, 1.0197077, 1.7601211, 3.5631554, -0.06737826]}, + {"layer": 1, "basis": [0.032759067, -0.13314772, -0.04128816, -0.11289616, 0.023375977, -0.11517027, 0.12231716, -0.08102903, 0.051120073, 0.017500771, 0.17724757, -0.13217951, -0.05027826, 0.09021876, 0.23416683, -0.006712762, 0.0016444396, -0.18244062, -0.11891862, -0.041960504, -0.04127221, 0.01418096, -0.10312874, -0.002769091, -0.008398052, 0.10911036, -0.003349999, -0.14249031, 0.16507183, 0.069211185, 0.14665863, 0.14452334, -0.24081635, -0.08388082, -0.13391608, 0.07642385, -0.10556987, 0.014958295, -0.27333915, -0.03797991, 0.1049096, 0.11524216, -0.09412197, -0.14525123, 0.050785664, -0.05137568, -0.23252927, -0.023240367, 0.11796432, 0.04320953, -0.054238513, 0.3080224, -0.174124, 0.13288367, 0.14280891, 0.1960923, 0.08207218, -0.019696636, -0.1053515, -0.08753564, 0.046138033, 0.2510945, 0.20568748, -0.037384894], "neutral": [2.5403802, -0.6107809, 0.062300798, 1.49499, -0.64720786, 2.2524116, 2.5358746, -5.168618, -3.499977, -1.0449457, 0.15478604, -2.34535, -2.5848777, -1.3628726, 1.8815207, -1.1110901, -3.9774685, -4.7597775, -0.6708746, 0.0017258171, 2.0631378, -3.0336688, -0.6227669, 2.474963, -2.6115007, 0.26991248, -1.9374989, 0.9526677, 5.328921, -2.6247644, 0.044735555, 2.2181914, -4.052362, 2.8750932, 0.7703316, -1.9708306, -0.3956953, -2.4062173, -2.3324852, -2.1703327, 0.35780063, -2.869667, -0.15014786, -1.6218642, 0.33910915, 0.54017884, -2.4443815, 2.6439462, 2.1077006, 2.679039, 2.529034, 0.14207181, 0.46443367, -0.9520941, 1.1665174, -1.7227926, 3.6997166, -0.25603804, 0.32729462, 3.2004669, -1.4965214, 1.621521, 3.3546197, -2.644725], "target": 1.0402274, "along": 17.34076, "delta": [0.59091896, -2.401763, -0.7447696, -2.0364585, 0.42166364, -2.0774796, 2.2063978, -1.4616286, 0.92212087, 0.31568474, 3.1972506, -2.384298, -0.90693605, 1.6273961, 4.2239795, -0.12108704, 0.029662952, -3.2909248, -2.1450937, -0.75689757, -0.74448186, 0.25580087, -1.8602705, -0.049949784, -0.15148686, 1.9681691, -0.0604284, -2.5702877, 2.9776208, 1.2484543, 2.6454773, 2.6069603, -4.343926, -1.5130701, -2.415623, 1.3785589, -1.9043045, 0.26982272, -4.9305825, -0.68509424, 1.8923943, 2.0787764, -1.6978034, -2.6200902, 0.9160887, -0.9267316, -4.1944404, -0.4192175, 2.1278796, 0.77942795, -0.9783724, 5.556211, -3.1409068, 2.3969998, 2.5760348, 3.537178, 1.4804454, -0.3552945, -1.9003655, -1.578997, 0.8322532, 4.529326, 3.7102592, -0.67436117]} ] } ] diff --git a/tests/fixtures/browser/slens-qwen3-v1.json b/tests/fixtures/browser/slens-qwen3-v1.json index 8ac8f1e28..661700734 100644 --- a/tests/fixtures/browser/slens-qwen3-v1.json +++ b/tests/fixtures/browser/slens-qwen3-v1.json @@ -89,7 +89,7 @@ "atoms": [ { "atom": "slens/#71", - "layers": {"0": [0.35488254, -0.08659148, -0.3507128, -0.9364377, -0.3485439, 0.48243034, -0.48717576, 0.21507472, -0.30465654, 0.24291047, 0.16373575, 0.32411253, 0.35367876, -0.26117367, 0.45568743, 0.31481034, 0.46102703, 0.77203315, -0.20012906, -0.28253806, 0.33156824, -0.38976, 0.36178577, -0.36760002, -0.45552957, 0.38615257, -0.16950306, 0.1918014, -0.18688017, 0.20020905, -0.22635627, 0.09708221, 0.65878195, 0.27963465, -0.30782187, 0.30294907, 0.12230445, -0.27087614, -0.4976254, -0.15894717, 0.20325969, -0.44413707, -0.3019767, 0.31230587, 0.25542212, 0.3850361, 0.82428616, 0.2769444, 0.38346234, 0.3121459, -0.14619653, 0.20072517, -0.07266763, -0.6168245, 0.52276826, -0.7295811, 0.17508985, 0.045250207, 0.307312, 0.27588207, 0.03723143, -0.11836925, 0.36199212, -0.042688817], "1": [0.82533, -0.16512169, -0.82037675, -0.6878888, -0.15401797, 0.37622124, 0.019301347, 0.38672456, -0.27077204, 0.22177704, 0.20020217, 0.4918955, 0.37209034, -0.36715433, 0.29502606, 0.22441258, 0.7597246, 0.67460895, -0.32925788, -0.30826333, 0.72706664, -0.32137695, 0.79667926, -0.71707624, -0.19013345, 0.067900985, 0.32193625, -0.12140365, -0.6346562, 0.4907952, -0.49341613, 0.46877894, 0.05689156, -0.2665437, -0.17473999, 0.057134688, -0.21899468, -0.65467834, -0.23690113, -0.095307425, -0.20993304, 0.29612625, 0.26711038, -0.07591881, -0.10637852, 0.7870405, 0.42769283, 0.15434477, 0.11549957, 0.25776622, -0.08424796, -0.7724304, -0.56842506, -0.084772564, 0.37972125, -0.101947665, -0.52403736, 0.035737157, 0.037717074, -0.024759293, 0.53120315, -0.21143316, 0.25117233, -0.51532245]}, + "layers": {"0": [-0.0067286463, -0.010389668, -0.013958355, -0.0098383585, -0.01827183, 0.0020184824, -0.024476612, 0.004416248, -0.005716022, 0.011191838, 0.008681553, 0.00619142, -0.0010287, -0.008737674, 0.004885956, 0.0042954455, 0.0025200718, 0.0052102627, -0.011474445, -0.009623388, -0.002604139, -0.016108045, 0.0032329021, -0.011533143, -0.007152998, 0.0055990024, 0.0024956004, -0.0007190381, 0.0113121895, 0.0057164426, -0.012542423, 0.008193434, 0.011046597, 0.019368256, 0.0013262981, 0.011073131, -0.0023321249, -0.011689515, 0.0024360819, -0.0077996887, 0.01920941, -0.012544816, -0.016412197, 0.00808627, -0.010666939, 0.020002631, 0.018849138, 0.0007802985, -0.019202372, 0.004667869, -0.0036398717, 0.0036711963, 0.009291359, 0.0008173296, 0.0063583176, 0.0026158672, 0.005059519, -0.013061728, -0.01539335, 0.017424978, -0.004855069, 0.0074147973, 0.013132986, -0.012718528], "1": [0.006809286, -0.008926889, -0.022915175, -0.012653247, -0.017269386, 0.022811089, -0.009413962, -0.0016711229, -0.0006767721, 0.009524327, -0.004180344, 0.020861072, 0.01608134, -0.02147232, 0.009823528, 0.0054637594, 0.030256014, 0.012114093, -0.0043172934, -0.012985602, 0.0147441765, -0.012725802, 0.025886796, -0.025905155, 0.00012420258, 0.004616409, -0.004471872, -0.018759424, 0.0032775002, 0.012646742, -0.004629076, 0.01701967, 0.00994779, 0.0069213305, -0.006095546, -0.0033721407, 0.017526265, -0.029162787, 0.005271028, -0.0018847429, -0.021497272, 0.008300499, -0.0015037972, -0.0023777809, -0.014921579, 0.026279408, 0.021596484, -0.000864008, 0.0019243952, -0.0043328805, 0.0013684183, -0.010901853, -0.011191864, -0.00019407086, 0.014501839, 0.0061787684, -0.0061614644, -0.009741394, -0.013144133, 0.0104925055, 0.027936444, -0.0077676736, 0.0022878705, -0.027448758]}, "pushes": [ { "expression": "0.3 slens/#71", @@ -97,15 +97,15 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 0, "basis": [0.11912487, -0.029066516, -0.11772519, -0.31433788, -0.11699715, 0.16193935, -0.16353227, 0.07219501, -0.1022653, 0.081538744, 0.054961845, 0.10879617, 0.11872079, -0.08766923, 0.15296245, 0.10567367, 0.15475482, 0.25915152, -0.06717814, -0.0948407, 0.11129886, -0.13083231, 0.1214421, -0.1233938, -0.15290947, 0.12962142, -0.05689778, 0.064382754, -0.062730834, 0.06720499, -0.07598193, 0.03258798, 0.22113602, 0.0938661, -0.10332782, 0.10169215, 0.04105443, -0.09092609, -0.16703995, -0.053354446, 0.06822901, -0.1490853, -0.10136575, 0.104832985, 0.085738584, 0.12924664, 0.2766915, 0.092963055, 0.12871838, 0.10477928, -0.049074385, 0.06737823, -0.024392638, -0.20705199, 0.17547975, -0.24490146, 0.058773123, 0.015189322, 0.10315668, 0.092606455, 0.012497625, -0.039733484, 0.12151137, -0.014329529], "neutral": [-1.0697541, 0.5980025, -0.62266487, 0.48415062, 0.9949875, 1.4079958, 0.5412151, 0.24653126, -0.5583217, -0.0560521, 0.2563484, -1.9526263, 0.042111605, 0.91166836, 1.5351591, -0.22556959, 0.41342497, 1.7063704, -0.35431933, -0.6667204, 0.8396592, 0.5784123, -0.65091294, 0.4576738, -0.8654752, 0.17347713, -1.0710843, -0.026679069, -0.932949, 0.1308341, 1.2947704, -0.1102646, -0.50611275, -0.10273012, -0.0011565374, -0.9610713, 0.0007523571, -0.41574287, -1.1953559, -0.4055067, 0.9238321, -0.12423193, 1.8482071, 0.14442427, 0.5066812, -0.1547352, 0.31152064, 0.06653554, 0.9140094, -0.73482746, 0.5601327, -0.78795004, 0.17368877, 1.3637522, 0.255479, 0.9373276, -1.1588248, -0.15820484, -0.92295545, -0.26795825, 0.061374705, 0.9107198, -0.4912306, 1.0379199], "target": 0.028011601, "along": 18.612587, "delta": [0.062107936, -0.015154363, -0.061378192, -0.16388583, -0.060998615, 0.08443006, -0.085260555, 0.037640195, -0.053317893, 0.042511724, 0.028655369, 0.056722883, 0.061897263, -0.045707963, 0.079749785, 0.05509491, 0.08068427, 0.1351134, -0.035024554, -0.04944694, 0.058027707, -0.06821183, 0.06331607, -0.06433362, -0.07972216, 0.067580506, -0.029664703, 0.033567134, -0.03270587, 0.035038553, -0.039614573, 0.016990343, 0.115293324, 0.04893882, -0.053871855, 0.05301907, 0.021404482, -0.047405988, -0.087089345, -0.027817322, 0.035572447, -0.07772836, -0.052848894, 0.054656602, 0.044701386, 0.067385115, 0.14425819, 0.048467997, 0.06710969, 0.054628603, -0.025585832, 0.03512888, -0.01271755, -0.10795036, 0.09148959, -0.12768388, 0.030642448, 0.007919231, 0.05378263, 0.048282076, 0.0065158666, -0.020715782, 0.06335218, -0.0074709635]}, - {"layer": 1, "basis": [0.24810705, -0.04963815, -0.24661802, -0.20679007, -0.0463002, 0.11309795, 0.0058022854, 0.11625542, -0.081398286, 0.06666963, 0.060183886, 0.14787143, 0.11185615, -0.110372305, 0.088689424, 0.06746191, 0.22838505, 0.20279795, -0.09898004, -0.09266876, 0.21856752, -0.09661091, 0.23949419, -0.2155643, -0.057157073, 0.020412093, 0.09677905, -0.036495827, -0.19078752, 0.14754067, -0.14832857, 0.14092225, 0.017102487, -0.08012718, -0.05252956, 0.017175576, -0.0658332, -0.19680649, -0.071216166, -0.028650895, -0.06310914, 0.089020155, 0.08029754, -0.022822374, -0.03197904, 0.23659661, 0.12857112, 0.046398442, 0.03472097, 0.077488534, -0.025326248, -0.23220462, -0.17087741, -0.02548395, 0.114150114, -0.030647054, -0.15753378, 0.010743145, 0.011338338, -0.0074430285, 0.15968794, -0.0635601, 0.075506315, -0.15491395], "neutral": [-1.1489043, 0.66334873, -0.331071, 1.4405504, 0.7537279, 1.276424, 0.087124966, 0.26788065, -0.5330119, -0.7228864, 0.67532283, -1.9355294, -0.11008074, 0.20615493, 1.5101553, -0.20731449, 0.31628898, 1.8702863, -0.24037302, -0.34410205, 0.4802817, 0.22172844, -0.960725, 0.50646406, -1.4034104, 0.43842185, -0.5915393, -0.024377147, -1.1723615, -0.035872586, 0.8888337, -0.16504191, -0.2052579, 0.9123388, 0.9835431, -0.07350717, 0.68469554, -0.29789487, -1.7445227, 0.16906886, 1.1819685, -0.2213497, 2.156016, -0.07718279, -0.32519507, -0.9837756, 0.06553345, -0.54566085, 1.0326622, -0.5658421, 0.5097351, -0.89339787, -0.88046074, 1.4606498, 0.7556698, 1.0270442, -1.1929218, -0.068277635, -0.72793156, -0.110670745, 0.43531215, 0.8252082, -0.29633963, 1.8864964], "target": 0.0434865, "along": 13.387413, "delta": [0.1444409, -0.028897924, -0.14357403, -0.12038733, -0.026954666, 0.06584243, 0.0033779263, 0.06768062, -0.04738778, 0.03881317, 0.035037354, 0.086086564, 0.06511948, -0.06425563, 0.051632475, 0.039274413, 0.1329593, 0.118063234, -0.05762338, -0.05394913, 0.12724383, -0.05624414, 0.13942674, -0.12549543, -0.03327523, 0.011883344, 0.056342024, -0.02124684, -0.1110711, 0.08589401, -0.0863527, 0.08204095, 0.009956584, -0.04664778, -0.030581223, 0.009999135, -0.03832623, -0.11457517, -0.041460037, -0.01667974, -0.03674035, 0.051825017, 0.046746954, -0.013286541, -0.018617293, 0.13773985, 0.07485047, 0.02701186, 0.020213565, 0.045111634, -0.014744225, -0.13518296, -0.099479996, -0.014836035, 0.06645497, -0.017841848, -0.09171171, 0.006254355, 0.00660086, -0.0043331203, 0.0929658, -0.03700289, 0.043957643, -0.090186514]} + {"layer": 0, "basis": [-0.07931453, -0.12246916, -0.16453537, -0.115970545, -0.21538085, 0.023793044, -0.28852028, 0.052056924, -0.067378126, 0.13192481, 0.102334596, 0.07298193, -0.012125895, -0.10299612, 0.05759365, 0.050632954, 0.029705577, 0.061416443, -0.13525608, -0.11343656, -0.030696524, -0.18987505, 0.03810813, -0.13594797, -0.08431661, 0.06599875, 0.029417116, -0.008475727, 0.13334346, 0.06738309, -0.14784496, 0.09658085, 0.13021275, 0.22830507, 0.015633859, 0.13052553, -0.027490132, -0.13779122, 0.028715536, -0.09193954, 0.22643264, -0.14787316, -0.19346026, 0.09531763, -0.12573752, 0.23578282, 0.22218591, 0.00919784, -0.22634971, 0.055022925, -0.04290532, 0.04327456, 0.10952274, 0.009634347, 0.07494925, 0.030834772, 0.059639536, -0.15396632, -0.18145053, 0.20539851, -0.057229567, 0.08740259, 0.15480627, -0.14992079], "neutral": [-1.0697541, 0.5980025, -0.62266487, 0.48415062, 0.9949875, 1.4079958, 0.5412151, 0.24653126, -0.5583217, -0.0560521, 0.2563484, -1.9526263, 0.042111605, 0.91166836, 1.5351591, -0.22556959, 0.41342497, 1.7063704, -0.35431933, -0.6667204, 0.8396592, 0.5784123, -0.65091294, 0.4576738, -0.8654752, 0.17347713, -1.0710843, -0.026679069, -0.932949, 0.1308341, 1.2947704, -0.1102646, -0.50611275, -0.10273012, -0.0011565374, -0.9610713, 0.0007523571, -0.41574287, -1.1953559, -0.4055067, 0.9238321, -0.12423193, 1.8482071, 0.14442427, 0.5066812, -0.1547352, 0.31152064, 0.06653554, 0.9140094, -0.73482746, 0.5601327, -0.78795004, 0.17368877, 1.3637522, 0.255479, 0.9373276, -1.1588248, -0.15820484, -0.92295545, -0.26795825, 0.061374705, 0.9107198, -0.4912306, 1.0379199], "target": 0.07025936, "along": 12.939406, "delta": [-0.07210598, -0.11133848, -0.14958148, -0.1054305, -0.19580585, 0.0216306, -0.26229796, 0.0473257, -0.06125443, 0.119934745, 0.09303386, 0.066348925, -0.011023826, -0.09363526, 0.05235922, 0.046031147, 0.027005767, 0.055834576, -0.12296326, -0.10312681, -0.027906653, -0.17261815, 0.03464465, -0.12359227, -0.07665345, 0.060000416, 0.026743526, -0.007705406, 0.12122446, 0.061258934, -0.13440798, 0.08780304, 0.11837829, 0.20755544, 0.014212968, 0.11866264, -0.024991676, -0.12526798, 0.02610571, -0.08358356, 0.20585318, -0.13443363, -0.17587751, 0.08665464, -0.114309795, 0.21435356, 0.20199242, 0.008361889, -0.2057778, 0.050022136, -0.039005846, 0.039341528, 0.0995687, 0.008758724, 0.068137445, 0.028032336, 0.054219164, -0.139973, -0.1649593, 0.18673076, -0.052028228, 0.07945896, 0.14073661, -0.13629515]}, + {"layer": 1, "basis": [0.060204998, -0.07892801, -0.20260687, -0.11187498, -0.15268905, 0.20168659, -0.08323452, -0.014775404, -0.0059837503, 0.084210314, -0.03696094, 0.18444532, 0.14218482, -0.18984973, 0.08685574, 0.048308387, 0.26751167, 0.107108, -0.038171794, -0.11481353, 0.13036215, -0.112516485, 0.22888076, -0.22904307, 0.0010981498, 0.040816452, -0.039538518, -0.16586338, 0.028978353, 0.111817464, -0.040928453, 0.15048116, 0.0879544, 0.061195653, -0.053894393, -0.029815128, 0.15496027, -0.2578458, 0.046604335, -0.016664147, -0.19007033, 0.07338972, -0.013295977, -0.021023395, -0.13193066, 0.23235208, 0.19094752, -0.007639216, 0.017014736, -0.03830961, 0.012099011, -0.09638985, -0.09895401, -0.0017158975, 0.12821949, 0.054630212, -0.05447722, -0.08612954, -0.11621521, 0.09277057, 0.24700293, -0.068678685, 0.020228444, -0.24269103], "neutral": [-1.1489043, 0.66334873, -0.331071, 1.4405504, 0.7537279, 1.276424, 0.087124966, 0.26788065, -0.5330119, -0.7228864, 0.67532283, -1.9355294, -0.11008074, 0.20615493, 1.5101553, -0.20731449, 0.31628898, 1.8702863, -0.24037302, -0.34410205, 0.4802817, 0.22172844, -0.960725, 0.50646406, -1.4034104, 0.43842185, -0.5915393, -0.024377147, -1.1723615, -0.035872586, 0.8888337, -0.16504191, -0.2052579, 0.9123388, 0.9835431, -0.07350717, 0.68469554, -0.29789487, -1.7445227, 0.16906886, 1.1819685, -0.2213497, 2.156016, -0.07718279, -0.32519507, -0.9837756, 0.06553345, -0.54566085, 1.0326622, -0.5658421, 0.5097351, -0.89339787, -0.88046074, 1.4606498, 0.7556698, 1.0270442, -1.1929218, -0.068277635, -0.72793156, -0.110670745, 0.43531215, 0.8252082, -0.29633963, 1.8864964], "target": 0.06358813, "along": 19.060593, "delta": [0.07297011, -0.09566291, -0.24556507, -0.13559555, -0.18506332, 0.24444968, -0.100882515, -0.017908195, -0.007252469, 0.102065206, -0.044797674, 0.22355278, 0.1723319, -0.23010308, 0.10527153, 0.058551088, 0.32423148, 0.12981783, -0.04626526, -0.13915715, 0.1580025, -0.13637306, 0.27740976, -0.2776065, 0.0013309877, 0.04947066, -0.047921766, -0.20103095, 0.03512256, 0.13552584, -0.049606405, 0.18238729, 0.106603146, 0.074170806, -0.06532148, -0.03613675, 0.1878161, -0.31251615, 0.05648573, -0.020197403, -0.23037045, 0.08895034, -0.01611509, -0.025480932, -0.15990359, 0.28161708, 0.23143363, -0.009258939, 0.020622328, -0.046432298, 0.014664333, -0.116827145, -0.11993496, -0.0020797148, 0.15540554, 0.06621332, -0.06602788, -0.10439136, -0.14085601, 0.11244047, 0.2993743, -0.08324045, 0.024517428, -0.29414818]} ] } ] }, { "atom": "slens/a", - "layers": {"0": [-0.5719363, -0.046613477, 0.81255627, 0.05861847, 0.0632603, -0.35228652, 0.651313, 0.43651026, 0.4931951, -0.5277194, 0.37046185, -0.4655604, -0.449727, -0.28546566, -0.21215929, 0.13139974, -0.55716157, -0.5884405, 0.577825, -0.8822695, -0.22177649, -0.67589283, 0.7523498, -0.00572253, 0.8194949, 0.06590111, 0.34960097, 0.458464, -0.4008084, -0.45463717, 0.60738397, -0.44185817, -0.6352855, -0.11123446, -0.2002779, -0.27767837, 0.08104469, -0.36712855, -0.0198422, 0.0629767, -0.282336, -0.21275276, 0.15889974, -0.094371416, -0.050547123, 0.2544819, 0.033148374, -0.22574118, 0.17173134, -0.08488782, -0.19679469, -0.11030998, 0.013086766, 0.17455739, -0.26305944, 0.15017962, 0.16312698, -0.194618, -0.36340332, 0.15430005, -0.7640381, -0.12544934, -0.09339121, -0.53664637], "1": [-0.8110836, 0.020791426, 0.6268889, 0.15006284, -0.32265812, -0.55590767, -0.078232825, 0.5504818, -0.076863304, -0.9547367, -0.79375535, -0.5201285, -0.78635705, -0.50912213, -0.18153648, 0.5774399, -0.72721386, -0.5800297, 0.2901269, -0.8017936, -0.5824427, -0.90383536, 0.78373975, -0.066075265, 1.0431429, -0.041596025, 0.2892214, 0.44408712, 0.036120176, -0.3694953, 0.5230024, -0.13022006, -0.26262745, 0.18597095, -0.56579214, 0.014715254, -0.0068975016, 0.20634457, -0.116112545, 0.14535415, 0.14901471, -0.36061203, 0.5508018, -0.28136313, 0.3915463, 0.65203065, 0.34749264, -0.22968847, -0.079385705, -0.53788805, -0.35170406, -0.54800415, 0.14745621, 0.101811916, 0.20693073, -0.11781679, -0.18071456, -0.08236588, -0.39642593, 0.1609097, -0.52122605, 0.76378655, -0.17930868, 0.0067112446]}, + "layers": {"0": [-0.01399834, -0.0057133874, 0.015720578, -0.014162807, 0.0015671314, -0.006146393, 0.014278978, 0.0032392498, 0.009428332, -0.009441899, 0.007786274, -0.0066794944, -0.0014646947, -0.0031501064, 0.009076402, 0.008137455, 0.0014933576, -0.0032348013, 0.008458412, -0.011664802, -0.011438532, -0.0062300256, 0.014480574, 0.0054657324, 0.018877465, -0.0013316022, -0.0031126956, 0.0031616394, -0.01037658, 0.008649641, 0.009686509, -0.008352487, -0.009463772, -0.0060760025, -0.0004364791, -0.011085993, 0.0027569442, -0.016298562, 0.017811, -0.0031938297, -0.0034207352, 0.010167448, 0.002203337, -0.004661415, -0.018675102, 0.006507594, -0.0027090916, 0.008930276, 0.01125832, 0.005837463, -0.005500562, -0.0031148042, 0.003431926, 0.011983142, -0.004856877, -0.00316119, 0.0038235649, -0.0028743427, -0.0064634467, 0.009255791, -0.0051073623, -0.0054181414, 0.000357644, -0.011197956], "1": [-0.0117928265, -0.0052956357, 0.018127799, 0.002197259, -0.005528979, -0.009406285, -0.0049292957, 0.027086012, -0.0052832672, -0.0107183885, -0.029770153, -0.014035437, -0.031378917, -0.02919323, -0.027828882, 0.0074988203, -0.04385616, -0.022591729, -0.009873917, -0.014022278, -0.010142227, -0.03532909, 0.02044284, -0.0073131667, 0.015611625, 0.0018649732, 0.011686537, 0.027522504, 0.029984782, -0.0029013753, 0.006951946, -0.018776808, -0.0075724274, 0.010451126, -0.01840479, -0.0024172217, -0.034053557, 0.004140701, -0.010197561, 0.009362534, 0.017697085, -0.019895308, 0.014744876, -0.0056469287, 0.03251108, -0.003597782, 0.028437493, 0.002906084, -0.017688822, -0.003993776, -0.013964014, -0.036743477, -0.016424205, -0.021762798, 0.017949123, -0.0061388686, -0.01656411, 0.011822981, -0.004615276, -0.012157591, -0.021089993, 0.02697033, 0.0030557166, 0.023890037]}, "pushes": [ { "expression": "0.3 slens/a", @@ -113,8 +113,8 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 0, "basis": [-0.18066007, -0.014724006, 0.25666574, 0.018516077, 0.019982312, -0.11127831, 0.20573314, 0.13788244, 0.15578772, -0.16669306, 0.11701943, -0.14705865, -0.14205725, -0.09017131, -0.0670157, 0.04150582, -0.1759931, -0.1858733, 0.18252017, -0.27868637, -0.07005352, -0.21349727, 0.23764807, -0.0018076011, 0.25885752, 0.020816475, 0.11043001, 0.14481705, -0.12660514, -0.14360827, 0.19185707, -0.13957171, -0.20067045, -0.035136126, -0.06326267, -0.0877115, 0.025599945, -0.11596653, -0.006267644, 0.01989273, -0.08918273, -0.067203164, 0.050192367, -0.029809516, -0.015966544, 0.08038433, 0.010470724, -0.07130586, 0.05424554, -0.026813893, -0.062162414, -0.0348441, 0.004133775, 0.05513822, -0.08309375, 0.047437906, 0.05152764, -0.061474852, -0.11478982, 0.04873944, -0.2413401, -0.03962624, -0.029499896, -0.16951287], "neutral": [-1.0697541, 0.5980025, -0.62266487, 0.48415062, 0.9949875, 1.4079958, 0.5412151, 0.24653126, -0.5583217, -0.0560521, 0.2563484, -1.9526263, 0.042111605, 0.91166836, 1.5351591, -0.22556959, 0.41342497, 1.7063704, -0.35431933, -0.6667204, 0.8396592, 0.5784123, -0.65091294, 0.4576738, -0.8654752, 0.17347713, -1.0710843, -0.026679069, -0.932949, 0.1308341, 1.2947704, -0.1102646, -0.50611275, -0.10273012, -0.0011565374, -0.9610713, 0.0007523571, -0.41574287, -1.1953559, -0.4055067, 0.9238321, -0.12423193, 1.8482071, 0.14442427, 0.5066812, -0.1547352, 0.31152064, 0.06653554, 0.9140094, -0.73482746, 0.5601327, -0.78795004, 0.17368877, 1.3637522, 0.255479, 0.9373276, -1.1588248, -0.15820484, -0.92295545, -0.26795825, 0.061374705, 0.9107198, -0.4912306, 1.0379199], "target": 0.029167166, "along": 18.10483, "delta": [-0.09540054, -0.0077752555, 0.13553661, 0.009777722, 0.010551992, -0.058762357, 0.10864079, 0.072811104, 0.08226629, -0.08802504, 0.06179405, -0.07765675, -0.07501569, -0.047616452, -0.03538875, 0.021917837, -0.092936076, -0.09815347, 0.0963828, -0.14716497, -0.036992922, -0.11274077, 0.125494, -0.0009545337, 0.136694, 0.010992485, 0.058314398, 0.07647305, -0.06685594, -0.07583472, 0.10131331, -0.073703155, -0.10596736, -0.018554213, -0.033406902, -0.04631751, 0.013518476, -0.06123805, -0.0033097332, 0.010504685, -0.04709442, -0.035487745, 0.026504911, -0.01574141, -0.008431398, 0.04244828, 0.0055292393, -0.037654243, 0.028645257, -0.01415952, -0.032825895, -0.018400004, 0.0021829084, 0.029116651, -0.043879032, 0.025050372, 0.027210025, -0.032462813, -0.06061667, 0.02573767, -0.12744364, -0.020925295, -0.01557791, -0.08951408]}, - {"layer": 1, "basis": [-0.21889012, 0.0056110583, 0.1691808, 0.04049801, -0.08707693, -0.15002485, -0.02111298, 0.14856054, -0.020743381, -0.2576583, -0.21421367, -0.14036898, -0.21221705, -0.13739866, -0.048991915, 0.15583582, -0.19625588, -0.15653475, 0.07829761, -0.21638297, -0.15718596, -0.24392137, 0.2115107, -0.017831974, 0.28151682, -0.011225673, 0.07805324, 0.11984742, 0.009747884, -0.09971705, 0.14114459, -0.035142966, -0.07087623, 0.05018866, -0.1526924, 0.0039712596, -0.001861454, 0.05568697, -0.03133572, 0.03922726, 0.040215146, -0.09731969, 0.1486469, -0.0759325, 0.10566804, 0.17596589, 0.093779124, -0.061986867, -0.021424111, -0.14516182, -0.09491566, -0.1478919, 0.03979455, 0.027476355, 0.055845156, -0.031795654, -0.048770104, -0.022228383, -0.10698492, 0.04342529, -0.14066519, 0.20612589, -0.048390694, 0.0018111881], "neutral": [-1.1489043, 0.66334873, -0.331071, 1.4405504, 0.7537279, 1.276424, 0.087124966, 0.26788065, -0.5330119, -0.7228864, 0.67532283, -1.9355294, -0.11008074, 0.20615493, 1.5101553, -0.20731449, 0.31628898, 1.8702863, -0.24037302, -0.34410205, 0.4802817, 0.22172844, -0.960725, 0.50646406, -1.4034104, 0.43842185, -0.5915393, -0.024377147, -1.1723615, -0.035872586, 0.8888337, -0.16504191, -0.2052579, 0.9123388, 0.9835431, -0.07350717, 0.68469554, -0.29789487, -1.7445227, 0.16906886, 1.1819685, -0.2213497, 2.156016, -0.07718279, -0.32519507, -0.9837756, 0.06553345, -0.54566085, 1.0326622, -0.5658421, 0.5097351, -0.89339787, -0.88046074, 1.4606498, 0.7556698, 1.0270442, -1.1929218, -0.068277635, -0.72793156, -0.110670745, 0.43531215, 0.8252082, -0.29633963, 1.8864964], "target": 0.044481453, "along": 13.895169, "delta": [-0.13529101, 0.0034680679, 0.10456681, 0.025030902, -0.053820275, -0.09272695, -0.013049454, 0.0918219, -0.012821013, -0.15925275, -0.13240062, -0.08675889, -0.13116655, -0.084923, -0.030280791, 0.09631859, -0.12130131, -0.09675058, 0.048393976, -0.13374141, -0.097153075, -0.15076226, 0.13072997, -0.011021539, 0.17399916, -0.0069383336, 0.048242938, 0.07407497, 0.006024946, -0.061632846, 0.08723827, -0.02172107, -0.043806992, 0.031020472, -0.094375715, 0.0024545456, -0.0011505225, 0.03441885, -0.019367898, 0.024245478, 0.02485607, -0.060151096, 0.09187528, -0.046932157, 0.065311015, 0.10876053, 0.057962745, -0.038312677, -0.013241757, -0.08972123, -0.058665216, -0.091408625, 0.024596108, 0.016982513, 0.034516625, -0.019652171, -0.030143695, -0.0137388585, -0.06612495, 0.026840188, -0.086941965, 0.12740172, -0.02990919, 0.0011194543]} + {"layer": 0, "basis": [-0.19958073, -0.08145837, 0.22413544, -0.20192559, 0.022343306, -0.08763192, 0.2035819, 0.04618346, 0.13442402, -0.13461745, 0.11101245, -0.09523259, -0.020882819, -0.044912506, 0.1294064, 0.11601941, 0.021291481, -0.04612004, 0.12059544, -0.1663104, -0.16308436, -0.08882432, 0.20645614, 0.07792743, 0.26914465, -0.018985258, -0.044379123, 0.045076933, -0.14794363, 0.12332187, 0.13810498, -0.11908522, -0.1349293, -0.08662834, -0.006223082, -0.15805805, 0.03930701, -0.23237604, 0.25393954, -0.045535885, -0.048770983, 0.14496192, 0.03141398, -0.06645991, -0.26625946, 0.09278173, -0.038624752, 0.127323, 0.160515, 0.083227366, -0.078424014, -0.044409182, 0.048930533, 0.17084911, -0.06924671, -0.04507053, 0.05451431, -0.040980816, -0.09215231, 0.13196403, -0.072817996, -0.077248916, 0.0050990935, -0.15965436], "neutral": [-1.0697541, 0.5980025, -0.62266487, 0.48415062, 0.9949875, 1.4079958, 0.5412151, 0.24653126, -0.5583217, -0.0560521, 0.2563484, -1.9526263, 0.042111605, 0.91166836, 1.5351591, -0.22556959, 0.41342497, 1.7063704, -0.35431933, -0.6667204, 0.8396592, 0.5784123, -0.65091294, 0.4576738, -0.8654752, 0.17347713, -1.0710843, -0.026679069, -0.932949, 0.1308341, 1.2947704, -0.1102646, -0.50611275, -0.10273012, -0.0011565374, -0.9610713, 0.0007523571, -0.41574287, -1.1953559, -0.4055067, 0.9238321, -0.12423193, 1.8482071, 0.14442427, 0.5066812, -0.1547352, 0.31152064, 0.06653554, 0.9140094, -0.73482746, 0.5601327, -0.78795004, 0.17368877, 1.3637522, 0.255479, 0.9373276, -1.1588248, -0.15820484, -0.92295545, -0.26795825, 0.061374705, 0.9107198, -0.4912306, 1.0379199], "target": 0.055098016, "along": 12.045168, "delta": [-0.13245471, -0.054061055, 0.14875081, -0.13401093, 0.014828466, -0.058158226, 0.13511015, 0.03065034, 0.0892125, -0.08934087, 0.07367506, -0.06320252, -0.013859193, -0.029806852, 0.08588248, 0.076998, 0.014130408, -0.03060825, 0.08003496, -0.11037437, -0.108233355, -0.05894958, 0.13701768, 0.051717702, 0.17862184, -0.012599849, -0.029452864, 0.029915977, -0.098184995, 0.08184439, 0.09165542, -0.079032674, -0.089547835, -0.057492185, -0.0041300408, -0.104897566, 0.02608668, -0.1542198, 0.16853076, -0.030220566, -0.032367587, 0.096206136, 0.020848352, -0.044107106, -0.17670704, 0.06157597, -0.025633892, 0.084499806, 0.10652816, 0.05523508, -0.05204726, -0.029472813, 0.032473475, 0.11338655, -0.045956604, -0.029911725, 0.036179233, -0.027197527, -0.06115825, 0.08757989, -0.048326742, -0.05126739, 0.003384089, -0.105956994]}, + {"layer": 1, "basis": [-0.07895516, -0.035455264, 0.12136898, 0.014711058, -0.03701754, -0.06297682, -0.033002548, 0.18134588, -0.035372455, -0.07176161, -0.19931668, -0.09396985, -0.2100877, -0.19545409, -0.18631952, 0.050205994, -0.29362515, -0.15125582, -0.066107705, -0.09388175, -0.06790409, -0.23653482, 0.1368686, -0.048963014, 0.10452273, 0.012486342, 0.07824354, 0.18426828, 0.20075367, -0.019425245, 0.046544567, -0.12571421, -0.05069881, 0.06997223, -0.12322348, -0.016183747, -0.2279949, 0.027722763, -0.068274565, 0.0626839, 0.11848527, -0.13320278, 0.09871968, -0.037807234, 0.21766773, -0.024087818, 0.1903943, 0.019456774, -0.11842995, -0.026739074, -0.093491666, -0.2460044, -0.109963104, -0.14570597, 0.12017271, -0.041100863, -0.1108998, 0.07915705, -0.030900132, -0.08139733, -0.14120144, 0.18057138, 0.02045859, 0.15994823], "neutral": [-1.1489043, 0.66334873, -0.331071, 1.4405504, 0.7537279, 1.276424, 0.087124966, 0.26788065, -0.5330119, -0.7228864, 0.67532283, -1.9355294, -0.11008074, 0.20615493, 1.5101553, -0.20731449, 0.31628898, 1.8702863, -0.24037302, -0.34410205, 0.4802817, 0.22172844, -0.960725, 0.50646406, -1.4034104, 0.43842185, -0.5915393, -0.024377147, -1.1723615, -0.035872586, 0.8888337, -0.16504191, -0.2052579, 0.9123388, 0.9835431, -0.07350717, 0.68469554, -0.29789487, -1.7445227, 0.16906886, 1.1819685, -0.2213497, 2.156016, -0.07718279, -0.32519507, -0.9837756, 0.06553345, -0.54566085, 1.0326622, -0.5658421, 0.5097351, -0.89339787, -0.88046074, 1.4606498, 0.7556698, 1.0270442, -1.1929218, -0.068277635, -0.72793156, -0.110670745, 0.43531215, 0.8252082, -0.29633963, 1.8864964], "target": 0.07082396, "along": 19.954832, "delta": [-0.11158576, -0.050108224, 0.17152838, 0.020790847, -0.052316155, -0.089003906, -0.04664185, 0.25629255, -0.049991194, -0.101419255, -0.28169033, -0.13280573, -0.2969128, -0.2762314, -0.2633217, 0.070955135, -0.4149746, -0.21376686, -0.093428716, -0.13268122, -0.09596751, -0.33428997, 0.19343369, -0.06919846, 0.1477199, 0.017646702, 0.11058005, 0.2604227, 0.2837212, -0.027453315, 0.06578051, -0.17766942, -0.07165162, 0.09889037, -0.17414932, -0.02287217, -0.32222068, 0.039180033, -0.0964911, 0.088589914, 0.1674529, -0.18825285, 0.13951857, -0.05343222, 0.3076255, -0.03404284, 0.2690805, 0.027497873, -0.16737472, -0.037789803, -0.13212992, -0.34767315, -0.15540868, -0.20592338, 0.16983771, -0.058087036, -0.1567325, 0.111871086, -0.043670546, -0.11503723, -0.1995572, 0.25519797, 0.028913721, 0.22605167]} ] } ] diff --git a/tests/fixtures/browser/unit-reads-gemma3-v1.json b/tests/fixtures/browser/unit-reads-gemma3-v1.json index 3a19413c5..3e9f53db3 100644 --- a/tests/fixtures/browser/unit-reads-gemma3-v1.json +++ b/tests/fixtures/browser/unit-reads-gemma3-v1.json @@ -1811,7 +1811,7 @@ {"unit": "neuron/L2n12", "index": 12, "pole": "+", "coeff": 1.59164, "label": null}, {"unit": "neuron/L2n1", "index": 1, "pole": "-", "coeff": -1.26139, "label": null}, {"unit": "neuron/L2n30", "index": 30, "pole": "-", "coeff": -1.211387, "label": null}, - {"unit": "neuron/L2n11", "index": 11, "pole": "-", "coeff": -1.112304, "label": null}, + {"unit": "neuron/L2n11", "index": 11, "pole": "-", "coeff": -1.112305, "label": null}, {"unit": "neuron/L2n32", "index": 32, "pole": "+", "coeff": 0.716691, "label": null} ] } @@ -1823,37 +1823,31 @@ {"unit": "neuron/L2n1", "score": 0.8254109, "runner_up": 0.6968674}, {"unit": "neuron/L2n32", "score": 0.6369863, "runner_up": 0.6064911}, {"unit": "neuron/L2n12", "score": 0.5760052, "runner_up": 0.5690922}, - {"unit": "neuron/L2n30", "score": 0.5601975, "runner_up": 0.51959676}, - {"unit": "neuron/L2n11", "score": 0.5603288, "runner_up": 0.528478} + {"unit": "neuron/L2n30", "score": 0.56019753, "runner_up": 0.51959676}, + {"unit": "neuron/L2n11", "score": 0.5603289, "runner_up": 0.52847797} ] } }, { "target": "jlens/#72", - "k": 5, + "k": 2, "result": { "target": "jlens/#72", - "k": 5, - "mean_share": 0.4252, + "k": 2, + "mean_share": 0.101954, "layers": { "0": { - "share": 0.478989, + "share": 0.127254, "neurons": [ - {"unit": "neuron/L0n46", "index": 46, "pole": "-", "coeff": -0.76417, "label": null}, - {"unit": "neuron/L0n80", "index": 80, "pole": "-", "coeff": -0.738314, "label": null}, - {"unit": "neuron/L0n63", "index": 63, "pole": "+", "coeff": 0.610945, "label": null}, - {"unit": "neuron/L0n20", "index": 20, "pole": "+", "coeff": 0.563671, "label": null}, - {"unit": "neuron/L0n0", "index": 0, "pole": "-", "coeff": -0.354341, "label": null} + {"unit": "neuron/L0n20", "index": 20, "pole": "+", "coeff": 0.697912, "label": null}, + {"unit": "neuron/L0n13", "index": 13, "pole": "+", "coeff": 0.584876, "label": null} ] }, "1": { - "share": 0.37141, + "share": 0.076653, "neurons": [ - {"unit": "neuron/L1n11", "index": 11, "pole": "-", "coeff": -0.867147, "label": null}, - {"unit": "neuron/L1n27", "index": 27, "pole": "+", "coeff": 0.817968, "label": null}, - {"unit": "neuron/L1n2", "index": 2, "pole": "-", "coeff": -0.808364, "label": null}, - {"unit": "neuron/L1n65", "index": 65, "pole": "-", "coeff": -0.647517, "label": null}, - {"unit": "neuron/L1n71", "index": 71, "pole": "+", "coeff": 0.444967, "label": null} + {"unit": "neuron/L1n2", "index": 2, "pole": "-", "coeff": -0.809161, "label": null}, + {"unit": "neuron/L1n45", "index": 45, "pole": "-", "coeff": -0.510674, "label": null} ] } }, @@ -1861,18 +1855,12 @@ }, "iterations": { "0": [ - {"unit": "neuron/L0n80", "score": 0.92663187, "runner_up": 0.8302831}, - {"unit": "neuron/L0n46", "score": 0.8592969, "runner_up": 0.71170914}, - {"unit": "neuron/L0n63", "score": 0.53609407, "runner_up": 0.46302876}, - {"unit": "neuron/L0n0", "score": 0.52969867, "runner_up": 0.45507252}, - {"unit": "neuron/L0n20", "score": 0.48427027, "runner_up": 0.4647324} + {"unit": "neuron/L0n13", "score": 0.560788, "runner_up": 0.5508115}, + {"unit": "neuron/L0n20", "score": 0.61073667, "runner_up": 0.41575295} ], "1": [ - {"unit": "neuron/L1n2", "score": 0.50448036, "runner_up": 0.48851058}, - {"unit": "neuron/L1n11", "score": 0.47874326, "runner_up": 0.41458184}, - {"unit": "neuron/L1n27", "score": 0.44136274, "runner_up": 0.40649465}, - {"unit": "neuron/L1n65", "score": 0.4770847, "runner_up": 0.40210307}, - {"unit": "neuron/L1n71", "score": 0.3486435, "runner_up": 0.3219085} + {"unit": "neuron/L1n2", "score": 0.55598277, "runner_up": 0.43119392}, + {"unit": "neuron/L1n45", "score": 0.41271573, "runner_up": 0.3891763} ] } } diff --git a/tests/fixtures/browser/unit-reads-qwen3-v1.json b/tests/fixtures/browser/unit-reads-qwen3-v1.json index 2b145131e..41f72c4e1 100644 --- a/tests/fixtures/browser/unit-reads-qwen3-v1.json +++ b/tests/fixtures/browser/unit-reads-qwen3-v1.json @@ -1824,8 +1824,8 @@ "2": { "share": 0.501509, "neurons": [ - {"unit": "neuron/L2n61", "index": 61, "pole": "-", "coeff": -2.200743, "label": null}, - {"unit": "neuron/L2n75", "index": 75, "pole": "-", "coeff": -1.298769, "label": null}, + {"unit": "neuron/L2n61", "index": 61, "pole": "-", "coeff": -2.200744, "label": null}, + {"unit": "neuron/L2n75", "index": 75, "pole": "-", "coeff": -1.29877, "label": null}, {"unit": "neuron/L2n59", "index": 59, "pole": "-", "coeff": -1.173116, "label": null}, {"unit": "neuron/L2n6", "index": 6, "pole": "-", "coeff": -1.142288, "label": null}, {"unit": "neuron/L2n80", "index": 80, "pole": "+", "coeff": 1.068681, "label": null} @@ -1837,10 +1837,10 @@ "iterations": { "2": [ {"unit": "neuron/L2n61", "score": 7.3699718, "runner_up": 5.3687835}, - {"unit": "neuron/L2n59", "score": 4.649299, "runner_up": 4.4677544}, - {"unit": "neuron/L2n6", "score": 4.08145, "runner_up": 4.022781}, - {"unit": "neuron/L2n75", "score": 4.193457, "runner_up": 4.185761}, - {"unit": "neuron/L2n80", "score": 4.1440487, "runner_up": 3.4512544} + {"unit": "neuron/L2n59", "score": 4.6492987, "runner_up": 4.4677544}, + {"unit": "neuron/L2n6", "score": 4.08145, "runner_up": 4.0227814}, + {"unit": "neuron/L2n75", "score": 4.193458, "runner_up": 4.1857605}, + {"unit": "neuron/L2n80", "score": 4.144048, "runner_up": 3.4512548} ] } }, @@ -1850,26 +1850,26 @@ "result": { "target": "jlens/#71", "k": 5, - "mean_share": 0.417149, + "mean_share": 0.304001, "layers": { "0": { - "share": 0.448954, + "share": 0.378404, "neurons": [ - {"unit": "neuron/L0n22", "index": 22, "pole": "+", "coeff": 1.946504, "label": null}, - {"unit": "neuron/L0n77", "index": 77, "pole": "-", "coeff": -1.698037, "label": null}, - {"unit": "neuron/L0n4", "index": 4, "pole": "-", "coeff": -1.634036, "label": null}, - {"unit": "neuron/L0n63", "index": 63, "pole": "+", "coeff": 1.616153, "label": null}, - {"unit": "neuron/L0n5", "index": 5, "pole": "+", "coeff": 1.182781, "label": null} + {"unit": "neuron/L0n35", "index": 35, "pole": "-", "coeff": -0.028839, "label": null}, + {"unit": "neuron/L0n44", "index": 44, "pole": "-", "coeff": -0.023133, "label": null}, + {"unit": "neuron/L0n43", "index": 43, "pole": "-", "coeff": -0.016879, "label": null}, + {"unit": "neuron/L0n54", "index": 54, "pole": "+", "coeff": 0.013164, "label": null}, + {"unit": "neuron/L0n76", "index": 76, "pole": "+", "coeff": 0.011438, "label": null} ] }, "1": { - "share": 0.385344, + "share": 0.229598, "neurons": [ - {"unit": "neuron/L1n9", "index": 9, "pole": "-", "coeff": -1.583305, "label": null}, - {"unit": "neuron/L1n56", "index": 56, "pole": "+", "coeff": 1.302368, "label": null}, - {"unit": "neuron/L1n19", "index": 19, "pole": "-", "coeff": -0.921716, "label": null}, - {"unit": "neuron/L1n30", "index": 30, "pole": "-", "coeff": -0.913862, "label": null}, - {"unit": "neuron/L1n65", "index": 65, "pole": "+", "coeff": 0.861526, "label": null} + {"unit": "neuron/L1n22", "index": 22, "pole": "-", "coeff": -0.037168, "label": null}, + {"unit": "neuron/L1n6", "index": 6, "pole": "+", "coeff": 0.029029, "label": null}, + {"unit": "neuron/L1n94", "index": 94, "pole": "+", "coeff": 0.023376, "label": null}, + {"unit": "neuron/L1n34", "index": 34, "pole": "+", "coeff": 0.022863, "label": null}, + {"unit": "neuron/L1n32", "index": 32, "pole": "+", "coeff": 0.013715, "label": null} ] } }, @@ -1877,18 +1877,18 @@ }, "iterations": { "0": [ - {"unit": "neuron/L0n22", "score": 12.87685, "runner_up": 10.829328}, - {"unit": "neuron/L0n77", "score": 12.030784, "runner_up": 10.910479}, - {"unit": "neuron/L0n4", "score": 11.787075, "runner_up": 9.859676}, - {"unit": "neuron/L0n63", "score": 11.040162, "runner_up": 8.4532385}, - {"unit": "neuron/L0n5", "score": 9.630395, "runner_up": 8.6707535} + {"unit": "neuron/L0n35", "score": 0.14256957, "runner_up": 0.119649895}, + {"unit": "neuron/L0n44", "score": 0.112581946, "runner_up": 0.09573939}, + {"unit": "neuron/L0n54", "score": 0.09958621, "runner_up": 0.09031227}, + {"unit": "neuron/L0n43", "score": 0.09598276, "runner_up": 0.08627312}, + {"unit": "neuron/L0n76", "score": 0.088355854, "runner_up": 0.076890014} ], "1": [ - {"unit": "neuron/L1n65", "score": 6.1886377, "runner_up": 6.0886993}, - {"unit": "neuron/L1n9", "score": 5.2705913, "runner_up": 5.081437}, - {"unit": "neuron/L1n56", "score": 5.9833407, "runner_up": 4.9353824}, - {"unit": "neuron/L1n19", "score": 4.3877373, "runner_up": 4.0273714}, - {"unit": "neuron/L1n30", "score": 4.4504256, "runner_up": 4.0512834} + {"unit": "neuron/L1n6", "score": 0.14499165, "runner_up": 0.14218278}, + {"unit": "neuron/L1n22", "score": 0.12769541, "runner_up": 0.12092789}, + {"unit": "neuron/L1n32", "score": 0.13743372, "runner_up": 0.13366508}, + {"unit": "neuron/L1n94", "score": 0.12779148, "runner_up": 0.10878898}, + {"unit": "neuron/L1n34", "score": 0.100436985, "runner_up": 0.09716625} ] } } @@ -1928,6 +1928,13 @@ "groups": [ [2, 3] ] + }, + { + "path": "find[1].result.layers.1.neurons", + "key": ["unit"], + "groups": [ + [2, 3] + ] } ] } diff --git a/tests/lens/test_jlens_decompose.py b/tests/lens/test_jlens_decompose.py index 26cfa9b3a..5df6c1b94 100644 --- a/tests/lens/test_jlens_decompose.py +++ b/tests/lens/test_jlens_decompose.py @@ -196,27 +196,34 @@ def test_the_pursuit_runs_in_the_whitened_metric() -> None: """Regression: selection, the NNLS fit and the share used Euclidean residual-space products. Under an anisotropic covariance they are the Mahalanobis ones: equal to the Euclidean pursuit of the whitened target - against the whitened atoms, and different from the plain one.""" + (``Σ^{-1/2}t``, a vector) against the dual-whitened atoms (``Σ^{1/2}u``, + token atoms are reads), and different from the plain one.""" jacobian, unembed = _dictionary() whitener = synthetic_whitener([0], _D) gen = torch.Generator().manual_seed(9) target = torch.randn(_D, generator=gen) dec = sparse_decompose(target, TokensOut(jacobian, unembed, whitener, 0), layer=0, k=4) - # By hand: whiten everything, then the identity-metric pursuit. - W = whitener.whiten(0, torch.eye(_D)) # rows of I W = W (symmetric) + # By hand: whiten the target as a vector and the atoms as reads, then + # the identity-metric pursuit. + W = whitener.whiten(0, torch.eye(_D)) # Σ^{-1/2} (symmetric) + W_dual = whitener.whiten_dual(0, torch.eye(_D)) # Σ^{+1/2} hand = sparse_decompose( - target @ W, TokensOut(jacobian @ W, unembed, _iso(), 0), layer=0, k=4, + target @ W, TokensOut(jacobian @ W_dual, unembed, _iso(), 0), layer=0, k=4, ) assert [v for v, _c in dec.atoms] == [v for v, _c in hand.atoms] assert dec.share == pytest.approx(hand.share, rel=1e-4) plain = sparse_decompose(target, TokensOut(jacobian, unembed, _iso(), 0), layer=0, k=4) assert dec.atoms != plain.atoms or abs(dec.share - plain.share) > 1e-3 - # The whitened coordinates' dot products are Mahalanobis. + # The whitened coordinates' dot products are Mahalanobis, and a read + # pairs with a vector exactly as before whitening. u, v = torch.randn(2, _D, generator=gen) assert float(whitener.whiten(0, u) @ whitener.whiten(0, v)) == pytest.approx( float(u @ whitener.apply_inv(0, v)), rel=1e-4, ) + assert float(whitener.whiten_dual(0, u) @ whitener.whiten(0, v)) == pytest.approx( + float(u @ v), rel=1e-4, + ) def test_an_uncovered_layer_is_a_whitener_error() -> None: @@ -225,6 +232,12 @@ def test_an_uncovered_layer_is_a_whitener_error() -> None: TokensOut(jacobian, unembed, _iso(layers=(0,)), 3) session = LensHarness() session.lens.fit(_PROMPTS) - name = session.lens.register_direction("g") + # A lens atom is a read; raising it to a steering direction needs Σ. + with pytest.raises(WhitenerError, match="needs a Mahalanobis whitener"): + session.lens.register_direction("g") + width = int(session.model.config.hidden_size) + session.registry.put_profile( + "local/v", {L: torch.ones(width) for L in range(len(session.layers))}, + ) with pytest.raises(WhitenerError, match="none could be built"): - session.lens.decompose(name, k=2) + session.lens.decompose("local/v", k=2) diff --git a/tests/lens/test_jlens_grammar.py b/tests/lens/test_jlens_grammar.py index 9eadecd2e..a3459cb94 100644 --- a/tests/lens/test_jlens_grammar.py +++ b/tests/lens/test_jlens_grammar.py @@ -172,8 +172,10 @@ def test_token_id_atom_steers_and_probes_the_vocab_id(make_tiny_session: Any) -> by_id = session.registry.ensure_profile_registered(key) expected = lens.token_direction(gid, get_unembedding(session.model)) assert set(by_id) == set(expected) + whitener = session.whitener for layer, vec in by_id.items(): - assert torch.allclose(vec, expected[layer]) + # The atom is the token's read raised to its steering vector, Σu. + assert torch.allclose(vec, whitener.apply(layer, expected[layer]), atol=1e-6) by_word = session.registry.ensure_profile_registered("jlens/g") for layer, vec in by_id.items(): assert torch.allclose(vec, by_word[layer]) @@ -187,6 +189,73 @@ def test_token_id_atom_steers_and_probes_the_vocab_id(make_tiny_session: Any) -> assert session._read_plane.resolve_gates().lens_keys == {f"jlens/#{gid}"} +def test_a_lens_atom_resolves_inside_generate_on_a_cold_session( + make_tiny_session: Any, +) -> None: + """Regression: raising a ``jlens/`` atom needs the whitener, and a scope + opened inside ``generate`` on a cold session refused to build it + (``ConcurrentExtractionError``). Scope opening now makes the neutral + baseline resident before resolving.""" + from drowse import SamplingConfig + + session = make_tiny_session(warm=False) # no whitener built yet + session.lens.fit(_TINY_PROMPTS) + result = session.generate( + "hi", steering="0.5 jlens/g", + sampling=SamplingConfig(max_tokens=4, seed=1), stateless=True, + ) + assert "jlens/g" in (result.first.applied_steering or "") + + +def test_ablating_a_lens_atom_zeroes_the_tokens_reading(make_tiny_session: Any) -> None: + """Regression: a ``jlens/`` atom is a read ``u``. Folded as if it were a + write, ``!jlens/g`` pinned the ``Σ⁻¹u`` reading instead of the token's own. + The atom is now raised to ``Σu``, so the ablation pins exactly ``u·h`` to + neutral's at every fitted layer and edits along ``Σu``.""" + from drowse.model.readout import get_unembedding + + session = make_tiny_session() + lens = session.lens.fit(_TINY_PROMPTS) + whitener = session.whitener + means = session.layer_means + gid = int(session.tokenizer.encode("g", add_special_tokens=False)[0]) + reads = lens.token_direction(gid, get_unembedding(session.model)) + seen: dict[int, list[torch.Tensor]] = {} + + def _hook(layer: int, prepend: bool) -> Any: + def hook(_module: Any, _inputs: Any, output: Any) -> None: + hidden = output[0] if isinstance(output, tuple) else output + row = hidden[0].detach().float().clone() + if prepend: + seen[layer] = [row] + else: + seen[layer].append(row) + return hook + + ids = session.tokenizer("a line of text", return_tensors="pt").input_ids + with session.steering("!jlens/g"): + handles = [ + module.register_forward_hook(_hook(layer, prepend), prepend=prepend) + for layer, module in enumerate(session.layers) + for prepend in (True, False) + ] + try: + with torch.inference_mode(): + session.model(ids) + finally: + for handle in handles: + handle.remove() + for layer, u in reads.items(): + before, after = seen[layer] + u = u.float().cpu() + neutral = float(means[layer].float().cpu() @ u) + assert torch.allclose(after @ u, torch.full((after.shape[0],), neutral), atol=1e-4) + raised = whitener.apply(layer, u) + edit = after - before + along = ((edit @ raised) / (raised @ raised)).unsqueeze(-1) * raised + assert torch.allclose(edit, along, atol=1e-4) + + def test_token_id_atom_rejects_ids_outside_the_vocab(make_tiny_session: Any) -> None: from drowse.lens.jlens import InvalidTokenIdError, resolve_token_atom from drowse.model.readout import get_unembedding diff --git a/tests/lens/test_lens_runtime.py b/tests/lens/test_lens_runtime.py index ff09668ac..18afac930 100644 --- a/tests/lens/test_lens_runtime.py +++ b/tests/lens/test_lens_runtime.py @@ -36,6 +36,7 @@ from drowse.model.fingerprint import loaded_model_fingerprint from drowse.readout.planner import ReadDemand from tests.support.lens import LENS_PROMPTS as _PROMPTS +from tests.support.whitener import synthetic_whitener from tests.support.lens import TOY_MODEL_ID as _MODEL_ID from tests.support.lens import FakeCapture, LensHarness from tests.support.replay import ReplayRig @@ -102,6 +103,7 @@ def test_register_direction_and_eviction_report_changes() -> None: and tells the session (``on_change``) whenever they or the resident lens change; eviction drops the directions.""" s = LensHarness() + s.whitener = synthetic_whitener(range(len(s.layers)), int(s.model.config.hidden_size)) s.lens.fit(_PROMPTS) s.lens.probes["jlens/b"] = {"word": "b", "token_id": 2, "layers": [0]} s.changes.clear() @@ -892,6 +894,7 @@ def test_jlens_readout_rejects_unfitted_layer() -> None: def test_register_jlens_direction_registers_profile() -> None: s = LensHarness() + s.whitener = synthetic_whitener(range(len(s.layers)), int(s.model.config.hidden_size)) lens = s.lens.fit(_PROMPTS) seen_layers: list[list[int] | None] = [] real_token_direction = lens.token_direction @@ -915,8 +918,9 @@ def _spy_token_direction( expected = lens.token_direction( s.tokenizer.encode("g")[0], s.model.lm_head.weight, ) + # The profile is the read raised to its steering vector, Σu. for layer, vec in dirs.items(): - assert torch.allclose(vec, expected[layer]) + assert torch.allclose(vec, s.whitener.apply(layer, expected[layer]), atol=1e-6) # idempotent assert s.lens.register_direction("g") == name diff --git a/tests/lens/test_slens.py b/tests/lens/test_slens.py index a3945e061..516626e77 100644 --- a/tests/lens/test_slens.py +++ b/tests/lens/test_slens.py @@ -81,8 +81,11 @@ def test_slens_atom_is_the_footprint_and_steers(make_tiny_session: Any) -> None: a = _token(session, "a") profile = session.registry.ensure_profile_registered("slens/a") assert sorted(profile) == list(range(len(session.layers))) + whitener = session.whitener for layer, vector in profile.items(): - expected = lens.matrix(layer, "out") @ _centred(session, a) + # The footprint is a read; the atom is its raised steering vector. + footprint = lens.matrix(layer, "out") @ _centred(session, a) + expected = whitener.apply(layer, footprint) assert torch.allclose(vector.cpu(), expected, atol=1e-5) by_id = session.registry.ensure_profile_registered(f"slens/#{a}") assert all(torch.allclose(by_id[L], profile[L]) for L in profile) @@ -595,6 +598,7 @@ def _harness(session: Any) -> LensHarness: harness = LensHarness( model=session.model, tokenizer=session.tokenizer, layers=session.layers, model_id=session.model_id, neutral_means={"out": session.layer_means}, + whitener=session.whitener, ) d = int(session.model.get_input_embeddings().weight.shape[1]) gen = torch.Generator().manual_seed(11) @@ -833,7 +837,8 @@ def test_slens_atom_resolution_runs_in_the_exclusive_section(make_tiny_session: assert "slens/" in harness.exclusive_messages[0] entered = len(harness.exclusive_messages) profile = harness.profiles["slens/a"] - expected = lens.matrix(1, "out") @ _centred(session, _token(session, "a")) + footprint = lens.matrix(1, "out") @ _centred(session, _token(session, "a")) + expected = session.whitener.apply(1, footprint) assert torch.allclose(profile[1].cpu(), expected, atol=1e-5) # Idempotent: a registered atom does no model work. harness.lens.register_input_direction("a") From af00c77b0d866aa96fdffcdf02e00c04e644ae7e Mon Sep 17 00:00:00 2001 From: a9lim Date: Tue, 10 Nov 2026 15:09:07 -0500 Subject: [PATCH 3/4] =?UTF-8?q?Re-calibrate=20the=20steering=20gains=20for?= =?UTF-8?q?=20typed=20frames:=20affine=2016=20=E2=86=92=208,=20curved=20al?= =?UTF-8?q?ong=204=20=E2=86=92=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Typed frames write along δ, which moves a concept's reading furthest per whitened unit and disrupts more per unit, and curved surfaces now pass through the true centroids rather than their projections onto the covector span. Both gains were re-fit to keep the documented α bands by matching the old code's neutral-text NLL cost (teacher-forced): - affine: six bipolar concepts on SmolLM2-360M, gemma-3-4b, Llama-3.1-8B and gemma-4-12b at old α ∈ {0.25, 0.5, 1}; equal-cost α was 0.47–0.48× the old one, stable across α (per model 0.44–0.55), so 16 → 8. At matched cost the δ write moves pole preference more for most concepts. - curved: spectral emotions%{happy,angry,calm} on SmolLM2-360M and gemma-4-12b; equal-cost along 0.35–0.80× (geo-mean ~0.55), so 4 → 2. - jlens atoms (no per-term gain): on gemma-3-4b the old α ≈ 0.3 sweet spot maps to α ≈ 0.1; the note says so. The lowering goldens regenerate (only their gain-dependent fields), with regenerators for the rank-one and composed lowerings added to the parity module; the units goldens and the term-layers golden's curved groups follow. --- ARCHITECTURE.md | 4 +- drowse/lens/AGENTS.md | 12 ++- drowse/steering/AGENTS.md | 6 +- drowse/steering/hooks.py | 44 +++++--- tests/AGENTS.md | 2 +- tests/browser/test_browser_parity.py | 96 +++++++++++++---- .../browser/affine-composed-lowering-v1.json | 24 ++--- .../browser/affine-rank-one-lowering-v1.json | 4 +- .../browser/neuron-push-gemma3-v1.json | 8 +- .../browser/neuron-push-qwen3-v1.json | 8 +- tests/fixtures/browser/slens-gemma3-v1.json | 8 +- tests/fixtures/browser/slens-qwen3-v1.json | 8 +- .../browser/steering-term-layers-v1.json | 6 +- .../browser/token-anatomy-gemma3-v1.json | 82 +++++++------- .../browser/token-anatomy-qwen3-v1.json | 100 +++++++++--------- .../browser/unit-ablation-gemma3-v1.json | 20 ++-- .../browser/unit-ablation-qwen3-v1.json | 24 ++--- tests/model/test_model_numerics.py | 6 +- 18 files changed, 268 insertions(+), 194 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 37b8c3c48..e7b92c130 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1098,8 +1098,8 @@ executable statement of why a boundary is strict. - **Per-target coherence.** Whitened-unit targets unify push *strength* across targets, but not *coherence*: a hard persona such as `hacker` shatters at roughly half the effective gain a robust concept tolerates (about 2×). - `_SUBSPACE_GAIN = 16.0` is the coherence-first compromise and is tagged a - prototype; tune α down per target. + `_SUBSPACE_GAIN` (8.0 since fit policy 2) is the coherence-first + compromise; tune α down per target. - **Low-α drift.** A steering trajectory can pass through neighboring attractor basins at low displacement (`personas%hacker` surfacing a cyber-security cluster before locking into the persona). That is signal about the model's diff --git a/drowse/lens/AGENTS.md b/drowse/lens/AGENTS.md index d62f2bd71..ec9edf918 100644 --- a/drowse/lens/AGENTS.md +++ b/drowse/lens/AGENTS.md @@ -577,13 +577,15 @@ the per-layer softmax probability `p_l(v)`. reading furthest per unit of Mahalanobis displacement, and folded it reads with `Σ⁻¹Σu = u` again, so `!jlens/` zeroes exactly the token's reading (LEACE). On real models `Σu` is mostly `u` restricted to the - neutral activations' span (cosine about 0.15 with `u`), so the push - calibration below predates fit policy 2. A word must be one token: the leading-space piece is tried first, + neutral activations' span (cosine about 0.15 with `u`). A word must be one token: the leading-space piece is tried first, and the match must survive a decode round trip (else `MultiTokenWordError` lists the pieces). `#` is bounds-checked against the unembedding - (`InvalidTokenIdError`). Lens atoms run hot. On gemma-3-4b α ≈ 0.3 was the - coherent sweet spot and α ≥ 0.5 over-steered into repetition, because the - atom is one sharp token direction rather than a distributed contrast. + (`InvalidTokenIdError`). Lens atoms run hot, because the atom is one sharp + token direction rather than a distributed contrast. On gemma-3-4b the + pre-policy-2 atom was coherent at α ≈ 0.3 and over-steered from 0.5; the + raised atom at the current gain reaches that α ≈ 0.3 neutral-text cost at + α ≈ 0.08–0.23 (median about 0.1) while moving the token's log-probability as + much or more, so start near α ≈ 0.1. - **`slens/` atom.** `slens/` or `slens/#` resolves through the registry's `slens` resolver into `register_input_direction`: the footprint `K_l ẽ_v` at the S lens's `out` site on every layer it holds (steering diff --git a/drowse/steering/AGENTS.md b/drowse/steering/AGENTS.md index 3de19d82b..1ab329f8d 100644 --- a/drowse/steering/AGENTS.md +++ b/drowse/steering/AGENTS.md @@ -406,15 +406,15 @@ bounded by the whitened-unit target. | Constant | Value | Applies as | Calibration | |---|---|---|---| -| `_SUBSPACE_GAIN` | 16.0 | affine: `eff_along_L = share_L · 16`, α already folded into the target | gemma-4-12b α sweep over `formal.casual%formal`, `personas%caveman`, `personas%hacker`: dead → expressive at `16·α ≈ 7–8` for every target, coherence ceilings about 2× apart (hacker ≈ 12, caveman ≈ 17, formal > 22). Coherence-first: α ≈ 0.5 lands ≈ 8, α ≈ 1.0 is the strong / over-steer zone. Prototype. | -| `_MANIFOLD_ALONG_GAIN` | 4.0 | curved: `eff_along_L = along · share_L · 4`; periodic `BoxDomain`: `min(1, along · 4)` on every layer | stateless gemma-4-12b `months_loop%january` sweep: `along = 1.0` is the vivid coherent sweet spot. `eff_along = 1` lands on the node; `norm_cap = 3·‖h‖` bounds overshoot. | +| `_SUBSPACE_GAIN` | 8.0 | affine: `eff_along_L = share_L · 8`, α already folded into the target | First set at 16 on a gemma-4-12b α sweep over `formal.casual%formal`, `personas%caveman`, `personas%hacker` with covector writes: dead → expressive at `16·α ≈ 7–8`, coherence ceilings about 2× apart; α ≈ 0.5 expressive, α ≈ 1.0 strong / over-steer. Typed frames write along `δ`, which disrupts more per whitened unit, so the gain was re-fit to keep those α bands: the new α matching the old code's neutral-text NLL cost at α ∈ {0.25, 0.5, 1} was 0.47–0.48× the old one (six bipolar concepts on SmolLM2-360M, gemma-3-4b, Llama-3.1-8B, gemma-4-12b; per model 0.44–0.55). At matched cost the `δ` write moves pole preference more for most concepts. | +| `_MANIFOLD_ALONG_GAIN` | 2.0 | curved: `eff_along_L = along · share_L · 2`; periodic `BoxDomain`: `min(1, along · 2)` on every layer | First set at 4 on a stateless gemma-4-12b `months_loop%january` sweep (`along = 1.0` vivid and coherent), when curved surfaces passed through the centroids' projections onto the covector span. They now pass through the centroids, so the same fraction moves 2–3× further; equal-cost `along` on spectral `emotions` (SmolLM2-360M, gemma-4-12b) was 0.35–0.80× the old one, geo-mean about 0.55, hence 2. `eff_along = 1` lands on the node; `norm_cap = 3·‖h‖` bounds overshoot. | | `_MANIFOLD_ONTO_GAIN` | 0.5 | curved: `eff_onto_L = min(1, onto · share_L · 0.5)` | gemma-4-12b `emotions%dominant` sweep at along 0.3: onto ≈ 0.5 sweet spot, 1.0 strong but coherent. Too much `onto` erases per-token variation and loops. | Curved `along` and `onto` are fractions: each caps at 1 before gain, and a negative value raises `SteeringCompositionError` (422) in `add_manifold` because a curved position has no opposite. Periodic fits drop share weighting because share × gain would send some layers past the node and each would wrap -to a different one; consequently every `along ≥ 0.25` lands all layers on the +to a different one; consequently every `along ≥ 0.5` lands all layers on the node. `fit_mode=auto` can resolve flat on one model and curved on another, so the same negative `%` coefficient pushes away on one and raises on the other. Recommended affine α is about 0.5, toward 1.0 for stronger expression. diff --git a/drowse/steering/hooks.py b/drowse/steering/hooks.py index 65cbef6a0..73a206086 100644 --- a/drowse/steering/hooks.py +++ b/drowse/steering/hooks.py @@ -63,27 +63,39 @@ def _canonical_trigger(trigger: Trigger) -> Trigger: # (periodic ``BoxDomain``: unweighted, clamped to [0, 1]) # ``onto`` ``eff_onto_L = clamp(onto · share_L · _MANIFOLD_ONTO_GAIN, 0, 1)`` -# Affine ``along`` gain (prototype). ``synthesize_subspace`` emits a -# whitened-unit target per push term, so the average per-layer whitened push is -# ``GAIN·α`` for every target. Live-calibrated on a gemma-4-12b α-sweep -# (``formal.casual%formal``, ``personas%caveman``, ``personas%hacker``): the -# dead→expressive transition sits at ``E = GAIN·α ≈ 7-8`` for every target, -# but the coherence ceiling varies ~2× (hacker breaks at ``E ≈ 12``, caveman -# ``≈ 17``, formal past ``22``) — the per-target coherence variance a scalar -# gain cannot unify. Coherence-first: recommended ``α ≈ 0.5`` lands at -# ``E ≈ 8``, so ``GAIN = 16``; ``α ≈ 1.0`` is the strong / over-steered zone. -_SUBSPACE_GAIN = 16.0 +# Affine ``along`` gain. ``synthesize_subspace`` emits a whitened-unit target +# per push term, so the average per-layer whitened push is ``GAIN·α`` for every +# target. First live-calibrated at 16 on a gemma-4-12b α-sweep +# (``formal.casual%formal``, ``personas%caveman``, ``personas%hacker``) when +# frames wrote along the LDA covector ``Σ⁻¹δ``: dead→expressive at +# ``16·α ≈ 7-8``, coherence ceilings ~2× apart, so ``α ≈ 0.5`` expressive and +# ``α ≈ 1.0`` strong / over-steered. Typed frames write along ``δ``, which moves +# the concept's reading furthest per unit of Mahalanobis displacement and so +# disrupts more per unit: re-calibrated to keep those α bands by matching the +# neutral-text NLL cost of the old code at α ∈ {0.25, 0.5, 1} (six bipolar +# concepts on SmolLM2-360M, gemma-3-4b, Llama-3.1-8B and gemma-4-12b, +# teacher-forced). The new α with equal cost was 0.47–0.48× the old one, +# stable across α (per model 0.44–0.55, gemma-4-12b the highest), hence 8. At +# matched cost the ``δ`` write buys more pole preference for most concepts. +_SUBSPACE_GAIN = 8.0 # Curved ``along`` gain. The curved target is raw node coordinates and the # kernel translates the foot by ``eff_along·(target − origin)``, so # ``eff_along`` is a fraction of the way to the node (``1.0`` lands on it); # ``norm_cap = 3·‖h‖`` bounds off-domain RBF extrapolation past it. -# Live-calibrated on a stateless gemma-4-12b ``months_loop%january`` sweep: -# ``along = 1.0`` at gain 4 lands the vivid coherent sweet spot. Periodic -# ``BoxDomain`` fits drop share-weighting and clamp ``eff_along`` to [0, 1] -# per layer — share ∈ [0.19, 1.47] × 4 would send layers past the node, each -# wrapping to a different one. -_MANIFOLD_ALONG_GAIN = 4.0 +# First live-calibrated at 4 on a stateless gemma-4-12b ``months_loop%january`` +# sweep (``along = 1.0`` the vivid coherent sweet spot) when frames read and +# wrote along covectors: a curved surface then passed through the centroids' +# projections onto the covector span, shorter than the centroids themselves. +# Typed frames pass through the true centroids, so the same fraction moves +# 2–3× further. Re-calibrated to 2 by matching the old code's neutral-text +# NLL cost on spectral ``emotions%{happy,angry,calm}`` (SmolLM2-360M, +# gemma-4-12b): equal-cost ``along`` was 0.35–0.80× the old one, geo-mean +# ~0.55, the same halving as the affine gain. Periodic ``BoxDomain`` fits +# drop share-weighting and clamp ``eff_along`` to [0, 1] per layer — share ∈ +# [0.19, 1.47] × gain would send layers past the node, each wrapping to a +# different one. +_MANIFOLD_ALONG_GAIN = 2.0 # ``onto`` gain (curved off-surface collapse only). The off-surface residual # carries per-token variation, so too much ``onto`` erases it and degenerates diff --git a/tests/AGENTS.md b/tests/AGENTS.md index c2e844773..8aa790322 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -232,7 +232,7 @@ files from it, so their paths are part of its interface: model-free composer: each term's key, fitted layers, mean-1 share and clause selection, the refusals composition answers in band, and a curved `%` term's hook share (`_manifold_layer_shares`, mean 1 over the clause's layers where the response's share is mean 1 - over the fit) with the lowered plan's curved groups (each layer's `along · share · 4` and + over the fit) with the lowered plan's curved groups (each layer's `along · share · 2` and `min(1, onto · share · 0.5)`, so the gains are pinned too). Its inputs (whiteners, profile directions, a flat and a curved manifold, the cases' expressions) stay; after a deliberate change regenerate the outputs with `PYTHONPATH=. python -m tests.browser.test_browser_parity`. diff --git a/tests/browser/test_browser_parity.py b/tests/browser/test_browser_parity.py index a13fdb074..18379e307 100644 --- a/tests/browser/test_browser_parity.py +++ b/tests/browser/test_browser_parity.py @@ -73,7 +73,12 @@ from drowse.store import selectors from drowse.units.instrument import UnitsInstrument from drowse.steering.grammar import SteeringExprError, parse_expr, referenced_selectors -from drowse.steering.hooks import CurvedGroup, _lower_affine_subspaces +from drowse.steering.hooks import ( + _MANIFOLD_ALONG_GAIN, + _MANIFOLD_ONTO_GAIN, + CurvedGroup, + _lower_affine_subspaces, +) from drowse.steering.triggers import TriggerContext from tests.support.composer import SteeringRig from tests.support.manifolds import circle_centroids, stamp_current_geometry @@ -96,8 +101,8 @@ ).read_text() ) -@pytest.mark.parametrize("case", COMPOSED_LOWERING["cases"], ids=lambda case: case["name"]) -def test_browser_composed_affine_lowering_matches_python(case: dict[str, object]) -> None: +def _composed_lowering_layers(case: dict[str, Any]) -> list[dict[str, Any]]: + """A composed-lowering case's per-layer outputs, from its inputs.""" whitener, means = _whitener() pushes = [] for term in cast(list[dict[str, Any]], case["terms"]): @@ -118,18 +123,34 @@ def test_browser_composed_affine_lowering_matches_python(case: dict[str, object] synthesized = synthesize_subspace(pushes, [], means, whitener=whitener) lowered = _lower_affine_subspaces(synthesized) + rows = [] for expected in cast(list[dict[str, Any]], case["expectedLayers"]): layer = expected["layer"] actual = lowered[layer] world_target = actual.target @ actual.subspace.basis target = float(world_target.norm()) - basis = world_target / target - delta = actual.eff_along * world_target - assert basis.tolist() == pytest.approx(expected["basis"], abs=1e-6) - assert actual.subspace.mean.tolist() == pytest.approx(expected["neutral"], abs=1e-7) - assert target == pytest.approx(expected["target"], abs=1e-6) - assert actual.eff_along == pytest.approx(expected["along"], abs=1e-6) - assert delta.tolist() == pytest.approx(expected["delta"], abs=1e-5) + rows.append({ + "layer": layer, + "basis": (world_target / target).tolist(), + "neutral": actual.subspace.mean.tolist(), + "target": target, + "along": actual.eff_along, + "delta": (actual.eff_along * world_target).tolist(), + }) + return rows + + +@pytest.mark.parametrize("case", COMPOSED_LOWERING["cases"], ids=lambda case: case["name"]) +def test_browser_composed_affine_lowering_matches_python(case: dict[str, Any]) -> None: + for expected, actual in zip( + case["expectedLayers"], _composed_lowering_layers(case), strict=True, + ): + assert actual["layer"] == expected["layer"] + assert actual["basis"] == pytest.approx(expected["basis"], abs=1e-6) + assert actual["neutral"] == pytest.approx(expected["neutral"], abs=1e-7) + assert actual["target"] == pytest.approx(expected["target"], abs=1e-6) + assert actual["along"] == pytest.approx(expected["along"], abs=1e-6) + assert actual["delta"] == pytest.approx(expected["delta"], abs=1e-5) def _whitener() -> tuple[LayerWhitener, dict[int, torch.Tensor]]: return _ppca_whitener(COMPOSED_LOWERING["whiteners"]) @@ -244,8 +265,9 @@ def test_browser_rank_one_ablation_matches_python() -> None: ).read_text() ) -def test_browser_affine_lowering_fixture_matches_python() -> None: - layers = AFFINE_LOWERING["layers"] +def _rank_one_lowering_layers(fixture: dict[str, Any]) -> list[dict[str, Any]]: + """The rank-one lowering golden's per-layer target and budget, from its inputs.""" + layers = fixture["layers"] basis = { row["layer"]: torch.tensor([row["basis"]], dtype=torch.float32) for row in layers @@ -262,18 +284,27 @@ def test_browser_affine_lowering_fixture_matches_python() -> None: } whitener = isotropic_whitener(means, len(layers[0]["basis"])) synthesized = synthesize_subspace( - [(basis, coordinates, AFFINE_LOWERING["coefficient"])], + [(basis, coordinates, fixture["coefficient"])], [], means, whitener=whitener, ) lowered = _lower_affine_subspaces(synthesized) - + out = [] for row in layers: layer = lowered[row["layer"]] - assert layer.target.tolist() == pytest.approx([row["expectedTarget"]]) - assert layer.eff_along == pytest.approx(row["expectedAlong"]) assert layer.kappa.tolist() == [0.0] + out.append({**row, "expectedTarget": float(layer.target[0]), + "expectedAlong": layer.eff_along}) + return out + + +def test_browser_affine_lowering_fixture_matches_python() -> None: + for expected, actual in zip( + AFFINE_LOWERING["layers"], _rank_one_lowering_layers(AFFINE_LOWERING), strict=True, + ): + assert actual["expectedTarget"] == pytest.approx(expected["expectedTarget"]) + assert actual["expectedAlong"] == pytest.approx(expected["expectedAlong"]) # --------------------------------------------------------------------------- @@ -336,7 +367,8 @@ def _affine_fisher_expected(fixture: dict[str, Any]) -> dict[str, Any]: def regenerate_affine_goldens() -> None: - """Recompute the Fisher-fit and ablation-lowering goldens from their inputs.""" + """Recompute the affine goldens' outputs from their inputs: the Fisher fit, + the ablation, rank-one and composed lowerings.""" # Only the ``expected`` block (the last key) is recomputed; the inputs # above it keep their row-per-sample layout. text = AFFINE_FISHER.read_text() @@ -349,6 +381,27 @@ def regenerate_affine_goldens() -> None: ablation = json.loads(path.read_text()) ablation.update(schemaVersion=2, layers=_ablation_lowering_layers(ablation)) path.write_text(_golden_json(ablation) + "\n") + path = GOLDENS / "affine-rank-one-lowering-v1.json" + rank_one = json.loads(path.read_text()) + rank_one["layers"] = _rank_one_lowering_layers(rank_one) + path.write_text(_golden_json(rank_one) + "\n") + # The composed golden keeps its own layout, and its gain-free fields carry + # last-digit noise across platforms: patch only ``along`` and ``delta`` in + # place, in file order. + path = GOLDENS / "affine-composed-lowering-v1.json" + text = path.read_text() + cursor = 0 + for case in json.loads(text)["cases"]: + for expected, actual in zip( + case["expectedLayers"], _composed_lowering_layers(case), strict=True, + ): + for key in ("along", "delta"): + old = f'"{key}": {json.dumps(expected[key])}' + at = text.index(old, cursor) + new = f'"{key}": {json.dumps(actual[key])}' + text = text[:at] + new + text[at + len(old):] + cursor = at + len(new) + path.write_text(text) def test_browser_affine_fisher_fixture_matches_python_source_of_truth() -> None: @@ -749,8 +802,13 @@ def test_browser_term_layers_fixture_matches_python() -> None: assert responses["0.5 z"]["terms"][0]["share"][2] == 0.0 scoped = next(case for case in fixture["cases"] if case["expression"] == "0.3,0.5 mood%n1{0}") assert scoped["curvedShares"] == [{"manifold": "mood", "layers": [0], "share": [1.0]}] - # The kernel's coefficients: along · share · 4 and min(1, onto · share · 0.5) per layer. - assert scoped["curvedGroups"] == [{"layer": 0, "along": pytest.approx(1.2), "onto": pytest.approx(0.25)}] + # The kernel's coefficients: along · share · _MANIFOLD_ALONG_GAIN and + # min(1, onto · share · _MANIFOLD_ONTO_GAIN) per layer (along 0.3, onto 0.5, share 1). + assert scoped["curvedGroups"] == [{ + "layer": 0, + "along": pytest.approx(0.3 * _MANIFOLD_ALONG_GAIN), + "onto": pytest.approx(0.5 * _MANIFOLD_ONTO_GAIN), + }] assert scoped["response"]["terms"][0]["layers"] == [0] assert len(scoped["response"]["terms"][0]["share"]) == 2 assert [t["key"] for t in responses["0.2 a{1} + 0.3 a{1} + 0.25 a + 0.5 a{2}@response"]["terms"]] == ["a{1}", "a", "a{2}"] diff --git a/tests/fixtures/browser/affine-composed-lowering-v1.json b/tests/fixtures/browser/affine-composed-lowering-v1.json index 0d5da8ea4..5936df41b 100644 --- a/tests/fixtures/browser/affine-composed-lowering-v1.json +++ b/tests/fixtures/browser/affine-composed-lowering-v1.json @@ -68,16 +68,16 @@ "basis": [-0.9834892749786377, 0.18096616864204407], "neutral": [0.5, -0.5], "target": 0.670113205909729, - "along": 17.58540979499561, - "delta": [-11.589649200439453, 2.1325442790985107] + "along": 8.792704922915652, + "delta": [-5.794825077056885, 1.0662721395492554] }, { "layer": 1, "basis": [0.20601047575473785, -0.9785497784614563], "neutral": [1.5, -1.5], "target": 0.8255664706230164, - "along": 14.414590205004393, - "delta": [2.451566219329834, -11.644939422607422] + "along": 7.207295077084348, + "delta": [1.2257832288742065, -5.822469711303711] } ] }, @@ -93,16 +93,16 @@ "basis": [0.6000000238418579, 0.7999998927116394], "neutral": [0.5, -0.5], "target": 0.3031695783138275, - "along": 11.415590478789037, - "delta": [2.0765159130096436, 2.7686874866485596] + "along": 5.707795120021595, + "delta": [1.0382579565048218, 1.3843437433242798] }, { "layer": 1, "basis": [0.800000011920929, 0.5999999642372131], "neutral": [1.5, -1.5], "target": 0.4251883625984192, - "along": 20.584409521210965, - "delta": [7.001801013946533, 5.251350402832031] + "along": 10.292204879978405, + "delta": [3.5009005069732666, 2.6256749629974365] } ] }, @@ -118,16 +118,16 @@ "basis": [0.9965457320213318, -0.08304551988840103], "neutral": [0.5, -0.5], "target": 0.7301289439201355, - "along": 12.35397581455201, - "delta": [8.988838195800781, -0.7490702271461487] + "along": 6.176987939113005, + "delta": [4.494418621063232, -0.37453505396842957] }, { "layer": 1, "basis": [-0.10653311759233475, 0.9943091869354248], "neutral": [1.5, -1.5], "target": 0.9051050543785095, - "along": 19.646024185447992, - "delta": [-1.8943417072296143, 17.680522918701172] + "along": 9.823012060886995, + "delta": [-0.9471707344055176, 8.840261459350586] } ] } diff --git a/tests/fixtures/browser/affine-rank-one-lowering-v1.json b/tests/fixtures/browser/affine-rank-one-lowering-v1.json index 2b6fc20ad..bc012c793 100644 --- a/tests/fixtures/browser/affine-rank-one-lowering-v1.json +++ b/tests/fixtures/browser/affine-rank-one-lowering-v1.json @@ -11,7 +11,7 @@ "selectedNode": 1, "mahalanobisShare": 1.4142135623730951, "expectedTarget": 0.5, - "expectedAlong": 10.666666666666666 + "expectedAlong": 5.333333333333333 }, { "layer": 1, @@ -21,7 +21,7 @@ "selectedNode": 1, "mahalanobisShare": 2.8284271247461903, "expectedTarget": 0.5, - "expectedAlong": 21.333333333333332 + "expectedAlong": 10.666666666666666 } ] } diff --git a/tests/fixtures/browser/neuron-push-gemma3-v1.json b/tests/fixtures/browser/neuron-push-gemma3-v1.json index f45d6d383..d07308559 100644 --- a/tests/fixtures/browser/neuron-push-gemma3-v1.json +++ b/tests/fixtures/browser/neuron-push-gemma3-v1.json @@ -18,7 +18,7 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 2, "basis": [0.2236881, 0.08795369, -0.10927382, -0.123490304, -0.15959172, -0.043285843, 0.11696857, -0.14968209, -0.11886181, -0.16780777, -0.03458214, 0.062257875, 0.108486466, -0.072372526, 0.046958487, -0.02205911, 0.1187834, -0.037909914, -0.041347727, -0.053018194, 0.04924895, -0.06410942, -0.038753472, -0.10165104, -0.069114245, 0.0173074, 0.09497102, 0.2887968, -0.2390806, -0.22403105, 0.11693123, -0.107954815, 0.10139461, -0.029429145, 0.06597792, -0.09831821, 0.26354802, 0.17102952, -0.20910043, 0.11566122, -0.2601988, 0.13241605, 0.10998681, -0.059746187, 0.12110625, 0.20755358, 0.0, 0.11773188, -0.039305165, 0.029629271, 0.08464488, -0.030990168, 0.118906155, -0.13738845, -0.11170822, 0.12985216, 0.06918535, -0.018799696, -0.108074054, 0.12691718, -0.09015541, 0.096466176, 0.13689293, -0.14298978], "neutral": [1.5604588, -2.1175702, 0.14606446, 0.7385114, 0.35017264, 2.8522646, 1.4717126, -4.8974986, -4.089805, -0.76257277, 1.5562946, -2.5270953, -2.3369787, -0.34086064, 0.43853664, -1.8613778, -4.776157, -5.077354, -1.767068, -0.83124685, 2.1675637, -3.947026, -1.7668724, 3.9983017, -1.1012617, 0.30404115, -2.3319027, 1.8102349, 5.8336906, -3.1748953, 0.41587326, 1.4522133, -4.975678, 3.4511287, 0.097035326, -1.7819252, 2.1127462, -2.3910875, -2.4991999, -1.598096, 0.84621066, -2.497753, -1.234034, -2.0303576, 1.1722668, 0.0033107798, -2.7347724, 1.9015208, -0.12735252, 2.2576592, 1.1667862, -0.03853252, -0.9637408, 0.27681503, 1.951656, -3.7724102, 4.5014596, -0.75800496, 0.4131548, 3.9477253, -1.5466305, 1.8362722, 2.8683174, -2.190604], "target": 0.4576722, "along": 16.0, "delta": [1.6380132, 0.64406335, -0.80018544, -0.9042893, -1.1686511, -0.31697163, 0.8565322, -1.0960853, -0.87039596, -1.2288153, -0.25323656, 0.45589918, 0.7944198, -0.5299663, 0.3438655, -0.16153347, 0.8698218, -0.27760503, -0.3027793, -0.38823926, 0.360638, -0.46945763, -0.28378218, -0.7443657, -0.50610673, 0.12673786, 0.6954496, 2.1147883, -1.7507287, -1.6405245, 0.8562588, -0.7905267, 0.7424879, -0.21550243, 0.48314017, -0.7199602, 1.9298975, 1.2524073, -1.5311912, 0.8469588, -1.9053723, 0.9696504, 0.8054065, -0.4375067, 0.88683146, 1.5198641, 0.0, 0.8621217, -0.2878221, 0.21696791, 0.6198337, -0.22693342, 0.8707207, -1.006062, -0.81801194, 0.95087564, 0.5066274, -0.13766557, -0.79139984, 0.9293835, -0.660186, 0.7063982, 1.0024334, -1.0470792]} + {"layer": 2, "basis": [0.2236881, 0.08795369, -0.10927382, -0.12349032, -0.15959172, -0.043285843, 0.11696857, -0.14968209, -0.11886181, -0.16780777, -0.03458214, 0.06225788, 0.108486466, -0.07237252, 0.046958487, -0.02205911, 0.11878339, -0.037909914, -0.041347727, -0.053018194, 0.04924895, -0.06410942, -0.038753465, -0.10165105, -0.069114245, 0.0173074, 0.094971016, 0.28879675, -0.2390806, -0.22403105, 0.11693123, -0.107954815, 0.10139461, -0.029429145, 0.065977916, -0.09831821, 0.263548, 0.17102952, -0.20910043, 0.11566122, -0.2601988, 0.13241605, 0.10998681, -0.059746187, 0.12110625, 0.2075536, 0.0, 0.11773186, -0.039305158, 0.02962927, 0.08464488, -0.030990168, 0.118906155, -0.13738845, -0.11170822, 0.12985216, 0.06918535, -0.018799694, -0.10807406, 0.12691718, -0.09015541, 0.096466176, 0.13689291, -0.14298978], "neutral": [1.5604588, -2.1175702, 0.14606446, 0.7385114, 0.35017264, 2.8522646, 1.4717126, -4.8974986, -4.089805, -0.76257277, 1.5562946, -2.5270953, -2.3369787, -0.34086064, 0.43853664, -1.8613778, -4.776157, -5.077354, -1.767068, -0.83124685, 2.1675637, -3.947026, -1.7668724, 3.9983017, -1.1012617, 0.30404115, -2.3319027, 1.8102349, 5.8336906, -3.1748953, 0.41587326, 1.4522133, -4.975678, 3.4511287, 0.097035326, -1.7819252, 2.1127462, -2.3910875, -2.4991999, -1.598096, 0.84621066, -2.497753, -1.234034, -2.0303576, 1.1722668, 0.0033107798, -2.7347724, 1.9015208, -0.12735252, 2.2576592, 1.1667862, -0.03853252, -0.9637408, 0.27681503, 1.951656, -3.7724102, 4.5014596, -0.75800496, 0.4131548, 3.9477253, -1.5466305, 1.8362722, 2.8683174, -2.190604], "target": 0.4576722, "along": 8.0, "delta": [0.8190066, 0.32203168, -0.40009272, -0.45214468, -0.58432555, -0.15848581, 0.4282661, -0.54804265, -0.43519798, -0.61440766, -0.12661828, 0.2279496, 0.3972099, -0.26498312, 0.17193276, -0.08076674, 0.43491086, -0.13880251, -0.15138964, -0.19411963, 0.180319, -0.23472881, -0.14189108, -0.37218288, -0.25305337, 0.06336893, 0.34772477, 1.057394, -0.87536436, -0.82026225, 0.4281294, -0.39526334, 0.37124395, -0.10775121, 0.24157007, -0.3599801, 0.9649487, 0.62620366, -0.7655956, 0.4234794, -0.9526861, 0.48482516, 0.40270326, -0.21875335, 0.44341573, 0.7599321, 0.0, 0.43106082, -0.14391103, 0.10848395, 0.30991685, -0.11346671, 0.43536034, -0.503031, -0.40900597, 0.4754378, 0.2533137, -0.06883278, -0.39569995, 0.46469173, -0.330093, 0.3531991, 0.50121665, -0.5235396]} ] }, { @@ -27,7 +27,7 @@ "coefficient": -0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 2, "basis": [-0.2236881, -0.08795369, 0.10927382, 0.123490304, 0.15959172, 0.043285843, -0.11696857, 0.14968209, 0.11886181, 0.16780777, 0.03458214, -0.062257875, -0.108486466, 0.072372526, -0.046958487, 0.02205911, -0.1187834, 0.037909914, 0.041347727, 0.053018194, -0.04924895, 0.06410942, 0.038753472, 0.10165104, 0.069114245, -0.0173074, -0.09497102, -0.2887968, 0.2390806, 0.22403105, -0.11693123, 0.107954815, -0.10139461, 0.029429145, -0.06597792, 0.09831821, -0.26354802, -0.17102952, 0.20910043, -0.11566122, 0.2601988, -0.13241605, -0.10998681, 0.059746187, -0.12110625, -0.20755358, 0.0, -0.11773188, 0.039305165, -0.029629271, -0.08464488, 0.030990168, -0.118906155, 0.13738845, 0.11170822, -0.12985216, -0.06918535, 0.018799696, 0.108074054, -0.12691718, 0.09015541, -0.096466176, -0.13689293, 0.14298978], "neutral": [1.5604588, -2.1175702, 0.14606446, 0.7385114, 0.35017264, 2.8522646, 1.4717126, -4.8974986, -4.089805, -0.76257277, 1.5562946, -2.5270953, -2.3369787, -0.34086064, 0.43853664, -1.8613778, -4.776157, -5.077354, -1.767068, -0.83124685, 2.1675637, -3.947026, -1.7668724, 3.9983017, -1.1012617, 0.30404115, -2.3319027, 1.8102349, 5.8336906, -3.1748953, 0.41587326, 1.4522133, -4.975678, 3.4511287, 0.097035326, -1.7819252, 2.1127462, -2.3910875, -2.4991999, -1.598096, 0.84621066, -2.497753, -1.234034, -2.0303576, 1.1722668, 0.0033107798, -2.7347724, 1.9015208, -0.12735252, 2.2576592, 1.1667862, -0.03853252, -0.9637408, 0.27681503, 1.951656, -3.7724102, 4.5014596, -0.75800496, 0.4131548, 3.9477253, -1.5466305, 1.8362722, 2.8683174, -2.190604], "target": 0.4576722, "along": 16.0, "delta": [-1.6380132, -0.64406335, 0.80018544, 0.9042893, 1.1686511, 0.31697163, -0.8565322, 1.0960853, 0.87039596, 1.2288153, 0.25323656, -0.45589918, -0.7944198, 0.5299663, -0.3438655, 0.16153347, -0.8698218, 0.27760503, 0.3027793, 0.38823926, -0.360638, 0.46945763, 0.28378218, 0.7443657, 0.50610673, -0.12673786, -0.6954496, -2.1147883, 1.7507287, 1.6405245, -0.8562588, 0.7905267, -0.7424879, 0.21550243, -0.48314017, 0.7199602, -1.9298975, -1.2524073, 1.5311912, -0.8469588, 1.9053723, -0.9696504, -0.8054065, 0.4375067, -0.88683146, -1.5198641, 0.0, -0.8621217, 0.2878221, -0.21696791, -0.6198337, 0.22693342, -0.8707207, 1.006062, 0.81801194, -0.95087564, -0.5066274, 0.13766557, 0.79139984, -0.9293835, 0.660186, -0.7063982, -1.0024334, 1.0470792]} + {"layer": 2, "basis": [-0.2236881, -0.08795369, 0.10927382, 0.12349032, 0.15959172, 0.043285843, -0.11696857, 0.14968209, 0.11886181, 0.16780777, 0.03458214, -0.06225788, -0.108486466, 0.07237252, -0.046958487, 0.02205911, -0.11878339, 0.037909914, 0.041347727, 0.053018194, -0.04924895, 0.06410942, 0.038753465, 0.10165105, 0.069114245, -0.0173074, -0.094971016, -0.28879675, 0.2390806, 0.22403105, -0.11693123, 0.107954815, -0.10139461, 0.029429145, -0.065977916, 0.09831821, -0.263548, -0.17102952, 0.20910043, -0.11566122, 0.2601988, -0.13241605, -0.10998681, 0.059746187, -0.12110625, -0.2075536, 0.0, -0.11773186, 0.039305158, -0.02962927, -0.08464488, 0.030990168, -0.118906155, 0.13738845, 0.11170822, -0.12985216, -0.06918535, 0.018799694, 0.10807406, -0.12691718, 0.09015541, -0.096466176, -0.13689291, 0.14298978], "neutral": [1.5604588, -2.1175702, 0.14606446, 0.7385114, 0.35017264, 2.8522646, 1.4717126, -4.8974986, -4.089805, -0.76257277, 1.5562946, -2.5270953, -2.3369787, -0.34086064, 0.43853664, -1.8613778, -4.776157, -5.077354, -1.767068, -0.83124685, 2.1675637, -3.947026, -1.7668724, 3.9983017, -1.1012617, 0.30404115, -2.3319027, 1.8102349, 5.8336906, -3.1748953, 0.41587326, 1.4522133, -4.975678, 3.4511287, 0.097035326, -1.7819252, 2.1127462, -2.3910875, -2.4991999, -1.598096, 0.84621066, -2.497753, -1.234034, -2.0303576, 1.1722668, 0.0033107798, -2.7347724, 1.9015208, -0.12735252, 2.2576592, 1.1667862, -0.03853252, -0.9637408, 0.27681503, 1.951656, -3.7724102, 4.5014596, -0.75800496, 0.4131548, 3.9477253, -1.5466305, 1.8362722, 2.8683174, -2.190604], "target": 0.4576722, "along": 8.0, "delta": [-0.8190066, -0.32203168, 0.40009272, 0.45214468, 0.58432555, 0.15848581, -0.4282661, 0.54804265, 0.43519798, 0.61440766, 0.12661828, -0.2279496, -0.3972099, 0.26498312, -0.17193276, 0.08076674, -0.43491086, 0.13880251, 0.15138964, 0.19411963, -0.180319, 0.23472881, 0.14189108, 0.37218288, 0.25305337, -0.06336893, -0.34772477, -1.057394, 0.87536436, 0.82026225, -0.4281294, 0.39526334, -0.37124395, 0.10775121, -0.24157007, 0.3599801, -0.9649487, -0.62620366, 0.7655956, -0.4234794, 0.9526861, -0.48482516, -0.40270326, 0.21875335, -0.44341573, -0.7599321, 0.0, -0.43106082, 0.14391103, -0.10848395, -0.30991685, 0.11346671, -0.43536034, 0.503031, 0.40900597, -0.4754378, -0.2533137, 0.06883278, 0.39569995, -0.46469173, 0.330093, -0.3531991, -0.50121665, 0.5235396]} ] }, { @@ -36,7 +36,7 @@ "coefficient": 0.3, "trigger": {"prompt": false, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 2, "basis": [0.2236881, 0.08795369, -0.10927382, -0.123490304, -0.15959172, -0.043285843, 0.11696857, -0.14968209, -0.11886181, -0.16780777, -0.03458214, 0.062257875, 0.108486466, -0.072372526, 0.046958487, -0.02205911, 0.1187834, -0.037909914, -0.041347727, -0.053018194, 0.04924895, -0.06410942, -0.038753472, -0.10165104, -0.069114245, 0.0173074, 0.09497102, 0.2887968, -0.2390806, -0.22403105, 0.11693123, -0.107954815, 0.10139461, -0.029429145, 0.06597792, -0.09831821, 0.26354802, 0.17102952, -0.20910043, 0.11566122, -0.2601988, 0.13241605, 0.10998681, -0.059746187, 0.12110625, 0.20755358, 0.0, 0.11773188, -0.039305165, 0.029629271, 0.08464488, -0.030990168, 0.118906155, -0.13738845, -0.11170822, 0.12985216, 0.06918535, -0.018799696, -0.108074054, 0.12691718, -0.09015541, 0.096466176, 0.13689293, -0.14298978], "neutral": [1.5604588, -2.1175702, 0.14606446, 0.7385114, 0.35017264, 2.8522646, 1.4717126, -4.8974986, -4.089805, -0.76257277, 1.5562946, -2.5270953, -2.3369787, -0.34086064, 0.43853664, -1.8613778, -4.776157, -5.077354, -1.767068, -0.83124685, 2.1675637, -3.947026, -1.7668724, 3.9983017, -1.1012617, 0.30404115, -2.3319027, 1.8102349, 5.8336906, -3.1748953, 0.41587326, 1.4522133, -4.975678, 3.4511287, 0.097035326, -1.7819252, 2.1127462, -2.3910875, -2.4991999, -1.598096, 0.84621066, -2.497753, -1.234034, -2.0303576, 1.1722668, 0.0033107798, -2.7347724, 1.9015208, -0.12735252, 2.2576592, 1.1667862, -0.03853252, -0.9637408, 0.27681503, 1.951656, -3.7724102, 4.5014596, -0.75800496, 0.4131548, 3.9477253, -1.5466305, 1.8362722, 2.8683174, -2.190604], "target": 0.4576722, "along": 16.0, "delta": [1.6380132, 0.64406335, -0.80018544, -0.9042893, -1.1686511, -0.31697163, 0.8565322, -1.0960853, -0.87039596, -1.2288153, -0.25323656, 0.45589918, 0.7944198, -0.5299663, 0.3438655, -0.16153347, 0.8698218, -0.27760503, -0.3027793, -0.38823926, 0.360638, -0.46945763, -0.28378218, -0.7443657, -0.50610673, 0.12673786, 0.6954496, 2.1147883, -1.7507287, -1.6405245, 0.8562588, -0.7905267, 0.7424879, -0.21550243, 0.48314017, -0.7199602, 1.9298975, 1.2524073, -1.5311912, 0.8469588, -1.9053723, 0.9696504, 0.8054065, -0.4375067, 0.88683146, 1.5198641, 0.0, 0.8621217, -0.2878221, 0.21696791, 0.6198337, -0.22693342, 0.8707207, -1.006062, -0.81801194, 0.95087564, 0.5066274, -0.13766557, -0.79139984, 0.9293835, -0.660186, 0.7063982, 1.0024334, -1.0470792]} + {"layer": 2, "basis": [0.2236881, 0.08795369, -0.10927382, -0.12349032, -0.15959172, -0.043285843, 0.11696857, -0.14968209, -0.11886181, -0.16780777, -0.03458214, 0.06225788, 0.108486466, -0.07237252, 0.046958487, -0.02205911, 0.11878339, -0.037909914, -0.041347727, -0.053018194, 0.04924895, -0.06410942, -0.038753465, -0.10165105, -0.069114245, 0.0173074, 0.094971016, 0.28879675, -0.2390806, -0.22403105, 0.11693123, -0.107954815, 0.10139461, -0.029429145, 0.065977916, -0.09831821, 0.263548, 0.17102952, -0.20910043, 0.11566122, -0.2601988, 0.13241605, 0.10998681, -0.059746187, 0.12110625, 0.2075536, 0.0, 0.11773186, -0.039305158, 0.02962927, 0.08464488, -0.030990168, 0.118906155, -0.13738845, -0.11170822, 0.12985216, 0.06918535, -0.018799694, -0.10807406, 0.12691718, -0.09015541, 0.096466176, 0.13689291, -0.14298978], "neutral": [1.5604588, -2.1175702, 0.14606446, 0.7385114, 0.35017264, 2.8522646, 1.4717126, -4.8974986, -4.089805, -0.76257277, 1.5562946, -2.5270953, -2.3369787, -0.34086064, 0.43853664, -1.8613778, -4.776157, -5.077354, -1.767068, -0.83124685, 2.1675637, -3.947026, -1.7668724, 3.9983017, -1.1012617, 0.30404115, -2.3319027, 1.8102349, 5.8336906, -3.1748953, 0.41587326, 1.4522133, -4.975678, 3.4511287, 0.097035326, -1.7819252, 2.1127462, -2.3910875, -2.4991999, -1.598096, 0.84621066, -2.497753, -1.234034, -2.0303576, 1.1722668, 0.0033107798, -2.7347724, 1.9015208, -0.12735252, 2.2576592, 1.1667862, -0.03853252, -0.9637408, 0.27681503, 1.951656, -3.7724102, 4.5014596, -0.75800496, 0.4131548, 3.9477253, -1.5466305, 1.8362722, 2.8683174, -2.190604], "target": 0.4576722, "along": 8.0, "delta": [0.8190066, 0.32203168, -0.40009272, -0.45214468, -0.58432555, -0.15848581, 0.4282661, -0.54804265, -0.43519798, -0.61440766, -0.12661828, 0.2279496, 0.3972099, -0.26498312, 0.17193276, -0.08076674, 0.43491086, -0.13880251, -0.15138964, -0.19411963, 0.180319, -0.23472881, -0.14189108, -0.37218288, -0.25305337, 0.06336893, 0.34772477, 1.057394, -0.87536436, -0.82026225, 0.4281294, -0.39526334, 0.37124395, -0.10775121, 0.24157007, -0.3599801, 0.9649487, 0.62620366, -0.7655956, 0.4234794, -0.9526861, 0.48482516, 0.40270326, -0.21875335, 0.44341573, 0.7599321, 0.0, 0.43106082, -0.14391103, 0.10848395, 0.30991685, -0.11346671, 0.43536034, -0.503031, -0.40900597, 0.4754378, 0.2533137, -0.06883278, -0.39569995, 0.46469173, -0.330093, 0.3531991, 0.50121665, -0.5235396]} ] }, { @@ -53,7 +53,7 @@ "gate": {"probe": "neuron/L1n5", "op": ">", "threshold": 0.0} }, "layers": [ - {"layer": 2, "basis": [0.2236881, 0.08795369, -0.10927382, -0.123490304, -0.15959172, -0.043285843, 0.11696857, -0.14968209, -0.11886181, -0.16780777, -0.03458214, 0.062257875, 0.108486466, -0.072372526, 0.046958487, -0.02205911, 0.1187834, -0.037909914, -0.041347727, -0.053018194, 0.04924895, -0.06410942, -0.038753472, -0.10165104, -0.069114245, 0.0173074, 0.09497102, 0.2887968, -0.2390806, -0.22403105, 0.11693123, -0.107954815, 0.10139461, -0.029429145, 0.06597792, -0.09831821, 0.26354802, 0.17102952, -0.20910043, 0.11566122, -0.2601988, 0.13241605, 0.10998681, -0.059746187, 0.12110625, 0.20755358, 0.0, 0.11773188, -0.039305165, 0.029629271, 0.08464488, -0.030990168, 0.118906155, -0.13738845, -0.11170822, 0.12985216, 0.06918535, -0.018799696, -0.108074054, 0.12691718, -0.09015541, 0.096466176, 0.13689293, -0.14298978], "neutral": [1.5604588, -2.1175702, 0.14606446, 0.7385114, 0.35017264, 2.8522646, 1.4717126, -4.8974986, -4.089805, -0.76257277, 1.5562946, -2.5270953, -2.3369787, -0.34086064, 0.43853664, -1.8613778, -4.776157, -5.077354, -1.767068, -0.83124685, 2.1675637, -3.947026, -1.7668724, 3.9983017, -1.1012617, 0.30404115, -2.3319027, 1.8102349, 5.8336906, -3.1748953, 0.41587326, 1.4522133, -4.975678, 3.4511287, 0.097035326, -1.7819252, 2.1127462, -2.3910875, -2.4991999, -1.598096, 0.84621066, -2.497753, -1.234034, -2.0303576, 1.1722668, 0.0033107798, -2.7347724, 1.9015208, -0.12735252, 2.2576592, 1.1667862, -0.03853252, -0.9637408, 0.27681503, 1.951656, -3.7724102, 4.5014596, -0.75800496, 0.4131548, 3.9477253, -1.5466305, 1.8362722, 2.8683174, -2.190604], "target": 0.4576722, "along": 16.0, "delta": [1.6380132, 0.64406335, -0.80018544, -0.9042893, -1.1686511, -0.31697163, 0.8565322, -1.0960853, -0.87039596, -1.2288153, -0.25323656, 0.45589918, 0.7944198, -0.5299663, 0.3438655, -0.16153347, 0.8698218, -0.27760503, -0.3027793, -0.38823926, 0.360638, -0.46945763, -0.28378218, -0.7443657, -0.50610673, 0.12673786, 0.6954496, 2.1147883, -1.7507287, -1.6405245, 0.8562588, -0.7905267, 0.7424879, -0.21550243, 0.48314017, -0.7199602, 1.9298975, 1.2524073, -1.5311912, 0.8469588, -1.9053723, 0.9696504, 0.8054065, -0.4375067, 0.88683146, 1.5198641, 0.0, 0.8621217, -0.2878221, 0.21696791, 0.6198337, -0.22693342, 0.8707207, -1.006062, -0.81801194, 0.95087564, 0.5066274, -0.13766557, -0.79139984, 0.9293835, -0.660186, 0.7063982, 1.0024334, -1.0470792]} + {"layer": 2, "basis": [0.2236881, 0.08795369, -0.10927382, -0.12349032, -0.15959172, -0.043285843, 0.11696857, -0.14968209, -0.11886181, -0.16780777, -0.03458214, 0.06225788, 0.108486466, -0.07237252, 0.046958487, -0.02205911, 0.11878339, -0.037909914, -0.041347727, -0.053018194, 0.04924895, -0.06410942, -0.038753465, -0.10165105, -0.069114245, 0.0173074, 0.094971016, 0.28879675, -0.2390806, -0.22403105, 0.11693123, -0.107954815, 0.10139461, -0.029429145, 0.065977916, -0.09831821, 0.263548, 0.17102952, -0.20910043, 0.11566122, -0.2601988, 0.13241605, 0.10998681, -0.059746187, 0.12110625, 0.2075536, 0.0, 0.11773186, -0.039305158, 0.02962927, 0.08464488, -0.030990168, 0.118906155, -0.13738845, -0.11170822, 0.12985216, 0.06918535, -0.018799694, -0.10807406, 0.12691718, -0.09015541, 0.096466176, 0.13689291, -0.14298978], "neutral": [1.5604588, -2.1175702, 0.14606446, 0.7385114, 0.35017264, 2.8522646, 1.4717126, -4.8974986, -4.089805, -0.76257277, 1.5562946, -2.5270953, -2.3369787, -0.34086064, 0.43853664, -1.8613778, -4.776157, -5.077354, -1.767068, -0.83124685, 2.1675637, -3.947026, -1.7668724, 3.9983017, -1.1012617, 0.30404115, -2.3319027, 1.8102349, 5.8336906, -3.1748953, 0.41587326, 1.4522133, -4.975678, 3.4511287, 0.097035326, -1.7819252, 2.1127462, -2.3910875, -2.4991999, -1.598096, 0.84621066, -2.497753, -1.234034, -2.0303576, 1.1722668, 0.0033107798, -2.7347724, 1.9015208, -0.12735252, 2.2576592, 1.1667862, -0.03853252, -0.9637408, 0.27681503, 1.951656, -3.7724102, 4.5014596, -0.75800496, 0.4131548, 3.9477253, -1.5466305, 1.8362722, 2.8683174, -2.190604], "target": 0.4576722, "along": 8.0, "delta": [0.8190066, 0.32203168, -0.40009272, -0.45214468, -0.58432555, -0.15848581, 0.4282661, -0.54804265, -0.43519798, -0.61440766, -0.12661828, 0.2279496, 0.3972099, -0.26498312, 0.17193276, -0.08076674, 0.43491086, -0.13880251, -0.15138964, -0.19411963, 0.180319, -0.23472881, -0.14189108, -0.37218288, -0.25305337, 0.06336893, 0.34772477, 1.057394, -0.87536436, -0.82026225, 0.4281294, -0.39526334, 0.37124395, -0.10775121, 0.24157007, -0.3599801, 0.9649487, 0.62620366, -0.7655956, 0.4234794, -0.9526861, 0.48482516, 0.40270326, -0.21875335, 0.44341573, 0.7599321, 0.0, 0.43106082, -0.14391103, 0.10848395, 0.30991685, -0.11346671, 0.43536034, -0.503031, -0.40900597, 0.4754378, 0.2533137, -0.06883278, -0.39569995, 0.46469173, -0.330093, 0.3531991, 0.50121665, -0.5235396]} ] } ] diff --git a/tests/fixtures/browser/neuron-push-qwen3-v1.json b/tests/fixtures/browser/neuron-push-qwen3-v1.json index bfe180158..56f44de0e 100644 --- a/tests/fixtures/browser/neuron-push-qwen3-v1.json +++ b/tests/fixtures/browser/neuron-push-qwen3-v1.json @@ -18,7 +18,7 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 2, "basis": [-0.07124704, 0.01781176, 0.053435285, -0.03562352, -0.17811762, -0.14249408, 0.07124704, -0.10687057, 0.01781176, -0.14249408, 0.053435285, 0.03562352, -0.03562352, -0.17811762, 0.12468234, -0.08905881, -0.10687057, 0.10687057, 0.24936467, -0.24936467, -0.10687057, -0.08905881, 0.17811762, -0.03562352, 0.24936467, -0.17811762, 0.0, 0.07124704, 0.07124704, -0.07124704, 0.10687057, -0.10687057, -0.21374114, 0.0, 0.10687057, -0.17811762, -0.17811762, -0.03562352, -0.07124704, 0.08905881, -0.01781176, 0.21374114, 0.10687057, -0.07124704, -0.08905881, -0.053435285, 0.17811762, -0.01781176, 0.053435285, -0.24936467, 0.07124704, -0.03562352, -0.24936467, 0.01781176, 0.053435285, 0.0, 0.10687057, 0.17811762, -0.21374114, 0.03562352, -0.03562352, -0.08905881, 0.03562352, 0.17811762], "neutral": [-1.1361581, 1.0497185, 0.15657717, 1.0506705, 1.0729295, 1.2391597, 0.1344861, -0.13217883, -0.85807353, -0.2682, 0.47560444, -1.9608706, -0.019228162, 0.75979495, 1.8830032, -0.17108698, 1.1172285, 1.0450405, 0.4929612, -1.0516003, 0.44990543, 0.31380934, -0.30493772, 0.2873628, -0.928504, -0.89649653, -0.7381714, -0.2547708, -0.441094, -0.39500263, 1.0224733, 0.43456802, -0.00023164351, 1.1087089, 1.0855498, 0.21198261, 0.7086305, -0.10458102, -1.4401479, 0.38656035, 0.96317333, 0.53272986, 2.3079002, -1.3511573, 0.5077557, -1.0545553, -0.9975011, 0.047818065, 0.8516593, 0.102646835, 0.12864351, -0.80223536, -1.039478, 0.9660736, 0.690741, 1.6428763, -1.2846469, -0.66371906, -0.022738198, -0.8345139, 0.3874209, 0.21338554, -0.8968024, 1.828379], "target": 0.06048136, "along": 16.0, "delta": [-0.068945885, 0.017236471, 0.051709417, -0.034472942, -0.17236473, -0.13789177, 0.068945885, -0.103418835, 0.017236471, -0.13789177, 0.051709417, 0.034472942, -0.034472942, -0.17236473, 0.12065531, -0.08618236, -0.103418835, 0.103418835, 0.24131063, -0.24131063, -0.103418835, -0.08618236, 0.17236473, -0.034472942, 0.24131063, -0.17236473, 0.0, 0.068945885, 0.068945885, -0.068945885, 0.103418835, -0.103418835, -0.20683767, 0.0, 0.103418835, -0.17236473, -0.17236473, -0.034472942, -0.068945885, 0.08618236, -0.017236471, 0.20683767, 0.103418835, -0.068945885, -0.08618236, -0.051709417, 0.17236473, -0.017236471, 0.051709417, -0.24131063, 0.068945885, -0.034472942, -0.24131063, 0.017236471, 0.051709417, 0.0, 0.103418835, 0.17236473, -0.20683767, 0.034472942, -0.034472942, -0.08618236, 0.034472942, 0.17236473]} + {"layer": 2, "basis": [-0.07124705, 0.017811762, 0.05343529, -0.035623524, -0.17811762, -0.1424941, 0.07124705, -0.10687058, 0.017811762, -0.1424941, 0.05343529, 0.035623524, -0.035623524, -0.17811762, 0.12468234, -0.08905881, -0.10687058, 0.10687058, 0.24936467, -0.24936467, -0.10687058, -0.08905881, 0.17811762, -0.035623524, 0.24936467, -0.17811762, 0.0, 0.07124705, 0.07124705, -0.07124705, 0.10687058, -0.10687058, -0.21374115, 0.0, 0.10687058, -0.17811762, -0.17811762, -0.035623524, -0.07124705, 0.08905881, -0.017811762, 0.21374115, 0.10687058, -0.07124705, -0.08905881, -0.05343529, 0.17811762, -0.017811762, 0.05343529, -0.24936467, 0.07124705, -0.035623524, -0.24936467, 0.017811762, 0.05343529, 0.0, 0.10687058, 0.17811762, -0.21374115, 0.035623524, -0.035623524, -0.08905881, 0.035623524, 0.17811762], "neutral": [-1.1361581, 1.0497185, 0.15657717, 1.0506705, 1.0729295, 1.2391597, 0.1344861, -0.13217883, -0.85807353, -0.2682, 0.47560444, -1.9608706, -0.019228162, 0.75979495, 1.8830032, -0.17108698, 1.1172285, 1.0450405, 0.4929612, -1.0516003, 0.44990543, 0.31380934, -0.30493772, 0.2873628, -0.928504, -0.89649653, -0.7381714, -0.2547708, -0.441094, -0.39500263, 1.0224733, 0.43456802, -0.00023164351, 1.1087089, 1.0855498, 0.21198261, 0.7086305, -0.10458102, -1.4401479, 0.38656035, 0.96317333, 0.53272986, 2.3079002, -1.3511573, 0.5077557, -1.0545553, -0.9975011, 0.047818065, 0.8516593, 0.102646835, 0.12864351, -0.80223536, -1.039478, 0.9660736, 0.690741, 1.6428763, -1.2846469, -0.66371906, -0.022738198, -0.8345139, 0.3874209, 0.21338554, -0.8968024, 1.828379], "target": 0.06048136, "along": 8.0, "delta": [-0.034472946, 0.0086182365, 0.02585471, -0.017236473, -0.08618236, -0.06894589, 0.034472946, -0.05170942, 0.0086182365, -0.06894589, 0.02585471, 0.017236473, -0.017236473, -0.08618236, 0.060327657, -0.04309118, -0.05170942, 0.05170942, 0.12065531, -0.12065531, -0.05170942, -0.04309118, 0.08618236, -0.017236473, 0.12065531, -0.08618236, 0.0, 0.034472946, 0.034472946, -0.034472946, 0.05170942, -0.05170942, -0.10341884, 0.0, 0.05170942, -0.08618236, -0.08618236, -0.017236473, -0.034472946, 0.04309118, -0.0086182365, 0.10341884, 0.05170942, -0.034472946, -0.04309118, -0.02585471, 0.08618236, -0.0086182365, 0.02585471, -0.12065531, 0.034472946, -0.017236473, -0.12065531, 0.0086182365, 0.02585471, 0.0, 0.05170942, 0.08618236, -0.10341884, 0.017236473, -0.017236473, -0.04309118, 0.017236473, 0.08618236]} ] }, { @@ -27,7 +27,7 @@ "coefficient": -0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 2, "basis": [0.07124704, -0.01781176, -0.053435285, 0.03562352, 0.17811762, 0.14249408, -0.07124704, 0.10687057, -0.01781176, 0.14249408, -0.053435285, -0.03562352, 0.03562352, 0.17811762, -0.12468234, 0.08905881, 0.10687057, -0.10687057, -0.24936467, 0.24936467, 0.10687057, 0.08905881, -0.17811762, 0.03562352, -0.24936467, 0.17811762, 0.0, -0.07124704, -0.07124704, 0.07124704, -0.10687057, 0.10687057, 0.21374114, 0.0, -0.10687057, 0.17811762, 0.17811762, 0.03562352, 0.07124704, -0.08905881, 0.01781176, -0.21374114, -0.10687057, 0.07124704, 0.08905881, 0.053435285, -0.17811762, 0.01781176, -0.053435285, 0.24936467, -0.07124704, 0.03562352, 0.24936467, -0.01781176, -0.053435285, 0.0, -0.10687057, -0.17811762, 0.21374114, -0.03562352, 0.03562352, 0.08905881, -0.03562352, -0.17811762], "neutral": [-1.1361581, 1.0497185, 0.15657717, 1.0506705, 1.0729295, 1.2391597, 0.1344861, -0.13217883, -0.85807353, -0.2682, 0.47560444, -1.9608706, -0.019228162, 0.75979495, 1.8830032, -0.17108698, 1.1172285, 1.0450405, 0.4929612, -1.0516003, 0.44990543, 0.31380934, -0.30493772, 0.2873628, -0.928504, -0.89649653, -0.7381714, -0.2547708, -0.441094, -0.39500263, 1.0224733, 0.43456802, -0.00023164351, 1.1087089, 1.0855498, 0.21198261, 0.7086305, -0.10458102, -1.4401479, 0.38656035, 0.96317333, 0.53272986, 2.3079002, -1.3511573, 0.5077557, -1.0545553, -0.9975011, 0.047818065, 0.8516593, 0.102646835, 0.12864351, -0.80223536, -1.039478, 0.9660736, 0.690741, 1.6428763, -1.2846469, -0.66371906, -0.022738198, -0.8345139, 0.3874209, 0.21338554, -0.8968024, 1.828379], "target": 0.06048136, "along": 16.0, "delta": [0.068945885, -0.017236471, -0.051709417, 0.034472942, 0.17236473, 0.13789177, -0.068945885, 0.103418835, -0.017236471, 0.13789177, -0.051709417, -0.034472942, 0.034472942, 0.17236473, -0.12065531, 0.08618236, 0.103418835, -0.103418835, -0.24131063, 0.24131063, 0.103418835, 0.08618236, -0.17236473, 0.034472942, -0.24131063, 0.17236473, 0.0, -0.068945885, -0.068945885, 0.068945885, -0.103418835, 0.103418835, 0.20683767, 0.0, -0.103418835, 0.17236473, 0.17236473, 0.034472942, 0.068945885, -0.08618236, 0.017236471, -0.20683767, -0.103418835, 0.068945885, 0.08618236, 0.051709417, -0.17236473, 0.017236471, -0.051709417, 0.24131063, -0.068945885, 0.034472942, 0.24131063, -0.017236471, -0.051709417, 0.0, -0.103418835, -0.17236473, 0.20683767, -0.034472942, 0.034472942, 0.08618236, -0.034472942, -0.17236473]} + {"layer": 2, "basis": [0.07124705, -0.017811762, -0.05343529, 0.035623524, 0.17811762, 0.1424941, -0.07124705, 0.10687058, -0.017811762, 0.1424941, -0.05343529, -0.035623524, 0.035623524, 0.17811762, -0.12468234, 0.08905881, 0.10687058, -0.10687058, -0.24936467, 0.24936467, 0.10687058, 0.08905881, -0.17811762, 0.035623524, -0.24936467, 0.17811762, 0.0, -0.07124705, -0.07124705, 0.07124705, -0.10687058, 0.10687058, 0.21374115, 0.0, -0.10687058, 0.17811762, 0.17811762, 0.035623524, 0.07124705, -0.08905881, 0.017811762, -0.21374115, -0.10687058, 0.07124705, 0.08905881, 0.05343529, -0.17811762, 0.017811762, -0.05343529, 0.24936467, -0.07124705, 0.035623524, 0.24936467, -0.017811762, -0.05343529, 0.0, -0.10687058, -0.17811762, 0.21374115, -0.035623524, 0.035623524, 0.08905881, -0.035623524, -0.17811762], "neutral": [-1.1361581, 1.0497185, 0.15657717, 1.0506705, 1.0729295, 1.2391597, 0.1344861, -0.13217883, -0.85807353, -0.2682, 0.47560444, -1.9608706, -0.019228162, 0.75979495, 1.8830032, -0.17108698, 1.1172285, 1.0450405, 0.4929612, -1.0516003, 0.44990543, 0.31380934, -0.30493772, 0.2873628, -0.928504, -0.89649653, -0.7381714, -0.2547708, -0.441094, -0.39500263, 1.0224733, 0.43456802, -0.00023164351, 1.1087089, 1.0855498, 0.21198261, 0.7086305, -0.10458102, -1.4401479, 0.38656035, 0.96317333, 0.53272986, 2.3079002, -1.3511573, 0.5077557, -1.0545553, -0.9975011, 0.047818065, 0.8516593, 0.102646835, 0.12864351, -0.80223536, -1.039478, 0.9660736, 0.690741, 1.6428763, -1.2846469, -0.66371906, -0.022738198, -0.8345139, 0.3874209, 0.21338554, -0.8968024, 1.828379], "target": 0.06048136, "along": 8.0, "delta": [0.034472946, -0.0086182365, -0.02585471, 0.017236473, 0.08618236, 0.06894589, -0.034472946, 0.05170942, -0.0086182365, 0.06894589, -0.02585471, -0.017236473, 0.017236473, 0.08618236, -0.060327657, 0.04309118, 0.05170942, -0.05170942, -0.12065531, 0.12065531, 0.05170942, 0.04309118, -0.08618236, 0.017236473, -0.12065531, 0.08618236, 0.0, -0.034472946, -0.034472946, 0.034472946, -0.05170942, 0.05170942, 0.10341884, 0.0, -0.05170942, 0.08618236, 0.08618236, 0.017236473, 0.034472946, -0.04309118, 0.0086182365, -0.10341884, -0.05170942, 0.034472946, 0.04309118, 0.02585471, -0.08618236, 0.0086182365, -0.02585471, 0.12065531, -0.034472946, 0.017236473, 0.12065531, -0.0086182365, -0.02585471, 0.0, -0.05170942, -0.08618236, 0.10341884, -0.017236473, 0.017236473, 0.04309118, -0.017236473, -0.08618236]} ] }, { @@ -36,7 +36,7 @@ "coefficient": 0.3, "trigger": {"prompt": false, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 2, "basis": [-0.07124704, 0.01781176, 0.053435285, -0.03562352, -0.17811762, -0.14249408, 0.07124704, -0.10687057, 0.01781176, -0.14249408, 0.053435285, 0.03562352, -0.03562352, -0.17811762, 0.12468234, -0.08905881, -0.10687057, 0.10687057, 0.24936467, -0.24936467, -0.10687057, -0.08905881, 0.17811762, -0.03562352, 0.24936467, -0.17811762, 0.0, 0.07124704, 0.07124704, -0.07124704, 0.10687057, -0.10687057, -0.21374114, 0.0, 0.10687057, -0.17811762, -0.17811762, -0.03562352, -0.07124704, 0.08905881, -0.01781176, 0.21374114, 0.10687057, -0.07124704, -0.08905881, -0.053435285, 0.17811762, -0.01781176, 0.053435285, -0.24936467, 0.07124704, -0.03562352, -0.24936467, 0.01781176, 0.053435285, 0.0, 0.10687057, 0.17811762, -0.21374114, 0.03562352, -0.03562352, -0.08905881, 0.03562352, 0.17811762], "neutral": [-1.1361581, 1.0497185, 0.15657717, 1.0506705, 1.0729295, 1.2391597, 0.1344861, -0.13217883, -0.85807353, -0.2682, 0.47560444, -1.9608706, -0.019228162, 0.75979495, 1.8830032, -0.17108698, 1.1172285, 1.0450405, 0.4929612, -1.0516003, 0.44990543, 0.31380934, -0.30493772, 0.2873628, -0.928504, -0.89649653, -0.7381714, -0.2547708, -0.441094, -0.39500263, 1.0224733, 0.43456802, -0.00023164351, 1.1087089, 1.0855498, 0.21198261, 0.7086305, -0.10458102, -1.4401479, 0.38656035, 0.96317333, 0.53272986, 2.3079002, -1.3511573, 0.5077557, -1.0545553, -0.9975011, 0.047818065, 0.8516593, 0.102646835, 0.12864351, -0.80223536, -1.039478, 0.9660736, 0.690741, 1.6428763, -1.2846469, -0.66371906, -0.022738198, -0.8345139, 0.3874209, 0.21338554, -0.8968024, 1.828379], "target": 0.06048136, "along": 16.0, "delta": [-0.068945885, 0.017236471, 0.051709417, -0.034472942, -0.17236473, -0.13789177, 0.068945885, -0.103418835, 0.017236471, -0.13789177, 0.051709417, 0.034472942, -0.034472942, -0.17236473, 0.12065531, -0.08618236, -0.103418835, 0.103418835, 0.24131063, -0.24131063, -0.103418835, -0.08618236, 0.17236473, -0.034472942, 0.24131063, -0.17236473, 0.0, 0.068945885, 0.068945885, -0.068945885, 0.103418835, -0.103418835, -0.20683767, 0.0, 0.103418835, -0.17236473, -0.17236473, -0.034472942, -0.068945885, 0.08618236, -0.017236471, 0.20683767, 0.103418835, -0.068945885, -0.08618236, -0.051709417, 0.17236473, -0.017236471, 0.051709417, -0.24131063, 0.068945885, -0.034472942, -0.24131063, 0.017236471, 0.051709417, 0.0, 0.103418835, 0.17236473, -0.20683767, 0.034472942, -0.034472942, -0.08618236, 0.034472942, 0.17236473]} + {"layer": 2, "basis": [-0.07124705, 0.017811762, 0.05343529, -0.035623524, -0.17811762, -0.1424941, 0.07124705, -0.10687058, 0.017811762, -0.1424941, 0.05343529, 0.035623524, -0.035623524, -0.17811762, 0.12468234, -0.08905881, -0.10687058, 0.10687058, 0.24936467, -0.24936467, -0.10687058, -0.08905881, 0.17811762, -0.035623524, 0.24936467, -0.17811762, 0.0, 0.07124705, 0.07124705, -0.07124705, 0.10687058, -0.10687058, -0.21374115, 0.0, 0.10687058, -0.17811762, -0.17811762, -0.035623524, -0.07124705, 0.08905881, -0.017811762, 0.21374115, 0.10687058, -0.07124705, -0.08905881, -0.05343529, 0.17811762, -0.017811762, 0.05343529, -0.24936467, 0.07124705, -0.035623524, -0.24936467, 0.017811762, 0.05343529, 0.0, 0.10687058, 0.17811762, -0.21374115, 0.035623524, -0.035623524, -0.08905881, 0.035623524, 0.17811762], "neutral": [-1.1361581, 1.0497185, 0.15657717, 1.0506705, 1.0729295, 1.2391597, 0.1344861, -0.13217883, -0.85807353, -0.2682, 0.47560444, -1.9608706, -0.019228162, 0.75979495, 1.8830032, -0.17108698, 1.1172285, 1.0450405, 0.4929612, -1.0516003, 0.44990543, 0.31380934, -0.30493772, 0.2873628, -0.928504, -0.89649653, -0.7381714, -0.2547708, -0.441094, -0.39500263, 1.0224733, 0.43456802, -0.00023164351, 1.1087089, 1.0855498, 0.21198261, 0.7086305, -0.10458102, -1.4401479, 0.38656035, 0.96317333, 0.53272986, 2.3079002, -1.3511573, 0.5077557, -1.0545553, -0.9975011, 0.047818065, 0.8516593, 0.102646835, 0.12864351, -0.80223536, -1.039478, 0.9660736, 0.690741, 1.6428763, -1.2846469, -0.66371906, -0.022738198, -0.8345139, 0.3874209, 0.21338554, -0.8968024, 1.828379], "target": 0.06048136, "along": 8.0, "delta": [-0.034472946, 0.0086182365, 0.02585471, -0.017236473, -0.08618236, -0.06894589, 0.034472946, -0.05170942, 0.0086182365, -0.06894589, 0.02585471, 0.017236473, -0.017236473, -0.08618236, 0.060327657, -0.04309118, -0.05170942, 0.05170942, 0.12065531, -0.12065531, -0.05170942, -0.04309118, 0.08618236, -0.017236473, 0.12065531, -0.08618236, 0.0, 0.034472946, 0.034472946, -0.034472946, 0.05170942, -0.05170942, -0.10341884, 0.0, 0.05170942, -0.08618236, -0.08618236, -0.017236473, -0.034472946, 0.04309118, -0.0086182365, 0.10341884, 0.05170942, -0.034472946, -0.04309118, -0.02585471, 0.08618236, -0.0086182365, 0.02585471, -0.12065531, 0.034472946, -0.017236473, -0.12065531, 0.0086182365, 0.02585471, 0.0, 0.05170942, 0.08618236, -0.10341884, 0.017236473, -0.017236473, -0.04309118, 0.017236473, 0.08618236]} ] }, { @@ -53,7 +53,7 @@ "gate": {"probe": "neuron/L1n5", "op": ">", "threshold": 0.0} }, "layers": [ - {"layer": 2, "basis": [-0.07124704, 0.01781176, 0.053435285, -0.03562352, -0.17811762, -0.14249408, 0.07124704, -0.10687057, 0.01781176, -0.14249408, 0.053435285, 0.03562352, -0.03562352, -0.17811762, 0.12468234, -0.08905881, -0.10687057, 0.10687057, 0.24936467, -0.24936467, -0.10687057, -0.08905881, 0.17811762, -0.03562352, 0.24936467, -0.17811762, 0.0, 0.07124704, 0.07124704, -0.07124704, 0.10687057, -0.10687057, -0.21374114, 0.0, 0.10687057, -0.17811762, -0.17811762, -0.03562352, -0.07124704, 0.08905881, -0.01781176, 0.21374114, 0.10687057, -0.07124704, -0.08905881, -0.053435285, 0.17811762, -0.01781176, 0.053435285, -0.24936467, 0.07124704, -0.03562352, -0.24936467, 0.01781176, 0.053435285, 0.0, 0.10687057, 0.17811762, -0.21374114, 0.03562352, -0.03562352, -0.08905881, 0.03562352, 0.17811762], "neutral": [-1.1361581, 1.0497185, 0.15657717, 1.0506705, 1.0729295, 1.2391597, 0.1344861, -0.13217883, -0.85807353, -0.2682, 0.47560444, -1.9608706, -0.019228162, 0.75979495, 1.8830032, -0.17108698, 1.1172285, 1.0450405, 0.4929612, -1.0516003, 0.44990543, 0.31380934, -0.30493772, 0.2873628, -0.928504, -0.89649653, -0.7381714, -0.2547708, -0.441094, -0.39500263, 1.0224733, 0.43456802, -0.00023164351, 1.1087089, 1.0855498, 0.21198261, 0.7086305, -0.10458102, -1.4401479, 0.38656035, 0.96317333, 0.53272986, 2.3079002, -1.3511573, 0.5077557, -1.0545553, -0.9975011, 0.047818065, 0.8516593, 0.102646835, 0.12864351, -0.80223536, -1.039478, 0.9660736, 0.690741, 1.6428763, -1.2846469, -0.66371906, -0.022738198, -0.8345139, 0.3874209, 0.21338554, -0.8968024, 1.828379], "target": 0.06048136, "along": 16.0, "delta": [-0.068945885, 0.017236471, 0.051709417, -0.034472942, -0.17236473, -0.13789177, 0.068945885, -0.103418835, 0.017236471, -0.13789177, 0.051709417, 0.034472942, -0.034472942, -0.17236473, 0.12065531, -0.08618236, -0.103418835, 0.103418835, 0.24131063, -0.24131063, -0.103418835, -0.08618236, 0.17236473, -0.034472942, 0.24131063, -0.17236473, 0.0, 0.068945885, 0.068945885, -0.068945885, 0.103418835, -0.103418835, -0.20683767, 0.0, 0.103418835, -0.17236473, -0.17236473, -0.034472942, -0.068945885, 0.08618236, -0.017236471, 0.20683767, 0.103418835, -0.068945885, -0.08618236, -0.051709417, 0.17236473, -0.017236471, 0.051709417, -0.24131063, 0.068945885, -0.034472942, -0.24131063, 0.017236471, 0.051709417, 0.0, 0.103418835, 0.17236473, -0.20683767, 0.034472942, -0.034472942, -0.08618236, 0.034472942, 0.17236473]} + {"layer": 2, "basis": [-0.07124705, 0.017811762, 0.05343529, -0.035623524, -0.17811762, -0.1424941, 0.07124705, -0.10687058, 0.017811762, -0.1424941, 0.05343529, 0.035623524, -0.035623524, -0.17811762, 0.12468234, -0.08905881, -0.10687058, 0.10687058, 0.24936467, -0.24936467, -0.10687058, -0.08905881, 0.17811762, -0.035623524, 0.24936467, -0.17811762, 0.0, 0.07124705, 0.07124705, -0.07124705, 0.10687058, -0.10687058, -0.21374115, 0.0, 0.10687058, -0.17811762, -0.17811762, -0.035623524, -0.07124705, 0.08905881, -0.017811762, 0.21374115, 0.10687058, -0.07124705, -0.08905881, -0.05343529, 0.17811762, -0.017811762, 0.05343529, -0.24936467, 0.07124705, -0.035623524, -0.24936467, 0.017811762, 0.05343529, 0.0, 0.10687058, 0.17811762, -0.21374115, 0.035623524, -0.035623524, -0.08905881, 0.035623524, 0.17811762], "neutral": [-1.1361581, 1.0497185, 0.15657717, 1.0506705, 1.0729295, 1.2391597, 0.1344861, -0.13217883, -0.85807353, -0.2682, 0.47560444, -1.9608706, -0.019228162, 0.75979495, 1.8830032, -0.17108698, 1.1172285, 1.0450405, 0.4929612, -1.0516003, 0.44990543, 0.31380934, -0.30493772, 0.2873628, -0.928504, -0.89649653, -0.7381714, -0.2547708, -0.441094, -0.39500263, 1.0224733, 0.43456802, -0.00023164351, 1.1087089, 1.0855498, 0.21198261, 0.7086305, -0.10458102, -1.4401479, 0.38656035, 0.96317333, 0.53272986, 2.3079002, -1.3511573, 0.5077557, -1.0545553, -0.9975011, 0.047818065, 0.8516593, 0.102646835, 0.12864351, -0.80223536, -1.039478, 0.9660736, 0.690741, 1.6428763, -1.2846469, -0.66371906, -0.022738198, -0.8345139, 0.3874209, 0.21338554, -0.8968024, 1.828379], "target": 0.06048136, "along": 8.0, "delta": [-0.034472946, 0.0086182365, 0.02585471, -0.017236473, -0.08618236, -0.06894589, 0.034472946, -0.05170942, 0.0086182365, -0.06894589, 0.02585471, 0.017236473, -0.017236473, -0.08618236, 0.060327657, -0.04309118, -0.05170942, 0.05170942, 0.12065531, -0.12065531, -0.05170942, -0.04309118, 0.08618236, -0.017236473, 0.12065531, -0.08618236, 0.0, 0.034472946, 0.034472946, -0.034472946, 0.05170942, -0.05170942, -0.10341884, 0.0, 0.05170942, -0.08618236, -0.08618236, -0.017236473, -0.034472946, 0.04309118, -0.0086182365, 0.10341884, 0.05170942, -0.034472946, -0.04309118, -0.02585471, 0.08618236, -0.0086182365, 0.02585471, -0.12065531, 0.034472946, -0.017236473, -0.12065531, 0.0086182365, 0.02585471, 0.0, 0.05170942, 0.08618236, -0.10341884, 0.017236473, -0.017236473, -0.04309118, 0.017236473, 0.08618236]} ] } ] diff --git a/tests/fixtures/browser/slens-gemma3-v1.json b/tests/fixtures/browser/slens-gemma3-v1.json index 5381b308d..fb4876706 100644 --- a/tests/fixtures/browser/slens-gemma3-v1.json +++ b/tests/fixtures/browser/slens-gemma3-v1.json @@ -97,8 +97,8 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 0, "basis": [0.111408405, 0.15787417, 0.009698066, -0.008461342, -0.030051319, 0.045879815, -0.13405938, 0.04410646, -0.031155676, 0.04253443, -0.24363002, 0.05194264, 0.14785473, -0.07414442, -0.33353, 0.11852285, 0.02964776, 0.058135524, 0.085914046, 0.11526413, 0.04125206, 0.026256014, -0.015475084, 0.09677861, -0.034716576, 0.037367173, 0.1984919, 0.16138202, -0.1800056, -0.08266567, -0.12459776, -0.18219484, 0.21396217, 0.08656315, 0.05079619, -0.11605504, 0.13428311, -0.0863291, 0.16915138, 0.0014088221, -0.03276097, -0.08703856, 0.098184526, 0.06337002, -0.021602366, 0.06596126, 0.11488861, -0.010957559, -0.10010601, -0.21905112, 0.16543761, -0.29456535, 0.10433054, -0.15326114, -0.074959174, -0.12728818, -0.20134522, 0.11199662, -0.056349725, -0.026617592, 0.020758243, -0.15167773, -0.227451, 0.0694992], "neutral": [2.5011036, -0.4328916, -0.22815919, 0.88161534, -0.82922167, 1.491485, 1.9539326, -3.9881096, -1.4245024, -2.1901445, -0.16345637, -2.71713, -1.2177546, -0.5948393, 2.36368, -1.9189181, -2.602368, -1.9446074, 1.5463581, 0.33549452, 0.7032369, -1.9593922, -0.65063, 1.5692993, -1.5085074, -1.6737885, -2.807972, 2.2502272, 2.972189, -0.03529877, 0.1057314, 3.2459009, -3.411113, 3.6565142, -1.2219691, 0.77729684, -1.2308892, -1.6396497, -1.736317, -1.9587177, -1.2799597, -3.049032, 0.20408136, -2.688755, 1.1541778, 0.7216564, -1.4041886, 2.2414868, 1.2284724, 0.47957373, 1.6112742, -0.015047793, -0.97778773, 0.08165591, -0.91091067, -3.4077399, 3.8692083, 0.13136284, 0.2638365, 2.9992876, -3.6165664, 2.2740467, 3.6357148, -1.6329161], "target": 0.62881047, "along": 14.187488, "delta": [0.9939012, 1.4084334, 0.08651878, -0.07548567, -0.26809505, 0.4093049, -1.195976, 0.39348435, -0.27794728, 0.3794599, -2.1734822, 0.4633928, 1.3190477, -0.6614603, -2.9755013, 1.0573709, 0.2644948, 0.518641, 0.7664599, 1.0282991, 0.36801955, 0.23423623, -0.13805695, 0.86338526, -0.30971494, 0.33336154, 1.7707939, 1.4397279, -1.6058733, -0.7374803, -1.1115667, -1.625404, 1.9088079, 0.77225065, 0.45316502, -1.035355, 1.1979719, -0.7701627, 1.5090402, 0.012568441, -0.2922685, -0.77649194, 0.8759278, 0.5653392, -0.1927199, 0.5884563, 1.024949, -0.097755015, -0.8930698, -1.9542078, 1.4759086, -2.6278882, 0.9307579, -1.3672795, -0.6687288, -1.1355685, -1.7962492, 0.9991488, -0.50270945, -0.23746194, 0.18518929, -1.3531536, -2.029145, 0.62001914]}, - {"layer": 1, "basis": [0.17795312, 0.070367314, -0.16361566, 0.10261329, -0.0078052073, 0.09831176, -0.16368082, -0.11972929, -0.15176839, 0.021200962, -0.055200245, 0.15447105, 0.09827654, -0.06698116, -0.3358005, -0.07777088, -0.017220518, 0.09951315, 0.14346397, -0.00101903, -0.11058069, 0.04126511, 0.029735077, 0.057961233, 0.000676652, 0.060527373, 0.03941653, 0.061162263, -0.14212698, -0.075682595, -0.12472814, -0.17888317, 0.26618096, 0.067657955, 0.11373681, -0.13349913, 0.14829925, -0.069696456, 0.18696573, 0.05467432, 0.081960134, -0.014616368, 0.11102715, 0.11257323, -0.09290354, -0.054629892, 0.042267025, 0.069468416, -0.14494409, -0.07542273, 0.002474462, -0.1690981, 0.09719052, -0.016227778, -0.07685678, -0.21807039, -0.13975208, 0.06805604, -0.057095014, -0.019715685, -0.15944514, -0.34713322, -0.20994808, 0.05530225], "neutral": [2.5403802, -0.6107809, 0.062300798, 1.49499, -0.64720786, 2.2524116, 2.5358746, -5.168618, -3.499977, -1.0449457, 0.15478604, -2.34535, -2.5848777, -1.3628726, 1.8815207, -1.1110901, -3.9774685, -4.7597775, -0.6708746, 0.0017258171, 2.0631378, -3.0336688, -0.6227669, 2.474963, -2.6115007, 0.26991248, -1.9374989, 0.9526677, 5.328921, -2.6247644, 0.044735555, 2.2181914, -4.052362, 2.8750932, 0.7703316, -1.9708306, -0.3956953, -2.4062173, -2.3324852, -2.1703327, 0.35780063, -2.869667, -0.15014786, -1.6218642, 0.33910915, 0.54017884, -2.4443815, 2.6439462, 2.1077006, 2.679039, 2.529034, 0.14207181, 0.46443367, -0.9520941, 1.1665174, -1.7227926, 3.6997166, -0.25603804, 0.32729462, 3.2004669, -1.4965214, 1.621521, 3.3546197, -2.644725], "target": 0.813217, "along": 17.812513, "delta": [2.577729, 1.0193014, -2.3700445, 1.4863986, -0.113061845, 1.424089, -2.3709884, -1.7343313, -2.1984317, 0.30710524, -0.79959977, 2.237581, 1.4235787, -0.9702515, -4.8642178, -1.1265453, -0.24944675, 1.4414916, 2.0781386, -0.014761096, -1.6018097, 0.5977432, 0.43072563, 0.8395939, 0.009801601, 0.87676555, 0.5709657, 0.8859622, -2.0587714, -1.0962956, -1.8067418, -2.591201, 3.855748, 0.9800551, 1.6475276, -1.9337935, 2.1481795, -1.0095837, 2.7082808, 0.79198146, 1.1872284, -0.2117245, 1.608277, 1.6306726, -1.3457484, -0.79133797, 0.6122564, 1.0062804, -2.0995786, -1.0925312, 0.035843667, -2.44946, 1.4078473, -0.23506649, -1.1133041, -3.1588452, -2.0243702, 0.9858216, -0.82704633, -0.28559035, -2.3096328, -5.028377, -3.0411901, 0.8010773]} + {"layer": 0, "basis": [0.111408405, 0.15787417, 0.009698066, -0.008461342, -0.030051319, 0.045879815, -0.13405938, 0.04410646, -0.031155676, 0.04253443, -0.24363002, 0.05194264, 0.14785473, -0.07414442, -0.33353, 0.11852285, 0.02964776, 0.058135524, 0.085914046, 0.11526413, 0.04125206, 0.026256014, -0.015475084, 0.09677861, -0.034716576, 0.037367173, 0.1984919, 0.16138202, -0.1800056, -0.08266567, -0.12459776, -0.18219484, 0.21396217, 0.08656315, 0.05079619, -0.11605504, 0.13428311, -0.0863291, 0.16915138, 0.0014088221, -0.03276097, -0.08703856, 0.098184526, 0.06337002, -0.021602366, 0.06596126, 0.11488861, -0.010957559, -0.10010601, -0.21905112, 0.16543761, -0.29456535, 0.10433054, -0.15326114, -0.074959174, -0.12728818, -0.20134522, 0.11199662, -0.056349725, -0.026617592, 0.020758243, -0.15167773, -0.227451, 0.0694992], "neutral": [2.5011036, -0.4328916, -0.22815919, 0.88161534, -0.82922167, 1.491485, 1.9539326, -3.9881096, -1.4245024, -2.1901445, -0.16345637, -2.71713, -1.2177546, -0.5948393, 2.36368, -1.9189181, -2.602368, -1.9446074, 1.5463581, 0.33549452, 0.7032369, -1.9593922, -0.65063, 1.5692993, -1.5085074, -1.6737885, -2.807972, 2.2502272, 2.972189, -0.03529877, 0.1057314, 3.2459009, -3.411113, 3.6565142, -1.2219691, 0.77729684, -1.2308892, -1.6396497, -1.736317, -1.9587177, -1.2799597, -3.049032, 0.20408136, -2.688755, 1.1541778, 0.7216564, -1.4041886, 2.2414868, 1.2284724, 0.47957373, 1.6112742, -0.015047793, -0.97778773, 0.08165591, -0.91091067, -3.4077399, 3.8692083, 0.13136284, 0.2638365, 2.9992876, -3.6165664, 2.2740467, 3.6357148, -1.6329161], "target": 0.62881047, "along": 7.093744, "delta": [0.4969506, 0.7042167, 0.04325939, -0.037742835, -0.13404752, 0.20465244, -0.597988, 0.19674218, -0.13897364, 0.18972994, -1.0867411, 0.2316964, 0.65952384, -0.33073014, -1.4877506, 0.52868545, 0.1322474, 0.2593205, 0.38322994, 0.51414955, 0.18400978, 0.11711811, -0.069028474, 0.43169263, -0.15485747, 0.16668077, 0.88539696, 0.71986395, -0.8029367, -0.36874014, -0.55578333, -0.812702, 0.95440394, 0.38612533, 0.22658251, -0.5176775, 0.59898597, -0.38508135, 0.7545201, 0.0062842206, -0.14613426, -0.38824597, 0.4379639, 0.2826696, -0.09635995, 0.29422814, 0.5124745, -0.048877507, -0.4465349, -0.9771039, 0.7379543, -1.3139441, 0.46537894, -0.68363976, -0.3343644, -0.56778425, -0.8981246, 0.4995744, -0.25135472, -0.11873097, 0.092594646, -0.6765768, -1.0145725, 0.31000957]}, + {"layer": 1, "basis": [0.17795312, 0.070367314, -0.16361566, 0.10261329, -0.0078052073, 0.09831176, -0.16368082, -0.11972929, -0.15176839, 0.021200962, -0.055200245, 0.15447105, 0.09827654, -0.06698116, -0.3358005, -0.07777088, -0.017220518, 0.09951315, 0.14346397, -0.00101903, -0.11058069, 0.04126511, 0.029735077, 0.057961233, 0.000676652, 0.060527373, 0.03941653, 0.061162263, -0.14212698, -0.075682595, -0.12472814, -0.17888317, 0.26618096, 0.067657955, 0.11373681, -0.13349913, 0.14829925, -0.069696456, 0.18696573, 0.05467432, 0.081960134, -0.014616368, 0.11102715, 0.11257323, -0.09290354, -0.054629892, 0.042267025, 0.069468416, -0.14494409, -0.07542273, 0.002474462, -0.1690981, 0.09719052, -0.016227778, -0.07685678, -0.21807039, -0.13975208, 0.06805604, -0.057095014, -0.019715685, -0.15944514, -0.34713322, -0.20994808, 0.05530225], "neutral": [2.5403802, -0.6107809, 0.062300798, 1.49499, -0.64720786, 2.2524116, 2.5358746, -5.168618, -3.499977, -1.0449457, 0.15478604, -2.34535, -2.5848777, -1.3628726, 1.8815207, -1.1110901, -3.9774685, -4.7597775, -0.6708746, 0.0017258171, 2.0631378, -3.0336688, -0.6227669, 2.474963, -2.6115007, 0.26991248, -1.9374989, 0.9526677, 5.328921, -2.6247644, 0.044735555, 2.2181914, -4.052362, 2.8750932, 0.7703316, -1.9708306, -0.3956953, -2.4062173, -2.3324852, -2.1703327, 0.35780063, -2.869667, -0.15014786, -1.6218642, 0.33910915, 0.54017884, -2.4443815, 2.6439462, 2.1077006, 2.679039, 2.529034, 0.14207181, 0.46443367, -0.9520941, 1.1665174, -1.7227926, 3.6997166, -0.25603804, 0.32729462, 3.2004669, -1.4965214, 1.621521, 3.3546197, -2.644725], "target": 0.813217, "along": 8.906257, "delta": [1.2888645, 0.5096507, -1.1850222, 0.7431993, -0.056530923, 0.7120445, -1.1854942, -0.8671656, -1.0992159, 0.15355262, -0.39979988, 1.1187905, 0.71178937, -0.48512575, -2.4321089, -0.56327266, -0.124723375, 0.7207458, 1.0390693, -0.007380548, -0.80090487, 0.2988716, 0.21536282, 0.41979694, 0.0049008005, 0.43838277, 0.28548285, 0.4429811, -1.0293857, -0.5481478, -0.9033709, -1.2956005, 1.927874, 0.49002755, 0.8237638, -0.9668968, 1.0740898, -0.50479186, 1.3541404, 0.39599073, 0.5936142, -0.10586225, 0.8041385, 0.8153363, -0.6728742, -0.39566898, 0.3061282, 0.5031402, -1.0497893, -0.5462656, 0.017921833, -1.22473, 0.70392364, -0.117533244, -0.55665207, -1.5794226, -1.0121851, 0.4929108, -0.41352317, -0.14279518, -1.1548164, -2.5141885, -1.5205951, 0.40053865]} ] } ] @@ -113,8 +113,8 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 0, "basis": [-0.02494292, -0.13965261, -0.09160335, -0.04515198, -0.037039842, -0.11242032, 0.094287544, -0.13314334, 0.02299021, 0.0042860056, 0.18213591, -0.08136957, -0.12674399, 0.106292546, 0.27850297, -0.105050184, -0.14376242, -0.06342271, -0.0390402, -0.07921631, -0.17758784, -0.01174258, -0.00042112457, -0.045752365, -0.033314016, 0.0342396, -0.097021714, -0.1688728, 0.18724933, 0.029401379, 0.08053313, 0.18166712, -0.2539565, -0.105999865, -0.03896099, 0.018886654, -0.08138127, 0.0012501349, -0.181745, 0.053883404, 0.1322095, 0.09540836, -0.071745396, -0.14791274, 0.012778723, -0.12145279, -0.17731203, 0.09311104, 0.04345031, 0.11576097, -0.1291177, 0.30984548, -0.17551559, 0.17862473, 0.10226616, 0.11794804, 0.15051404, -0.059411973, -0.04073647, -0.070261985, 0.083905056, 0.14482883, 0.2931887, -0.005544116], "neutral": [2.5011036, -0.4328916, -0.22815919, 0.88161534, -0.82922167, 1.491485, 1.9539326, -3.9881096, -1.4245024, -2.1901445, -0.16345637, -2.71713, -1.2177546, -0.5948393, 2.36368, -1.9189181, -2.602368, -1.9446074, 1.5463581, 0.33549452, 0.7032369, -1.9593922, -0.65063, 1.5692993, -1.5085074, -1.6737885, -2.807972, 2.2502272, 2.972189, -0.03529877, 0.1057314, 3.2459009, -3.411113, 3.6565142, -1.2219691, 0.77729684, -1.2308892, -1.6396497, -1.736317, -1.9587177, -1.2799597, -3.049032, 0.20408136, -2.688755, 1.1541778, 0.7216564, -1.4041886, 2.2414868, 1.2284724, 0.47957373, 1.6112742, -0.015047793, -0.97778773, 0.08165591, -0.91091067, -3.4077399, 3.8692083, 0.13136284, 0.2638365, 2.9992876, -3.6165664, 2.2740467, 3.6357148, -1.6329161], "target": 0.8290411, "along": 14.65924, "delta": [-0.3031341, -1.697214, -1.1132659, -0.54873705, -0.45014936, -1.3662568, 1.1458871, -1.618106, 0.2794026, 0.052088305, 2.2135181, -0.9888935, -1.540334, 1.2917852, 3.3846781, -1.2766868, -1.7471608, -0.7707833, -0.47445998, -0.9627247, -2.1582448, -0.1427089, -0.0051179742, -0.5560337, -0.404869, 0.41611773, -1.1791159, -2.0523303, 2.2756622, 0.35731828, 0.97872823, 2.207821, -3.0863616, -1.2882283, -0.4734973, 0.22953163, -0.9890357, 0.01519303, -2.2087674, 0.6548511, 1.6067569, 1.1595085, -0.8719298, -1.7976003, 0.15530126, -1.4760295, -2.1548932, 1.1315889, 0.5280565, 1.4068561, -1.5691819, 3.765587, -2.1330607, 2.1708465, 1.2428522, 1.4334358, 1.829214, -0.7220404, -0.4950749, -0.85390186, 1.0197077, 1.7601211, 3.5631554, -0.06737826]}, - {"layer": 1, "basis": [0.032759067, -0.13314772, -0.04128816, -0.11289616, 0.023375977, -0.11517027, 0.12231716, -0.08102903, 0.051120073, 0.017500771, 0.17724757, -0.13217951, -0.05027826, 0.09021876, 0.23416683, -0.006712762, 0.0016444396, -0.18244062, -0.11891862, -0.041960504, -0.04127221, 0.01418096, -0.10312874, -0.002769091, -0.008398052, 0.10911036, -0.003349999, -0.14249031, 0.16507183, 0.069211185, 0.14665863, 0.14452334, -0.24081635, -0.08388082, -0.13391608, 0.07642385, -0.10556987, 0.014958295, -0.27333915, -0.03797991, 0.1049096, 0.11524216, -0.09412197, -0.14525123, 0.050785664, -0.05137568, -0.23252927, -0.023240367, 0.11796432, 0.04320953, -0.054238513, 0.3080224, -0.174124, 0.13288367, 0.14280891, 0.1960923, 0.08207218, -0.019696636, -0.1053515, -0.08753564, 0.046138033, 0.2510945, 0.20568748, -0.037384894], "neutral": [2.5403802, -0.6107809, 0.062300798, 1.49499, -0.64720786, 2.2524116, 2.5358746, -5.168618, -3.499977, -1.0449457, 0.15478604, -2.34535, -2.5848777, -1.3628726, 1.8815207, -1.1110901, -3.9774685, -4.7597775, -0.6708746, 0.0017258171, 2.0631378, -3.0336688, -0.6227669, 2.474963, -2.6115007, 0.26991248, -1.9374989, 0.9526677, 5.328921, -2.6247644, 0.044735555, 2.2181914, -4.052362, 2.8750932, 0.7703316, -1.9708306, -0.3956953, -2.4062173, -2.3324852, -2.1703327, 0.35780063, -2.869667, -0.15014786, -1.6218642, 0.33910915, 0.54017884, -2.4443815, 2.6439462, 2.1077006, 2.679039, 2.529034, 0.14207181, 0.46443367, -0.9520941, 1.1665174, -1.7227926, 3.6997166, -0.25603804, 0.32729462, 3.2004669, -1.4965214, 1.621521, 3.3546197, -2.644725], "target": 1.0402274, "along": 17.34076, "delta": [0.59091896, -2.401763, -0.7447696, -2.0364585, 0.42166364, -2.0774796, 2.2063978, -1.4616286, 0.92212087, 0.31568474, 3.1972506, -2.384298, -0.90693605, 1.6273961, 4.2239795, -0.12108704, 0.029662952, -3.2909248, -2.1450937, -0.75689757, -0.74448186, 0.25580087, -1.8602705, -0.049949784, -0.15148686, 1.9681691, -0.0604284, -2.5702877, 2.9776208, 1.2484543, 2.6454773, 2.6069603, -4.343926, -1.5130701, -2.415623, 1.3785589, -1.9043045, 0.26982272, -4.9305825, -0.68509424, 1.8923943, 2.0787764, -1.6978034, -2.6200902, 0.9160887, -0.9267316, -4.1944404, -0.4192175, 2.1278796, 0.77942795, -0.9783724, 5.556211, -3.1409068, 2.3969998, 2.5760348, 3.537178, 1.4804454, -0.3552945, -1.9003655, -1.578997, 0.8322532, 4.529326, 3.7102592, -0.67436117]} + {"layer": 0, "basis": [-0.02494292, -0.13965261, -0.09160335, -0.04515198, -0.037039842, -0.11242032, 0.094287544, -0.13314334, 0.02299021, 0.0042860056, 0.18213591, -0.08136957, -0.12674399, 0.106292546, 0.27850297, -0.105050184, -0.14376242, -0.06342271, -0.0390402, -0.07921631, -0.17758784, -0.01174258, -0.00042112457, -0.045752365, -0.033314016, 0.0342396, -0.097021714, -0.1688728, 0.18724933, 0.029401379, 0.08053313, 0.18166712, -0.2539565, -0.105999865, -0.03896099, 0.018886654, -0.08138127, 0.0012501349, -0.181745, 0.053883404, 0.1322095, 0.09540836, -0.071745396, -0.14791274, 0.012778723, -0.12145279, -0.17731203, 0.09311104, 0.04345031, 0.11576097, -0.1291177, 0.30984548, -0.17551559, 0.17862473, 0.10226616, 0.11794804, 0.15051404, -0.059411973, -0.04073647, -0.070261985, 0.083905056, 0.14482883, 0.2931887, -0.005544116], "neutral": [2.5011036, -0.4328916, -0.22815919, 0.88161534, -0.82922167, 1.491485, 1.9539326, -3.9881096, -1.4245024, -2.1901445, -0.16345637, -2.71713, -1.2177546, -0.5948393, 2.36368, -1.9189181, -2.602368, -1.9446074, 1.5463581, 0.33549452, 0.7032369, -1.9593922, -0.65063, 1.5692993, -1.5085074, -1.6737885, -2.807972, 2.2502272, 2.972189, -0.03529877, 0.1057314, 3.2459009, -3.411113, 3.6565142, -1.2219691, 0.77729684, -1.2308892, -1.6396497, -1.736317, -1.9587177, -1.2799597, -3.049032, 0.20408136, -2.688755, 1.1541778, 0.7216564, -1.4041886, 2.2414868, 1.2284724, 0.47957373, 1.6112742, -0.015047793, -0.97778773, 0.08165591, -0.91091067, -3.4077399, 3.8692083, 0.13136284, 0.2638365, 2.9992876, -3.6165664, 2.2740467, 3.6357148, -1.6329161], "target": 0.8290411, "along": 7.32962, "delta": [-0.15156706, -0.848607, -0.55663294, -0.27436852, -0.22507468, -0.6831284, 0.57294357, -0.809053, 0.1397013, 0.026044153, 1.1067591, -0.49444675, -0.770167, 0.6458926, 1.6923391, -0.6383434, -0.8735804, -0.38539165, -0.23722999, -0.48136234, -1.0791224, -0.07135445, -0.0025589871, -0.27801684, -0.2024345, 0.20805886, -0.58955795, -1.0261651, 1.1378311, 0.17865914, 0.48936412, 1.1039104, -1.5431808, -0.64411414, -0.23674865, 0.114765815, -0.49451786, 0.007596515, -1.1043837, 0.32742554, 0.80337846, 0.57975423, -0.4359649, -0.89880013, 0.07765063, -0.73801476, -1.0774466, 0.56579447, 0.26402825, 0.70342803, -0.78459096, 1.8827935, -1.0665303, 1.0854232, 0.6214261, 0.7167179, 0.914607, -0.3610202, -0.24753745, -0.42695093, 0.50985384, 0.88006055, 1.7815777, -0.03368913]}, + {"layer": 1, "basis": [0.032759067, -0.13314772, -0.04128816, -0.11289616, 0.023375977, -0.11517027, 0.12231716, -0.08102903, 0.051120073, 0.017500771, 0.17724757, -0.13217951, -0.05027826, 0.09021876, 0.23416683, -0.006712762, 0.0016444396, -0.18244062, -0.11891862, -0.041960504, -0.04127221, 0.01418096, -0.10312874, -0.002769091, -0.008398052, 0.10911036, -0.003349999, -0.14249031, 0.16507183, 0.069211185, 0.14665863, 0.14452334, -0.24081635, -0.08388082, -0.13391608, 0.07642385, -0.10556987, 0.014958295, -0.27333915, -0.03797991, 0.1049096, 0.11524216, -0.09412197, -0.14525123, 0.050785664, -0.05137568, -0.23252927, -0.023240367, 0.11796432, 0.04320953, -0.054238513, 0.3080224, -0.174124, 0.13288367, 0.14280891, 0.1960923, 0.08207218, -0.019696636, -0.1053515, -0.08753564, 0.046138033, 0.2510945, 0.20568748, -0.037384894], "neutral": [2.5403802, -0.6107809, 0.062300798, 1.49499, -0.64720786, 2.2524116, 2.5358746, -5.168618, -3.499977, -1.0449457, 0.15478604, -2.34535, -2.5848777, -1.3628726, 1.8815207, -1.1110901, -3.9774685, -4.7597775, -0.6708746, 0.0017258171, 2.0631378, -3.0336688, -0.6227669, 2.474963, -2.6115007, 0.26991248, -1.9374989, 0.9526677, 5.328921, -2.6247644, 0.044735555, 2.2181914, -4.052362, 2.8750932, 0.7703316, -1.9708306, -0.3956953, -2.4062173, -2.3324852, -2.1703327, 0.35780063, -2.869667, -0.15014786, -1.6218642, 0.33910915, 0.54017884, -2.4443815, 2.6439462, 2.1077006, 2.679039, 2.529034, 0.14207181, 0.46443367, -0.9520941, 1.1665174, -1.7227926, 3.6997166, -0.25603804, 0.32729462, 3.2004669, -1.4965214, 1.621521, 3.3546197, -2.644725], "target": 1.0402274, "along": 8.67038, "delta": [0.29545948, -1.2008815, -0.3723848, -1.0182292, 0.21083182, -1.0387398, 1.1031989, -0.7308143, 0.46106043, 0.15784237, 1.5986253, -1.192149, -0.45346802, 0.81369805, 2.1119897, -0.06054352, 0.014831476, -1.6454624, -1.0725468, -0.37844878, -0.37224093, 0.12790044, -0.93013525, -0.024974892, -0.07574343, 0.98408455, -0.0302142, -1.2851439, 1.4888104, 0.62422717, 1.3227386, 1.3034801, -2.171963, -0.75653505, -1.2078115, 0.68927944, -0.95215225, 0.13491136, -2.4652913, -0.34254712, 0.94619715, 1.0393882, -0.8489017, -1.3100451, 0.45804435, -0.4633658, -2.0972202, -0.20960875, 1.0639398, 0.38971397, -0.4891862, 2.7781055, -1.5704534, 1.1984999, 1.2880174, 1.768589, 0.7402227, -0.17764725, -0.95018274, -0.7894985, 0.4161266, 2.264663, 1.8551296, -0.33718058]} ] } ] diff --git a/tests/fixtures/browser/slens-qwen3-v1.json b/tests/fixtures/browser/slens-qwen3-v1.json index 661700734..3e4af1eac 100644 --- a/tests/fixtures/browser/slens-qwen3-v1.json +++ b/tests/fixtures/browser/slens-qwen3-v1.json @@ -97,8 +97,8 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 0, "basis": [-0.07931453, -0.12246916, -0.16453537, -0.115970545, -0.21538085, 0.023793044, -0.28852028, 0.052056924, -0.067378126, 0.13192481, 0.102334596, 0.07298193, -0.012125895, -0.10299612, 0.05759365, 0.050632954, 0.029705577, 0.061416443, -0.13525608, -0.11343656, -0.030696524, -0.18987505, 0.03810813, -0.13594797, -0.08431661, 0.06599875, 0.029417116, -0.008475727, 0.13334346, 0.06738309, -0.14784496, 0.09658085, 0.13021275, 0.22830507, 0.015633859, 0.13052553, -0.027490132, -0.13779122, 0.028715536, -0.09193954, 0.22643264, -0.14787316, -0.19346026, 0.09531763, -0.12573752, 0.23578282, 0.22218591, 0.00919784, -0.22634971, 0.055022925, -0.04290532, 0.04327456, 0.10952274, 0.009634347, 0.07494925, 0.030834772, 0.059639536, -0.15396632, -0.18145053, 0.20539851, -0.057229567, 0.08740259, 0.15480627, -0.14992079], "neutral": [-1.0697541, 0.5980025, -0.62266487, 0.48415062, 0.9949875, 1.4079958, 0.5412151, 0.24653126, -0.5583217, -0.0560521, 0.2563484, -1.9526263, 0.042111605, 0.91166836, 1.5351591, -0.22556959, 0.41342497, 1.7063704, -0.35431933, -0.6667204, 0.8396592, 0.5784123, -0.65091294, 0.4576738, -0.8654752, 0.17347713, -1.0710843, -0.026679069, -0.932949, 0.1308341, 1.2947704, -0.1102646, -0.50611275, -0.10273012, -0.0011565374, -0.9610713, 0.0007523571, -0.41574287, -1.1953559, -0.4055067, 0.9238321, -0.12423193, 1.8482071, 0.14442427, 0.5066812, -0.1547352, 0.31152064, 0.06653554, 0.9140094, -0.73482746, 0.5601327, -0.78795004, 0.17368877, 1.3637522, 0.255479, 0.9373276, -1.1588248, -0.15820484, -0.92295545, -0.26795825, 0.061374705, 0.9107198, -0.4912306, 1.0379199], "target": 0.07025936, "along": 12.939406, "delta": [-0.07210598, -0.11133848, -0.14958148, -0.1054305, -0.19580585, 0.0216306, -0.26229796, 0.0473257, -0.06125443, 0.119934745, 0.09303386, 0.066348925, -0.011023826, -0.09363526, 0.05235922, 0.046031147, 0.027005767, 0.055834576, -0.12296326, -0.10312681, -0.027906653, -0.17261815, 0.03464465, -0.12359227, -0.07665345, 0.060000416, 0.026743526, -0.007705406, 0.12122446, 0.061258934, -0.13440798, 0.08780304, 0.11837829, 0.20755544, 0.014212968, 0.11866264, -0.024991676, -0.12526798, 0.02610571, -0.08358356, 0.20585318, -0.13443363, -0.17587751, 0.08665464, -0.114309795, 0.21435356, 0.20199242, 0.008361889, -0.2057778, 0.050022136, -0.039005846, 0.039341528, 0.0995687, 0.008758724, 0.068137445, 0.028032336, 0.054219164, -0.139973, -0.1649593, 0.18673076, -0.052028228, 0.07945896, 0.14073661, -0.13629515]}, - {"layer": 1, "basis": [0.060204998, -0.07892801, -0.20260687, -0.11187498, -0.15268905, 0.20168659, -0.08323452, -0.014775404, -0.0059837503, 0.084210314, -0.03696094, 0.18444532, 0.14218482, -0.18984973, 0.08685574, 0.048308387, 0.26751167, 0.107108, -0.038171794, -0.11481353, 0.13036215, -0.112516485, 0.22888076, -0.22904307, 0.0010981498, 0.040816452, -0.039538518, -0.16586338, 0.028978353, 0.111817464, -0.040928453, 0.15048116, 0.0879544, 0.061195653, -0.053894393, -0.029815128, 0.15496027, -0.2578458, 0.046604335, -0.016664147, -0.19007033, 0.07338972, -0.013295977, -0.021023395, -0.13193066, 0.23235208, 0.19094752, -0.007639216, 0.017014736, -0.03830961, 0.012099011, -0.09638985, -0.09895401, -0.0017158975, 0.12821949, 0.054630212, -0.05447722, -0.08612954, -0.11621521, 0.09277057, 0.24700293, -0.068678685, 0.020228444, -0.24269103], "neutral": [-1.1489043, 0.66334873, -0.331071, 1.4405504, 0.7537279, 1.276424, 0.087124966, 0.26788065, -0.5330119, -0.7228864, 0.67532283, -1.9355294, -0.11008074, 0.20615493, 1.5101553, -0.20731449, 0.31628898, 1.8702863, -0.24037302, -0.34410205, 0.4802817, 0.22172844, -0.960725, 0.50646406, -1.4034104, 0.43842185, -0.5915393, -0.024377147, -1.1723615, -0.035872586, 0.8888337, -0.16504191, -0.2052579, 0.9123388, 0.9835431, -0.07350717, 0.68469554, -0.29789487, -1.7445227, 0.16906886, 1.1819685, -0.2213497, 2.156016, -0.07718279, -0.32519507, -0.9837756, 0.06553345, -0.54566085, 1.0326622, -0.5658421, 0.5097351, -0.89339787, -0.88046074, 1.4606498, 0.7556698, 1.0270442, -1.1929218, -0.068277635, -0.72793156, -0.110670745, 0.43531215, 0.8252082, -0.29633963, 1.8864964], "target": 0.06358813, "along": 19.060593, "delta": [0.07297011, -0.09566291, -0.24556507, -0.13559555, -0.18506332, 0.24444968, -0.100882515, -0.017908195, -0.007252469, 0.102065206, -0.044797674, 0.22355278, 0.1723319, -0.23010308, 0.10527153, 0.058551088, 0.32423148, 0.12981783, -0.04626526, -0.13915715, 0.1580025, -0.13637306, 0.27740976, -0.2776065, 0.0013309877, 0.04947066, -0.047921766, -0.20103095, 0.03512256, 0.13552584, -0.049606405, 0.18238729, 0.106603146, 0.074170806, -0.06532148, -0.03613675, 0.1878161, -0.31251615, 0.05648573, -0.020197403, -0.23037045, 0.08895034, -0.01611509, -0.025480932, -0.15990359, 0.28161708, 0.23143363, -0.009258939, 0.020622328, -0.046432298, 0.014664333, -0.116827145, -0.11993496, -0.0020797148, 0.15540554, 0.06621332, -0.06602788, -0.10439136, -0.14085601, 0.11244047, 0.2993743, -0.08324045, 0.024517428, -0.29414818]} + {"layer": 0, "basis": [-0.07931453, -0.12246916, -0.16453537, -0.115970545, -0.21538085, 0.023793044, -0.28852028, 0.052056924, -0.067378126, 0.13192481, 0.102334596, 0.07298193, -0.012125895, -0.10299612, 0.05759365, 0.050632954, 0.029705577, 0.061416443, -0.13525608, -0.11343656, -0.030696524, -0.18987505, 0.03810813, -0.13594797, -0.08431661, 0.06599875, 0.029417116, -0.008475727, 0.13334346, 0.06738309, -0.14784496, 0.09658085, 0.13021275, 0.22830507, 0.015633859, 0.13052553, -0.027490132, -0.13779122, 0.028715536, -0.09193954, 0.22643264, -0.14787316, -0.19346026, 0.09531763, -0.12573752, 0.23578282, 0.22218591, 0.00919784, -0.22634971, 0.055022925, -0.04290532, 0.04327456, 0.10952274, 0.009634347, 0.07494925, 0.030834772, 0.059639536, -0.15396632, -0.18145053, 0.20539851, -0.057229567, 0.08740259, 0.15480627, -0.14992079], "neutral": [-1.0697541, 0.5980025, -0.62266487, 0.48415062, 0.9949875, 1.4079958, 0.5412151, 0.24653126, -0.5583217, -0.0560521, 0.2563484, -1.9526263, 0.042111605, 0.91166836, 1.5351591, -0.22556959, 0.41342497, 1.7063704, -0.35431933, -0.6667204, 0.8396592, 0.5784123, -0.65091294, 0.4576738, -0.8654752, 0.17347713, -1.0710843, -0.026679069, -0.932949, 0.1308341, 1.2947704, -0.1102646, -0.50611275, -0.10273012, -0.0011565374, -0.9610713, 0.0007523571, -0.41574287, -1.1953559, -0.4055067, 0.9238321, -0.12423193, 1.8482071, 0.14442427, 0.5066812, -0.1547352, 0.31152064, 0.06653554, 0.9140094, -0.73482746, 0.5601327, -0.78795004, 0.17368877, 1.3637522, 0.255479, 0.9373276, -1.1588248, -0.15820484, -0.92295545, -0.26795825, 0.061374705, 0.9107198, -0.4912306, 1.0379199], "target": 0.07025936, "along": 6.469703, "delta": [-0.03605299, -0.05566924, -0.07479074, -0.05271525, -0.097902924, 0.0108153, -0.13114898, 0.02366285, -0.030627215, 0.059967373, 0.04651693, 0.033174463, -0.005511913, -0.04681763, 0.02617961, 0.023015574, 0.013502884, 0.027917288, -0.06148163, -0.051563405, -0.013953326, -0.086309075, 0.017322324, -0.061796136, -0.038326725, 0.030000208, 0.013371763, -0.003852703, 0.06061223, 0.030629467, -0.06720399, 0.04390152, 0.059189145, 0.10377772, 0.007106484, 0.05933132, -0.012495838, -0.06263399, 0.013052855, -0.04179178, 0.10292659, -0.06721681, -0.087938756, 0.04332732, -0.057154898, 0.10717678, 0.10099621, 0.0041809445, -0.1028889, 0.025011068, -0.019502923, 0.019670764, 0.04978435, 0.004379362, 0.034068722, 0.014016168, 0.027109582, -0.0699865, -0.08247965, 0.09336538, -0.026014114, 0.03972948, 0.070368305, -0.06814758]}, + {"layer": 1, "basis": [0.060204998, -0.07892801, -0.20260687, -0.11187498, -0.15268905, 0.20168659, -0.08323452, -0.014775404, -0.0059837503, 0.084210314, -0.03696094, 0.18444532, 0.14218482, -0.18984973, 0.08685574, 0.048308387, 0.26751167, 0.107108, -0.038171794, -0.11481353, 0.13036215, -0.112516485, 0.22888076, -0.22904307, 0.0010981498, 0.040816452, -0.039538518, -0.16586338, 0.028978353, 0.111817464, -0.040928453, 0.15048116, 0.0879544, 0.061195653, -0.053894393, -0.029815128, 0.15496027, -0.2578458, 0.046604335, -0.016664147, -0.19007033, 0.07338972, -0.013295977, -0.021023395, -0.13193066, 0.23235208, 0.19094752, -0.007639216, 0.017014736, -0.03830961, 0.012099011, -0.09638985, -0.09895401, -0.0017158975, 0.12821949, 0.054630212, -0.05447722, -0.08612954, -0.11621521, 0.09277057, 0.24700293, -0.068678685, 0.020228444, -0.24269103], "neutral": [-1.1489043, 0.66334873, -0.331071, 1.4405504, 0.7537279, 1.276424, 0.087124966, 0.26788065, -0.5330119, -0.7228864, 0.67532283, -1.9355294, -0.11008074, 0.20615493, 1.5101553, -0.20731449, 0.31628898, 1.8702863, -0.24037302, -0.34410205, 0.4802817, 0.22172844, -0.960725, 0.50646406, -1.4034104, 0.43842185, -0.5915393, -0.024377147, -1.1723615, -0.035872586, 0.8888337, -0.16504191, -0.2052579, 0.9123388, 0.9835431, -0.07350717, 0.68469554, -0.29789487, -1.7445227, 0.16906886, 1.1819685, -0.2213497, 2.156016, -0.07718279, -0.32519507, -0.9837756, 0.06553345, -0.54566085, 1.0326622, -0.5658421, 0.5097351, -0.89339787, -0.88046074, 1.4606498, 0.7556698, 1.0270442, -1.1929218, -0.068277635, -0.72793156, -0.110670745, 0.43531215, 0.8252082, -0.29633963, 1.8864964], "target": 0.06358813, "along": 9.530296, "delta": [0.036485054, -0.047831453, -0.122782536, -0.06779777, -0.09253166, 0.12222484, -0.050441258, -0.0089540975, -0.0036262346, 0.051032603, -0.022398837, 0.11177639, 0.08616595, -0.11505154, 0.052635767, 0.029275544, 0.16211574, 0.064908914, -0.02313263, -0.06957857, 0.07900125, -0.06818653, 0.13870488, -0.13880324, 0.00066549383, 0.02473533, -0.023960883, -0.10051548, 0.01756128, 0.06776292, -0.024803203, 0.091193646, 0.053301573, 0.037085403, -0.03266074, -0.018068375, 0.09390805, -0.15625808, 0.028242866, -0.010098701, -0.11518522, 0.04447517, -0.008057545, -0.012740466, -0.07995179, 0.14080854, 0.115716815, -0.0046294695, 0.010311164, -0.023216149, 0.0073321667, -0.058413573, -0.05996748, -0.0010398574, 0.07770277, 0.03310666, -0.03301394, -0.05219568, -0.07042801, 0.056220233, 0.14968716, -0.041620225, 0.012258714, -0.14707409]} ] } ] @@ -113,8 +113,8 @@ "coefficient": 0.3, "trigger": {"prompt": true, "generated": true, "thinking": true, "response": true, "first_n": null, "after_n": null, "gate": null}, "layers": [ - {"layer": 0, "basis": [-0.19958073, -0.08145837, 0.22413544, -0.20192559, 0.022343306, -0.08763192, 0.2035819, 0.04618346, 0.13442402, -0.13461745, 0.11101245, -0.09523259, -0.020882819, -0.044912506, 0.1294064, 0.11601941, 0.021291481, -0.04612004, 0.12059544, -0.1663104, -0.16308436, -0.08882432, 0.20645614, 0.07792743, 0.26914465, -0.018985258, -0.044379123, 0.045076933, -0.14794363, 0.12332187, 0.13810498, -0.11908522, -0.1349293, -0.08662834, -0.006223082, -0.15805805, 0.03930701, -0.23237604, 0.25393954, -0.045535885, -0.048770983, 0.14496192, 0.03141398, -0.06645991, -0.26625946, 0.09278173, -0.038624752, 0.127323, 0.160515, 0.083227366, -0.078424014, -0.044409182, 0.048930533, 0.17084911, -0.06924671, -0.04507053, 0.05451431, -0.040980816, -0.09215231, 0.13196403, -0.072817996, -0.077248916, 0.0050990935, -0.15965436], "neutral": [-1.0697541, 0.5980025, -0.62266487, 0.48415062, 0.9949875, 1.4079958, 0.5412151, 0.24653126, -0.5583217, -0.0560521, 0.2563484, -1.9526263, 0.042111605, 0.91166836, 1.5351591, -0.22556959, 0.41342497, 1.7063704, -0.35431933, -0.6667204, 0.8396592, 0.5784123, -0.65091294, 0.4576738, -0.8654752, 0.17347713, -1.0710843, -0.026679069, -0.932949, 0.1308341, 1.2947704, -0.1102646, -0.50611275, -0.10273012, -0.0011565374, -0.9610713, 0.0007523571, -0.41574287, -1.1953559, -0.4055067, 0.9238321, -0.12423193, 1.8482071, 0.14442427, 0.5066812, -0.1547352, 0.31152064, 0.06653554, 0.9140094, -0.73482746, 0.5601327, -0.78795004, 0.17368877, 1.3637522, 0.255479, 0.9373276, -1.1588248, -0.15820484, -0.92295545, -0.26795825, 0.061374705, 0.9107198, -0.4912306, 1.0379199], "target": 0.055098016, "along": 12.045168, "delta": [-0.13245471, -0.054061055, 0.14875081, -0.13401093, 0.014828466, -0.058158226, 0.13511015, 0.03065034, 0.0892125, -0.08934087, 0.07367506, -0.06320252, -0.013859193, -0.029806852, 0.08588248, 0.076998, 0.014130408, -0.03060825, 0.08003496, -0.11037437, -0.108233355, -0.05894958, 0.13701768, 0.051717702, 0.17862184, -0.012599849, -0.029452864, 0.029915977, -0.098184995, 0.08184439, 0.09165542, -0.079032674, -0.089547835, -0.057492185, -0.0041300408, -0.104897566, 0.02608668, -0.1542198, 0.16853076, -0.030220566, -0.032367587, 0.096206136, 0.020848352, -0.044107106, -0.17670704, 0.06157597, -0.025633892, 0.084499806, 0.10652816, 0.05523508, -0.05204726, -0.029472813, 0.032473475, 0.11338655, -0.045956604, -0.029911725, 0.036179233, -0.027197527, -0.06115825, 0.08757989, -0.048326742, -0.05126739, 0.003384089, -0.105956994]}, - {"layer": 1, "basis": [-0.07895516, -0.035455264, 0.12136898, 0.014711058, -0.03701754, -0.06297682, -0.033002548, 0.18134588, -0.035372455, -0.07176161, -0.19931668, -0.09396985, -0.2100877, -0.19545409, -0.18631952, 0.050205994, -0.29362515, -0.15125582, -0.066107705, -0.09388175, -0.06790409, -0.23653482, 0.1368686, -0.048963014, 0.10452273, 0.012486342, 0.07824354, 0.18426828, 0.20075367, -0.019425245, 0.046544567, -0.12571421, -0.05069881, 0.06997223, -0.12322348, -0.016183747, -0.2279949, 0.027722763, -0.068274565, 0.0626839, 0.11848527, -0.13320278, 0.09871968, -0.037807234, 0.21766773, -0.024087818, 0.1903943, 0.019456774, -0.11842995, -0.026739074, -0.093491666, -0.2460044, -0.109963104, -0.14570597, 0.12017271, -0.041100863, -0.1108998, 0.07915705, -0.030900132, -0.08139733, -0.14120144, 0.18057138, 0.02045859, 0.15994823], "neutral": [-1.1489043, 0.66334873, -0.331071, 1.4405504, 0.7537279, 1.276424, 0.087124966, 0.26788065, -0.5330119, -0.7228864, 0.67532283, -1.9355294, -0.11008074, 0.20615493, 1.5101553, -0.20731449, 0.31628898, 1.8702863, -0.24037302, -0.34410205, 0.4802817, 0.22172844, -0.960725, 0.50646406, -1.4034104, 0.43842185, -0.5915393, -0.024377147, -1.1723615, -0.035872586, 0.8888337, -0.16504191, -0.2052579, 0.9123388, 0.9835431, -0.07350717, 0.68469554, -0.29789487, -1.7445227, 0.16906886, 1.1819685, -0.2213497, 2.156016, -0.07718279, -0.32519507, -0.9837756, 0.06553345, -0.54566085, 1.0326622, -0.5658421, 0.5097351, -0.89339787, -0.88046074, 1.4606498, 0.7556698, 1.0270442, -1.1929218, -0.068277635, -0.72793156, -0.110670745, 0.43531215, 0.8252082, -0.29633963, 1.8864964], "target": 0.07082396, "along": 19.954832, "delta": [-0.11158576, -0.050108224, 0.17152838, 0.020790847, -0.052316155, -0.089003906, -0.04664185, 0.25629255, -0.049991194, -0.101419255, -0.28169033, -0.13280573, -0.2969128, -0.2762314, -0.2633217, 0.070955135, -0.4149746, -0.21376686, -0.093428716, -0.13268122, -0.09596751, -0.33428997, 0.19343369, -0.06919846, 0.1477199, 0.017646702, 0.11058005, 0.2604227, 0.2837212, -0.027453315, 0.06578051, -0.17766942, -0.07165162, 0.09889037, -0.17414932, -0.02287217, -0.32222068, 0.039180033, -0.0964911, 0.088589914, 0.1674529, -0.18825285, 0.13951857, -0.05343222, 0.3076255, -0.03404284, 0.2690805, 0.027497873, -0.16737472, -0.037789803, -0.13212992, -0.34767315, -0.15540868, -0.20592338, 0.16983771, -0.058087036, -0.1567325, 0.111871086, -0.043670546, -0.11503723, -0.1995572, 0.25519797, 0.028913721, 0.22605167]} + {"layer": 0, "basis": [-0.19958073, -0.08145837, 0.22413544, -0.20192559, 0.022343306, -0.08763192, 0.2035819, 0.04618346, 0.13442402, -0.13461745, 0.11101245, -0.09523259, -0.020882819, -0.044912506, 0.1294064, 0.11601941, 0.021291481, -0.04612004, 0.12059544, -0.1663104, -0.16308436, -0.08882432, 0.20645614, 0.07792743, 0.26914465, -0.018985258, -0.044379123, 0.045076933, -0.14794363, 0.12332187, 0.13810498, -0.11908522, -0.1349293, -0.08662834, -0.006223082, -0.15805805, 0.03930701, -0.23237604, 0.25393954, -0.045535885, -0.048770983, 0.14496192, 0.03141398, -0.06645991, -0.26625946, 0.09278173, -0.038624752, 0.127323, 0.160515, 0.083227366, -0.078424014, -0.044409182, 0.048930533, 0.17084911, -0.06924671, -0.04507053, 0.05451431, -0.040980816, -0.09215231, 0.13196403, -0.072817996, -0.077248916, 0.0050990935, -0.15965436], "neutral": [-1.0697541, 0.5980025, -0.62266487, 0.48415062, 0.9949875, 1.4079958, 0.5412151, 0.24653126, -0.5583217, -0.0560521, 0.2563484, -1.9526263, 0.042111605, 0.91166836, 1.5351591, -0.22556959, 0.41342497, 1.7063704, -0.35431933, -0.6667204, 0.8396592, 0.5784123, -0.65091294, 0.4576738, -0.8654752, 0.17347713, -1.0710843, -0.026679069, -0.932949, 0.1308341, 1.2947704, -0.1102646, -0.50611275, -0.10273012, -0.0011565374, -0.9610713, 0.0007523571, -0.41574287, -1.1953559, -0.4055067, 0.9238321, -0.12423193, 1.8482071, 0.14442427, 0.5066812, -0.1547352, 0.31152064, 0.06653554, 0.9140094, -0.73482746, 0.5601327, -0.78795004, 0.17368877, 1.3637522, 0.255479, 0.9373276, -1.1588248, -0.15820484, -0.92295545, -0.26795825, 0.061374705, 0.9107198, -0.4912306, 1.0379199], "target": 0.055098016, "along": 6.022584, "delta": [-0.066227354, -0.027030528, 0.074375406, -0.06700546, 0.007414233, -0.029079113, 0.06755508, 0.01532517, 0.04460625, -0.044670437, 0.03683753, -0.03160126, -0.0069295964, -0.014903426, 0.04294124, 0.038499, 0.007065204, -0.015304125, 0.04001748, -0.055187184, -0.054116677, -0.02947479, 0.06850884, 0.025858851, 0.08931092, -0.0062999246, -0.014726432, 0.014957989, -0.049092498, 0.040922195, 0.04582771, -0.039516337, -0.044773918, -0.028746093, -0.0020650204, -0.052448783, 0.01304334, -0.0771099, 0.08426538, -0.015110283, -0.016183794, 0.048103068, 0.010424176, -0.022053553, -0.08835352, 0.030787986, -0.012816946, 0.042249903, 0.05326408, 0.02761754, -0.02602363, -0.0147364065, 0.016236737, 0.056693275, -0.022978302, -0.014955862, 0.018089617, -0.013598763, -0.030579126, 0.043789946, -0.024163371, -0.025633695, 0.0016920445, -0.052978497]}, + {"layer": 1, "basis": [-0.07895516, -0.035455264, 0.12136898, 0.014711058, -0.03701754, -0.06297682, -0.033002548, 0.18134588, -0.035372455, -0.07176161, -0.19931668, -0.09396985, -0.2100877, -0.19545409, -0.18631952, 0.050205994, -0.29362515, -0.15125582, -0.066107705, -0.09388175, -0.06790409, -0.23653482, 0.1368686, -0.048963014, 0.10452273, 0.012486342, 0.07824354, 0.18426828, 0.20075367, -0.019425245, 0.046544567, -0.12571421, -0.05069881, 0.06997223, -0.12322348, -0.016183747, -0.2279949, 0.027722763, -0.068274565, 0.0626839, 0.11848527, -0.13320278, 0.09871968, -0.037807234, 0.21766773, -0.024087818, 0.1903943, 0.019456774, -0.11842995, -0.026739074, -0.093491666, -0.2460044, -0.109963104, -0.14570597, 0.12017271, -0.041100863, -0.1108998, 0.07915705, -0.030900132, -0.08139733, -0.14120144, 0.18057138, 0.02045859, 0.15994823], "neutral": [-1.1489043, 0.66334873, -0.331071, 1.4405504, 0.7537279, 1.276424, 0.087124966, 0.26788065, -0.5330119, -0.7228864, 0.67532283, -1.9355294, -0.11008074, 0.20615493, 1.5101553, -0.20731449, 0.31628898, 1.8702863, -0.24037302, -0.34410205, 0.4802817, 0.22172844, -0.960725, 0.50646406, -1.4034104, 0.43842185, -0.5915393, -0.024377147, -1.1723615, -0.035872586, 0.8888337, -0.16504191, -0.2052579, 0.9123388, 0.9835431, -0.07350717, 0.68469554, -0.29789487, -1.7445227, 0.16906886, 1.1819685, -0.2213497, 2.156016, -0.07718279, -0.32519507, -0.9837756, 0.06553345, -0.54566085, 1.0326622, -0.5658421, 0.5097351, -0.89339787, -0.88046074, 1.4606498, 0.7556698, 1.0270442, -1.1929218, -0.068277635, -0.72793156, -0.110670745, 0.43531215, 0.8252082, -0.29633963, 1.8864964], "target": 0.07082396, "along": 9.977416, "delta": [-0.05579288, -0.025054112, 0.08576419, 0.0103954235, -0.026158078, -0.044501953, -0.023320924, 0.12814628, -0.024995597, -0.050709628, -0.14084516, -0.06640287, -0.1484564, -0.1381157, -0.13166085, 0.035477567, -0.2074873, -0.10688343, -0.046714358, -0.06634061, -0.047983754, -0.16714498, 0.09671684, -0.03459923, 0.07385995, 0.008823351, 0.055290025, 0.13021135, 0.1418606, -0.013726657, 0.032890256, -0.08883471, -0.03582581, 0.049445186, -0.08707466, -0.011436085, -0.16111034, 0.019590016, -0.04824555, 0.044294957, 0.08372645, -0.094126426, 0.06975929, -0.02671611, 0.15381275, -0.01702142, 0.13454024, 0.013748936, -0.08368736, -0.018894901, -0.06606496, -0.17383657, -0.07770434, -0.10296169, 0.08491886, -0.029043518, -0.07836625, 0.055935543, -0.021835273, -0.057518616, -0.0997786, 0.12759899, 0.014456861, 0.11302584]} ] } ] diff --git a/tests/fixtures/browser/steering-term-layers-v1.json b/tests/fixtures/browser/steering-term-layers-v1.json index 624091d91..041ad0d28 100644 --- a/tests/fixtures/browser/steering-term-layers-v1.json +++ b/tests/fixtures/browser/steering-term-layers-v1.json @@ -289,12 +289,12 @@ "curvedGroups": [ { "layer": 0, - "along": 0.7999999999999999, + "along": 0.39999999999999997, "onto": 0.16666666666666666 }, { "layer": 1, - "along": 1.5999999999999999, + "along": 0.7999999999999999, "onto": 0.3333333333333333 } ] @@ -326,7 +326,7 @@ "curvedGroups": [ { "layer": 0, - "along": 1.2, + "along": 0.6, "onto": 0.25 } ] diff --git a/tests/fixtures/browser/token-anatomy-gemma3-v1.json b/tests/fixtures/browser/token-anatomy-gemma3-v1.json index 63c2665e7..c6f994ed0 100644 --- a/tests/fixtures/browser/token-anatomy-gemma3-v1.json +++ b/tests/fixtures/browser/token-anatomy-gemma3-v1.json @@ -444,7 +444,7 @@ "provenance": "replayed", "instruments": {}, "anatomy": { - "token": {"raw_index": 3, "token_id": 89, "token": "v", "position": 37, "prompt_length": 35, "probability": 0.000226}, + "token": {"raw_index": 3, "token_id": 89, "token": "v", "position": 37, "prompt_length": 35, "probability": 0.000224}, "binding": { "sources": {"R": "local:r", "S": "local:s"}, "steering": "0.3 neuron/L2n7 + !head/L1h3" @@ -539,9 +539,9 @@ }, "steering": null, "neurons": [ - {"unit": "neuron/L0n92", "kind": "neuron", "layer": 0, "index": 92, "contribution": 0.265318, "activation": -4.215183, "activation_over_scale": -1.577979}, - {"unit": "neuron/L0n24", "kind": "neuron", "layer": 0, "index": 24, "contribution": -0.19056, "activation": -1.29512, "activation_over_scale": -0.754229}, - {"unit": "neuron/L0n1", "kind": "neuron", "layer": 0, "index": 1, "contribution": 0.125733, "activation": 3.042198, "activation_over_scale": 0.893508} + {"unit": "neuron/L0n92", "kind": "neuron", "layer": 0, "index": 92, "contribution": 0.271058, "activation": -4.215183, "activation_over_scale": -1.577979}, + {"unit": "neuron/L0n24", "kind": "neuron", "layer": 0, "index": 24, "contribution": -0.194682, "activation": -1.29512, "activation_over_scale": -0.754229}, + {"unit": "neuron/L0n1", "kind": "neuron", "layer": 0, "index": 1, "contribution": 0.128453, "activation": 3.042198, "activation_over_scale": 0.893508} ], "heads": [] }, @@ -634,14 +634,14 @@ }, "steering": null, "neurons": [ - {"unit": "neuron/L1n90", "kind": "neuron", "layer": 1, "index": 90, "contribution": 0.247644, "activation": 2.481558, "activation_over_scale": 0.650615}, - {"unit": "neuron/L1n16", "kind": "neuron", "layer": 1, "index": 16, "contribution": -0.164879, "activation": -1.668996, "activation_over_scale": -0.768124}, - {"unit": "neuron/L1n65", "kind": "neuron", "layer": 1, "index": 65, "contribution": -0.152584, "activation": 1.005004, "activation_over_scale": 0.702481} + {"unit": "neuron/L1n90", "kind": "neuron", "layer": 1, "index": 90, "contribution": 0.253001, "activation": 2.481558, "activation_over_scale": 0.650615}, + {"unit": "neuron/L1n16", "kind": "neuron", "layer": 1, "index": 16, "contribution": -0.168446, "activation": -1.668996, "activation_over_scale": -0.768124}, + {"unit": "neuron/L1n65", "kind": "neuron", "layer": 1, "index": 65, "contribution": -0.155885, "activation": 1.005004, "activation_over_scale": 0.702481} ], "heads": [ - {"unit": "head/L1h1", "kind": "head", "layer": 1, "index": 1, "contribution": 0.61765, "activation": 5.085099, "activation_over_scale": 0.757551}, - {"unit": "head/L1h0", "kind": "head", "layer": 1, "index": 0, "contribution": -0.429213, "activation": 5.660512, "activation_over_scale": 0.690551}, - {"unit": "head/L1h3", "kind": "head", "layer": 1, "index": 3, "contribution": 0.268256, "activation": 2.676031, "activation_over_scale": 0.437872} + {"unit": "head/L1h1", "kind": "head", "layer": 1, "index": 1, "contribution": 0.631012, "activation": 5.085099, "activation_over_scale": 0.757551}, + {"unit": "head/L1h0", "kind": "head", "layer": 1, "index": 0, "contribution": -0.438498, "activation": 5.660512, "activation_over_scale": 0.690551}, + {"unit": "head/L1h3", "kind": "head", "layer": 1, "index": 3, "contribution": 0.27406, "activation": 2.676031, "activation_over_scale": 0.437872} ] }, { @@ -709,9 +709,9 @@ "lens": "logit", "centred": false, "tokens": [ - {"token_id": 235, "token": "�", "value": 0.998637}, - {"token_id": 89, "token": "v", "value": 0.000226}, - {"token_id": 234, "token": "�", "value": 0.000176} + {"token_id": 235, "token": "�", "value": 0.998896}, + {"token_id": 89, "token": "v", "value": 0.000224}, + {"token_id": 234, "token": "�", "value": 0.000108} ], "absent": null }, @@ -729,9 +729,9 @@ "lens": "R:mid", "centred": false, "tokens": [ - {"token_id": 234, "token": "�", "value": 0.26076}, - {"token_id": 86, "token": "s", "value": 0.052225}, - {"token_id": 41, "token": "F", "value": 0.044973} + {"token_id": 234, "token": "�", "value": 0.18177}, + {"token_id": 64, "token": "]", "value": 0.056144}, + {"token_id": 66, "token": "_", "value": 0.042557} ], "absent": null }, @@ -749,9 +749,9 @@ "lens": "logit", "centred": false, "tokens": [ - {"token_id": 30, "token": ";", "value": 0.208966}, - {"token_id": 174, "token": "�", "value": 0.112482}, - {"token_id": 208, "token": "\u0010", "value": 0.053756} + {"token_id": 30, "token": ";", "value": 0.140065}, + {"token_id": 80, "token": "m", "value": 0.101418}, + {"token_id": 174, "token": "�", "value": 0.085876} ], "absent": null }, @@ -759,27 +759,27 @@ }, "steering": null, "neurons": [ - {"unit": "neuron/L3n65", "kind": "neuron", "layer": 3, "index": 65, "contribution": -0.255836, "activation": 1.495119, "activation_over_scale": 2.319434}, - {"unit": "neuron/L3n1", "kind": "neuron", "layer": 3, "index": 1, "contribution": -0.210966, "activation": -1.089777, "activation_over_scale": -0.328134}, - {"unit": "neuron/L3n40", "kind": "neuron", "layer": 3, "index": 40, "contribution": -0.200458, "activation": 1.33257, "activation_over_scale": 0.582483} + {"unit": "neuron/L3n65", "kind": "neuron", "layer": 3, "index": 65, "contribution": -0.273505, "activation": 1.574331, "activation_over_scale": 2.442317}, + {"unit": "neuron/L3n80", "kind": "neuron", "layer": 3, "index": 80, "contribution": 0.217317, "activation": -1.343226, "activation_over_scale": -0.368941}, + {"unit": "neuron/L3n1", "kind": "neuron", "layer": 3, "index": 1, "contribution": -0.187714, "activation": -0.955073, "activation_over_scale": -0.287574} ], "heads": [ - {"unit": "head/L3h3", "kind": "head", "layer": 3, "index": 3, "contribution": 0.275013, "activation": 2.890898, "activation_over_scale": 0.496523}, - {"unit": "head/L3h0", "kind": "head", "layer": 3, "index": 0, "contribution": 0.228595, "activation": 3.589121, "activation_over_scale": 0.573981}, - {"unit": "head/L3h1", "kind": "head", "layer": 3, "index": 1, "contribution": 0.121541, "activation": 4.230285, "activation_over_scale": 0.811455} + {"unit": "head/L3h0", "kind": "head", "layer": 3, "index": 0, "contribution": 0.288128, "activation": 3.498374, "activation_over_scale": 0.559468}, + {"unit": "head/L3h3", "kind": "head", "layer": 3, "index": 3, "contribution": 0.286197, "activation": 3.378534, "activation_over_scale": 0.580276}, + {"unit": "head/L3h2", "kind": "head", "layer": 3, "index": 2, "contribution": 0.108145, "activation": 4.429549, "activation_over_scale": 0.868321} ] } ], "units": [ - {"unit": "head/L1h1", "kind": "head", "layer": 1, "index": 1, "contribution": 0.61765, "activation": null, "activation_over_scale": null}, - {"unit": "head/L1h0", "kind": "head", "layer": 1, "index": 0, "contribution": -0.429213, "activation": null, "activation_over_scale": null}, - {"unit": "head/L3h3", "kind": "head", "layer": 3, "index": 3, "contribution": 0.275013, "activation": null, "activation_over_scale": null} + {"unit": "head/L1h1", "kind": "head", "layer": 1, "index": 1, "contribution": 0.631012, "activation": null, "activation_over_scale": null}, + {"unit": "head/L1h0", "kind": "head", "layer": 1, "index": 0, "contribution": -0.438498, "activation": null, "activation_over_scale": null}, + {"unit": "head/L3h0", "kind": "head", "layer": 3, "index": 0, "contribution": 0.288128, "activation": null, "activation_over_scale": null} ], "units_absent": null, "units_scale": "neutral", "patterns": [ - {"unit": "head/L1h1", "layer": 1, "head": 1, "contribution": 0.61765, "weights": [0.022336, 0.062347, 0.007904, 0.037203, 0.010624, 0.002121, 0.00468, 0.012376, 0.006731, 0.005794, 0.100515, 0.007583, 0.053267, 0.008189, 0.04048, 0.03428, 0.003374, 0.002958, 0.012269, 0.037101, 0.007615, 0.00836, 0.266196, 0.010719, 0.003962, 0.005337, 0.007372, 0.004007, 0.013467, 0.03351, 0.014436, 0.007153, 0.00788, 0.046682, 0.004022, 0.004034, 0.019171, 0.063944]}, - {"unit": "head/L1h0", "layer": 1, "head": 0, "contribution": -0.429213, "weights": [0.002693, 0.013983, 0.012361, 0.001403, 0.033336, 0.13111, 0.04639, 0.016847, 0.042002, 0.011377, 0.005741, 0.125858, 0.016956, 0.046482, 0.001674, 0.012127, 0.036897, 0.028198, 0.044821, 0.028732, 0.004749, 0.007203, 0.001104, 0.017163, 0.098674, 0.031132, 0.014673, 0.01294, 0.017506, 0.018386, 0.003288, 0.006994, 0.035563, 0.006245, 0.025073, 0.026321, 0.008918, 0.005078]} + {"unit": "head/L1h1", "layer": 1, "head": 1, "contribution": 0.631012, "weights": [0.022336, 0.062347, 0.007904, 0.037203, 0.010624, 0.002121, 0.00468, 0.012376, 0.006731, 0.005794, 0.100515, 0.007583, 0.053267, 0.008189, 0.04048, 0.03428, 0.003374, 0.002958, 0.012269, 0.037101, 0.007615, 0.00836, 0.266196, 0.010719, 0.003962, 0.005337, 0.007372, 0.004007, 0.013467, 0.03351, 0.014436, 0.007153, 0.00788, 0.046682, 0.004022, 0.004034, 0.019171, 0.063944]}, + {"unit": "head/L1h0", "layer": 1, "head": 0, "contribution": -0.438498, "weights": [0.002693, 0.013983, 0.012361, 0.001403, 0.033336, 0.13111, 0.04639, 0.016847, 0.042002, 0.011377, 0.005741, 0.125858, 0.016956, 0.046482, 0.001674, 0.012127, 0.036897, 0.028198, 0.044821, 0.028732, 0.004749, 0.007203, 0.001104, 0.017163, 0.098674, 0.031132, 0.014673, 0.01294, 0.017506, 0.018386, 0.003288, 0.006994, 0.035563, 0.006245, 0.025073, 0.026321, 0.008918, 0.005078]} ], "context": ["", "", "u", "s", "e", "r", "\n", "B", "e", " ", "b", "r", "i", "e", "f", ".", "\n", "\n", "H", "i", " ", "t", "h", "e", "r", "e", "", "\n", "", "m", "o", "d", "e", "l", "\n", "\n", "�", "�"] } @@ -789,18 +789,18 @@ "ids": [1, 3, 88, 86, 72, 85, 202, 37, 72, 224, 69, 85, 76, 72, 73, 17, 202, 202, 43, 76, 224, 87, 75, 72, 85, 72, 2, 202, 3, 80, 82, 71, 72, 79, 202, 202, 228, 235], "token_id": 89, "taps": { - "block_in": {"shape": [4, 64], "values": [3.5, 2.0, 3.0, -3.0, 3.0, 3.5, 2.5, -3.5, 2.5, -2.5, 1.0, -3.5, 0.5, 0.0, 2.5, 2.0, 2.5, -3.5, -3.5, 3.0, -2.5, 0.0, -3.5, -1.0, 0.0, 3.5, -1.0, 0.0, -0.5, -3.5, -3.0, -3.0, -3.5, -3.0, -2.0, -2.5, 0.5, -2.5, -2.0, 1.5, -3.0, -2.0, 3.5, 3.5, 1.0, 2.0, -3.5, -3.5, 3.5, -2.5, -3.0, 3.5, -3.0, 1.0, 3.0, 0.5, 1.5, -1.5, -1.5, -1.0, 0.5, -0.5, 1.5, -2.5, 5.866659, 3.3853152, -0.47496808, -3.9847457, 3.586886, 5.582507, 4.689533, -4.5920296, 2.7015626, -5.0583353, 1.2386763, -6.1506996, -0.036301255, -0.15771404, 2.2554529, 3.3979175, 0.23751616, -4.9194136, -5.616635, 2.9294562, -2.714249, 0.8676803, -3.3088486, -2.1013122, -0.2479593, 1.9627278, -1.2775438, 0.4123786, 1.1868973, -3.8506527, -1.917929, -2.6642852, -3.1694672, -5.2656584, -2.3793547, -4.1837435, -0.2275868, -2.8748593, -3.1232617, 2.0305095, -2.1752, -1.8135729, 6.3436017, 3.1883223, 1.5445291, 1.0250044, -4.5633817, -4.42474, 1.9914378, -4.656364, -1.8730792, 3.0051038, -4.4196973, 3.429342, 3.523611, 0.6154871, 4.7071023, 0.2834525, -2.1396394, 0.29152226, -0.5003052, -2.1443355, 1.0301528, -5.0127482, 6.4261723, 2.9317732, -0.21957722, -5.8523364, 4.366227, 2.2610269, 7.900812, -3.4554758, 1.1347916, -3.6040225, 1.0499359, -4.8314357, 1.3965006, 1.3811493, 1.7837291, 3.3932855, 1.3263781, -5.215716, -4.858269, 4.084514, -0.7311181, 0.31519988, -4.1438837, -1.5942998, 1.2141271, 2.2265377, -0.075425856, -0.8472178, 2.8287406, -6.505052, -1.93312, -1.400544, -3.3443267, -7.4520364, -3.0517313, -6.20548, -1.2591413, -6.05395, -1.8287886, 0.86917293, -1.6877487, -0.9164989, 7.465926, 2.5978768, 2.5172338, 2.5201411, -5.2141533, -5.4859242, 1.235686, -7.4736457, -2.6875043, 4.504106, -1.7943828, 3.8846602, 3.784665, -0.1997031, 3.3161368, 1.6132933, -1.8377407, -0.31469393, -1.1815001, -3.6265614, 0.09862316, -8.117807, 5.0398726, 2.411446, -3.072257, -6.319954, 3.7441316, 0.5934651, 9.462037, -5.7873306, -0.17545635, -3.9640262, 1.6652495, -5.0891447, 3.0124009, 3.7736092, -2.1221213, 5.0764294, 3.000593, -4.805947, -3.916577, 3.5454183, -1.4426523, -1.47081, -4.0744452, -3.1475625, -0.7201655, -0.09466556, 1.0820942, 3.9691863, -0.34102213, -7.812705, -0.5205893, -4.3022637, -1.0241346, -6.564938, -2.1140459, -8.229485, 4.9803047, -2.7657769, -4.149106, 3.418335, -4.871761, -1.1447924, 5.432336, 3.1543593, 3.4449518, 5.7719555, -3.3927286, -4.1068726, -1.267726, -7.917191, -3.5509183, 3.4784274, -0.7821179, 1.5568116, 3.8089378, -0.77928805, 5.9196067, 1.2518513, -1.6357925, -0.3277099, 0.11395049, -2.2967646, 2.3322673, -9.314311]}, - "mid": {"shape": [4, 64], "values": [4.953749, 3.170747, 0.6660588, -3.0887303, 2.700726, 5.236208, 3.3875623, -3.8893783, 2.3972847, -3.8848796, 0.53194255, -4.830065, -0.53749454, -0.4392755, 3.0031784, 4.043395, 2.2935655, -3.6362333, -3.951459, 3.1356313, -2.0265605, 1.0182593, -3.43441, -1.6895788, 0.2331556, 2.8670738, -1.3005987, -0.74462456, -0.14257985, -4.28221, -3.3244681, -3.0029747, -2.6478267, -4.1459513, -2.1066124, -3.1296153, 0.76193404, -2.2659452, -2.5837326, 2.8342113, -3.160788, -1.5854526, 5.3288684, 3.3353777, 0.16630113, 0.5075158, -2.6024406, -4.179663, 2.6766498, -3.9871984, -2.6799836, 3.4621532, -4.3488393, 3.4643793, 2.9526484, 0.5362569, 1.747103, -1.7526529, -2.2257338, 0.24971426, 0.5843427, -2.6430519, 0.982878, -3.1413813, 5.666883, 2.7954915, 0.03587091, -5.0079384, 4.545519, 4.543808, 6.8441563, -4.364123, 1.0385203, -4.3335967, 0.9550054, -4.708237, 0.5223081, -0.7302213, 1.3961512, 3.779602, -0.3039894, -6.454483, -5.4821963, 3.5983977, -1.1746223, -0.17413092, -3.7453892, -1.5057979, 0.34469664, 3.153815, -0.027005553, 0.11724314, 2.6031842, -5.4566073, -2.1885211, -0.949674, -3.2027001, -6.5257096, -2.1430976, -6.1394563, -1.0035633, -3.8978183, -2.7614872, 1.2140092, -2.0443988, -1.8422524, 5.704918, 1.7213378, 1.1225746, 0.07531172, -6.9697895, -5.3254356, 2.0624707, -7.551031, -3.2577753, 3.3319812, -2.5139933, 3.008801, 3.8108215, 1.1384838, 3.5736208, 1.0161258, -1.6766689, -0.096086085, 0.30433047, -2.4398248, 0.42671734, -5.282295, 5.7770967, 2.1415782, -1.6781058, -5.429443, 5.2230606, 1.0019034, 8.44391, -4.341218, 1.517842, -2.8772545, 1.8967702, -5.362566, 2.3114514, 3.130897, -0.6505661, 4.2714553, 1.5868953, -4.791916, -3.8119442, 5.783456, -1.7688909, 0.23404384, -4.336752, -1.8413501, 0.3749395, 0.7086326, 0.26077458, -0.014772654, 1.3144407, -6.3838325, -1.2088912, -1.3461791, -2.1770196, -6.86759, -3.29493, -6.334718, 1.7302455, -5.02635, -3.2682045, 1.8385682, -1.9440818, -0.37813485, 5.90926, 3.3425453, 2.7969997, 3.2285092, -5.241864, -5.193087, 0.8061929, -7.892048, -4.27883, 3.4871852, -1.8940374, 1.640511, 5.402358, -2.1646419, 3.7208364, 0.5138062, -2.1929994, -0.520038, -0.555435, -3.0060413, -0.072574794, -8.060579, 6.4242477, 2.2064998, -2.9688084, -4.7955256, 6.6504974, 1.7020273, 11.134117, -6.3912597, 0.22496024, -4.8998213, 1.2898785, -4.509138, 3.1358252, 2.4793968, -0.98506606, 4.6737585, 3.0588198, -5.8313255, -5.6243505, 4.5069723, 0.32148945, -1.1925488, -4.993167, -1.6020876, -0.7317565, 1.2003627, 0.52430916, 4.310114, -1.8010926, -8.025247, -1.2402749, -5.5897484, -0.9121609, -5.9840612, -1.4672122, -9.32761, 6.580824, -1.8873532, -5.3635907, 5.1116357, -4.6589227, -0.74061686, 4.3247256, 1.986178, 3.580432, 4.976962, -2.205165, -4.582225, -3.2849803, -8.447592, -3.3559966, 3.836014, -1.5005796, 1.3620884, 4.616214, -0.8685852, 6.028413, 1.3625156, -1.1830393, -0.6099317, -0.7153175, -3.9717438, 2.8559246, -8.759033]}, - "out": {"shape": [4, 64], "values": [5.866659, 3.3853152, -0.47496808, -3.9847457, 3.586886, 5.582507, 4.689533, -4.5920296, 2.7015626, -5.0583353, 1.2386763, -6.1506996, -0.036301255, -0.15771404, 2.2554529, 3.3979175, 0.23751616, -4.9194136, -5.616635, 2.9294562, -2.714249, 0.8676803, -3.3088486, -2.1013122, -0.2479593, 1.9627278, -1.2775438, 0.4123786, 1.1868973, -3.8506527, -1.917929, -2.6642852, -3.1694672, -5.2656584, -2.3793547, -4.1837435, -0.2275868, -2.8748593, -3.1232617, 2.0305095, -2.1752, -1.8135729, 6.3436017, 3.1883223, 1.5445291, 1.0250044, -4.5633817, -4.42474, 1.9914378, -4.656364, -1.8730792, 3.0051038, -4.4196973, 3.429342, 3.523611, 0.6154871, 4.7071023, 0.2834525, -2.1396394, 0.29152226, -0.5003052, -2.1443355, 1.0301528, -5.0127482, 6.4261723, 2.9317732, -0.21957722, -5.8523364, 4.366227, 2.2610269, 7.900812, -3.4554758, 1.1347916, -3.6040225, 1.0499359, -4.8314357, 1.3965006, 1.3811493, 1.7837291, 3.3932855, 1.3263781, -5.215716, -4.858269, 4.084514, -0.7311181, 0.31519988, -4.1438837, -1.5942998, 1.2141271, 2.2265377, -0.075425856, -0.8472178, 2.8287406, -6.505052, -1.93312, -1.400544, -3.3443267, -7.4520364, -3.0517313, -6.20548, -1.2591413, -6.05395, -1.8287886, 0.86917293, -1.6877487, -0.9164989, 7.465926, 2.5978768, 2.5172338, 2.5201411, -5.2141533, -5.4859242, 1.235686, -7.4736457, -2.6875043, 4.504106, -1.7943828, 3.8846602, 3.784665, -0.1997031, 3.3161368, 1.6132933, -1.8377407, -0.31469393, -1.1815001, -3.6265614, 0.09862316, -8.117807, 5.0398726, 2.411446, -3.072257, -6.319954, 3.7441316, 0.5934651, 9.462037, -5.7873306, -0.17545635, -3.9640262, 1.6652495, -5.0891447, 3.0124009, 3.7736092, -2.1221213, 5.0764294, 3.000593, -4.805947, -3.916577, 3.5454183, -1.4426523, -1.47081, -4.0744452, -3.1475625, -0.7201655, -0.09466556, 1.0820942, 3.9691863, -0.34102213, -7.812705, -0.5205893, -4.3022637, -1.0241346, -6.564938, -2.1140459, -8.229485, 4.9803047, -2.7657769, -4.149106, 3.418335, -4.871761, -1.1447924, 5.432336, 3.1543593, 3.4449518, 5.7719555, -3.3927286, -4.1068726, -1.267726, -7.917191, -3.5509183, 3.4784274, -0.7821179, 1.5568116, 3.8089378, -0.77928805, 5.9196067, 1.2518513, -1.6357925, -0.3277099, 0.11395049, -2.2967646, 2.3322673, -9.314311, 6.0597563, 0.95549476, -2.697392, -3.5777965, 7.62909, 0.62982273, 9.453976, -4.6602073, 0.36152244, -5.1556516, 0.7048434, -4.685692, 3.889481, 2.7191877, -0.6676966, 4.032877, 2.7074118, -3.3787494, -4.9604864, 4.592157, 0.7004647, 2.07026, -3.1265583, -1.742667, -0.08561003, 0.5315192, 0.87797475, 4.5996423, -0.35478222, -8.592873, -2.421432, -5.9679294, -1.2887018, -4.5603485, -1.4934459, -10.406954, 6.1270747, -0.40975678, -4.00025, 5.7422447, -3.789291, 0.21166587, 4.70187, 3.6412544, 2.7587202, 5.734912, -2.362519, -5.457711, -3.5683684, -8.346264, -4.4253197, 3.2421372, -1.0129571, 0.8049077, 5.371674, -0.38971403, 7.1487484, 1.3665426, -2.201035, -0.7983136, -0.84489715, -4.208145, 4.7886724, -9.312454]}, - "act": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 96], "data": "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"}, - "z": {"shape": [4, 64], "values": [0.119172, -0.11356902, 0.11070909, -0.33226988, 0.50125605, -1.10239, 0.59937054, -0.4496602, -0.7789365, -0.5390005, 0.5007147, -0.27321017, 0.5633257, -0.16499746, -0.08632303, -0.04784893, -0.08656454, -0.21346061, 0.0005423236, -0.5796802, 0.5403887, -0.9353795, 0.5774928, -0.4806178, -0.65073586, -0.42637062, 0.25731012, -0.3216092, 0.3682964, 0.12199689, -0.33118376, 0.19167422, 0.25095865, 0.2225132, 0.4447717, 0.064580366, -0.37271172, 0.48066032, -0.32657486, -0.58421206, 0.32016432, -0.9350612, -0.30299622, 0.2012285, 0.10227221, 0.403329, -0.5551396, 0.24428283, 0.596004, 0.28489503, 0.37631103, 0.009222145, -0.32023436, 0.29458484, -0.16988294, -0.5614155, 0.44782233, -0.56370115, -0.63252795, 0.23962237, 0.47867733, 0.04339245, -0.4401181, -0.043136552, 0.09406407, -0.68754286, -0.21666463, -0.35367966, 0.09735342, 0.380153, -0.34927937, 1.4898511, 0.1128411, 0.35738534, 0.36652976, -0.19037233, 0.22291993, -0.26270387, -0.22340916, -0.24455959, -0.41670382, -0.1845287, 0.18606989, -0.11584503, -0.19540669, -0.94508564, 0.06519684, 0.031074725, 0.47514158, 0.21724075, -1.1510463, -0.116089605, 0.11945165, -0.4622331, 0.18875182, 0.36615634, 0.118894935, 0.54986686, 0.046123065, -0.35767293, -0.012371514, -0.1581193, -0.581014, 0.045244116, 0.28727916, 0.0902862, -0.090086736, -0.11270172, -0.19913723, -0.8057601, 0.4680325, 0.04500887, 0.30749542, 0.46513638, 0.2356425, 0.15313426, 0.11615825, 0.23766129, -0.38751775, -0.06027326, 0.1824448, 0.02341441, -0.13643998, -0.12639445, -0.09846507, -0.33462745, 0.32966504, 0.06885933, 0.077895075, -1.2493273, -0.24122061, 0.34830034, -0.5105345, 1.2779969, -1.5735945, 0.45064425, 0.015898779, -1.3970319, -0.7817378, 1.1251909, -0.77590597, -0.38537678, -0.34567007, -0.6862699, -0.100062124, -1.4816998, -0.42139438, 0.35302934, -0.18626969, 1.1822, -1.818336, 0.6638749, -0.065630615, -1.4937471, -1.1348854, 0.93870425, -1.1282703, -0.4439827, -0.566922, -0.7628317, -0.20864554, 0.19357264, 0.20006473, -0.016524652, 0.46034077, 1.429836, -0.057532426, -0.06083231, -0.17149088, 0.2675868, 0.257981, 0.6437858, -0.39589304, 1.4683425, 0.6367118, 0.9051261, -0.055379435, 0.7097386, 0.26853532, 0.21302085, 0.42661595, 1.7511481, 0.08303431, -0.24047783, -0.27165505, 0.47292113, 0.27758527, 0.7301537, 0.0059358277, 1.6520915, 0.5326563, 0.8593639, -0.24163821, 0.11425394, 0.12908413, 0.23535313, 0.29874536, 0.14389661, 0.51610464, -0.043176133, 0.20205499, -0.11760247, 0.40157327, -0.2360212, 0.12800235, 0.055514205, -0.09612098, -0.5195559, -0.45070887, 0.20000133, 0.33258232, -0.008949388, 0.63332224, -0.11656354, 0.34807432, 0.0121446615, 0.32321075, 0.032623913, 0.23564741, -0.21838537, 0.17129347, 0.17215593, -0.23512131, -0.82661265, 0.22955696, 0.38174984, -0.021856168, 0.2967739, -0.32191467, -0.024886338, 0.5359306, -0.73287356, 0.5142095, -0.05324236, 0.118967675, 0.34100702, 0.20917228, 0.75803417, -0.3649354, -0.5361201, -0.1585751, 0.13962817, 0.11708645, -0.12383908, -0.44008955, -0.36629468, -0.074562036, -0.5840718, 0.14625748, 0.11562909, -0.50498956, 0.09906565, -0.31108394, 0.39451504, -0.10798631, -0.14834799]} + "block_in": {"shape": [4, 64], "values": [3.5, 2.0, 3.0, -3.0, 3.0, 3.5, 2.5, -3.5, 2.5, -2.5, 1.0, -3.5, 0.5, 0.0, 2.5, 2.0, 2.5, -3.5, -3.5, 3.0, -2.5, 0.0, -3.5, -1.0, 0.0, 3.5, -1.0, 0.0, -0.5, -3.5, -3.0, -3.0, -3.5, -3.0, -2.0, -2.5, 0.5, -2.5, -2.0, 1.5, -3.0, -2.0, 3.5, 3.5, 1.0, 2.0, -3.5, -3.5, 3.5, -2.5, -3.0, 3.5, -3.0, 1.0, 3.0, 0.5, 1.5, -1.5, -1.5, -1.0, 0.5, -0.5, 1.5, -2.5, 5.866659, 3.3853152, -0.47496808, -3.9847457, 3.586886, 5.582507, 4.689533, -4.5920296, 2.7015626, -5.0583353, 1.2386763, -6.1506996, -0.036301255, -0.15771404, 2.2554529, 3.3979175, 0.23751616, -4.9194136, -5.616635, 2.9294562, -2.714249, 0.8676803, -3.3088486, -2.1013122, -0.2479593, 1.9627278, -1.2775438, 0.4123786, 1.1868973, -3.8506527, -1.917929, -2.6642852, -3.1694672, -5.2656584, -2.3793547, -4.1837435, -0.2275868, -2.8748593, -3.1232617, 2.0305095, -2.1752, -1.8135729, 6.3436017, 3.1883223, 1.5445291, 1.0250044, -4.5633817, -4.42474, 1.9914378, -4.656364, -1.8730792, 3.0051038, -4.4196973, 3.429342, 3.523611, 0.6154871, 4.7071023, 0.2834525, -2.1396394, 0.29152226, -0.5003052, -2.1443355, 1.0301528, -5.0127482, 6.4261723, 2.9317732, -0.21957722, -5.8523364, 4.366227, 2.2610269, 7.900812, -3.4554758, 1.1347916, -3.6040225, 1.0499359, -4.8314357, 1.3965006, 1.3811493, 1.7837291, 3.3932855, 1.3263781, -5.215716, -4.858269, 4.084514, -0.7311181, 0.31519988, -4.1438837, -1.5942998, 1.2141271, 2.2265377, -0.075425856, -0.8472178, 2.8287406, -6.505052, -1.93312, -1.400544, -3.3443267, -7.4520364, -3.0517313, -6.20548, -1.2591413, -6.05395, -1.8287886, 0.86917293, -1.6877487, -0.9164989, 7.465926, 2.5978768, 2.5172338, 2.5201411, -5.2141533, -5.4859242, 1.235686, -7.4736457, -2.6875043, 4.504106, -1.7943828, 3.8846602, 3.784665, -0.1997031, 3.3161368, 1.6132933, -1.8377407, -0.31469393, -1.1815001, -3.6265614, 0.09862316, -8.117807, 4.220866, 2.0894146, -2.6721644, -5.8678093, 4.328457, 0.7519509, 9.0337715, -5.2392883, 0.2597416, -3.3496184, 1.7918677, -5.3170943, 2.615191, 4.0385923, -2.294054, 5.157196, 2.5656822, -4.6671443, -3.7651875, 3.739538, -1.6229713, -1.2360812, -3.932554, -2.7753797, -0.46711212, -0.15803449, 0.7343694, 2.9117923, 0.53434217, -6.992443, -0.94871867, -3.9070003, -1.3953786, -6.457187, -2.355616, -7.8695045, 4.0153556, -3.3919804, -3.3835104, 2.9948554, -3.9190745, -1.6296177, 5.0296326, 3.3731127, 3.001536, 5.0120234, -3.3927286, -4.5379333, -1.1238148, -8.025675, -3.860835, 3.5918941, -1.2174783, 2.0598426, 4.2179437, -1.2547258, 5.6662927, 1.3206842, -1.2400926, -0.7924017, 0.4440435, -2.6499639, 1.8310504, -8.7907715]}, + "mid": {"shape": [4, 64], "values": [4.953749, 3.170747, 0.6660588, -3.0887303, 2.700726, 5.236208, 3.3875623, -3.8893783, 2.3972847, -3.8848796, 0.53194255, -4.830065, -0.53749454, -0.4392755, 3.0031784, 4.043395, 2.2935655, -3.6362333, -3.951459, 3.1356313, -2.0265605, 1.0182593, -3.43441, -1.6895788, 0.2331556, 2.8670738, -1.3005987, -0.74462456, -0.14257985, -4.28221, -3.3244681, -3.0029747, -2.6478267, -4.1459513, -2.1066124, -3.1296153, 0.76193404, -2.2659452, -2.5837326, 2.8342113, -3.160788, -1.5854526, 5.3288684, 3.3353777, 0.16630113, 0.5075158, -2.6024406, -4.179663, 2.6766498, -3.9871984, -2.6799836, 3.4621532, -4.3488393, 3.4643793, 2.9526484, 0.5362569, 1.747103, -1.7526529, -2.2257338, 0.24971426, 0.5843427, -2.6430519, 0.982878, -3.1413813, 5.666883, 2.7954915, 0.03587091, -5.0079384, 4.545519, 4.543808, 6.8441563, -4.364123, 1.0385203, -4.3335967, 0.9550054, -4.708237, 0.5223081, -0.7302213, 1.3961512, 3.779602, -0.3039894, -6.454483, -5.4821963, 3.5983977, -1.1746223, -0.17413092, -3.7453892, -1.5057979, 0.34469664, 3.153815, -0.027005553, 0.11724314, 2.6031842, -5.4566073, -2.1885211, -0.949674, -3.2027001, -6.5257096, -2.1430976, -6.1394563, -1.0035633, -3.8978183, -2.7614872, 1.2140092, -2.0443988, -1.8422524, 5.704918, 1.7213378, 1.1225746, 0.07531172, -6.9697895, -5.3254356, 2.0624707, -7.551031, -3.2577753, 3.3319812, -2.5139933, 3.008801, 3.8108215, 1.1384838, 3.5736208, 1.0161258, -1.6766689, -0.096086085, 0.30433047, -2.4398248, 0.42671734, -5.282295, 5.7770967, 2.1415782, -1.6781058, -5.429443, 5.2230606, 1.0019034, 8.44391, -4.341218, 1.517842, -2.8772545, 1.8967702, -5.362566, 2.3114514, 3.130897, -0.6505661, 4.2714553, 1.5868953, -4.791916, -3.8119442, 5.783456, -1.7688909, 0.23404384, -4.336752, -1.8413501, 0.3749395, 0.7086326, 0.26077458, -0.014772654, 1.3144407, -6.3838325, -1.2088912, -1.3461791, -2.1770196, -6.86759, -3.29493, -6.334718, 1.7302455, -5.02635, -3.2682045, 1.8385682, -1.9440818, -0.37813485, 5.90926, 3.3425453, 2.7969997, 3.2285092, -5.241864, -5.193087, 0.8061929, -7.892048, -4.27883, 3.4871852, -1.8940374, 1.640511, 5.402358, -2.1646419, 3.7208364, 0.5138062, -2.1929994, -0.520038, -0.555435, -3.0060413, -0.072574794, -8.060579, 4.5637474, 1.3959088, -2.2843974, -4.9706993, 6.920661, 1.8790023, 10.450944, -5.8638406, 0.6446867, -4.051811, 1.4321035, -4.571544, 2.6766722, 2.8407469, -1.3982053, 4.800086, 2.5193808, -5.919528, -5.3479233, 5.41219, -0.071205735, -0.7454407, -4.434947, -1.1485269, -0.82259333, 1.1944451, 0.18997443, 3.6368666, -1.5290948, -7.6208763, -1.4269137, -5.015357, -1.3406483, -5.915069, -1.825913, -8.9808235, 6.0928555, -2.7043242, -4.3991756, 5.55171, -3.939099, -1.5550411, 3.9715457, 2.2203846, 3.1046062, 4.332575, -2.5466633, -5.2669444, -3.5653777, -8.232976, -3.9690177, 3.7637749, -1.8853232, 2.1795805, 5.1696057, -0.9112543, 6.020832, 1.0373524, -0.19787657, -1.091794, -0.39823744, -3.5600352, 2.5375261, -8.4132395]}, + "out": {"shape": [4, 64], "values": [5.866659, 3.3853152, -0.47496808, -3.9847457, 3.586886, 5.582507, 4.689533, -4.5920296, 2.7015626, -5.0583353, 1.2386763, -6.1506996, -0.036301255, -0.15771404, 2.2554529, 3.3979175, 0.23751616, -4.9194136, -5.616635, 2.9294562, -2.714249, 0.8676803, -3.3088486, -2.1013122, -0.2479593, 1.9627278, -1.2775438, 0.4123786, 1.1868973, -3.8506527, -1.917929, -2.6642852, -3.1694672, -5.2656584, -2.3793547, -4.1837435, -0.2275868, -2.8748593, -3.1232617, 2.0305095, -2.1752, -1.8135729, 6.3436017, 3.1883223, 1.5445291, 1.0250044, -4.5633817, -4.42474, 1.9914378, -4.656364, -1.8730792, 3.0051038, -4.4196973, 3.429342, 3.523611, 0.6154871, 4.7071023, 0.2834525, -2.1396394, 0.29152226, -0.5003052, -2.1443355, 1.0301528, -5.0127482, 6.4261723, 2.9317732, -0.21957722, -5.8523364, 4.366227, 2.2610269, 7.900812, -3.4554758, 1.1347916, -3.6040225, 1.0499359, -4.8314357, 1.3965006, 1.3811493, 1.7837291, 3.3932855, 1.3263781, -5.215716, -4.858269, 4.084514, -0.7311181, 0.31519988, -4.1438837, -1.5942998, 1.2141271, 2.2265377, -0.075425856, -0.8472178, 2.8287406, -6.505052, -1.93312, -1.400544, -3.3443267, -7.4520364, -3.0517313, -6.20548, -1.2591413, -6.05395, -1.8287886, 0.86917293, -1.6877487, -0.9164989, 7.465926, 2.5978768, 2.5172338, 2.5201411, -5.2141533, -5.4859242, 1.235686, -7.4736457, -2.6875043, 4.504106, -1.7943828, 3.8846602, 3.784665, -0.1997031, 3.3161368, 1.6132933, -1.8377407, -0.31469393, -1.1815001, -3.6265614, 0.09862316, -8.117807, 4.220866, 2.0894146, -2.6721644, -5.8678093, 4.328457, 0.7519509, 9.0337715, -5.2392883, 0.2597416, -3.3496184, 1.7918677, -5.3170943, 2.615191, 4.0385923, -2.294054, 5.157196, 2.5656822, -4.6671443, -3.7651875, 3.739538, -1.6229713, -1.2360812, -3.932554, -2.7753797, -0.46711212, -0.15803449, 0.7343694, 2.9117923, 0.53434217, -6.992443, -0.94871867, -3.9070003, -1.3953786, -6.457187, -2.355616, -7.8695045, 4.0153556, -3.3919804, -3.3835104, 2.9948554, -3.9190745, -1.6296177, 5.0296326, 3.3731127, 3.001536, 5.0120234, -3.3927286, -4.5379333, -1.1238148, -8.025675, -3.860835, 3.5918941, -1.2174783, 2.0598426, 4.2179437, -1.2547258, 5.6662927, 1.3206842, -1.2400926, -0.7924017, 0.4440435, -2.6499639, 1.8310504, -8.7907715, 4.3206306, -0.060860872, -2.7462509, -3.737607, 7.724537, 1.1037962, 9.044542, -4.218011, 0.771289, -4.111462, 1.1632478, -4.650914, 3.001525, 3.1249163, -1.0441391, 4.0817103, 2.3457325, -3.5809927, -4.860181, 5.82479, 0.3071874, 2.8577883, -2.753205, -1.3094089, -0.088838935, 0.7565593, 0.4788867, 3.7141087, -0.038958073, -8.307401, -2.73988, -5.261392, -1.8435299, -4.782245, -1.7828674, -10.169498, 6.094632, -1.4953065, -3.3034866, 6.176045, -2.8152866, -0.41404378, 4.349045, 3.7392173, 3.044982, 5.131217, -2.7438123, -5.9861226, -3.9242558, -8.186001, -5.190548, 3.0000145, -1.1157812, 1.7924662, 5.76655, -0.6872344, 7.0224614, 0.9109807, -1.2625667, -1.4266875, -0.59386015, -3.5026257, 4.7423916, -9.120673]}, + "act": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 96], "data": "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"}, + "z": {"shape": [4, 64], "values": [0.119172, -0.11356902, 0.11070909, -0.33226988, 0.50125605, -1.10239, 0.59937054, -0.4496602, -0.7789365, -0.5390005, 0.5007147, -0.27321017, 0.5633257, -0.16499746, -0.08632303, -0.04784893, -0.08656454, -0.21346061, 0.0005423236, -0.5796802, 0.5403887, -0.9353795, 0.5774928, -0.4806178, -0.65073586, -0.42637062, 0.25731012, -0.3216092, 0.3682964, 0.12199689, -0.33118376, 0.19167422, 0.25095865, 0.2225132, 0.4447717, 0.064580366, -0.37271172, 0.48066032, -0.32657486, -0.58421206, 0.32016432, -0.9350612, -0.30299622, 0.2012285, 0.10227221, 0.403329, -0.5551396, 0.24428283, 0.596004, 0.28489503, 0.37631103, 0.009222145, -0.32023436, 0.29458484, -0.16988294, -0.5614155, 0.44782233, -0.56370115, -0.63252795, 0.23962237, 0.47867733, 0.04339245, -0.4401181, -0.043136552, 0.09406407, -0.68754286, -0.21666463, -0.35367966, 0.09735342, 0.380153, -0.34927937, 1.4898511, 0.1128411, 0.35738534, 0.36652976, -0.19037233, 0.22291993, -0.26270387, -0.22340916, -0.24455959, -0.41670382, -0.1845287, 0.18606989, -0.11584503, -0.19540669, -0.94508564, 0.06519684, 0.031074725, 0.47514158, 0.21724075, -1.1510463, -0.116089605, 0.11945165, -0.4622331, 0.18875182, 0.36615634, 0.118894935, 0.54986686, 0.046123065, -0.35767293, -0.012371514, -0.1581193, -0.581014, 0.045244116, 0.28727916, 0.0902862, -0.090086736, -0.11270172, -0.19913723, -0.8057601, 0.4680325, 0.04500887, 0.30749542, 0.46513638, 0.2356425, 0.15313426, 0.11615825, 0.23766129, -0.38751775, -0.06027326, 0.1824448, 0.02341441, -0.13643998, -0.12639445, -0.09846507, -0.33462745, 0.32966504, 0.06885933, 0.077895075, -1.2493273, -0.24122061, 0.34830034, -0.5105345, 1.2779969, -1.5735945, 0.45064425, 0.015898779, -1.3970319, -0.7817378, 1.1251909, -0.77590597, -0.38537678, -0.34567007, -0.6862699, -0.100062124, -1.4816998, -0.42139438, 0.35302934, -0.18626969, 1.1822, -1.818336, 0.6638749, -0.065630615, -1.4937471, -1.1348854, 0.93870425, -1.1282703, -0.4439827, -0.566922, -0.7628317, -0.20864554, 0.19357264, 0.20006473, -0.016524652, 0.46034077, 1.429836, -0.057532426, -0.06083231, -0.17149088, 0.2675868, 0.257981, 0.6437858, -0.39589304, 1.4683425, 0.6367118, 0.9051261, -0.055379435, 0.7097386, 0.26853532, 0.21302085, 0.42661595, 1.7511481, 0.08303431, -0.24047783, -0.27165505, 0.47292113, 0.27758527, 0.7301537, 0.0059358277, 1.6520915, 0.5326563, 0.8593639, -0.12705569, 0.12878387, 0.14618656, 0.23872003, 0.33793074, 0.012525205, 0.43436074, -0.0089272605, 0.19761603, -0.030238824, 0.1845979, -0.2871847, 0.19650127, 0.0561816, 0.027882304, -0.3558185, -0.32208574, 0.18902181, 0.3482503, -0.026542665, 0.6625493, -0.27761662, 0.25230607, 0.0526315, 0.32362196, 0.14528973, 0.027982809, -0.25510836, 0.23533955, 0.16112956, -0.09024683, -0.65934944, 0.08044664, 0.20781055, -0.09012599, 0.4298075, -0.39199314, 0.008034411, 0.4221473, -0.59680533, 0.43329725, 0.05338896, 0.10041719, 0.17638622, 0.2928554, 0.6929154, -0.45185447, -0.5374759, -0.2448235, -0.01614169, 0.056160048, -0.057775456, -0.48259875, -0.35221547, -0.19957553, -0.4023011, 0.088696584, 0.29444778, -0.5302691, -0.058536932, -0.24997349, 0.31292224, -0.16305603, -0.073585436]} }, - "u": [0.11553532, 0.06771047, -0.037968215, 0.04571312, 0.0, 0.0823177, 0.066690706, 0.0, 0.101009324, -0.09774181, 0.0, 0.065577574, -0.08930132, 0.10350821, 0.025285061, 0.055963982, 0.08467057, -0.119167745, 0.05512732, 0.10753326, -0.04523453, 0.015638428, 0.059761014, -0.036972493, -0.07816237, 0.0232284, 0.042416867, 0.080880694, -0.087396234, -0.04458159, -0.1030744, -0.068581805, -0.044328526, -0.02631736, -0.021314962, -0.033915997, 0.05596117, 0.016690567, 0.0067017497, -0.016820434, -0.021264713, -0.0487883, -0.011635265, 0.035501428, -0.016223414, -0.013163336, -0.042603925, -0.032196894, -0.007876572, 0.029095065, -0.045277763, 0.032929376, 0.0, 0.031255566, 0.057500463, -0.023773737, 0.04192947, 0.027701665, 0.033160828, -0.024502289, -0.037343383, 0.02198326, -0.013639782, 0.0065921624], - "g_out": {"0": [0.039521493, 0.110398635, -0.016999936, 0.051822398, 0.016897637, 0.03821143, 0.0056722104, -0.06599356, 0.12914413, -0.10415461, 0.031220935, 0.063429356, -0.016506493, 0.06527181, -0.03232656, 0.06848669, 0.067180745, -0.06037298, 0.0383801, 0.08475421, -0.028002057, 0.015017992, 0.073952496, -0.019930167, -0.017795231, 0.08747293, 0.00916948, 0.06920174, -0.02472648, -0.023640264, -0.13120544, -0.058698993, -0.021079484, 0.0030415058, 0.014012754, -0.026944835, 0.051095434, 0.07088273, -0.024891514, -0.01546156, -0.04017895, -0.031154934, -0.0403385, 0.034419574, -0.009677548, -0.035307135, -0.04542641, -0.0024895575, -0.0090367785, -0.01820668, -0.03731033, -0.030284908, -0.021014975, -0.031091817, 0.007896372, -0.013087014, 0.028635444, 0.06313566, 0.0011098199, 0.037850298, -0.06572405, 0.018289665, 0.010041275, 0.03367559], "1": [0.07001983, 0.0036200006, -0.0071712974, 0.006163247, -0.015391313, 0.019384226, 0.043573726, 0.059938062, 0.09347355, -0.10641414, 0.04833095, 0.06172956, -0.08579177, 0.060311448, 0.0067055523, 0.0068317903, 0.09657802, -0.08372858, 0.047023565, 0.022231147, -0.010241626, 0.06802049, 0.045111556, -0.030677354, -0.025924344, 0.033969242, 0.055873886, 0.0475555, 0.019881291, -0.06003031, -0.084888056, -0.07865178, 0.020105695, -0.023017153, 0.01756496, 0.020809755, 0.043567352, 0.009069409, 0.004311355, 0.0059337653, -0.053529926, -0.07883975, -0.03676553, 0.007920498, 0.009236563, 0.0019766819, 0.021037579, -0.03648249, -0.036312487, 0.033041608, -0.05457877, 0.0448758, 0.020561513, 0.034980863, 0.08450146, 0.027796173, -0.00023056567, 0.04082533, 0.036928106, -0.062265437, -0.0069680773, -0.021600427, -0.054567177, -0.006278774], "3": [0.11553532, 0.06771047, -0.037968215, 0.04571312, 0.0, 0.0823177, 0.066690706, 0.0, 0.101009324, -0.09774181, 0.0, 0.065577574, -0.08930132, 0.10350821, 0.025285061, 0.055963982, 0.08467057, -0.119167745, 0.05512732, 0.10753326, -0.04523453, 0.015638428, 0.059761014, -0.036972493, -0.07816237, 0.0232284, 0.042416867, 0.080880694, -0.087396234, -0.04458159, -0.1030744, -0.068581805, -0.044328526, -0.02631736, -0.021314962, -0.033915997, 0.05596117, 0.016690567, 0.0067017497, -0.016820434, -0.021264713, -0.0487883, -0.011635265, 0.035501428, -0.016223414, -0.013163336, -0.042603925, -0.032196894, -0.007876572, 0.029095065, -0.045277763, 0.032929376, 0.0, 0.031255566, 0.057500463, -0.023773737, 0.04192947, 0.027701665, 0.033160828, -0.024502289, -0.037343383, 0.02198326, -0.013639782, 0.0065921624]}, - "g_mid": {"1": [0.088926196, 0.08340293, -0.03492887, 0.01857866, -0.030574894, 0.02451328, 0.0824737, 0.014710182, 0.050772157, -0.08619753, 0.043378543, 0.07608077, -0.096563146, 0.08121864, 0.00054758973, -0.015424339, -0.033665422, -0.13959771, 0.027728204, 0.06591473, -0.042918455, 0.055181433, -0.016086493, -0.109556556, -0.095827945, 0.00073774345, 0.06923655, 0.04126014, -0.021568194, -0.09263253, -0.11456003, -0.02129902, -0.03765966, 0.032533, -0.015062627, -0.015728537, 0.0050711976, 0.026749179, -0.0064309835, -0.01265174, -0.053538375, -0.030414509, 0.005782878, 0.010524448, -0.03634587, -0.061315473, -0.04375846, -0.056274366, -0.0015636021, 0.0007129526, -0.027338305, 0.07681763, 0.048900973, 0.035361197, 0.100165375, -0.035715025, 0.022640139, 0.039800912, 0.07596494, -0.018163793, -0.009400718, 0.01378678, 0.025187042, 0.07967466], "3": [0.048176922, 0.06922455, -0.046913773, 0.077891104, -0.059034005, 0.059834354, 0.036368445, -0.06294227, 0.054618027, -0.05896008, -0.018457128, 0.008249704, -0.095557064, 0.095725626, 0.04898662, 0.094526745, 0.07437044, -0.07643648, 0.058291055, 0.08376536, -0.008567374, -0.044406645, 0.06808382, -0.0067838766, -0.034179207, -0.0016482435, 0.032218557, 0.07105875, -0.056689586, -0.013150416, -0.0855372, -0.049482565, -0.036946673, 0.004304774, 0.024861941, -0.024560636, 0.005608488, 0.0003426224, -0.046976306, 0.0037990212, -0.011121358, -0.053777974, -0.05075295, 0.014604425, -0.0066373264, -0.07476805, -0.02319047, -0.0013293955, -0.042275276, 0.004727411, -0.056966856, 0.013002486, -0.01639601, 0.008504096, 0.038605917, -0.061576527, 0.031567454, -0.02001168, 0.023293607, -0.011650338, -0.06305831, -0.040228885, -0.023741027, -0.03119343]}, - "neuron_contributions": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 96], "data": "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"}, - "head_contributions": {"shape": [4, 4], "values": [0.0, 0.0, 0.0, 0.0, -0.42921254, 0.61765003, -0.045694496, 0.2682563, 0.0, 0.0, 0.0, 0.0, 0.22859478, 0.121540785, 0.07302874, 0.27501342]}, - "head_write_norms": {"shape": [4, 4], "values": [4.329318, 4.07536, 4.1306252, 3.6026623, 5.6605115, 5.0850983, 3.2429667, 2.6760304, 4.377547, 4.7998285, 3.6804824, 4.3144183, 3.5891194, 4.230286, 4.080644, 2.8908982]} + "u": [0.11803475, 0.06917528, -0.0387896, 0.046702057, 0.0, 0.08409853, 0.06813346, 0.0, 0.10319451, -0.0998563, 0.0, 0.066996254, -0.09123322, 0.10574746, 0.025832066, 0.057174683, 0.0865023, -0.12174577, 0.05631992, 0.10985958, -0.046213113, 0.015976742, 0.061053857, -0.03777234, -0.07985331, 0.023730911, 0.043334495, 0.082630426, -0.08928693, -0.045546047, -0.10530426, -0.070065476, -0.04528751, -0.026886702, -0.02177608, -0.034649722, 0.057171807, 0.017051645, 0.0068467325, -0.01718432, -0.021724744, -0.04984377, -0.011886978, 0.03626945, -0.016574383, -0.013448105, -0.0435256, -0.032893427, -0.008046971, 0.029724495, -0.046257284, 0.033641756, 0.0, 0.031931736, 0.0587444, -0.024288049, 0.04283655, 0.028300948, 0.033878215, -0.02503236, -0.038151253, 0.022458836, -0.013934858, 0.0067347744], + "g_out": {"0": [0.04037648, 0.112786934, -0.017367702, 0.052943498, 0.017263193, 0.03903809, 0.0057949177, -0.06742124, 0.13193797, -0.10640783, 0.031896356, 0.06480156, -0.016863588, 0.066683844, -0.033025894, 0.06996829, 0.0686341, -0.061679073, 0.039210394, 0.08658774, -0.028607838, 0.015342883, 0.07555235, -0.020361328, -0.01818021, 0.08936529, 0.00936785, 0.07069881, -0.025261413, -0.024151692, -0.13404389, -0.05996885, -0.021535512, 0.0031073056, 0.01431589, -0.027527748, 0.052200805, 0.07241617, -0.025430001, -0.015796054, -0.041048165, -0.031828925, -0.041211165, 0.0351642, -0.009886898, -0.03607095, -0.046409145, -0.002543414, -0.009232276, -0.018600557, -0.03811749, -0.030940074, -0.021469602, -0.03176444, 0.0080672, -0.0133701395, 0.029254928, 0.0645015, 0.0011338294, 0.03866913, -0.0671459, 0.018685333, 0.010258503, 0.034404103], "1": [0.07153461, 0.0036983062, -0.0073264353, 0.006296592, -0.015724279, 0.019803587, 0.044516377, 0.061234728, 0.0954957, -0.10871625, 0.04937652, 0.06306499, -0.08764774, 0.061616205, 0.006850617, 0.0069795838, 0.09866734, -0.085539915, 0.048040845, 0.02271209, -0.010463193, 0.06949203, 0.04608747, -0.03134101, -0.026485182, 0.03470412, 0.05708263, 0.04858429, 0.020311385, -0.061328977, -0.086724475, -0.080353305, 0.020540655, -0.023515102, 0.017944947, 0.021259936, 0.04450986, 0.009265608, 0.0044046207, 0.006062135, -0.05468797, -0.08054535, -0.037560903, 0.008091857, 0.009436386, 0.0020194463, 0.021492697, -0.037271727, -0.03709806, 0.033756416, -0.055759504, 0.045846622, 0.021006335, 0.035737626, 0.08632952, 0.028397504, -0.0002355557, 0.04170853, 0.037727, -0.06361246, -0.007118825, -0.022067714, -0.055747654, -0.006414605], "3": [0.11803475, 0.06917528, -0.0387896, 0.046702057, 0.0, 0.08409853, 0.06813346, 0.0, 0.10319451, -0.0998563, 0.0, 0.066996254, -0.09123322, 0.10574746, 0.025832066, 0.057174683, 0.0865023, -0.12174577, 0.05631992, 0.10985958, -0.046213113, 0.015976742, 0.061053857, -0.03777234, -0.07985331, 0.023730911, 0.043334495, 0.082630426, -0.08928693, -0.045546047, -0.10530426, -0.070065476, -0.04528751, -0.026886702, -0.02177608, -0.034649722, 0.057171807, 0.017051645, 0.0068467325, -0.01718432, -0.021724744, -0.04984377, -0.011886978, 0.03626945, -0.016574383, -0.013448105, -0.0435256, -0.032893427, -0.008046971, 0.029724495, -0.046257284, 0.033641756, 0.0, 0.031931736, 0.0587444, -0.024288049, 0.04283655, 0.028300948, 0.033878215, -0.02503236, -0.038151253, 0.022458836, -0.013934858, 0.0067347744]}, + "g_mid": {"1": [0.090849966, 0.08520724, -0.0356845, 0.018980578, -0.03123634, 0.025043588, 0.08425789, 0.0150284115, 0.05187054, -0.088062294, 0.044316974, 0.07772666, -0.098652154, 0.08297567, 0.0005594427, -0.01575802, -0.034393728, -0.14261772, 0.02832807, 0.06734067, -0.043846935, 0.05637521, -0.01643449, -0.111926645, -0.09790105, 0.0007537063, 0.07073437, 0.042152736, -0.022034798, -0.09463649, -0.117038354, -0.021759797, -0.038474374, 0.03323681, -0.015388487, -0.016068805, 0.0051809037, 0.027327854, -0.0065701045, -0.012925435, -0.054696597, -0.031072497, 0.0059079807, 0.010752129, -0.03713216, -0.06264194, -0.044705104, -0.05749178, -0.0015974287, 0.00072838087, -0.027929736, 0.07847947, 0.04995887, 0.03612619, 0.1023323, -0.036487672, 0.02312992, 0.040661953, 0.07760833, -0.01855674, -0.009604089, 0.014085038, 0.025731925, 0.08139831], "3": [0.04921916, 0.07072213, -0.047928672, 0.079576164, -0.06031112, 0.06112878, 0.0371552, -0.064303935, 0.055799596, -0.060235582, -0.018856425, 0.008428197, -0.097624294, 0.09779653, 0.050046384, 0.09657169, 0.07597934, -0.07809009, 0.059552092, 0.0855775, -0.008752726, -0.04536732, 0.06955672, -0.006930638, -0.03491863, -0.0016839039, 0.03291556, 0.072596, -0.05791599, -0.013434913, -0.08738768, -0.050553065, -0.037745964, 0.0043979045, 0.025399797, -0.025091972, 0.005729817, 0.0003500376, -0.04799257, 0.003881202, -0.01136196, -0.05494138, -0.05185092, 0.014920367, -0.006780917, -0.07638556, -0.023692165, -0.0013581542, -0.04318984, 0.0048296805, -0.058199253, 0.013283778, -0.016750712, 0.008688074, 0.039441105, -0.06290865, 0.03225037, -0.020444604, 0.023797538, -0.011902377, -0.06442249, -0.041099183, -0.024254628, -0.03186825]}, + "neuron_contributions": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 96], "data": "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"}, + "head_contributions": {"shape": [4, 4], "values": [0.0, 0.0, 0.0, 0.0, -0.438498, 0.6310119, -0.046682954, 0.27405962, 0.0, 0.0, 0.0, 0.0, 0.28812778, 0.06699392, 0.10814485, 0.28619662]}, + "head_write_norms": {"shape": [4, 4], "values": [4.329318, 4.07536, 4.1306252, 3.6026623, 5.6605115, 5.0850983, 3.2429667, 2.6760304, 4.377547, 4.7998285, 3.6804824, 4.3144183, 3.4983747, 4.440167, 4.4295487, 3.3785338]} } }, { diff --git a/tests/fixtures/browser/token-anatomy-qwen3-v1.json b/tests/fixtures/browser/token-anatomy-qwen3-v1.json index c0ea033df..8b48f5f31 100644 --- a/tests/fixtures/browser/token-anatomy-qwen3-v1.json +++ b/tests/fixtures/browser/token-anatomy-qwen3-v1.json @@ -426,7 +426,7 @@ "provenance": "replayed", "instruments": {}, "anatomy": { - "token": {"raw_index": 3, "token_id": 3, "token": "!", "position": 48, "prompt_length": 46, "probability": 0.00029}, + "token": {"raw_index": 3, "token_id": 3, "token": "!", "position": 48, "prompt_length": 46, "probability": 0.000317}, "binding": { "sources": {"R": "local:r", "S": "local:s"}, "steering": "0.3 neuron/L2n7 + !head/L1h3" @@ -526,10 +526,10 @@ }, "steering": null, "neurons": [ - {"unit": "neuron/L0n28", "kind": "neuron", "layer": 0, "index": 28, "contribution": 1.157034, "activation": 3.395751, "activation_over_scale": 2.54887}, - {"unit": "neuron/L0n87", "kind": "neuron", "layer": 0, "index": 87, "contribution": 0.677011, "activation": 1.569157, "activation_over_scale": 0.686323}, - {"unit": "neuron/L0n40", "kind": "neuron", "layer": 0, "index": 40, "contribution": -0.630087, "activation": -1.430745, "activation_over_scale": -0.620294}, - {"unit": "neuron/L0n24", "kind": "neuron", "layer": 0, "index": 24, "contribution": 0.56816, "activation": -1.013978, "activation_over_scale": -0.95237} + {"unit": "neuron/L0n28", "kind": "neuron", "layer": 0, "index": 28, "contribution": 1.159785, "activation": 3.395751, "activation_over_scale": 2.54887}, + {"unit": "neuron/L0n87", "kind": "neuron", "layer": 0, "index": 87, "contribution": 0.678621, "activation": 1.569157, "activation_over_scale": 0.686323}, + {"unit": "neuron/L0n40", "kind": "neuron", "layer": 0, "index": 40, "contribution": -0.631585, "activation": -1.430745, "activation_over_scale": -0.620294}, + {"unit": "neuron/L0n24", "kind": "neuron", "layer": 0, "index": 24, "contribution": 0.56951, "activation": -1.013978, "activation_over_scale": -0.95237} ], "heads": [] }, @@ -627,16 +627,16 @@ }, "steering": null, "neurons": [ - {"unit": "neuron/L1n40", "kind": "neuron", "layer": 1, "index": 40, "contribution": 0.414813, "activation": -2.588046, "activation_over_scale": -1.149952}, - {"unit": "neuron/L1n52", "kind": "neuron", "layer": 1, "index": 52, "contribution": 0.3486, "activation": 1.914017, "activation_over_scale": 1.665604}, - {"unit": "neuron/L1n11", "kind": "neuron", "layer": 1, "index": 11, "contribution": 0.297588, "activation": -1.363457, "activation_over_scale": -1.463797}, - {"unit": "neuron/L1n8", "kind": "neuron", "layer": 1, "index": 8, "contribution": -0.262176, "activation": 0.633499, "activation_over_scale": 0.251056} + {"unit": "neuron/L1n40", "kind": "neuron", "layer": 1, "index": 40, "contribution": 0.415799, "activation": -2.588046, "activation_over_scale": -1.149952}, + {"unit": "neuron/L1n52", "kind": "neuron", "layer": 1, "index": 52, "contribution": 0.349429, "activation": 1.914017, "activation_over_scale": 1.665604}, + {"unit": "neuron/L1n11", "kind": "neuron", "layer": 1, "index": 11, "contribution": 0.298295, "activation": -1.363457, "activation_over_scale": -1.463797}, + {"unit": "neuron/L1n8", "kind": "neuron", "layer": 1, "index": 8, "contribution": -0.262799, "activation": 0.633499, "activation_over_scale": 0.251056} ], "heads": [ - {"unit": "head/L1h0", "kind": "head", "layer": 1, "index": 0, "contribution": -0.181833, "activation": 1.8535, "activation_over_scale": 0.732937}, - {"unit": "head/L1h2", "kind": "head", "layer": 1, "index": 2, "contribution": 0.151901, "activation": 2.297571, "activation_over_scale": 1.193917}, - {"unit": "head/L1h3", "kind": "head", "layer": 1, "index": 3, "contribution": -0.043814, "activation": 1.029961, "activation_over_scale": 0.614568}, - {"unit": "head/L1h1", "kind": "head", "layer": 1, "index": 1, "contribution": -0.042955, "activation": 1.644715, "activation_over_scale": 0.777255} + {"unit": "head/L1h0", "kind": "head", "layer": 1, "index": 0, "contribution": -0.182265, "activation": 1.8535, "activation_over_scale": 0.732937}, + {"unit": "head/L1h2", "kind": "head", "layer": 1, "index": 2, "contribution": 0.152263, "activation": 2.297571, "activation_over_scale": 1.193917}, + {"unit": "head/L1h3", "kind": "head", "layer": 1, "index": 3, "contribution": -0.043919, "activation": 1.029961, "activation_over_scale": 0.614568}, + {"unit": "head/L1h1", "kind": "head", "layer": 1, "index": 1, "contribution": -0.043057, "activation": 1.644715, "activation_over_scale": 0.777255} ] }, { @@ -705,10 +705,10 @@ "lens": "logit", "centred": false, "tokens": [ - {"token_id": 4, "token": "\"", "value": 0.998872}, - {"token_id": 211, "token": "\u0014", "value": 0.000562}, - {"token_id": 3, "token": "!", "value": 0.00029}, - {"token_id": 26, "token": "8", "value": 4.9e-05} + {"token_id": 4, "token": "\"", "value": 0.998751}, + {"token_id": 211, "token": "\u0014", "value": 0.000638}, + {"token_id": 3, "token": "!", "value": 0.000317}, + {"token_id": 236, "token": "�", "value": 5.7e-05} ], "absent": null }, @@ -726,10 +726,10 @@ "lens": "R:mid", "centred": false, "tokens": [ - {"token_id": 244, "token": "�", "value": 0.487867}, - {"token_id": 46, "token": "L", "value": 0.115686}, - {"token_id": 62, "token": "\\", "value": 0.089974}, - {"token_id": 3, "token": "!", "value": 0.051531} + {"token_id": 244, "token": "�", "value": 0.460188}, + {"token_id": 46, "token": "L", "value": 0.110179}, + {"token_id": 3, "token": "!", "value": 0.072715}, + {"token_id": 62, "token": "\\", "value": 0.064742} ], "absent": null }, @@ -747,10 +747,10 @@ "lens": "logit", "centred": false, "tokens": [ - {"token_id": 56, "token": "V", "value": 0.76129}, - {"token_id": 244, "token": "�", "value": 0.084734}, - {"token_id": 3, "token": "!", "value": 0.044046}, - {"token_id": 83, "token": "q", "value": 0.020083} + {"token_id": 56, "token": "V", "value": 0.594016}, + {"token_id": 244, "token": "�", "value": 0.152862}, + {"token_id": 3, "token": "!", "value": 0.085722}, + {"token_id": 235, "token": "�", "value": 0.030626} ], "absent": null }, @@ -758,30 +758,30 @@ }, "steering": null, "neurons": [ - {"unit": "neuron/L3n81", "kind": "neuron", "layer": 3, "index": 81, "contribution": 1.003524, "activation": 1.317455, "activation_over_scale": 0.416976}, - {"unit": "neuron/L3n8", "kind": "neuron", "layer": 3, "index": 8, "contribution": 0.858308, "activation": 2.610878, "activation_over_scale": 0.765472}, - {"unit": "neuron/L3n12", "kind": "neuron", "layer": 3, "index": 12, "contribution": 0.727794, "activation": 1.639437, "activation_over_scale": 0.423563}, - {"unit": "neuron/L3n89", "kind": "neuron", "layer": 3, "index": 89, "contribution": 0.526333, "activation": 2.244774, "activation_over_scale": 0.788499} + {"unit": "neuron/L3n81", "kind": "neuron", "layer": 3, "index": 81, "contribution": 1.094572, "activation": 1.433577, "activation_over_scale": 0.453728}, + {"unit": "neuron/L3n8", "kind": "neuron", "layer": 3, "index": 8, "contribution": 0.819897, "activation": 2.48812, "activation_over_scale": 0.729481}, + {"unit": "neuron/L3n12", "kind": "neuron", "layer": 3, "index": 12, "contribution": 0.718273, "activation": 1.614152, "activation_over_scale": 0.41703}, + {"unit": "neuron/L3n89", "kind": "neuron", "layer": 3, "index": 89, "contribution": 0.521368, "activation": 2.218326, "activation_over_scale": 0.779209} ], "heads": [ - {"unit": "head/L3h2", "kind": "head", "layer": 3, "index": 2, "contribution": 1.067295, "activation": 1.772925, "activation_over_scale": 0.748502}, - {"unit": "head/L3h0", "kind": "head", "layer": 3, "index": 0, "contribution": 0.772177, "activation": 1.705482, "activation_over_scale": 0.725447}, - {"unit": "head/L3h1", "kind": "head", "layer": 3, "index": 1, "contribution": 0.369791, "activation": 1.020136, "activation_over_scale": 0.605047}, - {"unit": "head/L3h3", "kind": "head", "layer": 3, "index": 3, "contribution": 0.019401, "activation": 1.809894, "activation_over_scale": 0.896618} + {"unit": "head/L3h2", "kind": "head", "layer": 3, "index": 2, "contribution": 1.047186, "activation": 1.707769, "activation_over_scale": 0.720995}, + {"unit": "head/L3h0", "kind": "head", "layer": 3, "index": 0, "contribution": 0.743891, "activation": 1.646431, "activation_over_scale": 0.700329}, + {"unit": "head/L3h1", "kind": "head", "layer": 3, "index": 1, "contribution": 0.374406, "activation": 0.986869, "activation_over_scale": 0.585316}, + {"unit": "head/L3h3", "kind": "head", "layer": 3, "index": 3, "contribution": 0.041767, "activation": 1.76757, "activation_over_scale": 0.875651} ] } ], "units": [ - {"unit": "neuron/L0n28", "kind": "neuron", "layer": 0, "index": 28, "contribution": 1.157034, "activation": null, "activation_over_scale": null}, - {"unit": "head/L3h2", "kind": "head", "layer": 3, "index": 2, "contribution": 1.067295, "activation": null, "activation_over_scale": null}, - {"unit": "neuron/L3n81", "kind": "neuron", "layer": 3, "index": 81, "contribution": 1.003524, "activation": null, "activation_over_scale": null}, - {"unit": "neuron/L3n8", "kind": "neuron", "layer": 3, "index": 8, "contribution": 0.858308, "activation": null, "activation_over_scale": null} + {"unit": "neuron/L0n28", "kind": "neuron", "layer": 0, "index": 28, "contribution": 1.159785, "activation": null, "activation_over_scale": null}, + {"unit": "neuron/L3n81", "kind": "neuron", "layer": 3, "index": 81, "contribution": 1.094572, "activation": null, "activation_over_scale": null}, + {"unit": "head/L3h2", "kind": "head", "layer": 3, "index": 2, "contribution": 1.047186, "activation": null, "activation_over_scale": null}, + {"unit": "neuron/L3n8", "kind": "neuron", "layer": 3, "index": 8, "contribution": 0.819897, "activation": null, "activation_over_scale": null} ], "units_absent": null, "units_scale": "neutral", "patterns": [ - {"unit": "head/L3h2", "layer": 3, "head": 2, "contribution": 1.067295, "weights": [0.015233, 0.020516, 0.013894, 0.022817, 0.009568, 0.013363, 0.010125, 0.032571, 0.017361, 0.019201, 0.009252, 0.004685, 0.024881, 0.017392, 0.049784, 0.020728, 0.006365, 0.01601, 0.008301, 0.018856, 0.009568, 0.04345, 0.026187, 0.009595, 0.006513, 0.046401, 0.021604, 0.01268, 0.013224, 0.009026, 0.014548, 0.079319, 0.025604, 0.097857, 0.021396, 0.007873, 0.006703, 0.025043, 0.031647, 0.009658, 0.052355, 0.007299, 0.002588, 0.007724, 0.006436, 0.026888, 0.020096, 0.004966, 0.002848]}, - {"unit": "head/L3h0", "layer": 3, "head": 0, "contribution": 0.772177, "weights": [0.009662, 0.003898, 0.012133, 0.012886, 0.036583, 0.012404, 0.017725, 0.012197, 0.016416, 0.008767, 0.052952, 0.025246, 0.004868, 0.016047, 0.004945, 0.114057, 0.013214, 0.014552, 0.009439, 0.013433, 0.026328, 0.013506, 0.010957, 0.014267, 0.01574, 0.039081, 0.01043, 0.008602, 0.022264, 0.01135, 0.011307, 0.021738, 0.003304, 0.015971, 0.008477, 0.033774, 0.059816, 0.009459, 0.020127, 0.005626, 0.016917, 0.030482, 0.063979, 0.006131, 0.047186, 0.007465, 0.007749, 0.034088, 0.012455]} + {"unit": "head/L3h2", "layer": 3, "head": 2, "contribution": 1.047186, "weights": [0.015803, 0.021079, 0.013948, 0.023893, 0.010146, 0.013161, 0.009906, 0.029994, 0.017367, 0.018477, 0.00913, 0.004724, 0.02478, 0.016278, 0.046698, 0.019519, 0.006169, 0.015179, 0.008481, 0.018589, 0.009337, 0.041235, 0.026342, 0.010513, 0.006901, 0.045434, 0.021107, 0.011994, 0.013242, 0.00999, 0.014397, 0.085022, 0.023998, 0.099522, 0.02266, 0.008268, 0.006839, 0.024766, 0.030442, 0.009693, 0.049975, 0.007851, 0.002782, 0.008225, 0.006735, 0.028293, 0.022718, 0.005359, 0.003041]}, + {"unit": "head/L3h0", "layer": 3, "head": 0, "contribution": 0.743891, "weights": [0.010566, 0.004586, 0.011537, 0.011453, 0.032109, 0.011501, 0.015623, 0.014345, 0.015893, 0.008197, 0.044096, 0.022685, 0.004904, 0.018392, 0.004546, 0.101458, 0.013928, 0.01503, 0.010427, 0.015565, 0.027009, 0.015594, 0.01026, 0.013037, 0.016082, 0.039599, 0.011267, 0.008011, 0.021869, 0.011185, 0.010221, 0.023106, 0.003285, 0.017807, 0.009731, 0.034345, 0.061812, 0.010657, 0.024494, 0.007283, 0.0198, 0.029224, 0.066907, 0.006052, 0.054401, 0.008932, 0.007716, 0.031481, 0.011993]} ], "context": ["<|im_start|>", "s", "y", "s", "t", "e", "m", "\n", "B", "e", " ", "b", "r", "i", "e", "f", ".", "<|im_end|>", "\n", "<|im_start|>", "u", "s", "e", "r", "\n", "H", "i", " ", "t", "h", "e", "r", "e", "<|im_end|>", "\n", "<|im_start|>", "a", "s", "s", "i", "s", "t", "a", "n", "t", "\n", "\\", "\u0014", "\""] } @@ -791,18 +791,18 @@ "ids": [2, 85, 91, 85, 86, 71, 79, 201, 36, 71, 223, 68, 84, 75, 71, 72, 16, 1, 201, 2, 87, 85, 71, 84, 201, 42, 75, 223, 86, 74, 71, 84, 71, 1, 201, 2, 67, 85, 85, 75, 85, 86, 67, 80, 86, 201, 62, 211, 4], "token_id": 3, "taps": { - "block_in": {"shape": [4, 64], "values": [0.875, -0.375, -0.625, -0.25, -0.375, -0.625, -0.875, -0.25, 0.75, 0.5, 0.875, 0.875, 0.75, 0.625, -0.5, 0.375, 0.625, 0.875, -0.75, -0.125, 0.75, -0.125, 0.375, -0.75, -0.375, 0.125, 0.0, 0.5, -0.625, -0.25, 0.125, 0.75, -0.875, 0.75, -0.375, -0.875, -0.25, 0.25, -0.5, 0.25, -0.25, 0.25, -0.375, 0.875, 0.625, -0.25, 0.0, 0.0, -0.875, -0.625, 0.5, 0.875, 0.75, 0.75, 0.375, -0.125, 0.0, 0.25, 0.625, 0.875, 0.75, 0.125, -0.625, -0.125, 0.24096751, -0.93498075, -0.9210675, -0.51757586, 0.20284249, 0.22810769, 0.01613611, 0.48623645, 0.4708981, 1.7002262, 1.4250346, 0.7799957, 1.8778343, -0.4726825, 0.5239041, 1.0447462, 0.5585166, 0.814808, -0.5967735, -0.36300614, 0.23352902, -0.50771385, -0.17707248, -1.3743287, -1.4081093, -0.453878, -0.35890085, 0.26078993, 0.5994174, 1.0767348, 0.5709546, 1.6768974, -1.8787811, 1.1562378, -0.36651987, -1.1556292, -0.4903492, -0.26946768, -0.36938357, -0.5434944, -1.0733684, -0.25172627, 1.0405773, 1.8717501, 0.62124705, -0.2461718, 0.41346687, -0.94149166, -1.0086536, -0.008467734, 1.0222573, -0.6242373, 0.36440572, 0.4811405, -0.501069, -0.9006573, -0.8427419, 0.76533854, -0.41698506, 0.5789094, 0.07983616, -0.35652125, -0.9027308, -1.1068041, 0.9121771, -1.8684809, 0.07427144, -0.9979311, -0.92881495, 0.12738012, 0.63716173, 1.881113, 0.2634952, 1.3095165, -0.07893729, 1.9676532, 1.6729828, -0.8454336, 0.1944542, 1.8729603, 0.38943344, 1.5610285, -0.5145175, -0.23717602, 0.67365706, -0.15715605, -0.64473003, -2.967231, -1.5859606, 0.077372104, 1.0098307, -0.595383, 0.7989541, 2.4120831, 0.6058797, 2.7031875, -1.7721672, 2.20766, -0.61425805, -0.558503, 0.8895855, 1.6225085, -0.273629, -0.31904173, -0.72888803, 0.1458829, 1.2840209, 2.4624546, -0.027569607, -0.1958946, 0.1691346, -1.4315319, -1.29431, -0.080660656, 1.667209, 0.3468687, -0.67104024, 0.23093992, -0.009613052, -1.084475, 0.06587586, 1.2062013, -0.5979287, -0.6806671, 0.15170382, 0.14006652, -0.39053214, -1.0696164, 0.49370086, -0.40792322, -0.15125516, -1.852854, -0.99302334, -0.5313734, 0.96315205, 1.0431529, 0.1950528, 0.7682078, -0.5250856, 2.6603866, 0.9267309, -1.0084484, 0.52915883, 1.3598862, 1.0886893, 1.6325412, -0.4867547, -0.9036577, -0.033558972, -0.064074166, 1.4692283, -1.9535239, -1.1143432, -1.0227711, 1.2573161, -0.08870149, 1.0203731, 1.5055729, -0.1267938, 3.384828, -1.3760395, 3.063293, 0.20347553, -1.994685, 1.8906529, 2.3132918, -0.1568563, -0.9034254, -2.342308, 0.30211067, 1.3445501, 3.3688242, 0.807034, 0.18863252, -0.95200765, -0.7237169, -2.1042888, -0.055063248, 1.7737892, 0.8455297, -0.6187401, -0.122647926, -0.17754835, -0.8537438, -0.35443377, 0.730983, -0.28835833, -1.3015287, -0.028728161, -0.5664385, -0.8503574, -0.42288566]}, - "mid": {"shape": [4, 64], "values": [0.8891171, -0.49903148, -1.1107022, -0.41668445, 0.13220924, -0.39170337, -0.96015805, -0.6150569, 0.6457803, 0.6786804, 1.5465094, 0.82493746, 1.1566844, 0.28600773, -0.2774338, 0.6121715, 1.218152, 1.5563142, -0.9720998, -0.26295757, 0.4194006, -0.08353632, 0.04767555, -1.0887309, -0.3978232, -0.14488521, -0.23374876, 0.42322403, -0.6494681, 0.16761959, 0.21401769, 0.9402665, -1.2346461, 0.7887331, -0.6741792, -1.2570775, -0.74882174, 0.14550215, -0.38314185, 0.111591324, -0.25788602, 0.026634172, -0.3850522, 1.186515, 0.3139603, 0.050783068, 0.19868258, 0.017644407, -0.76110935, -0.6118901, 0.4560483, 0.90090406, 0.25700402, 0.36468905, 0.07660371, -0.6622577, 0.16243537, 0.42958206, 0.26691797, 0.99814236, 0.17002392, 0.082504, -0.3995468, -0.36972585, 0.68375933, -1.5140218, -0.5742482, -0.5136334, 0.008872941, 0.20939627, -0.40510535, 1.0757433, 0.8004464, 1.4085546, 1.7158397, 0.8701422, 1.936991, -0.5350214, 0.7504505, 1.2607262, 0.29773462, 1.1062112, -0.7166881, 0.00495553, -0.05151631, -0.10792032, -0.7225243, -2.005539, -2.240346, -0.07236388, 0.34338558, 0.2778117, 0.5923808, 1.8523686, 0.29442802, 2.2253602, -1.9351846, 1.8611269, -0.3931814, -0.8060992, 0.034543842, -0.17786327, -0.5023906, 0.50137633, -0.77856827, -0.31189817, 0.8948305, 3.091271, -0.15918225, -0.15120682, 0.22015572, -1.3223917, -1.4627074, 0.14713307, 1.4126523, -0.55444366, -0.21622929, 0.8552933, -0.11604503, -0.8376753, -0.45668146, 0.5930779, -1.2115192, -0.2543934, 0.31061542, -0.05277869, -0.84307706, -0.8110106, 0.53751934, -1.2683601, 0.018954393, -1.3899692, -0.69973475, 0.07353205, 1.1729059, 1.4991087, 0.09477131, 1.1809425, -0.2939621, 2.1145792, 1.2982955, -1.0963086, 0.496848, 1.77074, 0.67022496, 1.2104564, -0.51136845, -0.38524348, 1.1231381, 0.11733699, 0.67619413, -2.6886497, -1.267862, 0.015723396, 1.6100442, -0.28870332, 1.0631201, 2.0026963, 0.3338548, 3.3362195, -1.2410872, 2.0504317, 0.24282026, -1.160392, 1.8720733, 2.2412772, 0.28711742, -0.6686144, -1.9676572, 0.94412327, 0.92815065, 2.2971087, 0.19442627, 0.29317084, 0.13355115, -1.4848385, -1.9921203, 0.47506225, 1.6114203, 0.43121377, -0.5520829, -0.10106292, -0.5274822, -0.74229395, -0.49995038, 0.1430738, -0.17607918, -1.296207, 0.061807565, -0.3111934, -0.8535817, -1.4461614, 0.1249637, 0.029624611, 0.35657474, -1.474069, -0.7615592, -0.46099046, 1.0910722, 1.4933027, 0.80095196, 1.6795176, 0.028398633, 2.409814, 0.70966727, -0.9030246, 0.783883, 1.5739843, 1.2749226, 1.7058045, -0.41497102, -1.042962, 0.34004313, -0.5957008, 1.2801545, -2.9634013, -1.3793848, -1.0080283, 0.7099286, 0.75955826, 0.8580315, 0.46750224, -0.57102895, 3.3642874, -1.4545869, 2.5756721, 0.5522084, -1.9648018, 1.8950845, 2.956734, -0.20834367, -1.2591355, -2.233783, 0.3528848, 1.6344346, 3.3908565, 0.79081523, -0.07386613, -1.4703405, -1.2902417, -2.7729106, -0.3951826, 1.8551087, 0.75480664, -0.7141361, 0.04324889, 0.39464843, -1.2416312, -0.55453306, 0.523494, -0.35988542, -1.7616433, -0.6451538, -1.0900353, -0.9865565, -0.23050219]}, - "out": {"shape": [4, 64], "values": [0.24096751, -0.93498075, -0.9210675, -0.51757586, 0.20284249, 0.22810769, 0.01613611, 0.48623645, 0.4708981, 1.7002262, 1.4250346, 0.7799957, 1.8778343, -0.4726825, 0.5239041, 1.0447462, 0.5585166, 0.814808, -0.5967735, -0.36300614, 0.23352902, -0.50771385, -0.17707248, -1.3743287, -1.4081093, -0.453878, -0.35890085, 0.26078993, 0.5994174, 1.0767348, 0.5709546, 1.6768974, -1.8787811, 1.1562378, -0.36651987, -1.1556292, -0.4903492, -0.26946768, -0.36938357, -0.5434944, -1.0733684, -0.25172627, 1.0405773, 1.8717501, 0.62124705, -0.2461718, 0.41346687, -0.94149166, -1.0086536, -0.008467734, 1.0222573, -0.6242373, 0.36440572, 0.4811405, -0.501069, -0.9006573, -0.8427419, 0.76533854, -0.41698506, 0.5789094, 0.07983616, -0.35652125, -0.9027308, -1.1068041, 0.9121771, -1.8684809, 0.07427144, -0.9979311, -0.92881495, 0.12738012, 0.63716173, 1.881113, 0.2634952, 1.3095165, -0.07893729, 1.9676532, 1.6729828, -0.8454336, 0.1944542, 1.8729603, 0.38943344, 1.5610285, -0.5145175, -0.23717602, 0.67365706, -0.15715605, -0.64473003, -2.967231, -1.5859606, 0.077372104, 1.0098307, -0.595383, 0.7989541, 2.4120831, 0.6058797, 2.7031875, -1.7721672, 2.20766, -0.61425805, -0.558503, 0.8895855, 1.6225085, -0.273629, -0.31904173, -0.72888803, 0.1458829, 1.2840209, 2.4624546, -0.027569607, -0.1958946, 0.1691346, -1.4315319, -1.29431, -0.080660656, 1.667209, 0.3468687, -0.67104024, 0.23093992, -0.009613052, -1.084475, 0.06587586, 1.2062013, -0.5979287, -0.6806671, 0.15170382, 0.14006652, -0.39053214, -1.0696164, 0.49370086, -0.40792322, -0.15125516, -1.852854, -0.99302334, -0.5313734, 0.96315205, 1.0431529, 0.1950528, 0.7682078, -0.5250856, 2.6603866, 0.9267309, -1.0084484, 0.52915883, 1.3598862, 1.0886893, 1.6325412, -0.4867547, -0.9036577, -0.033558972, -0.064074166, 1.4692283, -1.9535239, -1.1143432, -1.0227711, 1.2573161, -0.08870149, 1.0203731, 1.5055729, -0.1267938, 3.384828, -1.3760395, 3.063293, 0.20347553, -1.994685, 1.8906529, 2.3132918, -0.1568563, -0.9034254, -2.342308, 0.30211067, 1.3445501, 3.3688242, 0.807034, 0.18863252, -0.95200765, -0.7237169, -2.1042888, -0.055063248, 1.7737892, 0.8455297, -0.6187401, -0.122647926, -0.17754835, -0.8537438, -0.35443377, 0.730983, -0.28835833, -1.3015287, -0.028728161, -0.5664385, -0.8503574, -0.42288566, 0.7632416, 1.9015431, -0.07393393, -0.8362652, 0.029531062, -1.0194365, 0.6092973, 1.4708303, 1.0492173, 1.9835634, 0.7015476, 1.9996845, 0.9672338, -0.336708, 1.4293681, 1.8965042, 1.0063035, 1.0340493, -1.1466442, -0.50109273, 0.8141408, 0.40266883, 0.9057771, -2.6843405, -0.42477268, -0.23430228, 0.35825282, 0.4093623, 0.66094875, 0.6960503, -0.26397806, 2.9183125, -1.764155, 4.0677323, -0.18758816, -2.5375612, 1.783645, 2.3995037, 0.57144344, -0.23304701, -2.4740648, -0.06678951, 1.3653896, 3.657668, 1.822285, -0.56350887, -1.9333858, -1.5729202, -2.849629, -0.57592225, 1.6641989, 0.6044707, -0.14019108, 0.30154917, 0.73588747, -1.5465622, -0.43094078, 0.8086809, -0.32690293, -0.9742854, -0.61652297, -0.8313382, -0.77306837, -1.1171064]}, - "act": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 96], "data": "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"}, - "z": {"shape": [4, 64], "values": [0.2843919, 0.18382163, 0.27276152, -0.6930688, -0.39952976, 0.083316304, 0.48403624, -0.14087439, 0.18916734, 0.44749326, -0.53173786, 0.5062618, 1.2640507, 0.11938638, 0.15099917, -0.48446316, 0.0014621159, -0.043899782, 0.035740864, -0.09475523, -0.024054328, 0.19466047, 0.047299538, 0.053740352, 0.23263948, 0.32760596, -0.27679783, 0.26823887, 0.52639115, 0.13531739, 0.24194935, 0.12199068, 0.3498518, 0.04158183, 0.616092, 0.02057328, -0.16632366, 0.30137682, 0.06607868, 0.087044075, -0.26701567, -0.3864135, 0.56645894, 0.0112559125, 0.10168383, 0.4256039, 0.113079526, 0.1340281, 0.33762884, -0.21845575, 0.51356363, 0.10616315, -0.011235315, 0.13595349, -0.30408078, -0.19394654, -0.34398565, -0.26919726, 0.48327976, -0.36595708, 0.32268572, -0.2194057, 0.13131009, -0.057169482, -0.06727141, 0.38418016, -0.097944334, -1.3065312, -0.4012589, 0.8962517, -0.098106906, -0.35658962, 0.28593948, 0.3251848, 0.38802338, -0.032171622, -0.013052667, 0.6544848, 0.2546387, -0.827091, -0.12643698, 0.44444472, -0.094024904, -1.2766168, -0.54722637, 0.8352693, -0.1054924, -0.26143244, 0.1882701, 0.33296126, 0.17743182, 0.02065831, 0.057362758, 0.7429772, 0.19787043, -0.6000386, -0.58162016, 0.32751656, -0.13875547, 0.19466402, -0.039329804, -0.2269551, 0.24948375, -0.4322246, 1.1159285, 1.027355, -0.5948523, 0.66653365, -0.3507072, 0.814148, 0.044886243, -0.6709807, -0.009813155, 0.3962776, 0.042855706, -0.056436013, -0.3463833, 0.2393114, 0.2772796, -0.34525228, 0.63710254, 0.17922114, -0.18436816, 0.0819604, -0.26025364, 0.22488557, -0.019156244, -0.4982925, 1.011924, 0.10968148, 0.55698425, -0.09680106, 0.07612212, 0.72561556, -0.19859353, 0.06380971, -0.41596153, -0.5679691, 0.28790447, -0.2551333, -0.011685017, -0.054786626, 0.3037382, -0.06364001, 0.8847926, 0.06743215, 0.5491722, -0.15094857, -0.14490505, 0.48758975, -0.22842062, -0.42253774, -0.38333887, -0.2977448, 0.42175072, -0.54574037, -0.014151846, 0.12126288, 0.2686596, -0.2086447, 0.35521102, 0.16532876, -0.42197478, -0.21186446, -0.07422056, 0.7452672, -0.18045695, -0.37588936, -0.45033252, 0.6683865, -0.0074672624, -0.21038859, -1.073542, 0.3663021, 0.43473968, 0.124005325, 0.58858025, 0.19983296, -0.40654033, -0.15502405, -0.19186965, 0.74174434, -0.30865848, -0.22410098, -0.7100259, 0.19586629, -0.122969605, -0.2810668, -0.92073673, 0.7482082, 0.47600335, 0.19156386, 0.9954796, -0.24098754, 0.15743686, -0.23744822, 0.35782838, 0.1415951, -0.9285834, 0.08305006, -0.41831008, -0.21083847, -0.36767974, 0.43034965, -0.36542746, 0.039375063, 0.08962494, 0.26856792, 0.89800775, -0.19775826, 0.012895734, -0.25678515, 0.0037235506, 0.14046204, -0.7142574, 0.2410288, -0.23917922, 0.10583773, -0.15063547, 0.2549273, -0.24849814, 0.07590322, 0.29488578, 0.37773395, 0.112684816, 0.33774355, 0.15553156, 0.19034602, -0.3323966, 0.06904089, -1.269157, -0.82359767, 0.885966, 0.3336541, 0.34105933, -0.77877986, 0.062067017, 0.18495451, 0.08081674, 0.021126172, 0.18115625, 0.26296517, -0.098676614, 0.40103376, -0.18684459, 0.22162826, -0.98294425, -0.8225472, 0.85885704, 0.36172307, 0.33705798, -0.792531, 0.0008658377, 0.35828334, 0.10755031, -0.00085092464]} + "block_in": {"shape": [4, 64], "values": [0.875, -0.375, -0.625, -0.25, -0.375, -0.625, -0.875, -0.25, 0.75, 0.5, 0.875, 0.875, 0.75, 0.625, -0.5, 0.375, 0.625, 0.875, -0.75, -0.125, 0.75, -0.125, 0.375, -0.75, -0.375, 0.125, 0.0, 0.5, -0.625, -0.25, 0.125, 0.75, -0.875, 0.75, -0.375, -0.875, -0.25, 0.25, -0.5, 0.25, -0.25, 0.25, -0.375, 0.875, 0.625, -0.25, 0.0, 0.0, -0.875, -0.625, 0.5, 0.875, 0.75, 0.75, 0.375, -0.125, 0.0, 0.25, 0.625, 0.875, 0.75, 0.125, -0.625, -0.125, 0.24096751, -0.93498075, -0.9210675, -0.51757586, 0.20284249, 0.22810769, 0.01613611, 0.48623645, 0.4708981, 1.7002262, 1.4250346, 0.7799957, 1.8778343, -0.4726825, 0.5239041, 1.0447462, 0.5585166, 0.814808, -0.5967735, -0.36300614, 0.23352902, -0.50771385, -0.17707248, -1.3743287, -1.4081093, -0.453878, -0.35890085, 0.26078993, 0.5994174, 1.0767348, 0.5709546, 1.6768974, -1.8787811, 1.1562378, -0.36651987, -1.1556292, -0.4903492, -0.26946768, -0.36938357, -0.5434944, -1.0733684, -0.25172627, 1.0405773, 1.8717501, 0.62124705, -0.2461718, 0.41346687, -0.94149166, -1.0086536, -0.008467734, 1.0222573, -0.6242373, 0.36440572, 0.4811405, -0.501069, -0.9006573, -0.8427419, 0.76533854, -0.41698506, 0.5789094, 0.07983616, -0.35652125, -0.9027308, -1.1068041, 0.9121771, -1.8684809, 0.07427144, -0.9979311, -0.92881495, 0.12738012, 0.63716173, 1.881113, 0.2634952, 1.3095165, -0.07893729, 1.9676532, 1.6729828, -0.8454336, 0.1944542, 1.8729603, 0.38943344, 1.5610285, -0.5145175, -0.23717602, 0.67365706, -0.15715605, -0.64473003, -2.967231, -1.5859606, 0.077372104, 1.0098307, -0.595383, 0.7989541, 2.4120831, 0.6058797, 2.7031875, -1.7721672, 2.20766, -0.61425805, -0.558503, 0.8895855, 1.6225085, -0.273629, -0.31904173, -0.72888803, 0.1458829, 1.2840209, 2.4624546, -0.027569607, -0.1958946, 0.1691346, -1.4315319, -1.29431, -0.080660656, 1.667209, 0.3468687, -0.67104024, 0.23093992, -0.009613052, -1.084475, 0.06587586, 1.2062013, -0.5979287, -0.6806671, 0.15170382, 0.14006652, -0.39053214, -1.0696164, 0.5281738, -0.41654146, -0.17710987, -1.8356175, -0.906841, -0.46242753, 0.9286791, 1.0948623, 0.18643457, 0.8371537, -0.55094033, 2.64315, 0.94396734, -0.92226595, 0.46883115, 1.4029773, 1.1403987, 1.5808318, -0.60741, -0.7830024, 0.018150441, -0.020982984, 1.3830459, -1.9362874, -1.2349985, -0.93658876, 1.2573161, -0.12317443, 0.9859002, 1.5400459, -0.17850322, 3.4365375, -1.2726207, 3.063293, 0.15176612, -1.9085027, 1.9768353, 2.3305283, -0.122383356, -0.9465166, -2.33369, 0.19869186, 1.2928407, 3.4032972, 0.8501252, 0.21448722, -1.03819, -0.7150987, -2.1301434, 0.065592065, 1.7393162, 0.86276615, -0.49808472, -0.13126616, -0.20340306, -0.8537438, -0.4061432, 0.64480066, -0.1849395, -1.3187652, -0.011491692, -0.5233473, -0.8675939, -0.509068]}, + "mid": {"shape": [4, 64], "values": [0.8891171, -0.49903148, -1.1107022, -0.41668445, 0.13220924, -0.39170337, -0.96015805, -0.6150569, 0.6457803, 0.6786804, 1.5465094, 0.82493746, 1.1566844, 0.28600773, -0.2774338, 0.6121715, 1.218152, 1.5563142, -0.9720998, -0.26295757, 0.4194006, -0.08353632, 0.04767555, -1.0887309, -0.3978232, -0.14488521, -0.23374876, 0.42322403, -0.6494681, 0.16761959, 0.21401769, 0.9402665, -1.2346461, 0.7887331, -0.6741792, -1.2570775, -0.74882174, 0.14550215, -0.38314185, 0.111591324, -0.25788602, 0.026634172, -0.3850522, 1.186515, 0.3139603, 0.050783068, 0.19868258, 0.017644407, -0.76110935, -0.6118901, 0.4560483, 0.90090406, 0.25700402, 0.36468905, 0.07660371, -0.6622577, 0.16243537, 0.42958206, 0.26691797, 0.99814236, 0.17002392, 0.082504, -0.3995468, -0.36972585, 0.68375933, -1.5140218, -0.5742482, -0.5136334, 0.008872941, 0.20939627, -0.40510535, 1.0757433, 0.8004464, 1.4085546, 1.7158397, 0.8701422, 1.936991, -0.5350214, 0.7504505, 1.2607262, 0.29773462, 1.1062112, -0.7166881, 0.00495553, -0.05151631, -0.10792032, -0.7225243, -2.005539, -2.240346, -0.07236388, 0.34338558, 0.2778117, 0.5923808, 1.8523686, 0.29442802, 2.2253602, -1.9351846, 1.8611269, -0.3931814, -0.8060992, 0.034543842, -0.17786327, -0.5023906, 0.50137633, -0.77856827, -0.31189817, 0.8948305, 3.091271, -0.15918225, -0.15120682, 0.22015572, -1.3223917, -1.4627074, 0.14713307, 1.4126523, -0.55444366, -0.21622929, 0.8552933, -0.11604503, -0.8376753, -0.45668146, 0.5930779, -1.2115192, -0.2543934, 0.31061542, -0.05277869, -0.84307706, -0.8110106, 0.53751934, -1.2683601, 0.018954393, -1.3899692, -0.69973475, 0.07353205, 1.1729059, 1.4991087, 0.09477131, 1.1809425, -0.2939621, 2.1145792, 1.2982955, -1.0963086, 0.496848, 1.77074, 0.67022496, 1.2104564, -0.51136845, -0.38524348, 1.1231381, 0.11733699, 0.67619413, -2.6886497, -1.267862, 0.015723396, 1.6100442, -0.28870332, 1.0631201, 2.0026963, 0.3338548, 3.3362195, -1.2410872, 2.0504317, 0.24282026, -1.160392, 1.8720733, 2.2412772, 0.28711742, -0.6686144, -1.9676572, 0.94412327, 0.92815065, 2.2971087, 0.19442627, 0.29317084, 0.13355115, -1.4848385, -1.9921203, 0.47506225, 1.6114203, 0.43121377, -0.5520829, -0.10106292, -0.5274822, -0.74229395, -0.49995038, 0.1430738, -0.17607918, -1.296207, 0.061807565, -0.3111934, -0.8535817, -1.4461614, 0.19348279, 0.018572718, 0.28558442, -1.4733801, -0.6511028, -0.41725945, 1.0634131, 1.5588611, 0.8020551, 1.6787264, -0.021652877, 2.4030316, 0.6802796, -0.81404865, 0.7556058, 1.5919049, 1.3180554, 1.6974498, -0.5368701, -0.9003885, 0.3492612, -0.48287305, 1.1812885, -2.916173, -1.5434889, -0.91088474, 0.73320395, 0.6947825, 0.7696572, 0.5896429, -0.5760659, 3.473387, -1.3575344, 2.6032329, 0.5054225, -1.8781909, 2.0352423, 2.9690585, -0.1443703, -1.2512014, -2.1860206, 0.23367463, 1.5512438, 3.419762, 0.8281555, -0.017617032, -1.5790317, -1.292725, -2.7686949, -0.3164276, 1.865692, 0.7488284, -0.6142979, 0.036343664, 0.2880367, -1.2463806, -0.5528184, 0.39065552, -0.27347156, -1.7914854, -0.6024223, -1.0210152, -1.0000666, -0.3299082]}, + "out": {"shape": [4, 64], "values": [0.24096751, -0.93498075, -0.9210675, -0.51757586, 0.20284249, 0.22810769, 0.01613611, 0.48623645, 0.4708981, 1.7002262, 1.4250346, 0.7799957, 1.8778343, -0.4726825, 0.5239041, 1.0447462, 0.5585166, 0.814808, -0.5967735, -0.36300614, 0.23352902, -0.50771385, -0.17707248, -1.3743287, -1.4081093, -0.453878, -0.35890085, 0.26078993, 0.5994174, 1.0767348, 0.5709546, 1.6768974, -1.8787811, 1.1562378, -0.36651987, -1.1556292, -0.4903492, -0.26946768, -0.36938357, -0.5434944, -1.0733684, -0.25172627, 1.0405773, 1.8717501, 0.62124705, -0.2461718, 0.41346687, -0.94149166, -1.0086536, -0.008467734, 1.0222573, -0.6242373, 0.36440572, 0.4811405, -0.501069, -0.9006573, -0.8427419, 0.76533854, -0.41698506, 0.5789094, 0.07983616, -0.35652125, -0.9027308, -1.1068041, 0.9121771, -1.8684809, 0.07427144, -0.9979311, -0.92881495, 0.12738012, 0.63716173, 1.881113, 0.2634952, 1.3095165, -0.07893729, 1.9676532, 1.6729828, -0.8454336, 0.1944542, 1.8729603, 0.38943344, 1.5610285, -0.5145175, -0.23717602, 0.67365706, -0.15715605, -0.64473003, -2.967231, -1.5859606, 0.077372104, 1.0098307, -0.595383, 0.7989541, 2.4120831, 0.6058797, 2.7031875, -1.7721672, 2.20766, -0.61425805, -0.558503, 0.8895855, 1.6225085, -0.273629, -0.31904173, -0.72888803, 0.1458829, 1.2840209, 2.4624546, -0.027569607, -0.1958946, 0.1691346, -1.4315319, -1.29431, -0.080660656, 1.667209, 0.3468687, -0.67104024, 0.23093992, -0.009613052, -1.084475, 0.06587586, 1.2062013, -0.5979287, -0.6806671, 0.15170382, 0.14006652, -0.39053214, -1.0696164, 0.5281738, -0.41654146, -0.17710987, -1.8356175, -0.906841, -0.46242753, 0.9286791, 1.0948623, 0.18643457, 0.8371537, -0.55094033, 2.64315, 0.94396734, -0.92226595, 0.46883115, 1.4029773, 1.1403987, 1.5808318, -0.60741, -0.7830024, 0.018150441, -0.020982984, 1.3830459, -1.9362874, -1.2349985, -0.93658876, 1.2573161, -0.12317443, 0.9859002, 1.5400459, -0.17850322, 3.4365375, -1.2726207, 3.063293, 0.15176612, -1.9085027, 1.9768353, 2.3305283, -0.122383356, -0.9465166, -2.33369, 0.19869186, 1.2928407, 3.4032972, 0.8501252, 0.21448722, -1.03819, -0.7150987, -2.1301434, 0.065592065, 1.7393162, 0.86276615, -0.49808472, -0.13126616, -0.20340306, -0.8537438, -0.4061432, 0.64480066, -0.1849395, -1.3187652, -0.011491692, -0.5233473, -0.8675939, -0.509068, 0.8086636, 1.9004514, -0.032943577, -0.851399, 0.11359662, -0.9831738, 0.607751, 1.5798756, 1.0293992, 1.9633174, 0.67335105, 2.016443, 0.9018066, -0.3047073, 1.2736754, 1.8724728, 1.0019873, 1.0291352, -1.2475877, -0.42398682, 0.78570235, 0.4284747, 0.81241786, -2.6755784, -0.6006049, -0.13333267, 0.36704814, 0.30859667, 0.5336803, 0.82558984, -0.20320493, 2.9889634, -1.6537921, 4.0843363, -0.1884476, -2.3873188, 1.9035182, 2.444952, 0.62789774, -0.24478841, -2.39629, -0.20408224, 1.301461, 3.664411, 1.8762848, -0.44929498, -1.9858444, -1.6363543, -2.836138, -0.5496086, 1.6176254, 0.6177927, -0.023823977, 0.33418003, 0.61919355, -1.534018, -0.4485862, 0.6573875, -0.29947373, -1.0190303, -0.6412941, -0.72173667, -0.7586746, -1.2336324]}, + "act": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 96], "data": "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"}, + "z": {"shape": [4, 64], "values": [0.2843919, 0.18382163, 0.27276152, -0.6930688, -0.39952976, 0.083316304, 0.48403624, -0.14087439, 0.18916734, 0.44749326, -0.53173786, 0.5062618, 1.2640507, 0.11938638, 0.15099917, -0.48446316, 0.0014621159, -0.043899782, 0.035740864, -0.09475523, -0.024054328, 0.19466047, 0.047299538, 0.053740352, 0.23263948, 0.32760596, -0.27679783, 0.26823887, 0.52639115, 0.13531739, 0.24194935, 0.12199068, 0.3498518, 0.04158183, 0.616092, 0.02057328, -0.16632366, 0.30137682, 0.06607868, 0.087044075, -0.26701567, -0.3864135, 0.56645894, 0.0112559125, 0.10168383, 0.4256039, 0.113079526, 0.1340281, 0.33762884, -0.21845575, 0.51356363, 0.10616315, -0.011235315, 0.13595349, -0.30408078, -0.19394654, -0.34398565, -0.26919726, 0.48327976, -0.36595708, 0.32268572, -0.2194057, 0.13131009, -0.057169482, -0.06727141, 0.38418016, -0.097944334, -1.3065312, -0.4012589, 0.8962517, -0.098106906, -0.35658962, 0.28593948, 0.3251848, 0.38802338, -0.032171622, -0.013052667, 0.6544848, 0.2546387, -0.827091, -0.12643698, 0.44444472, -0.094024904, -1.2766168, -0.54722637, 0.8352693, -0.1054924, -0.26143244, 0.1882701, 0.33296126, 0.17743182, 0.02065831, 0.057362758, 0.7429772, 0.19787043, -0.6000386, -0.58162016, 0.32751656, -0.13875547, 0.19466402, -0.039329804, -0.2269551, 0.24948375, -0.4322246, 1.1159285, 1.027355, -0.5948523, 0.66653365, -0.3507072, 0.814148, 0.044886243, -0.6709807, -0.009813155, 0.3962776, 0.042855706, -0.056436013, -0.3463833, 0.2393114, 0.2772796, -0.34525228, 0.63710254, 0.17922114, -0.18436816, 0.0819604, -0.26025364, 0.22488557, -0.019156244, -0.4982925, 1.011924, 0.10968148, 0.55698425, -0.09680106, 0.07612212, 0.72561556, -0.19859353, 0.06380971, -0.41596153, -0.5679691, 0.28790447, -0.2551333, -0.011685017, -0.054786626, 0.3037382, -0.06364001, 0.8847926, 0.06743215, 0.5491722, -0.15094857, -0.14490505, 0.48758975, -0.22842062, -0.42253774, -0.38333887, -0.2977448, 0.42175072, -0.54574037, -0.014151846, 0.12126288, 0.2686596, -0.2086447, 0.35521102, 0.16532876, -0.42197478, -0.21186446, -0.07422056, 0.7452672, -0.18045695, -0.37588936, -0.45033252, 0.6683865, -0.0074672624, -0.21038859, -1.073542, 0.3663021, 0.43473968, 0.124005325, 0.58858025, 0.19983296, -0.40654033, -0.15502405, -0.19186965, 0.74174434, -0.30865848, -0.22410098, -0.7100259, 0.19586629, -0.122969605, -0.2810668, -0.92073673, 0.7482082, 0.47600335, 0.19156386, 0.9914021, -0.19002916, 0.26249078, -0.21673407, 0.378297, 0.13640249, -0.83372986, 0.124980524, -0.39805606, -0.1718596, -0.36173484, 0.4068089, -0.23151131, 0.048941586, 0.11458322, 0.24434933, 0.89632565, -0.14758363, 0.112811096, -0.25306103, 0.042437322, 0.1583618, -0.66014713, 0.25322905, -0.24282989, 0.12020142, -0.1630279, 0.2404232, -0.18080209, 0.086779624, 0.31210336, 0.36012855, 0.079653986, 0.38325378, 0.19736257, 0.22898616, -0.33460978, 0.06062491, -1.3044729, -0.7727103, 0.79725397, 0.2877174, 0.3297312, -0.70213753, 0.049894378, 0.1474612, 0.030655693, -0.018675815, 0.1579072, 0.3187641, -0.048827298, 0.4295805, -0.18158767, 0.20608161, -1.057641, -0.7788738, 0.78776175, 0.3245724, 0.32907668, -0.73518157, -0.0037990792, 0.3110939, 0.054601945, -0.045827884]} }, - "u": [0.26880407, 0.28923607, -0.05079012, 0.13248043, 0.15757497, 0.077396765, -0.034734324, 0.107620776, 0.2108069, 0.0, 0.37246138, 0.10075283, 0.04585527, -0.04198315, -0.053653974, 0.27961925, 0.25705686, 0.09188258, -0.20121649, -0.18833315, -0.04042074, 0.16134192, 0.12530866, -0.16440502, 0.04889329, 0.3079679, -0.04402211, 0.19203922, 0.08510237, -0.31470552, 0.10510122, -0.31379193, -0.5567629, 0.4844768, -0.42472804, -0.48456132, -0.27923003, 0.60623616, 0.0, 0.6468518, 0.39860773, -0.29273695, 0.09450207, 0.0, -0.14772072, 0.0, -0.5081316, -0.18028289, -0.4649003, -0.35571742, -0.29114124, 0.07476768, -0.20780906, 0.26419622, -0.5560156, -0.7183421, -0.14789797, 0.0, -0.38036248, -0.09205484, 0.078991905, -0.09548638, -0.21582988, -0.585], - "g_out": {"0": [0.29503134, 0.230999, 0.19226335, -0.11023999, 0.050629288, 0.38477123, -0.41215795, -0.0027891155, 0.14266598, 0.11709896, 0.5765333, -0.025591668, 0.0491741, -0.10361778, 0.25018117, 0.21919227, -0.0762635, -0.1328635, -0.3156111, -0.19307762, 0.15917066, 0.16732943, 0.1871527, -0.51806426, -0.070956066, 0.11168969, -0.12695026, 0.08242449, 0.20450741, -0.39843962, -0.22733548, -0.31582972, -0.46282414, 0.33023912, -0.41021863, -0.48418325, -0.31453538, 0.59554744, -0.26978943, 0.46623874, 0.24452485, 0.33385345, 0.16983093, -0.18076508, 0.06440508, -0.3454021, -0.28984177, -0.2753279, -0.4772211, -0.1708141, -0.11325416, -0.26496077, -0.045102175, 0.13411187, -0.48410976, -0.72887224, -0.47807616, -0.043136373, -0.23983255, -0.12443411, 0.5364008, -0.19669491, -0.21420357, -0.86050594], "1": [0.29768974, 0.06391384, -0.07439103, -0.29068547, 0.22081764, 0.05151978, -0.055993967, 0.20821217, 0.2161255, 0.0749617, 0.06270373, 0.22405961, 0.2137453, -0.04758462, -0.075735345, 0.16027474, 0.0632831, 0.45729756, 0.1975458, -0.023984894, 0.05510386, 0.35340795, 0.1649257, -0.40915176, 0.16742487, 0.3641325, 0.05211286, 0.11544296, 0.33014214, -0.20465453, -0.06312935, -0.27026218, -0.19862248, 0.48614144, -0.24401721, -0.35824347, -0.079497114, 0.5377154, -0.155525, 0.6025527, 0.15365921, -0.38736075, 0.08447026, -0.50870514, -0.0063370764, 0.2010499, -0.6781345, -0.35995257, -0.5513509, -0.27882707, -0.247777, 0.1145374, -0.09899771, 0.03990385, -0.33002177, -0.5622185, -0.30138206, 0.101884015, -0.2290319, -0.16484675, -0.114087224, -0.08434428, 0.009584457, -0.48533252], "3": [0.26880407, 0.28923607, -0.05079012, 0.13248043, 0.15757497, 0.077396765, -0.034734324, 0.107620776, 0.2108069, 0.0, 0.37246138, 0.10075283, 0.04585527, -0.04198315, -0.053653974, 0.27961925, 0.25705686, 0.09188258, -0.20121649, -0.18833315, -0.04042074, 0.16134192, 0.12530866, -0.16440502, 0.04889329, 0.3079679, -0.04402211, 0.19203922, 0.08510237, -0.31470552, 0.10510122, -0.31379193, -0.5567629, 0.4844768, -0.42472804, -0.48456132, -0.27923003, 0.60623616, 0.0, 0.6468518, 0.39860773, -0.29273695, 0.09450207, 0.0, -0.14772072, 0.0, -0.5081316, -0.18028289, -0.4649003, -0.35571742, -0.29114124, 0.07476768, -0.20780906, 0.26419622, -0.5560156, -0.7183421, -0.14789797, 0.0, -0.38036248, -0.09205484, 0.078991905, -0.09548638, -0.21582988, -0.585]}, - "g_mid": {"1": [0.14513718, 0.46829808, -0.1047146, 0.005356066, 0.41543287, 0.1555934, -0.1239325, 0.035833657, -0.13196254, -0.11676198, 0.34226567, -0.08305615, 0.022175241, -0.25358275, -0.17081366, 0.029853193, 0.26115805, -0.12999056, -0.15218948, -0.16443598, 0.024329439, 0.30784908, 0.0015489534, 0.3223563, -0.0718372, 0.0905247, -0.16640009, -0.26714793, 0.14172603, -0.27319902, -0.06576656, -0.3581671, -0.35320297, 0.25267136, -0.17987727, -0.17257755, -0.28166777, 0.14566737, -0.04375872, 0.3242598, 0.34809905, 0.0786182, 0.03263241, 0.25443533, -0.0939276, 0.018573362, -0.37613973, -0.085220166, -0.07796495, -0.23785491, -0.09657596, -0.005999144, 0.019528776, 0.29629025, -0.3679598, -0.27371103, -0.19391584, 0.057162613, -0.02314587, -0.27191046, -0.0984488, -0.28457397, -0.3315461, -0.48906374], "3": [0.14612128, 0.043823548, -0.20496678, 0.26644555, 0.038479775, -0.015320323, -0.17297016, 0.22842477, 0.2188064, 0.34488046, 0.5142902, 0.08838679, 0.026136968, 0.12497695, 0.03862817, 0.053249888, 0.23707902, -0.14992534, 0.16615948, 0.029300254, -0.08943773, -0.15033592, -0.008499201, -0.40278453, 0.021850955, -0.08915656, 0.3515604, 0.08968271, 0.16230288, -0.4916831, 0.10162312, -0.27028, -0.41748112, 0.56717986, -0.2555344, -0.35357866, -0.38817328, 0.35435548, 0.19005942, 0.19514775, 0.3221473, -0.41692528, -0.06435023, -0.056616902, -0.3244943, 0.24581538, -0.26203823, -0.13939576, -0.39910445, -0.50286967, -0.37280023, 0.1086603, 0.016948476, 0.26365343, -0.5900983, -0.51162785, -0.3227573, 0.018342212, -0.5679347, -0.32786313, -0.027484998, -0.16439381, -0.5004662, -0.2812767]}, - "neuron_contributions": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 96], "data": "SA5HPCm0jL2ii549V+NquvTLHj0V05M9m6A+vFqwbL1jO7k7BQ0sPsNKHD1BWFa9bo3fvLv317v2Q2q9bUmyPVkn7TxVA5E+PR6VPIaT4Lsk6Rq9sexWvYJIUDwAriM77HIRP9636LxZW088tPd4PLQZlD9txKm6vzfSvYDdCr5GWaQ8kE4rvkycnzp5Q9M83V5KvNxiODmGSCI94cKxOGJNIb9n6ae8qRrIPdtkEj5BowC/S/CkOqHkRL04WuG7GnEgPXbPMbql5cA9zLqWONCbmbxRA4I7cIIkuu6+NT1SFgq7iBmWOWv/HTv9EKk9GzoSPTUSFD2f/gW5H77OOcFDJr7bcG68eN4bPa/a4j3nFU88FqX8vEJM27tECu+8LDI2PMoBVLx7ON07i+aKui3e0bsVpAQ8ORkNPFchTT1rQVA8y2kNvNB8CD29GNa830/gPEbHWruhCVg9nlAtP1rUTThY52O682+nvT5TDjwmRea7TrcEvL9FBL4diwU7MSsMOzyjP7p6jVE6grPpOy8an7m/IyM9LogHPbOB97z0O4a+sz7vPPIn0b1sXZg+6iEGujxUQLsej4A8UGU3vMhxNj7h6BI9LiG8PagGOLq1/YE7tcYhPXM8OrynfQ48QlHuvTY7gD3EUY89OvYjt4sPqDvR46C7M8xNvrwiqTrlAh67oPMjPexuDzrjvbq8Fz6aPTzpbTzPmGw95mjqPGFi1D4FwzG96hy8PbOPAD4SMRA8uEbzuj6fDTzKCs66EgulO3lX5zwmAaI96JhQvrh7sj5b9Tu7E9csPBShCjojg6o87t88PkToubxnFTo7jqYHvvcD1DwOqXI+nyd0vFGKJbsQR2w9xPadO//imT2joh88GraQOz8crrvGD6W8nW1jvmc0jb1YkEk91BpFPPdbtTyw6EY8PTLePXLeGTk8Qiq4M3FSvIweOb2ZNDa9PTaROww1/7tRftM9ziCquhMitTlBqjQ7wr3lu92BI73kjiE9j1UtOtOK37qeBTW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKUCzPnXwwrz8qHG7p5ydPR03kzxuGvs87vnTu/SxpTwOuls/Ma5AO8lozLx01Wk+tlA6P9JAILdmqJ88IBeTu8ZEmTx0MNm87/86Pshjk7pHwtS9dhdPu3ubw7hZCM+6/90NPYSQ6Dr7OM48g27Eu+FWrry0xAQ7bYM/u6EzFjwQ9F07SGCpuluOhzmpbAO92YmEPDa/qTvE9uE82uVTPb/Gwzx1/cI9xoiEvd6Xq7wDjn2+sgztO1/G/z1Vs2s8C8T7u1aMVL2pea49rZfSuV/xnb7Ck+W6RuGuPESWNjnAFau9jUHyOiizv7wGQWW8azqHux8zAT1dhC49vht6Pf/pnj2OTDU7aQnzNqXaCrz7Uzw7BKoXvJv2MDgi7x25aCWKPdQTnzohWXG6v+UBO4l/FjyIphg9a2YkPOnr2DsCRqy8d3OAP6T8pjt2TQI9/pXkuyvgtTsaI+85RhEGPfL6Ej3EvQY/AdXyvNzMG7r7lv08CTUxuaxFeD3wklS9"}, - "head_contributions": {"shape": [4, 4], "values": [0.0, 0.0, 0.0, 0.0, -0.1818323, -0.042954575, 0.1519015, -0.043814443, 0.0, 0.0, 0.0, 0.0, 0.7721776, 0.3697911, 1.0672956, 0.019400733]}, - "head_write_norms": {"shape": [4, 4], "values": [1.9329695, 0.79681945, 1.3495642, 1.1585367, 1.8535002, 1.6447152, 2.297571, 1.0299606, 1.8132874, 1.3752267, 1.6623766, 1.7503698, 1.705483, 1.0201366, 1.772925, 1.809894]} + "u": [0.26944312, 0.28992367, -0.050910864, 0.13279538, 0.15794958, 0.077580765, -0.0348169, 0.10787663, 0.21130806, 0.0, 0.37334687, 0.10099235, 0.045964286, -0.042082958, -0.053781528, 0.280284, 0.25766796, 0.092101015, -0.20169485, -0.18878089, -0.040516835, 0.16172548, 0.12560655, -0.16479588, 0.049009528, 0.30870005, -0.044126764, 0.19249576, 0.08530469, -0.3154537, 0.10535109, -0.3145379, -0.5580865, 0.48562855, -0.42573774, -0.4857133, -0.27989385, 0.6076774, 0.0, 0.6483896, 0.39955536, -0.2934329, 0.094726734, 0.0, -0.14807191, 0.0, -0.50933963, -0.18071148, -0.46600556, -0.3565631, -0.2918334, 0.07494543, -0.2083031, 0.26482427, -0.5573374, -0.72004986, -0.14824958, 0.0, -0.38126674, -0.09227368, 0.07917969, -0.095713384, -0.21634296, -0.58639073], + "g_out": {"0": [0.2957327, 0.23154813, 0.19272041, -0.11050207, 0.05074966, 0.38568598, -0.4131378, -0.0027957326, 0.14300513, 0.11737734, 0.57790387, -0.025652505, 0.049290992, -0.10386415, 0.2507759, 0.21971336, -0.07644482, -0.1331794, -0.31636143, -0.19353661, 0.15954904, 0.16772723, 0.18759763, -0.51929593, -0.071124785, 0.111955255, -0.12725207, 0.08262045, 0.2049936, -0.39938685, -0.22787593, -0.31658053, -0.4639244, 0.33102414, -0.41119382, -0.48533434, -0.31528315, 0.5969632, -0.2704308, 0.46734715, 0.24510612, 0.33464712, 0.17023465, -0.18119483, 0.06455816, -0.3462232, -0.2905309, -0.27598247, -0.4783556, -0.1712202, -0.11352344, -0.26559067, -0.04520939, 0.13443066, -0.48526064, -0.730605, -0.4792127, -0.043238938, -0.24040276, -0.12472996, 0.53767604, -0.1971625, -0.21471278, -0.8625517], "1": [0.2983974, 0.06406577, -0.07456789, -0.2913765, 0.22134256, 0.051642254, -0.05612707, 0.20870718, 0.21663925, 0.07513991, 0.06285271, 0.22459227, 0.21425346, -0.047697745, -0.07591537, 0.16065578, 0.06343356, 0.4583847, 0.19801542, -0.024041899, 0.055234864, 0.35424814, 0.16531782, -0.41012442, 0.1678229, 0.3649981, 0.052236736, 0.115717396, 0.330927, -0.2051411, -0.06327942, -0.2709047, -0.1990947, 0.4872972, -0.24459727, -0.35909516, -0.07968609, 0.53899366, -0.1558947, 0.6039852, 0.15402454, -0.3882816, 0.08467107, -0.5099145, -0.006352134, 0.20152788, -0.6797466, -0.36080825, -0.55266166, -0.2794899, -0.24836603, 0.114809684, -0.09923303, 0.039998636, -0.33080637, -0.5635551, -0.30209857, 0.10212621, -0.22957641, -0.16523862, -0.11435847, -0.08454478, 0.009607276, -0.4864863], "3": [0.26944312, 0.28992367, -0.050910864, 0.13279538, 0.15794958, 0.077580765, -0.0348169, 0.10787663, 0.21130806, 0.0, 0.37334687, 0.10099235, 0.045964286, -0.042082958, -0.053781528, 0.280284, 0.25766796, 0.092101015, -0.20169485, -0.18878089, -0.040516835, 0.16172548, 0.12560655, -0.16479588, 0.049009528, 0.30870005, -0.044126764, 0.19249576, 0.08530469, -0.3154537, 0.10535109, -0.3145379, -0.5580865, 0.48562855, -0.42573774, -0.4857133, -0.27989385, 0.6076774, 0.0, 0.6483896, 0.39955536, -0.2934329, 0.094726734, 0.0, -0.14807191, 0.0, -0.50933963, -0.18071148, -0.46600556, -0.3565631, -0.2918334, 0.07494543, -0.2083031, 0.26482427, -0.5573374, -0.72004986, -0.14824958, 0.0, -0.38126674, -0.09227368, 0.07917969, -0.095713384, -0.21634296, -0.58639073]}, + "g_mid": {"1": [0.1454822, 0.46941137, -0.10496358, 0.0053688176, 0.41642052, 0.15596336, -0.12422714, 0.035918854, -0.13227624, -0.11703955, 0.34307942, -0.08325363, 0.022227962, -0.25418562, -0.17121978, 0.029924178, 0.26177892, -0.13029961, -0.15255126, -0.16482691, 0.024387278, 0.30858094, 0.0015526339, 0.32312265, -0.07200799, 0.090739906, -0.16679569, -0.26778305, 0.14206293, -0.27384847, -0.06592291, -0.35901856, -0.35404265, 0.25327206, -0.18030488, -0.17298783, -0.2823374, 0.14601365, -0.043862745, 0.32503068, 0.34892663, 0.078805074, 0.032709986, 0.25504023, -0.094150916, 0.018617528, -0.37703395, -0.08542277, -0.07815032, -0.23842037, -0.09680556, -0.0060134046, 0.019575216, 0.29699457, -0.3688345, -0.2743617, -0.19437689, 0.05729851, -0.023200944, -0.27255684, -0.098682836, -0.2852505, -0.33233434, -0.4902264], "3": [0.14646868, 0.0439277, -0.205454, 0.26707897, 0.038571283, -0.015356742, -0.1733814, 0.22896779, 0.21932659, 0.34570035, 0.5155128, 0.088596925, 0.026199102, 0.12527406, 0.038719997, 0.053376496, 0.23764265, -0.15028176, 0.16655451, 0.029369906, -0.08965036, -0.1506933, -0.008519404, -0.4037421, 0.021902945, -0.0893685, 0.3523962, 0.089895904, 0.16268876, -0.49285197, 0.101864725, -0.27092257, -0.41847366, 0.56852823, -0.2561419, -0.35441917, -0.38909605, 0.3551979, 0.19051129, 0.19561164, 0.32291317, -0.41791648, -0.0645032, -0.056751512, -0.32526577, 0.24639976, -0.26266125, -0.13972715, -0.40005326, -0.50406516, -0.37368655, 0.10891862, 0.01698877, 0.26428026, -0.5915011, -0.5128441, -0.32352462, 0.018385816, -0.5692848, -0.3286426, -0.02755034, -0.16478464, -0.501656, -0.28194535]}, + "neuron_contributions": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 96], "data": "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"}, + "head_contributions": {"shape": [4, 4], "values": [0.0, 0.0, 0.0, 0.0, -0.18226463, -0.043056596, 0.15226263, -0.043918625, 0.0, 0.0, 0.0, 0.0, 0.74389136, 0.37440583, 1.0471855, 0.041766547]}, + "head_write_norms": {"shape": [4, 4], "values": [1.9329695, 0.79681945, 1.3495642, 1.1585367, 1.8535002, 1.6447152, 2.297571, 1.0299606, 1.8132874, 1.3752267, 1.6623766, 1.7503698, 1.6464318, 0.98686934, 1.707769, 1.7675701]} } }, { diff --git a/tests/fixtures/browser/unit-ablation-gemma3-v1.json b/tests/fixtures/browser/unit-ablation-gemma3-v1.json index f2dc9ef50..176404ae9 100644 --- a/tests/fixtures/browser/unit-ablation-gemma3-v1.json +++ b/tests/fixtures/browser/unit-ablation-gemma3-v1.json @@ -327,24 +327,24 @@ "forwards": [ { "ids": [1, 46, 83, 32, 84, 30, 58, 91, 26, 9, 93, 53], - "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [260], "data": "QV2BPwSzib5+q0ZAqSzWv9syVsB+F14/7ajPPxkI4r+gMJK8NtAhPyg1uz/gtzy9ng88v+BnOD+6BQpAVFo/PryqNECaKM8/8mlYP3aA1r+8NiY+hRA+QE+Ciz+wY3o+dxOrPzEpBsBfLUfATMUsvmD8Dz8S/QXAuTvOP5qTgD8ouhs/sjWDP6h0NL9S4T8/djaJv7ycMr6+bR0/msuSPxjtCr6UFHHA2MULwOFuFkBo7WU9CBl2wGSUmj/NVtc/qhvyvzyq1b+gTTY8a78QQCotRcAxGQ5Btbi9P4tbG0D+nyrAdnMPwIOkdT/qKLk/w/+FPiIm8r/W1ANAEmMfQKZcJ0A23SJA2WCpP8xs5z5cKS5Auq9dPzKLHT8ZIQ7AutNAv29f2D+0MpY/DFZfvwJGZz9DdDdAWYB7QHDMnz+fOyLA7OI0vy3sO799E7W/wBnYP0NwS7/O6CnAQt7fP96BSD/4s5y/O+4sQHwTlT/INIE9oGbLvZbF6r5FoEE+NM1KP0DsJ0BvESjAE+c7vzbeiD/w/c2/oO5xvg9HGEB55wzASCtFv3CaRr8yK/u/SHQnQJaaFEDyIYfAlHcSwApCO79CSGa/o9FBP1WMC0CQRQo+YuR+PtTTtr8irjs/ERwkwPpvMcBGv8i+VX32voyn2b+ArJ6+UJ0/PyWh0j8W2SzA8VqtPoz0hT9c/Wa/JY1xQMpQh7+4nTbAvYoJv67ppr58lBM+1DX0vxaXSr/HGB/A5dTQv2QAz79FA/K/V5KDvmjqo784QpHAFjMtvxwZhj70yw4/zx0HQOyrg78gMbo+sOaMP7GPPr/K0Rs/znzQv5jkxz/EAaY/NoIsP9Qmpb7uOV6/b3rOv1UdaD/cA8G+aVGZvunHuD/q8dc/mGpZv/XwtT89nLi/BW3DvzG3j8CAk1m9GjaZv+R5f78aNMc/rKsXP8Axfr4wW3S9L6C3vtraR7/mSeU/BD1lPgdKgz+9FHbAgGJ0PQAVAz9rmvA+KW8kP9xmcb9UVLW+G9xnv/C+0L5kqQM/x/J1v9A2Yj9ejja/y4Niv9ZMqT+WIYM+KajVvuEGUsAM0hRA+xNyP5+/TT9YWL0/nMQNwABndj6mgI6/piMzwIwo47+VOjLAnBUnQCW1jUB6sdq/9ky8P1opWT/2A0c/euF7wGYTEUBqO9i/S1fLP7PfZb/fPbq+Qlo/v3Ywxb7SJ84+QHQ0wKJM/794MGa/zDXSP9z0jb9oVp6+4PP3PYExxz/0jHu+5curvqCvf79/pApAzilOv1PQBb/KI0VAgAuQv3iEK75A0tM9mjGBP0O7O7/4Qp0/cNCKwIDJPMCDQZe/JVgyPwSTWL8fslM/4sukvzKB/j/gFZm/t+uTv2wLX78="}, + "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [260], "data": "D8ThPtCjfb4qBWlAtoqDv6ETaMBmykg+bygaQHpCtb9uINU+NL+Zvg50CT+gRyk/diboviAE8j2YdBJAyOalPm40QkCmafg/hTqqP9TL/L9lYoU/9jdCQDLHoz8K1ew/wacDQKDUD8C2WFDAVtCZvohX/z2M66O/5ruyP/AHxD600F0/7gCRPz+XiL+nsVo/QnIyv+jr0z4H8Dc/BBjTPw4RRr8l9JDAGccfwOT+DkBgQkO9lvEYwPAhgz4SCM8/vsoXwJQrhb/49ou/lA4OQGMYTsCAYydBZlvNP/RRBUDcZFHA1n4ewLIEGz+q98w/9BnvPsQD+r8sdl1A5K8JQFGJMEB48htAgS4eQES9ez7niRtAlO72P8LZuj5qhErA+ORDP+3/GEDURxBANQeBvzqW3z/mcFZAX9mvQMfrkj4O9C/ALA85vrUkNL/sS+W/jXoYQLISKb+rG96/d4J0P/mKBUBG0TK/w0BjQM9Dmj9dFLQ/LM1IvkAd0r5oOec/VryuP4whrz/14w3AOJ0nv254uj7e/jq/vKNJv434T0C0+EjA+4F7v9Uesr9iBNO/3b0wQAHs+z8ZW07AuZc+wA4bS7+GgLy/vKcRvvJHaT8bb24/lh6Dvjaae7+98nc/Vt89wIA5AcDo/rC+SPQKv1bY4r8sF5y+9sO8P3RiE0CsEXC/OgQ+P6yDAED6FB+/+yFxQG5HCr/7lD/Azh9ev3R3QL4majK+XVwNwMDNfr4l6da/oSgFwCayIcCqGb2/e201P10Ww7+XEHfA+roDvz6Yez7bqLk/OmTWPzTMkb/AmlU9QjlFPwzUE7+IzmA+8HbtvfxtA0CwZhNAd18YP/9oQ78QF0S/KoDsv6YZ6j5bImK+gy2gPspu/T/52tI/5wgcvzA2kD8Kgeq/436Gv5r9pMB9OX2/6wQIwAiCPr+QiHw/ELWfPn6x0L4ypy4+PbEeP2ZYA76U+B9AiMCYvv7bIz+mCnPARh1gv6tUfD/8IDI/HGEyPxvZhr9gCc49sM34vrBe277IHp4+tms7v+LO6j7v8py/f1iHv8jiiT+2rQE/h4wDP2YHRsAk6vE/npR0P4BCgT/iobM/JtUGwJA8Gb52L6m/6Yk3wKS2FMAX0jvAFsELQGBunEAPtgrAyrxuP6Q/Zz5KFWI/UP9iwHr6BUBLwKy/b0C+P4VftL+dxEQ/aFyNv0ShBb+JySw/WpExwEer4L8q+pK/rG3nP5DsQz5dR5S/bmSmP2bL+z+wGI490LH5vWBKor9E5kFAE1nXvyBeST73rnxAgCzTu36Mlz/ABKk8cA8BQOTXqr8ozV0/+PFGwEgrF8BhcLW/nidpP0I/nb8/uQk/4Be1vyhi2T+ArgjAbwKsv0bGrL8="}, "out_rows": [0, 1, 11], - "out": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 3, 64], "data": "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"} + "out": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 3, 64], "data": "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"} }, { "ids": [53], - "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [260], "data": "5JOJPnwFsL9g9UZANBXUvrj3JMCkxDy/aOi6P/69FsB0ACA/4xtbP1Vd/T9swYA+MFJEv9twRT/9EPM/EAOGPZHXF0Bywuk/WICWPyRYqr/DmD0/uvA0QF6iiT/g+Ba9aAF4P/QzIcAYaRHABMvTvR8K0D64OQzAoDcgQAhqTj/oqoE+6ZCfP0zGHr94aVk+/ppmv0ENAb9wG6i+N4dzP6BkjzxtRlbAB7n4v2kkGEArD4c+AJCTwCBkqD/DeYY/L0nsv++9CMDwyCW9dPIAQHM8PcBuXwVBztz8P25A7D84UBrA+Ib/v3oxnz8ih6g/R7cVP3w6B8Af1QFARnYlQOC3AUB9qy9AMZnaP7g6tj9eBhJAnq9IP4QhHj4Ogg7ARqKVv1SQPD+iVb4/1ZiUvysudj/M81JApTmCQEJAVT8OsBjALXIjvygVMD+Z5eu/uxOdP1TnXb/TJT/AlujrPzsSbj8vt7W/JoRBQFRcpD8s4W4+xE4ZP591Ar8ZG1s+zGGdPr7UQkDUEQ7AKMR/vxrfHz8TMR3AYA5vvdawyT89Jvy/9tjSvlZXGr+JY76/9JocQKL3mT/8HYPAeF1LwIGNzr95daG/fKgUP01yBkAgnFY8wL77PWYPk7/H8ac+CtItwETE/r98qFS+7Z+SvsLyD8ACRGS/mOLBPyfOwD9XZjbAPqAfPjAWbz6GWmC/Ur9nQDn5Hr+oeCDAMUwSv8u1vb4YRjG9CDUJwI04Qr/b/BbA3GArv0cH7L881PK/6EYNvxAxfL+8ZqLAvOpsv/FVhD5MYnI//woAQKgSrb/U7bo/WmixP68NF7+MeiQ/rjIHwKicsD9+qiE/AExKP4Dvm77GNaq/Vsewv4CP0j/4eJa+no4Sv/oTHkAkblc/kEAjv4OXlD/ltZ2/5tD4v/ZKfsBIKsg94unPv12PL7/c/7Q/AIAjP6ALZL04qF++9KO5vsb5Rr9Cxcg/WE80PpQy9j5VT43AIMf9vhcVCT9/EjE/jZwvP1Q3mr8Y/zY+NWxYvzB6Kr/Uv4U/laF4v1Cpkz+EiJG/1e1Iv8bxpD+S8jQ/LMgAv98MVMCU1vw//5aUP2T39T7SOgJAxMkOwIZh7z5woha/bsAZwLnGpL9dtU3AdTPvP+7MnECOI++/rmnpPxgPSz5IBlA/FkaAwJpCGkCvVOy/xWG9P9S3iT9IE0O/mp4Svyi6X74cdZe+GzrPv7f/ub8S4ty/ywmtPwTumL+4DCk+womXPyYSMkChZ4i/jEkYvqk2TL9rerI/pM1tv4ewc7+OrhNAQEVNvzr0mz/VCDy/7LJrP4hldL/KjQlA43eDwI74HsAwoaS/wvHRPhVBq79AHpk/LKf7vzs2uj+2I4i/DHB3vwE0Hr8="}, + "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [260], "data": "HLocvwZOqb9qbGtAoG8yPkk2J8A06uS/PlgMQEKZ/b+Js0w/ANo9PFv6oj8PJXA/q8m/vgC7Mz0nt/w/8HtXPkQiI0A6+BJAyr3CP698k78kvMQ/rKAzQN95pT/CG84/oJ+yP6YrJ8DYfhLAOn6YvuSNFD5eVnS/mvcHQFAv3z7kUNM+fv+vP2jPgL8UXYM+rBWevmBLyL1Xgmu/IkW2P+oi1b47FoLAzeMSwNY9E0BSpS4+R9U1wPD+1z75e20/6mMXwF6omr8iVZO/RfvYP3THSsBEVBxBA3IQQADrnD+fiDbAntUJwIy2jT9m3bc/YHdrP+IQF8Aih2hArlQNQIC3F0AUZitAGKAzQLbZmj8jw/g/eB7nP4BvvL3mw0nAJPO2PuTzuD92TCRAgKKIv+ae5z8QxnJA9q6vQAanvb4ScBfAQLkWveRJIz+uOxvA7cjqP6QdGr/WVv2/Sjd1P2VQF0A4tFK//EF5QPGPrz/E8tI/KO+YPhfr/b4lKr4/tO82Pw4x7j8YJOa/qH2EvzQFtbycWgPA0kZQv4DLDECIsj3ApPwMvwTzu79k92C/408fQARLQj9pxijAJRhywK3h3r+vjgXAnGA0vtCaLT/3OFY/vL3Uvvv23r4KfOg+4io+wEQFhr9QVE2+86UEv99GK8CUEIq/TJcbQFYNAUDloK2/CPWRP6rOnT8Zvju/eT1mQFArgL0JiBvAIAxRvwARjr7VMd++R7kgwADoNrsxeLy/Q4Rev143OMDZTbW/kEnqPoD0W7+qUonATEsnv7BzWT3SUQRA+InDP1k+ur82MpA/aquAPyxkdr7KoaA+1Cl/vwJOxD8vv9E/lSg8P8YFY7+4BLC/l3PZvxgrsD8EYEO+xcqCPilcQ0DONSw/mvsiv4hOSz9gpa2/DxeYv6xklMC6pG2/zH07wNCfr76fCEg/kKkVPqxDj75Ay7a9NtxJP4DBuL4IcwNA4MjUvgxeRD642YnARv6Mv+LLlT8Qeoc/44I0P8iLmL8sA0c/4lWhvvzORb/El3w/edZLv9lyNz8CXN6/RhBhv7w2YT8aEn0/zkm2PljgRsB2f7U/mDunP0wgND9VIg1A4U0KwNGz5j4FTFS//IQrwKayuL+cP1XAlNuMP88Qt0DsfR3AUc+qP75nIL/gsx8/Tn9kwCPAAkDSlZy/QqqsP15KNj9hqFg+T0qWv/Tnbb44xGG+mmzJv+a8g780MAHAapeoP7xoET7yfkW/JdkvQGTBO0BIi4u/BDH/Pf4+k7+wMwpAuDTjv4CitzzEwz5A43MOP0oGMEAUZnS/eB/ZP3Kryb8kOAVAgTomwK00379HPrG/ed1VP8qD77/63mA/whTqvwjjkj9TCQLAJAiivwqOgr8="}, "out_rows": [0], - "out": {"shape": [4, 1, 64], "values": [-3.3228173, 2.6917808, 1.2919352, -0.8703772, -0.3982346, 1.4549626, -5.2248516, -4.300988, 4.0531063, 0.7656816, 1.6257728, -4.046872, 2.3171093, -1.4473386, -3.1807756, -0.8747362, 4.457644, -3.1744833, 2.2869568, 3.5056405, 1.1023926, -5.189301, -0.40179473, 2.285265, 1.2096477, 0.8925779, 2.903258, 1.8272209, -0.41951585, -0.8866648, -2.001892, 1.7850989, 3.8695073, 0.8833115, 0.75673753, 0.59474444, 0.100141585, 3.3564668, -2.9077697, 5.065644, -0.45772922, -3.445949, 1.7437825, -3.0785406, -2.2558007, 3.7947717, 1.6703407, -4.9556785, 4.4331136, -0.5679393, 1.9098136, -0.6631287, -2.9770582, 1.8965118, -1.2202436, 2.0859423, -2.2611072, 2.1662288, 0.36869535, 2.4379666, 4.1067257, 5.2773886, -3.4915092, -0.79979384, -3.6021383, 4.0472517, 0.42952967, -2.3220923, 0.8238902, 2.4331555, -4.3219886, -2.5134716, 6.8149343, 3.010259, 1.1617763, -6.3597217, 1.4389116, -0.51830226, -4.547822, -2.8340855, 3.3385491, -3.9488704, 2.1644382, 3.3863668, 2.4506087, -3.9795656, 0.05303049, 0.4808051, 2.1126742, 0.08226508, 2.077139, 1.9643925, -0.87494135, -1.0772483, -1.7426131, 3.1501284, 5.619363, 1.3889618, 1.4270148, 0.81002045, -1.5303435, 4.47064, -3.3373003, 5.071707, -0.39271414, -5.8938713, 2.078878, -2.428078, -1.2487764, 6.05071, 3.2657902, -2.2528749, 5.7627764, 2.6876287, 1.629528, -2.3332891, -2.1410298, 2.4162152, -2.601479, 4.2462125, -0.5031675, 2.5122216, -0.5469654, 4.4525948, 1.8659654, 6.8319507, -3.2328477, -0.41927814, -3.0423894, -1.2224807, 1.4251708, -4.640463, 4.020829, 4.050933, -6.72436, -4.798883, 4.001359, 3.7699263, -3.12015, -6.7545457, 0.65435666, -1.8953224, -3.607744, -3.8639026, 3.9130785, -4.3585553, 3.8205335, 4.1138587, 1.9916153, -3.3523495, 1.6866684, 0.5443449, 2.7684586, -0.43415266, 2.0728443, 2.564957, -1.519779, -1.4824095, -0.6750833, 3.7012327, 4.3115993, 2.2043595, 1.0321159, 1.6129384, -4.525994, 2.741914, -1.9528103, 1.9716752, 0.7437289, -4.2874765, 3.248207, -2.1203742, -3.0778284, 4.4795403, 2.7173274, -1.982731, 1.7265565, 2.775311, 3.0061734, -2.8821104, -1.3417157, 1.9448186, -3.1375659, 4.231474, -0.9182719, 0.8160559, 1.4688433, 3.3884084, 1.0030422, 6.061635, -1.759041, -4.160859, -3.6446064, 3.6327662, 1.908766, -4.58418, 1.7205316, 3.9398284, -6.5683613, -3.87892, 2.3547392, -0.109298944, -3.9633694, -8.018128, 1.8589644, -2.7790446, -2.902745, -4.4489713, 3.645532, -4.527074, 3.1120443, 5.832137, 0.84015054, -0.15114975, 1.6179253, -0.09595683, -2.1393266, -1.2527959, 0.67672664, 1.9538723, 1.8952634, -3.3397553, -1.0256859, 4.590851, 0.79337275, -0.43581438, -0.16499364, 3.4267125, -4.768308, 2.469929, -0.9508792, 3.321662, -0.7725871, -5.1844625, 3.1981988, -0.80706143, -5.247876, 5.2998676, 3.0612948, -1.0532753, 0.7266239, 1.2000607, -1.0431504, -1.3125588, 0.7376567, 1.9087868, -2.5056057, 4.4550376, -1.9815757, 0.97555554, 1.1411871, 2.6793852, 2.5851169, 8.956462, 0.17740375, -3.239144]} + "out": {"shape": [4, 1, 64], "values": [-3.3228173, 2.6917808, 1.2919352, -0.8703772, -0.3982346, 1.4549626, -5.2248516, -4.300988, 4.0531063, 0.7656816, 1.6257728, -4.046872, 2.3171093, -1.4473386, -3.1807756, -0.8747362, 4.457644, -3.1744833, 2.2869568, 3.5056405, 1.1023926, -5.189301, -0.40179473, 2.285265, 1.2096477, 0.8925779, 2.903258, 1.8272209, -0.41951585, -0.8866648, -2.001892, 1.7850989, 3.8695073, 0.8833115, 0.75673753, 0.59474444, 0.100141585, 3.3564668, -2.9077697, 5.065644, -0.45772922, -3.445949, 1.7437825, -3.0785406, -2.2558007, 3.7947717, 1.6703407, -4.9556785, 4.4331136, -0.5679393, 1.9098136, -0.6631287, -2.9770582, 1.8965118, -1.2202436, 2.0859423, -2.2611072, 2.1662288, 0.36869535, 2.4379666, 4.1067257, 5.2773886, -3.4915092, -0.79979384, -2.873047, 4.748837, 0.8234005, -1.3286273, 1.1636198, 2.2412024, -4.0919476, -2.8954978, 6.9474854, 3.397562, 1.542389, -7.009252, 1.6787682, -1.0927095, -4.1198034, -2.6619194, 3.7538025, -4.2916107, 3.3052475, 3.9531891, 1.874947, -4.4971905, -0.17888433, 0.91994804, 1.6478091, 0.758576, 1.1788102, 2.0248983, -0.424966, -0.1650945, -2.139105, 2.5021312, 6.15977, 1.1546469, 0.6192282, 0.6031945, -1.1479423, 4.0759335, -2.846065, 5.0758014, -0.3663755, -5.3059235, 1.0207572, -3.5743363, -1.4351237, 6.361334, 2.463203, -2.634023, 5.731329, 2.03918, 1.951096, -2.4475915, -2.3416858, 2.677985, -2.523138, 4.7300954, -0.019091193, 2.8906403, -0.9351277, 4.3705635, 2.9947538, 5.9258156, -2.7207177, 0.567152, -2.7355514, 0.7741543, 2.3655572, -3.015235, 3.359475, 4.8209467, -6.5463247, -4.5327544, 4.6339808, 3.8209422, -1.5410974, -7.2535734, 1.0710931, -3.0999458, -3.0672033, -3.4300926, 4.801571, -3.6464424, 5.140469, 4.25796, 1.3412049, -4.363343, 0.9734189, 0.7557982, 1.7706895, 0.33982325, 0.7491546, 1.9917381, -0.7473464, -1.6582217, -1.6100584, 2.5920956, 4.9432797, 1.0635121, -0.39898556, 1.8342893, -5.241088, 3.0086684, -1.6845279, 2.8075628, -0.24020195, -4.1800385, 3.0220852, -3.5643835, -3.1202397, 4.7694783, 1.756609, -2.8527846, 1.6842778, 2.064567, 3.3679993, -2.7766254, -0.45438933, 2.123739, -3.7705197, 5.276848, -0.42467055, 1.9512125, 0.35516497, 3.8690953, 2.3657422, 5.342123, -2.0914075, -2.767817, -3.9007092, 4.769351, 2.6520922, -2.9202507, 1.430741, 5.329648, -6.412631, -4.020546, 3.056322, 1.2940325, -1.4102819, -8.040563, 2.3089533, -3.422491, -1.5154225, -3.1551106, 5.304043, -3.0240805, 4.760743, 7.799183, -0.13892242, -3.9237928, 1.4586415, 0.768215, -1.3198493, -0.717673, -0.75414073, 1.3593786, 1.9265814, -2.774991, -1.3888158, 2.0556574, 1.6892759, -0.2728591, -1.9424621, 3.036305, -5.4884987, 0.5819607, -1.7533022, 3.461397, -1.084969, -5.4183893, 2.5669148, -3.0905492, -4.3870697, 5.6697392, 1.3038969, -2.3631546, 0.45449266, 0.51346624, 1.4755166, -1.5850189, 2.1895, 1.263773, -4.33187, 4.6330724, -1.5601696, 1.3461833, 0.35135704, 2.2719526, 3.9134388, 8.14152, -0.46333683, -1.4918987]} }, { "ids": [53], - "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [260], "data": "ZomSv1Drh7++CgZADvmJvnXSPsAPIsO/hDiSP6BHIMCqdXU+cLEyP7b8PUByOQq/CfKtv4Ch7bxKN9U/WEipPcioCEAa2gtAPAb4Pj9NRb8wj4A/KX4oQIOBoT8g/vG96jo5P7bF4L8dEyDA9S88vyawij/S4QDA5ToHQNU5LEDqBrE+cCihP5i/J78MPes+qs2xvnGNT7//1ivA/osnP8apLj7qA0PA9evqv8KzDUDDPjw/iECRwDw/BEDaNSI/TV3ev80IEsB8WEQ91JSKP4Y1VcC+qA1BJIIbQFoUsT6YdjHA6qXpvxqvDkChbmk/3SIaP168AMBrwINAP9EbQHR32z8hVWpAbmLOP4SiKEA6bsk/KWP/PnK2hT/n7zDA2KVUv2M2oD9ur7c/GWxRv2ptXD+duE9AGMBzQK9uUj5sfkXAostNv0oanT/2ouq/IKwiPikES7/uEVjAEoz7P/qEtj6RkMW/ADoyQFSd6D8z4yE/FUL5PoaGSr/s+e29TNn8PnKkNUBrJRfA3i3zv6JYsD6W/izA+8w+v1DDaD/+tfS/AO+7PRul474aXqa/+IohQKu63D/AYEnAShV6wIf7AMBa8BLAc836P1fL4T/s91Q+oEPwPlgFZ7/bGFY/lNRKwBCEZr86U8y+YKHGvjui4b8sd/G/jtEKQELh1z96D1/ARoaiPyxgdD6ZejW/qXhNQNrt0b5+nRHA+LEav6EThr+yR0y+rOdBwCiIoz6vxQLA4OyQPH7qOcBiaQ/A8yJFvxInpT+MIaDAA8I8v420Aj8WNghA6DX8P2bGWb+bLvI/FMTkP/DDmb6IxEk+jHw7wIQ9xD5E/S4/2LCZPwyMB7/oqJi/8nm1v+ZCwD/MCWq/ONPQPqGrXUAA9VU9Wsnwvwg+hD90OE+/rvMOwG/kZcAwsWC/wydCwGTZT78L/rI/0FJVvq103T6Uu1++9PT0PkqApb94ljE/IEDPPjjrEL1+FIrAoMpov3DFbD/a4Dk/2PiqPwgIOL9AkCq+49iVv8LnTr9fFRhAlIy2v8Y5vD+v7Xm/QHQuvfwcjT7TmXs/GDw2PtRLY8DpB/A/JshMP/Na5D6q0hdAHG0KwLqG4T7gMlu+ZhgywKrgHb+3klbApKYTQIX5nEAeFQHApqs0QHDETL49rrE+yo5/wC0A7j+DHuG/CGMsQJEOOj8RpaC/UDRPv+KYBz/gNXG/JeWcvxzjk791owTAhrF3P5Tjnr84rTo+XnKSP8PCBEAE+h/AbP3DPp1Tmr/u+pI/GM8zv9fAUL/IQwpAJsWYvyIFuj+NE1i/LBrHP6cwqL/ZSBpAKhyGwBDewL9oXau/zht9P41M0b90HYE/7pntv4wolT+tWMa/vAOGv307tL4="}, + "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [260], "data": "TnIVwL6GTb8/TSVAqDukPg7SHsC7GzLA8obTP29m6L/wwMc+wIyCPNarFUCgTu49vL2Fv0+2g78gL/M/cIMBvoi5EECwOilALBBCP9Syr76mMp0/qgEnQOfx0j/2SpY/qLtDP0Mi97/2nhPAipyBv4b+oz+F6je/Io+eP9rPHED+xYU+S0icPxzQiL8SHB0/1/y8PlhWIb+UY3fAfEuJPwS2Qb6HPlvAugEHwN+GAkCXbgg/WRAtwJUatj/UNAM/2sDzv5TUl79Kz2y/Zt8sP7rCRcCXkR5BfSg9QPCOEL2qyEfAQpnXvyp+7z+QmV0/iol6P94lEsAsgL1ASRT8P5xhA0CuR1hAkQQKQHoQI0DORKQ/y1C9P3v/XT+YAVPAoUeDP6AU1T9VDiRAkiMrvxhlqz/n6kNADcqcQDuai7+QZyrAqYOgvhR2tz/4HRDA0C3XPsu8G795CwfAA8+gP7e12D/lFmy/hdZoQITB4j8D3fY/byrCPgJwHb8hzFc/FA7aPrUp2D8WWf2/wBfwv4pUv744ZhfAfW65v/cIvj8uXzLAfjLTPV8Yv7+oL5C+rpYOQIGtij8kNca/3BiLwGM6GMAA0jbAC/S2Pwza8j6eWHY/YIY6vcJUiL42s0Q/MFVDwEDNID1w8fu+WKMyv7sOC8Cjssy/5l1IQOT5AkAUeBXAt58gQKxGij8k2Fi/2+gzQGg7JT2g9BfArLpYv5TSbr+Bdwq/RF9QwATUhD+T5j2/EKKsvBzLdcDh0t6//CGRPk8f7D98/HHAlQYKvy1qzD4yTVtAPOe8P7APPL9HN8I/oBi0P/BlVD34rpw9GB0LwFGftj6t3sM/S7WVP4rlMb9vnaK/Bl7gv8v4tz8Zqm6/zoinP4kuW0CibuG+iAUCwMRCBT/y4ga/RtiXv7fxhsCO3g3A3jV2wIvY5b7SkmY/KMQgv0Yphb54Gvy9qKjsP4EOj79Y1pE/3NlmvkZz1b4NwnPAKuShvzxnzz8rR4o/BdDFP2cFJL86Ltw+QKjfvjTnQb/cJQ1Aw+2YvyUvbj8IvJ+/ALSJOlB/C75qEJ4/+LdmP+EwWsBo/60/JglTP0tTHj+h+ClAF7ULwMOtaz9sC/S+SCJEwFh4/b6veF/Abg7hPxc6sUCGAxLADeMkQE6MRb+watM9VGNbwB35rj9bcEK/PskrQPQZEj/zyDC/mADEv4kJXD88d3u/5PmJv4BIE7/qxBvA+hpVP2CEfj1pJnS/0FsbQLxO6T9CBRnAVZ1pPzC1sL9W3qY/ojjLv76w1z58iTdA6ECGPRvBL0A2eIC/TDkMQCKZ8r/Bbx5ATkopwDQ05r7qQpG/dlXEP6bA8L8ciSo+ygGtv4tiMz+qGwbA1P2lv8EpF78="}, "out_rows": [0], - "out": {"shape": [4, 1, 64], "values": [-4.0540786, 1.3292133, 2.42923, 0.22866118, -0.80690676, 1.2440633, -5.389746, -5.0004325, 3.989731, 0.19836771, 2.4727683, -3.2311163, 2.2528486, -1.0856066, -2.9848208, -0.9699806, 4.585266, -3.3076808, 3.6828928, 3.6926067, 1.1648536, -6.3594255, -0.10125741, 2.3703907, 0.9505861, 1.1079963, 2.5940957, 1.9445875, -0.32101625, -0.856445, -2.0080276, 0.31190604, 3.1900043, 0.28710556, 0.3139792, 1.0857052, 0.6504003, 3.4836254, -2.3818083, 4.531464, -0.0828712, -2.5092015, 2.3272164, -3.156529, -2.0486093, 3.5476773, 1.6922747, -4.424534, 4.6068764, -0.11170161, 1.902561, -0.123695254, -4.5638456, 1.5166149, -0.84667903, 1.0940703, -1.6262338, 0.8435941, 0.23212373, 0.33775026, 4.3551335, 4.532182, -4.8268585, -0.46952522, -4.8518076, 2.4571142, 1.4964236, -0.9705195, -0.35725626, 2.095818, -4.468525, -2.874908, 6.2145033, 2.607561, 1.3521512, -4.865359, 1.0512012, -0.92683476, -4.643066, -2.675677, 3.0378666, -4.0849824, 3.630367, 3.113276, 2.3864346, -5.725057, 0.47539103, -0.030247867, 2.3707237, 0.0038833618, 2.1457746, 2.3593333, -0.854749, -1.7726388, -1.7842456, 1.8466043, 4.575574, 0.91833055, 1.1310627, 0.97979456, -1.5891232, 3.9564388, -2.9871778, 4.20767, 0.19975412, -4.5001497, 2.928883, -2.579348, -1.2735894, 6.719794, 3.6997755, -2.168357, 5.5565386, 3.5827274, 1.5093061, -2.2596042, -2.9987442, 2.2318678, -3.2223136, 3.1829443, -0.3967219, 1.5030673, -0.18913224, 2.939422, 2.3031232, 6.095361, -5.0451107, -0.4293418, -4.553882, -1.6687559, 2.552474, -3.0636091, 2.1826882, 4.0093584, -6.898578, -4.922941, 3.5646377, 3.235102, -3.3087356, -5.191638, 0.17180151, -1.7031983, -3.3039527, -3.923156, 2.9516685, -4.7201757, 5.1048727, 4.2977667, 1.9646518, -4.905357, 1.9461682, -0.23809752, 2.4691257, -0.5946052, 1.7004077, 2.853971, -1.28391, -2.3949428, -0.7256483, 2.4980786, 2.5207675, 2.0910103, 0.43210673, 1.4600668, -4.6301494, 2.809547, -1.8298814, 1.2932823, 1.3278897, -2.7655048, 4.3610544, -2.412705, -3.0751402, 5.316322, 3.75418, -1.6037931, 2.1175473, 3.2737558, 3.513279, -2.2671306, -2.4127574, 1.2372366, -3.3801432, 2.6546412, -1.1185791, -0.5945776, 2.1892436, 2.145431, 1.5888976, 5.252764, -3.6894095, -3.2189915, -5.515034, 2.718124, 3.3817701, -3.2066097, -0.52002984, 4.0797524, -6.8759894, -3.6916614, 1.862182, 0.4636901, -3.7521782, -7.812139, 1.596352, -2.5762768, -2.45007, -4.033519, 2.3609185, -5.941795, 5.0288086, 6.3393717, 0.8744196, -2.719378, 2.1732106, -1.0797327, -2.8506355, -1.3657779, 0.8097995, 1.4816175, 1.6969787, -4.1258163, -1.1240108, 2.9393802, -1.0268972, 0.34754848, 0.09839982, 2.0755768, -5.4063535, 2.504107, -0.55356824, 2.9389691, -0.39169323, -3.8732858, 4.249441, -1.4732442, -5.0028367, 6.2874875, 4.567229, -0.2624216, 1.2811449, 1.2480569, -0.26263887, -0.63346946, -0.74629605, 1.1009424, -3.1334574, 2.7524672, -2.4787374, -0.7339763, 1.4488897, 2.573951, 3.2449243, 7.49391, -1.9346348, -3.1961634]} + "out": {"shape": [4, 1, 64], "values": [-4.0540786, 1.3292133, 2.42923, 0.22866118, -0.80690676, 1.2440633, -5.389746, -5.0004325, 3.989731, 0.19836771, 2.4727683, -3.2311163, 2.2528486, -1.0856066, -2.9848208, -0.9699806, 4.585266, -3.3076808, 3.6828928, 3.6926067, 1.1648536, -6.3594255, -0.10125741, 2.3703907, 0.9505861, 1.1079963, 2.5940957, 1.9445875, -0.32101625, -0.856445, -2.0080276, 0.31190604, 3.1900043, 0.28710556, 0.3139792, 1.0857052, 0.6504003, 3.4836254, -2.3818083, 4.531464, -0.0828712, -2.5092015, 2.3272164, -3.156529, -2.0486093, 3.5476773, 1.6922747, -4.424534, 4.6068764, -0.11170161, 1.902561, -0.123695254, -4.5638456, 1.5166149, -0.84667903, 1.0940703, -1.6262338, 0.8435941, 0.23212373, 0.33775026, 4.3551335, 4.532182, -4.8268585, -0.46952522, -4.008405, 3.0017405, 1.7950174, 0.15408307, -0.110869825, 1.853206, -4.1707716, -3.1509242, 6.304536, 2.9354935, 1.7509567, -5.561772, 1.2678691, -1.5933203, -4.1316876, -2.3785894, 3.4840422, -4.7779117, 4.8097725, 3.5702324, 1.7090132, -6.339944, 0.31461322, 0.24400914, 1.9037994, 0.29864228, 1.2412692, 2.4039433, -0.3435036, -0.72402024, -2.3015392, 1.090488, 4.9323745, 0.83802277, 0.40856016, 0.69205916, -1.284941, 3.4800115, -2.3539712, 4.178671, 0.43282992, -3.8027282, 1.573519, -3.80023, -1.4556069, 7.2564974, 3.058064, -2.393587, 5.440818, 2.9341269, 1.8307464, -2.1536734, -3.2109404, 2.5725098, -3.1602812, 3.9666162, 0.3126217, 1.8206177, -0.6130989, 2.7595103, 3.5534058, 5.1141667, -4.65562, 0.2281338, -4.027291, 0.6227275, 3.1998196, -1.4601984, 0.8058337, 4.20449, -6.7674985, -4.465597, 3.9597154, 3.2235591, -1.481684, -5.6423593, 0.51785123, -2.6999035, -2.932929, -3.3217309, 3.8401575, -4.4491916, 6.4265556, 4.502038, 1.3184717, -5.9333158, 1.039461, -0.33558697, 1.1280968, -0.28170836, 0.37443778, 2.3267329, -0.20042174, -2.1206026, -1.8507466, 1.66641, 2.5310807, 1.2051126, -0.7629095, 0.97301584, -5.3364987, 3.1523447, -1.3180447, 2.1511035, 0.3011396, -2.4129467, 3.7741826, -3.7545295, -3.068837, 5.995583, 3.245803, -2.1530497, 2.3883948, 2.2959313, 4.5161285, -2.0931726, -1.6291033, 0.8377981, -3.7577083, 3.9341664, -0.27310836, 0.32830563, 0.73105735, 2.6121516, 3.1533911, 4.3676753, -4.116737, -2.2832088, -5.5998573, 3.7715983, 3.8830378, -1.8272543, -1.8420013, 4.953784, -6.915371, -4.0054846, 2.5305233, 2.4134636, -0.71210337, -8.03257, 1.75355, -2.5060058, -1.1351553, -2.1988602, 4.0749044, -5.0017123, 7.0202293, 8.011882, -0.17552651, -6.8073688, 2.0909855, -0.703058, -2.39482, -1.1417414, -0.53310865, 1.5802972, 1.96304, -3.6582596, -1.5406425, 0.56374764, -0.17698526, 1.4578164, -1.0635433, 1.0868883, -5.8384147, 0.73744357, -1.2448549, 3.3169835, -0.77277255, -3.8340592, 3.7648916, -4.1727815, -4.5803957, 7.070001, 3.5862894, -0.8946654, 1.1402276, 0.38899696, 2.6577616, -0.9135995, 0.6158905, 0.023684204, -4.7012076, 3.3472729, -1.6788003, -0.93171036, 0.14006221, 2.7484133, 4.6557183, 6.358861, -2.9261072, -2.1388295]} } ], - "out_last_layer": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [12, 64], "data": "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"}, + "out_last_layer": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [12, 64], "data": "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"}, "tables": [ { "layer": 1, @@ -364,12 +364,12 @@ "forwards": [ { "ids": [1, 46, 83, 32, 84, 30, 58, 91, 26, 9, 93, 53], - "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [260], "data": "ZDbBPFqk6750Z0pACz8pP4EyJMAVFf09TeUWQF9XkL9BshNAqmSXvpnkCL/yo5c/MlCcPgELur1gpMY/8l7sO7IqaUCaFfA/KADEP43PiL/3FghAX/jdP2M8uD98w+o/E8jAP1AkAsCZEPy/DdBKv51U2D6mAbE+lqkMPrh8uL/WsUs/IaVvP7tXhb9FCZo/Hg18PeX+bz+WQ4E/JloMQIrY2r+YBkLACTXwvzw3C0Ax2ji/BtrbPqQ6Bb9lGcs/vGYTwKYlqT3M2t+/dWgNQDGrR8BrITBBiCDNP6EGc0AMyEPA7fcAwJspKb4vnAJA6TOLP+EPCsCn1YJAiJhjP19KT0DsLhU/q6sdQOFc2z7iVPo/mCI4QPktaz4mBRHAp8k0QLaZCUCPMhhA7LuJv8mn1T9pXhNANC+4QOFbHMDHMgPAuZAPvuFICT8ThUrAgJAVQJPb7L4B2nI/9HU5P7DJHUAMag0/jdmBQID8nz9CzTtAw3jbPuEaCr6TjTNATKQdvQuXmD5lvmDAVdqDvoebMr896KQ/1zvkvxACfkC9byfAy0XhvrqBBcBzgqq+uZs0QK0/2T47DLO/bqAVwJsb/r8vcli/5ERjvw4t0L6gi8A/7xRuv0e1Bb/EdLA/ZLz6v/Mjgb8Jj/k+IYXTPqRtNsBsaYc+UUr6Pxu2BUCkbhxA8Wi4P9n0yz93ubW+5YcqQHkMRL/ZupDAqQPBvy3YJj8vXy2/aJc7wHcGYb4JQta+xZ8rwIrpLMCCpzu/7psNQCaY2L8nhrW/WCHEv2kvJD/xP9Q/6MAcvnryA8CKlZO/67MoP4aCVT3BfCQ/8yULP/n1iT8HfyZAC/YIP+vOab+ZrSO/jcIEwIDssb2hcag+M2AmP/rSdT+Ihb4+Au0Tvpfi4j7ikg3AifjZPoH8s8AODf+/Lxyzv2ci+j50go4+B6Ecvk122L/w/Qg+tTNRQKnv2z/CizBAeQ3qv6z89T3t+da/mvUMwIxSyD/oq88+A/W5P/lwhb+kxqU/ijZfPqjs1z50S5W9HaaxvgcFlj7uG46/kQ63v3bbBUDArf4+ZI/DP28jFMAbM70/Ao0KP++Smz8zwaS9B3BbwDsfFUCFZQTAVHf5v7LKFsCMWHa/bn4vQOviVUBGZ7S/qcrwvt65SL8POdY/RSYRwKnfEEBpOpI+xlyPPo91BsDRgsE+z6zGv0MhK79HJF4/C0wBwPUNeb9j3za/H3nzP46FKUCbtlHAeH5uQJ4gWkAdeLE+NnvsPd+4lLx2OBFAD5sHwJ/aoD8IbbZA/kIgPiplnz8beJw/c64SQC6j2b8zsOs7WpNZv7Tw8b+IQ5+/3XXMPhDE4r8Hhoq+dYOFvxN6ET/wO9S/IoG/v7/a2r8="}, + "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [260], "data": "Rrh5viypjr50TV5ALHIMP1vbPMAjoNe+oGMbQFc4i7+LFdg/3N8Ev58BCL5CcJQ/TWuCPSB6lL4qIeA/3CUMPsMnWUDCTPY/yE/MP0osub/JOgFAcC0PQPa10D9l/AtAan/4P1pGB8AwyRXA3rQbvzfHvz6EuZw94xMJP5pWQL8KWFs/koFoP9vujr/UrZE/oyeNPOgGYz+P6xg/Wzz+P5k0179lAnHAHEABwNIwB0DA5Aa/W8JGvnbITL74otE/zecewLh33D1sJQHAbdIBQHW8RMCU8zZBeOXgPzOINUA35UfA+LwOwGpBDD7IrPU/15BwP2XMCMC+GJNAvSyOPyIXQUAjkaU/PdI3QLgi9z6YigdAGAc6QNDRVD7G/jTAop0eQO0rIEClfTNAm5B+v4tw9j/NPy5AMSvEQGChAsDqNRHAt3XLPZamkD7C1zHA8S4WQI7bA78UBXk+KJItPzmTKUBDf10+JL6FQOK5sz95Di9AQq6ZPhu0Vr5SZD1AFvLXPoI3vj330TTAGjfoviPzmr68NVE/hxDfv4/LckA+DTrAX5Luvo1dAcD4JN2+CfowQHY2Pz9aiNO/HHhCwIgz3r9Bba2/ZUEPvxp/Kb8C27s/MiY3vweF1L6i7Z8/tj0fwF48UL+OOWo+UZsxPmFeGcAh2LC+ggcGQJ6wGUCIs80/JdrbP9URCEDeTL6+KD84QC7r5r46xHfAp8Wqv3eibT5aoA6/3005wKr4Qj2P/Ra/zd0cwAPEPsAUgVq/NFf+P0rIwL/QhNW/Sr2Pv59B4j7MZQBAQWTQPmT4s7+qF12/o2UIP69iO74sccQ+KbkMPwrzqz+G+z1AHd0JP0X3kb+maDC/QvcKwLR2Hz6Xbnk9F+1hP5w31j9lMgI/TO2jvuZzBD800um/t9h8vab/ssCxQgLAvxASwKHCwTwTsOQ+y3Gevlk2kr9yMdQ9yscrQJ6ulD/jZC5AOSG8v9Ck/T1e1A3AN5IIwItrwD/MxR0/NluqPxxTbL8WhYI/XgCUuyYa2LzZ93c+u0TrvqvRpD7o+qS/roCkvzutwj/EdRE/h2zkP62fLcCQscE/usEmP6f2nj+ulC0/W8dBwPGNyj8+Ns+//HMWwMpzEcB4kOW/lk4WQAgJgkAB5g3A5IvMva/LS7+mDKo/McYZwKPb6T8UN5e7vqxOP5j0AcD/NTA/c/DEv3y5A7+TgDg/WdEKwOvimL/eSYW/lbDkP3MrEkCU3T3Al4ZDQM1aNECWr08+SMVoPhMlD78z8StAfWsHwDBjlj+A06dAWU0EP4EW4D+ss1Q/tV8uQJN54r80bEM+rppcv38x4L8LTLS/tJdnP8N/vr9UXYA+95ynv2dMSj8QKQLANVq2v6BIzL8="}, "out_rows": [0, 1, 11], - "out": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 3, 64], "data": "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"} + "out": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 3, 64], "data": "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"} } ], - "out_last_layer": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [12, 64], "data": "il/evwJfez+4hkm+9kN8QLQZuz+Vi3ZAujtrQGC2hTwi39m+ztXCwFi5ZT2IsF/A0yuPQBCaSb+OA5+/3aTIv2fr8L+YW10/5rmGwOaCsD6zw4nAyoUNQKBxz8DqOro/B4WkvwNhKcD55Q2/DpJuQA/Yv8AkUi8/Q4Czv7QRDsCGMgQ/YS4CQGSGSMAUkyDAssGiQFC7dL8gYxg/LD51wJTi4j+6E84+LWrlwGFqx7+ZdYHAFAcQvjhz4UCxCW9AMzidvzPCSEBMeFVATAhsv49XHD+uAafAghSZP1vXJD/Us6W/Jq2RwKESRcAEsnK/ii+KwO6brD+vwJu/EjBpwLA0qb8svQjAsTqAwLrW5b/szXq+QPDUv/Q+OcCFZ5zAAEvqQDxDuMAkFFFAAjz4v2uDNcBMzQvAON5EwMhx0z6w0As+rmpkwAwXsT/5vg7Az5oOwL9Zij9+LthAwh/av8SAl0AQzV5A5uwmwMsdtEAogBDBBcDpwGcMr8Cy1w3Ach9awHO5fj8QN3s9tilhwE+Nc7//bFk/aqfGPyY9YT5gihRAi6iLQNxHK74Ys1c/1eskwD1mw7+WNsHA7C/qv9wk4z1oOQ2/tBHQP2nw2D+thtRARnSKv9zEcb8/y7RAv4wuwGq6kj9AXNO/nEM4QBBrPMALUZi/rPBrQNLzzsCxYipAxMjGwN4a/j+THkq/ObqYwLTwe8DQC2K+nF+rv3iBCD48NiVA/WQtwLQZ6L8MwajAcCBawADYIDoQk6i9BbDXP/xFZ8BlpKzA79c1PyIAZj80XZhAONjbvShlpUCUHwJAUs9QP5tM6MCKn23AT/A+vxhKS0CFdb/AojJuwLl5oz83zJ0/bmsvwH0lf8DLWZZA+MTrv25ZyUCAQkS926ZiQBkuSUCc7CDAWBXXPhwylD5/JIFALhWSwEhGoDy8Gda/dxHdQETjUb/VtGO/Kai6v1x5A78fdxpAJjWBwDcOOEBTWTTAdNmaQGPrzkBKH4A/7qWEv9JzaMBbBxtAXxM6wPWqzMDwTaG/Xuy5vzRIF74obsC+cln+PuDUBT6mOiW/joSJwF+JDUButY5A4ByOP0Oqq8CRPIi/YPfJP3Xj00D4Q7PATZ2rwDMpQcBgTM0/6vFbwNgadzxHg7RApWyIwFDJUj08lqPAkG2EvwFwg8AKBIq/FuhqwIzrxcAZlPK/Xi+5wL+1HcCj/yPA9roxQJk0kkCeOaG/JWJbQOIFFMBWsoBAKNtnv88oL8B2WJPA5OIIQGqDeL9e6KW+ieRNwMgkvkAb9zzAumfLP3ZarsAszrHAEPkrPzArC0Ae2QK/VH4NwTUG8j8AOxW/EFUcwDpmlEBoeDLAbTd1QDYkC0B2JsPATIuEQFBtxD+cZLG/fiCov2YAYkBSmWS/NI8qvx58BMFQfQBAFCDvv60OPT/8SVk+UuGwP+6Yuj+ReEFAPIgiwI9OFsD/V5TArP3GQKizsMAQfpU/Wp+vQAOVVL+0MCRAGmfwwAJk1z/eklHA9n+0v3a8MMCZc/DAQ76jv5jJD8HvVUY/1K0dv6x5gkA25HBAdXu5vtLMNUBQFZlAWvtXPxFuo8Bozrq9XqTjv3AH9j9VskRAtF6SP4S4nT4c370/PQOSQGSoHb5ATyG82MGeP/Nwrr+LoLBAMcd4QBdUM8CIMoC+bYtuwJim8D2Tt4BAgkn0QJGtokDWcCJAZy39PoBBpMBePB9A0GUCwAfzwsAeoyJAaCS7PWmVw0CI37fAQPB6v0rq3b/6xB9BBh6ywL5RDMFghOlA8oumvmqBlT9G+u4/A1Qgv7grAb4UnAc+yoHSQHK0VkDeYyTAuT8gv7p0ET8E2D5AwOdxQNBnOMAerYdAmkPhvwiWyL+UOdk+QNtZwH/F0sBoFj8/KastQUp9tsAvMAPAjK17wI/sUEB83QFA+raPQDedE8Ca73E/lz1owJJnRMCUQ/0/f7l2v2hJHsCIWinA2g+TwC/Xs8AfIUJAcmyOPr4ajcCmWabAcMWGv09wwb8fQqU/xJFVPkgLi776d7u/NCO1Pij+KL8BUafAbLyAv1+gMcDIPAs/+PoZv/KG/j94Bso/kM0ZwTWboMCOWNu+73xUPwim774WfdnAGO/dP4BiOr1ekIY/wNeFwCp97z8q1tJAiiYnPwhQyD9v4Vc+WBNNwPzmwL+HyLy/9K0wQNnqzsCb3avAe7mowGHhhsBGsHPA9/9twNvAQr+cmtW/Me/eQDJgLb8K9f6/SMUqQH/u8L5Y2fRAzr4bvxibNMCN5flAukhkP4fh5MCejxs/XNyKwD5XBL93aSY/JlSqP/zGob7kmFHAUCOiv6I4/b8Ifl4/SEPQP2gFpr9lD2I/RWRwP5LzScB6U9Y/2q5UvsTDqUBujm+/sAOWPiRfSr51CA1AeodCwHwlJD8I8Ye/NsGBP+m4m8BKPd3AsFlrwDwk1D/hqb0/c2Q0wApA/UCkHstAazwnQMxkLcD4hujAMvRuPyyrU0BejZDAKuDCwPJL4MA/9WK/QMZsPwAPBb9+O3PAWhOlvxxAicADDsbAPO2hwOgyjb84Sy6/mIOTPR7lEsCfo2BAlrMHP8xvzD8gLd0/nxEyQFfB4ECQTcbAMuWMv8Few0Bg4Ji+xpuxvzFa68DunRk/YmgRP4zkq76NGRzB5vpywHxMw75C4TtA0TYjQJMyAUGHW8o/GAkJPxxztcCGgZ3AqPx1vmddhUByJD9AFGO6PrAnrbymP5Y/jhyEwAsAjT9iMl9ALZ5pv+1WIr8+7LK/uO54P/55678b41tATLhAwJ3TM8AWz+9Ag5mZP3oE8T9GeQPAMcgkQAG3jUC0IZC/QXFlP37BAz8gxzLAlJA7wFPL37/pXVNAEoaYwFjJpMBPehTAxCgzv1iPgL/+f3E/oEJPvsG1Cz9Oy6BAVkCjP7XHxj8ccZI/P41ev7k0q0DQZH69n0MUwF3YIUFYZwG+0HWBwDhU+b+kXpLAJUSZwFCZesBKoTjA7MXTQB8Bl75TA5G/C1UJwDxyhEC7PdJA/DWav5njXUD2iKHAckj4v3+B0z6/oZLAdG7rP2ECmcA4Ofo9ltmPwHWIH0BS/hNAAGyevtoNu8Atdxc/wLwFwFQFTL+p7sW/B4A9P69hP8DwKVu/QK/FQNzHBb8gUhpAtKZzv8MqJsAqihlAYnENwPYYXsAypcE/HfkGwBJO4L+6KYw/BMQsvya3B8GQNjnAehmuwLKxO8B6c9O+hDFTPzpki0CPqVhAZKM6wB9Ka0AGR8w/8NzKP1tfxT+90sA/9ou0P4o+sz9gEIM/rjENv7Er77/a5y3AT9q5wHB8R8BwAW49fJqGPjR/Fz/SELI/6hPEP73PRj9X9BBAHJh2QNrIdz+A2TE8BI9VwCgNf8Aghhy+vGq9v775d0D1ZSxAPVikv3p1k8DIoB+/KkyeP1io1z0nExDBwA3iv7DB8sBE6PS/GCtbP956UUAU0jLAWCLJPuxMjj52myhA7pIrQPYfWcBveRa/mfs0QGCJu7+v+yg/dK9WvrHh5L9MGXXAFmUFwAJpO0BotBlA4ifcwKMzOsBBZI3AcJm4PwtzZEDsNYE+XpNev5juIcAZCT1AubCEwBZA6kBiobvAtZ01QGOwCb/22bO/uHcrv+3CG8CoQBq/fPqxPwzqE8COUk7A6CFGPuDNrsCazke/gfKQQEO7A8EuKNg/e+pAQBCHOMBAL1TAxeirQMR6JMAcKTpAEGgmvrBfC8BPkBO/05KlQAu/mz9edU2/sTjFPxBDqUBQjWrAmRXvwC6uOEB7nME+5icmP3CxBMHg7TZAFbBxwGROuL/Ku5G/zIYCQcfB4r/AFRVA0KrlQO7fn78sFJ/APMqdv7Izwj++tuQ/jUKvP2w2pb++TYNAtdTuv067UsCfaNy/PO4owPID1UBw9Ek/oHgjwObSjED91ELAngNmQHj5zMCBJH5Axv8HwL7YLMBpiUFAYfzXwHdrnsCIMo5AjZoMQARzfMCMoZI/WuyfPzjyyD93tn3ALVMrQLxOkj/K2sHAbiGPQJqSQr+pF5VABvVpwAo/lkBOnD1A+CLEQH7Sl79srN69"}, + "out_last_layer": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [12, 64], "data": "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"}, "tables": [ { "layer": 2, diff --git a/tests/fixtures/browser/unit-ablation-qwen3-v1.json b/tests/fixtures/browser/unit-ablation-qwen3-v1.json index 5d894a84b..2cc4642af 100644 --- a/tests/fixtures/browser/unit-ablation-qwen3-v1.json +++ b/tests/fixtures/browser/unit-ablation-qwen3-v1.json @@ -327,24 +327,24 @@ "forwards": [ { "ids": [45, 82, 31, 83, 29, 57, 90, 25, 8, 92, 52, 3], - "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [259], "data": "PaoWwf2M0b4Qib8+sDrjQN04gEBRVJRAk54XwCSHf8BJ/qvAxaTgP1R0QECEP6s+ICQOvoCDibsutZJAiHNEQAzTQsCxspE/MD0wviu1VEDKElpA7ovVP43vB0B5qkrAOiAewCqSycDtvWXAXNetQLCTq8CTMKs/G6wgQeC26ECeRzw/hcuHP0TYRsCRxo2/PHdNv01bzL4wDw/AttQ5QBSNxb+sxks/Lw+IQFBjtr4owli/e1Okv/j3v0BSdMY+MK+fvbx+HsCd6us+8LfIwKipvMBA3djAI6a0PxcYCr9zH7s/wj2dPo8h2kB/OPO/PJ90vzCNT0B2ekXADqJUv8XHe0DAK2A+eCrmwHgav75qOwXB4oE6QNNSskCA04e/uRKJwFpAr0CkRfO+Zmb4P+JRCMA8VqO+pgcXP7hwoT9YWL0/uWJFwHiDZkAW87vAjOCvwCFzjcA6+wjA4PG+PSA0rj3KQ9g/S5nhv2X6BD9IzuDAWFxXP4zQfcAgHSm+Ai/QPzJYGUAMdds+qd9Iv/SSzj/QDK4+pRsSQLMs0D9eGXVA1OTuvvN/GUABTYLAxyHJwADbIDzQ7Sw/Jf/bv5iouz/UL+c/XGkpwA5vXcBA52u9D75XQBQOTT7Y4N++MPYNQKk4v79s7dO/SjpfQM2a+j+uqUrAuJmIPz6CEz9UJg/BmE0mQIZ+m0BLy7m/bmeLQIApsT+4+nbAHA4kQHXfoL9oVUDAbrzPP8XcG0BNFRfACQGWP0dWKsCAOY4+iSn0Px1/3sDzxtfAfJGbP2ADib7cgqdAPE1Sv13FFUDMelfAaOjfPWHOEj/A2RA83laUwDMSJ8ACehfALGcgvzHBmsBRT+W/nOb5Pr7ezz9fwI9ARotxP9OIfEAwRTbAIXhov6Choz1FdxXA/xABwW1HhUAgnW5AOCApP5f5WD/8ZV7A00ECwOBiDT7/au6/2YUjwIilFD/NR3pAXp8cwHFgwr9AVky/BmrKwPRWB0Dt//Y/LLL1vavBPEDTACxAmkirwGtKwsD0G50/CPc4PedN3T+B5RBAPgqZPi6Fyz/gbo69fbzGwBBGMb7IwhO+OgDzPxqCO8A/tAlB3CQAPzKfNEBel2dAsO/EvxoipECY8UXANc0Av1jser80moLA7h2FP+hIQ8Agnk2+aKFUwHZYmUBJrMM/TFssPjZ03EBqF23AVFeHvg/bTz9cOGbAqM0rwBYzjj/GI4I/tp31vh0TMcBLVPJAhNv4vsTfa78o3DdAYfXPQAb6AT/cegXA06kMQKhzhsAgnpQ/PRQSQJKmmUBsg2I/UPdLQKrJDMBosoNA9D1Bv4g+kcBWJI8/+f9/wIe7qD/UQX0/ldm1wLAtaz5SBgXAhEHWvw=="}, + "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [259], "data": "VGUewX7AR78uXvK/eIP2QCgdT0AlHlJAFHI7vyQnjMDXy87AxQivP066IUAlsM8/AFtbPoB63j9ORqJAFdpIQOpcWsCX2xhAUAZAPoJzBkAUhJVAssuwP5E3IUA6mSHAiqyev6m4ysBmAX/AyPa2QA7Wm8Cg/Ks+BggBQWQp4kBNCZM/s8WKPy5ofsBk7yA+Iz86v1DTFL5GDdW/5jYkQCtUBMAgXj6+Ie9aQCCXhb+DAJO/Ts0QwD2ajkDUJZe+qOhmPo1mPcDI/oU+qWvowBCgwsAYS9/AQAeIP/aRVb7c4kJAKAaHPCl67UA1dsW/NnkYv7zPYUBMi/q/+hupvzy0FkCGl3c/6PfJwMhyKj5tUe/AzWhCQM7b2UC6QKW/hYM9wDY5jkAEnhu/dncaQO57DMB0JoI+oGctP9jiOD/G9Cg/IeBlwGKFd0DIPqXAPPXwwEVPvsA/qsO/UJSmvqCdA79QXkC+YG0Nv0Dznbv6JgXBuVPZP835NsAoEwY/wn5qQHoWNEDUsng/ouaPv8y5Kz/A1Lk/aIbaPyQ2Y0CHmFBAsg96P1LldUCFu5rAISq1wOifLD+AVQo9DQwXwDv+xz+4EbU/dDJJwEyslsDARVY9voJEQNDCFz/wKd4+XRvJP7BbsL03Mtu/1EyVQAY1Q0A6fEvAGuvuPyB6qT/Ac+PADHVOQPTBrkAWhBLAp7R6QHWcmj9O7YrAfNLYPwDEjr+ILGTAWLl4PzqbP0CU7Nq/0WrqP+B3a8DQqJi9J2oPQPSGosC+Aa3AEDSqP5gH/74yBbtA0FG7v6wRfUDmy4W/kJCsvkiygD7cUYC/MipdwAB1w7/esjbAUEazvhcjwMCoDzrAHmZqv+EKlT+OZJBAolzvP8LWwkBNQF/AMCgVv4WNUz89QtG/lu4TwUBOQkDC0hlAMPTlP/rR4j6qBmzANDY+wHwkfD+dV8i/bn1VwMJSgT/8nhtAolsiv/CP8L9zSxfAUDUGweN9DEAEFuo/0CzKPkDFbUCDgh9AdHyZwKqsmcBA5Yo+s8Jrv2dG8D+7UBlAJpbRPuCfND5Sdc0+HNyswDNVoj9AZXK/yD+PPsBAD8CAmBNBoPZJPTgdrz4+mEZAH45FP4CghECZrHzA8IakPIBKoT2UYVjAZ5QKQM0WY8AbrgvAay5LwAP4fUC3yBhAHP6DP5uHy0DTonPAjgREv9iBwT44UzfAP/QAwJfziz+BLsA/0O8lP7J9078I9+xAYONEPXjplL/JaSxAOUHIQAh5pj5uT7C/8lDEP5AXSsAAV5Y+GdnOP3mHZkBCuco/MOhEQJaQE8A6Tl1AaKzuvs63YcA64YM+uixTwIFGAD8AMiG+vBvOwAAwDL1M7S3A1P8ZwA=="}, "out_rows": [0, 1, 11], - "out": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 3, 64], "data": "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"} + "out": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 3, 64], "data": "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"} }, { - "ids": [30], - "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [259], "data": "0MPfwMr3or8zQiFAFuPHvvAeLb4k59NAaa+tv96GFz+EZIm+adDLP4zMQMDUiCDAHogGwEvpB8CTYiRAgOxqP4pJf8CWrTzAqlQwP/SUr7+0QoHAWMCWQKw7uD7bwRPAq8FGwOMI7sBs45rABvpgQCKRsL/34Km/65COQRiPpj+ik6W/TqVIv0D+UsD2snO/rIdsP7oKiUCwoY/ACqeMQP52nr8a16o+HSCzQPd2Kr9D+RRAEq/rwLOYZz/ITOTAcGMBQOiXRT42JZU/GqnTPgqllsCsUIG/OPW3QIqMqr/ug+e/grLaP8T3S76VI4PA1zMwvyKpt0BA4OY8hGpjwASQnUDyq4ZA9EzRwGZfYUCsPba/MNx3QBosPb80Y2m/Wjfev71C5D/GW+VACEUDwJQREr+GC72/tzUnQCWxJEAsAk2/1HpqvzEC80AoBhXAZMdevzXfz79iJkvAY6iAwFh2MECsnYFArNLCQFCSNcCAFVLA7j4hQJ4PYUCSBug/siEfQKtIwb+sn49AmYmGP4C5HMAuQOY/0BHVQBFI+T/wGK5AFOKOQHr7IL8yr0VAnq5jv4DGxD56I0RABAbDwEgkbL//SIU/onh/vx/UCkDmSaE/9g1KQAFfb8Dv/SrAVNjTPzApKsE59CS/6HfWvknfjUDj6ApBY7hxQAQpdD870B7BmNi5wB6w2UBmup6/XLRZQK9Mub+vAovA7Q6nP9os5L8yz/G/SuYaQIRikMD9X0dAgIbjwJje7r8OFfQ/AiwMQayTPMFSUa3A5b9Mv1br0D+U+DHAZJzavgCAa7t+zqo/UB0SP657MMDVZURA4M6RwPYszb97STO/mF6nP7B2PEDyHiw/Ka2CQGMVEEDg5R1AeB5/vwLlBcADyqfAam58QHBiiT4wQ5/A6OGTwAKjs0CDk11Aw6ihQGyL9b8SDLo/q5o4QE/WcsDSpIC/1h06wPjGj7+gYas9DOmgwI+YcsB3aEDA3sInwCYWzj+y59c/AFStvcHlDMBEghO/0vVLwC+MSsBIoNK/KC4/QBIztj8DHlRAHBqZP+JNUkAhgEDAW+yAwErTDUB5EBNAt8yQQKxjicAo4MNAxEZaQIfwkz9KJ6RArppaQGbUYsD7rIK+zP+PQOWcZcAw625Aho9uwEOMwD8aeFtArCoPwGx1ukAI9sc/fashQN5i30A2ZUfAGnonv0llMkDYPXzA3I/4PgJBAT+7ekg/bDCWv6b7EcDQ2i0+RdAGwWhJDEDS42lAOt++QFws0r4kfkE/VH4rPxcE9cA6moBASCf2Pqi06EB6sgDAoG0CQeVUHD9aTmZAv5UCwOMxCsH2ylBADmGIv26ZfUAg11NAfoKPwPXrur66Gm1AKELxvw=="}, + "ids": [206], + "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [259], "data": "Vu5pvwqrRUCujylAfUlOwIXLtD+H/b5A+n2GwJsEIUDkfU3AaMuhvwD6QrxQqw3AWH0PQG8cLkDWqea/XvwAQLEnvcBmeMC/fHGhP8oL4UDef8C/AKCjO6SCq0AywrzAOraLwIvXsj9STJ/AQP/kPjcgRj8cKXlANDz9QH/XB0HLEC2/+lCHP2As+r8kfcA/bpvvv3pDzL+wD0HBIEFLQLTR2z/wcYNACLGoQCgRuD7gcfG/hxirQGs47EBW+wPA6slaQLyDkEBgBTe/woUTwNBShcAm85zAptOiQNKs1MDmy6HAwrC2v2AkEj6GvvXAyoy1P4KNSUGHpNtADoUMwHJ5D0HGsyG/WHUGwa5DJUBA64DALaCgv6gYvD4m5Yu/2UmjwIC9PkCqidjA4IfNPxg9RsHXmvK/9DpXP1yEcz+p45nAit12P0M4HUCkdgTBoROEv14TRsAARke9HnssweobaUDvppdATn5wP1tgIsG+EzTAKzq9vyhTQ8DNnYO/qINuvsCQwLwuGjBAmMlIQM99BcDzu0e/jL2qQGcuWsADQeFAmSGtQHDYSb72LVbA896owObXo7+2IphAVMwFQNwaLMBBSqBAAb8hQLLT28CAmWq9bssYP2drOcCWKMm/2VMHQFzPPcA87ofA6Swsv5jPaUArjaBA2LTGwGGbIL9FOdnA/A2FQB5H1UA4koK/LF6MPh+fcT/p2UjA6spnPz0LjsDak5c/wWKDQL7Y6j/4eFy/3tuhwM7pakCBt6o/PoHIv/xMscA0IqjAv6JDP5zL3r4c2DVAjAdFwHrSw7+0ln6/qbLaPvxGPT/2Haq/UVCdwLTjcD9gjk6/Gg2fP4Agnbx4wnq/iK9ZQEAoqr7i8jNA+DSPPvyZKMC/Yo2/jrOpv2+NFkCOXfTA9sOKvr0PRkGmSDjAtsjBQGsnAMDBPRFACddGwPAuhb34WQy/TqndPdqxc8DKLoDAgQnfvwZULUEVtTlAHRmUv0imHED3xwBA2wpav4754j/A9F/Avq+FwM6NjsAxsr1AzhHCP9J/XkBQ2bi9lFiFPxxq+r7QFa4/gHuqPXCKcL/05kA/DiqiQJ7X8r+k65pBPDZuPw8vE0CSBQpA2C+tQCFeGcAdMDnAaYkOwDUWZ8DETFm/FN2DP2UEhj6FAx+/HNO2QBygmj9Ando8D783QADnfjw5/RBAHD5wvjjjX79ucbDASoapwDDWtj1E0i2/rvmEwLB9Mr36sVNBxAN0P6acO0BtM4PAoDovQKSk/r9TiwXBrhvUQAWokb+y94hAzarqvx5AVj9qeB7Af6MAwFDKUkC37XZAthYUv/SoUcDUeS5AEEwQvxP9F0B2W5c/AEGrvXpqlEDhWPA/ViGBwA=="}, "out_rows": [0], - "out": {"shape": [4, 1, 64], "values": [-0.6824992, 0.5928737, -0.7061318, 0.09585023, -0.14480236, -1.6078202, -0.17822982, 0.8029319, 0.783676, -0.12402195, -0.10805391, -0.6508886, 1.054965, -1.4887656, -0.6027102, 0.81052434, -0.56275195, 1.3350074, 1.5364282, 0.45038432, -0.5509751, 0.73789287, 0.7144333, 1.7551717, -0.8142723, -0.7610377, 1.1605297, 0.8369615, 0.465866, -0.2897989, 0.15050086, -0.04716274, -0.8121033, -0.07721752, 0.21216929, -0.23136356, -0.7657402, 0.9701142, -0.3082087, 0.06724915, -1.0752451, 0.41274226, -0.6561986, 1.2538044, -1.1716973, -0.22261977, -0.116274714, -1.592118, 0.39691862, -1.0074534, -0.45292675, -1.0347872, 0.93831277, -1.1677134, -0.79741925, 2.0580964, -1.2597151, -0.9354436, -0.51873064, -0.5387423, 0.85435593, -0.005958885, -0.22217421, 1.049041, -0.34685948, 1.1807526, -1.2759712, 0.24892598, 0.27121425, -1.2016553, -0.2754411, 1.2852339, 0.40799105, 1.0067863, -1.085186, 0.46442127, 0.58314335, -1.2556261, -1.0559545, 2.0517147, -0.63689744, -0.13841999, 1.3258438, 0.13423234, -0.34453624, 1.452487, 0.96639836, 1.457965, -0.72622454, -0.46995115, 0.8307363, 0.36167645, -0.4607973, -0.19712497, -0.28936407, -0.5934388, 0.23514846, 0.4417944, 0.95026577, -0.11892441, -0.25233102, 1.049994, -0.14422277, 0.25007373, -1.8568699, -0.14958644, -0.4533079, 1.4952106, -0.28869092, -0.5524269, -0.06562799, -0.21579099, 0.79407793, -1.136131, -1.7195852, -0.8842661, 1.3054259, -1.9223264, -0.48810822, 2.0807688, -0.50927573, -0.97067684, -1.5221647, -1.0118645, 1.057172, -0.27576745, 0.92947805, 1.0699201, -0.45875967, 0.55113745, -0.7524278, 0.32839453, 0.71753895, -0.384472, -0.4285651, 0.99710804, 0.39039665, 0.8907899, -1.6978592, -0.22199988, 1.266726, -0.6653487, -1.5623608, 1.8637803, -1.11753, -0.5090476, 1.5396498, -0.08774227, -0.9959102, 2.3691878, 0.71341383, 0.21457934, -0.8483323, -0.027324319, 1.581511, 0.6268518, -0.4625985, 0.6337186, -0.345389, -0.51012063, 0.38965687, 0.35604775, 0.9740882, 0.7682116, -0.5172572, 0.6817416, -0.6658944, -0.35533762, -2.0395355, -0.63927704, -0.2790989, 1.1952984, -0.50561726, -0.13547885, 0.90495104, -0.3679912, 1.4470458, -1.1080495, -2.137322, -0.6507554, 1.1904134, -1.7765919, -0.48552433, 2.0258832, -1.0908529, -2.001297, -0.6399747, -0.76545405, 0.7644856, 0.74217665, 1.4291703, -0.23988926, 0.21432114, 0.36209047, -0.28286752, 0.02503717, 0.38388884, -0.7785129, -0.17340113, 1.5899159, 0.9262053, 1.1259981, -0.80776215, -0.6359607, 0.290257, -0.321061, -0.34971273, 1.6070359, -0.8281011, -0.5194886, 1.4496872, 0.99901295, -1.2990196, 3.4578907, 0.7374942, -0.47595993, -1.2481632, -0.21313149, 2.0976646, 0.8889993, -0.40469384, 0.4816652, 0.5112271, 0.10135245, 0.10606999, 0.7223219, -0.07959676, 0.9771306, -0.15102363, 0.9985058, 1.0328063, 0.5860549, -4.062378, -1.6646185, 0.36918777, 2.4316893, -1.0923662, -0.29324314, 0.7036567, -0.3899908, 0.57671434, -2.294147, -1.989382, -1.0145897, 1.2046663, -2.3110614, 0.109510005, 0.6863879, -0.74124455, -1.2770997, 0.060625494, -0.11436196, 1.14962, 1.1572299, -0.01907438, 0.24124825]} + "out": {"shape": [4, 1, 64], "values": [-0.2962495, -0.5132853, -1.1409464, -1.0181218, -0.9411045, -0.10085493, 0.0317955, -0.09648621, 0.074151844, 0.8986765, 1.2227855, -0.2067428, 0.5866026, 0.41323158, -0.45590597, -0.1782439, -0.86627144, 0.5366197, 0.68033206, -0.39883035, -0.051809058, -0.9794891, 0.23977083, 0.94414806, -0.3719266, -0.71556956, -0.740837, 0.61126053, 0.06557125, 0.1627242, -0.9043546, -1.0568525, -1.1860441, -0.20895468, -0.05798492, 0.5625885, -0.5152211, -0.16812018, -0.6798321, -0.37339047, -0.62286806, -0.61694515, -0.10674885, 1.0347183, -1.1618922, -0.32212108, -0.91232085, 0.73475814, 1.1618662, -0.33193958, -1.0200412, -0.9982538, 0.8581754, 0.34926268, 0.08649656, -0.14550596, -0.7087967, -0.72528505, -0.0104628205, -0.2863769, -1.5519078, -0.9577484, 0.119891524, 0.23304793, -0.029363304, -1.1429282, -1.3322132, -0.8284672, -0.8586612, -0.24135518, 0.70111966, 0.22779207, -0.44949043, 1.7691867, 0.18334061, 0.7298958, -0.5682166, 1.621294, -0.6145525, 0.6352658, -0.4222436, -0.39564776, 0.18234317, -0.70762235, -0.4129981, -0.6210532, 0.07761973, 0.3078769, 0.21087971, -1.0088198, -0.11225581, 0.022723794, -0.14660877, -0.42436814, -1.8142767, -1.6325898, 0.2751839, -0.5542029, 0.8172033, 0.4268236, -0.63747525, -0.28762704, -1.2440511, -0.3158201, -1.603535, -1.0562384, -0.4565135, 1.1486328, -1.7131641, -0.15557261, -0.123016715, 1.5410233, 1.2294745, -0.1634107, -1.9490826, -1.2919538, 1.0730059, -0.15474164, 1.107323, -0.17745623, -0.09540695, -1.0422542, 0.14283563, -1.0841529, -1.5937756, -1.1430312, 0.3141582, 0.4351151, -0.41544068, -1.3656602, -0.9355219, -0.67080176, -0.36556613, 0.09940517, 0.6890979, -1.1926572, -0.26319367, 2.128058, 0.43419826, 1.0532324, 0.043443084, 0.90883505, -1.1297988, -0.24906546, -0.8039589, -0.9025726, 0.50555146, -0.3249123, -0.37718058, 0.35389972, 0.6492897, -0.7145523, 0.24538253, -1.3137033, -0.2204418, 0.5838332, -0.68528026, -0.14271957, -1.188299, -1.6088964, 0.25691152, -0.40799797, 1.6437314, -0.08251014, -1.0670909, -0.611456, -2.2735243, -0.63608176, -2.2736375, -1.564502, -0.19836566, 1.1403704, -1.7494454, -0.029211104, -0.2650293, 1.8978217, 0.96547997, -0.0439402, -2.1169624, -1.5681497, 0.97278094, -0.109852955, 0.6237357, 0.18219219, -0.97056776, -1.037591, 1.5504477, -1.8549783, -2.6654058, -1.1719935, 0.35170907, -0.52896583, -0.9136083, -0.9439833, -0.7668425, 1.0308359, 1.1435089, -0.07517903, 0.35262254, -0.40164712, -0.07611835, 2.1894598, 1.6193985, 0.5066099, 0.11364919, 0.9413061, -0.9404163, 0.7264919, -0.97323567, -0.9471942, 1.0525396, -0.62275964, -0.16268042, 1.3003083, 1.8624898, -1.0560818, -0.61007214, -0.36364472, -0.29465875, 1.3451818, 0.6228647, -0.30642855, -0.38281995, -2.2693985, 0.1457819, -0.3388977, 2.324489, -1.2478927, -0.18310612, -0.7995467, -3.3564634, -0.9590001, -3.384094, -2.0793233, -0.6830977, 2.889058, -2.5868037, -0.68530726, -0.16454831, 2.37128, 0.8609099, 0.3743905, -1.6277024, -0.083437085, 1.3352554, -0.70345145, 1.5983658, 0.5807592, -0.49995196, -2.6184769, 1.714682, -1.0728254, -1.7499553, -1.4072969, -0.21541017, 0.05776459]} }, { - "ids": [30], - "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [259], "data": "0Vj4wNo2F8DTbERARFWoP6qFuD6uP6JAwAs3Pjf1p78M+Ru/CX+ePw8rDsA7yEXAE794v94okL+irvQ/DcfsP6TbPsDePnbAe0TBP8DMD73ZjPy/6D2FQMMYFD8tvg/AskogwB24AMF8B1fAvlx8QJWRLsCyDcu+5DmgQSip8T7dtNC/XBWuv6qMCMC9uhDAmtkWP5o7bEBsC1jAKZ1nQPR2AsAwynU+E9OnQGOESr9zSTxAhsjPwEq7WT/JUuHAGnqAPxjLob6K5BM/RvaHvkxrr8D5D36/7DS4QLgHDsAUcYS+ecwsQDJGhz+9kI7AXtq0v3iLiEAKgky/psyEwOH7tUCYP/s/yj6gwOWmh0BQc6C/5Y+UQN29Lr/1uwe/Ts1hwM5mLEB2PaxAVLLUv+CTwz1A1aC8NSa7P0+h2z/utK+/gImBvxQy50C6WZLAesGPvyTK0r5EGlPA9COgwFjMmUCSMERAAD3PQLovRcBKnSjA03NMQHP8D0AAJY4/KygkQDRFP8C683ZA2CAeP5i0xb9lSNk/SkGlQAqIkT9dlo1AkgZ5QNDf6L1M8BBAEhC6vlDvz75V/11Ac5WwwKq3DMAoMCS/hNO7vxiApT9gEOw+iVogQERucsD9RR/AxCLaPwZeD8HOv0q/GMOBvkx8UkB/i9pATJRGQOg2Kz9ySgvBWbTfwM201kA8TaS/5oRWQPC/1r4AxmfA5DHzP9s2Vb9qdwvAGiWtP/sYl8C4KjdArPTbwDhD6r9Z2eo/6R8RQXh+SMGZr73ALJUMvuzbkz859ADASpwIwAAU7b+f9VA/YOaZvhE0EsBFAzZAXd6DwIgJJsDOsI2/7AyWP+erzj++9WM+fF9pQObYuD845ldAsZuNv8+ZFMBwiavAlOuKQBCknL2E/5DAbM1bwOKM4kAGqZNA+FiKQAYErb9guoc+yKfjP+Icc8AmePe/4Kayv3GQlD6w6us9CYKbwGKSlcCqQnDAAgZ/wJR59D9ITao/+igaP7StFsB06bQ+flVswFlslsDGHQ3ASGBIQBD7AUAgFRtA3bG8P9YtP0CoG/i/PLVfwFEvTkB8NvA/oWSWQEBoksDcScJAGoTOP94QV0BiIKBAfg+BQFVXWcBI+wk/trSIQGZZZMAEEktAni96wAxWHD6hI2lAngItwO7irEBYJ5k/nawVQH0a+UDh2yHAi1VBv9wic0CrQIjAwBOVvBj6AkC/T8Q/gsUYwELA5780Vgs/SgfZwH+NDUA6fGNA856kQNwKA794P+e9p8kIPwXz98DGM25AChjqPy6O8ECRqPy/SjAMQTNuEb98kEBAXbFEv0sSCMGTfSdAtnwkwOhwXEDjKYJA1IaXwEyCUb/Y8hFAUHvRvw=="}, + "ids": [206], + "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [259], "data": "9geNvxrjT0CMAPs/zvlVwBcdMEAWJtJAmmOPwAOFuz8vuIbAy+nTv2xKI7+SB1rAaroIQIrYtj+jE2e/icISQL6SzMAo6S6/MNg4P2bD1UAsp4i//OEUPxw6oUBVGYjAfmpzwNyVNT/Y0ZrAEJXMvijByD3uj0lAXgbqQLi7+kCin5S/xAHIPq6iJMCfuARAPtDIv9jgob6cQEPBYGNnQB44Bz/lulVA5CSqQHZgjr4cmcG/XMaXQPaCvEBGlk2/DV97QPRaj0Cacau/JVwkwFzOtcAu4JDA8B+eQO8MvMDxeGvAmlhMvzj1/b3MdgTB+DqUP64CMEGspcFAMu8KwBdwHEEEFmy/hvjswAtnAUAQK3LA2DFkvigMmL7sQf2+xNyjwIHWa0BmU9jAMGO0PywpRsFvexfAtAy9P6AnND9XiMHAyhcNP/D6SECu0O3A/BNHv8avIsD0L7M/GmYgwVmJfEDcXIBAyqOzP658MsE0AjnAYCAdPfQp/b9B2ZK/mCSzvtb5xb8dOx9ArRKJQM2aGMDU0rY/6m2OQA478L9BCtxA81bJQAj1cr66j0XAIqCcwCBPv708VKNAHvQOQAPmJsBSoF5ANtRXQGAu38AQO4S9AIzHO4qI5b9cRje/IfPsP7LukcC6qpLACBiDv+U9QECfwdpAAzKWwHhsMD6yq7XAxIYzQDqb80AUZtK/iOVbvqRHjT9v4lHAmh4fP37vh8Ck65A/KgF8QFrOfj87fRS/TszbwCy8OkASx40/ICj8PrSX8MCHPovAPjZ4PxoP3j607k9AGqEtwOJa8b87dp+//CP/vssyKz/zltS/CkqawBJtIUDkdZS/nGxEP8hIJr5uyJW+fMt+QM6BoL7wY1NAHltmP8xtP8BA3s+/lDVcvx2oAEB119zAf8WLvyJmQ0ESnwjAfonbQL//H8BppBtAchhSwPAeaT40Iru/HV4mP0hvE8B2o4TAPqUzwG7tOEH4xtI/JDe8v/IvTkBok+Q/DrAbv5qinT8jSVvAJt9rwIw0ccCxs51ANYYEQEn9gkDMgxa+EhcaPwAPGT4jXcQ/QK7DPuSssL8ql5A/IDahQC7H0r/4IJxBYAkUvgTqP0DCZhRAdHCYQGo4Y8Aa4mXADu2Lvz5gSMCYnbI+tP6BvhJMXj4QY/Y9zw+WQMyu6z+0cXo/ErVGQEwXPL+0foVApsASvwpAj7+ivbPAwILZwKCwJL5IlHu/VuWGwKrLnD8UhjdBcKinvhetB0DwqRTAAtE1QPjmXMAAkArBDfipQFSnkb5XvqxAnCUKwEh77r0PYT3AvJfsvk3iPEBbuEBATLq5PhXKgMDBYjJApL3uvgCqTUAiaSU/eHdVv5GRnEAqlxtAf1+jwA=="}, "out_rows": [0], - "out": {"shape": [4, 1, 64], "values": [-0.38720503, 0.72651386, -0.619477, 0.07635921, -0.07112992, -1.478036, -0.24782601, 0.81573987, 0.7667432, -0.14765257, -0.19512752, -0.6708921, 1.267655, -1.6290655, -0.8254478, 0.86110675, -0.54755276, 1.4204364, 1.6305003, 0.4362366, -0.60988986, 0.68236625, 0.89456236, 1.6393595, -0.81578207, -0.73571503, 1.3106105, 0.80439806, 0.64331293, -0.4036854, 0.15007204, -0.21003631, -0.6142578, -0.079105616, 0.24329227, -0.3623806, -0.64361936, 1.1253681, -0.37235105, 0.05581993, -1.0812311, 0.3081453, -0.5362309, 1.1926761, -0.8909648, -0.1787216, -0.20358664, -1.5668023, 0.39706364, -0.9941313, -0.41266477, -0.9799522, 0.6966092, -1.2329104, -0.8526543, 1.8985667, -1.2463813, -0.82019556, -0.5354192, -0.46259266, 0.82789284, 0.014602274, -0.37452483, 0.8842627, -0.025553584, 1.4188585, -1.1369523, 0.32918113, 0.29172096, -0.8293646, -0.3028777, 1.3683903, 0.14759743, 0.9378873, -1.1989334, 0.6898315, 0.84458274, -1.5913719, -1.3226371, 2.1666677, -0.5200505, 0.1305184, 1.3148007, 0.07193296, -0.24961963, 1.5577002, 1.4032769, 1.3400687, -0.59472966, -0.4253299, 1.0630236, 0.28825438, -0.34205586, -0.10178009, -0.034657046, -0.629107, 0.4541546, 0.4124328, 0.994358, -0.23540075, -0.09777361, 1.2022994, -0.1640786, 0.39098942, -1.9009397, -0.36322677, -0.342772, 1.4625883, 0.074762344, -0.5444252, -0.10070673, -0.48516154, 0.9792086, -1.3076031, -1.6664381, -0.6339208, 1.1216118, -2.01259, -0.40897736, 2.0078952, -0.5066177, -0.6513104, -1.4393291, -0.97770464, 1.1959035, -0.19727731, 0.87155837, 0.92702633, -0.20193137, 0.9380882, -0.6575459, 0.5464578, 0.65738785, 0.11043003, -0.65546715, 1.1042811, 0.31727085, 0.8892647, -1.6413922, -0.0656549, 1.6119262, -0.980495, -1.580523, 2.043126, -0.9620462, -0.15536459, 1.5443794, -0.16899621, -1.0394374, 2.3520734, 1.2245111, 0.037246943, -0.8629941, -0.13398881, 1.6990786, 0.8474999, -0.28997278, 0.8074914, -0.29061818, -0.62560445, 0.5110247, 0.48450476, 0.6202551, 0.3371437, -0.31580105, 0.7881524, -0.6725038, -0.15630107, -2.38258, -0.7792573, -0.072405145, 1.3259416, 0.14333574, -0.015943337, 0.70273906, -0.44900298, 1.6493694, -1.5697526, -2.1198726, -0.3953728, 1.2031882, -2.0686958, -0.56800324, 1.9070443, -1.1311257, -1.7705655, -0.49576688, -0.7397574, 0.8555154, 0.5750735, 1.267634, -0.25770605, 0.04741341, 1.0882894, -0.22684738, 0.6462398, 0.7834031, -0.03627488, -0.80987513, 1.8495846, 0.86714375, 1.1935111, -0.9880667, -0.5634248, 0.77324164, -0.8708844, -0.51515913, 2.0728455, -0.6093211, 0.05964023, 1.5171189, 0.6863083, -1.4331343, 3.640472, 1.5775411, -0.4414668, -1.1657008, -0.07988277, 1.9343541, 0.7212097, -0.31913722, 0.5089479, 0.75821304, -0.292177, -0.1818951, 1.0842483, -0.28425843, 0.5401112, -0.039836183, 1.4103731, 0.8074854, 0.6360352, -4.101799, -1.6731932, 0.8696974, 2.402713, -0.103761524, -0.117385, 0.37733006, -0.2295849, 0.9876807, -2.5229807, -1.7495524, -0.832806, 1.5889375, -2.4611442, -0.11664189, 0.9365312, -0.8397269, -1.5388834, -0.24941194, -0.34706378, 1.1950544, 0.9984425, 0.32987803, 0.5522592]} + "out": {"shape": [4, 1, 64], "values": [-0.112167895, -0.36820486, -1.1611835, -0.98459387, -0.883392, -0.20711547, 0.039737277, 0.06398487, 0.08813077, 1.109179, 1.2380848, -0.4144465, 0.70452297, 0.22308302, -0.407382, -0.21941757, -0.89462984, 0.67374146, 0.6962322, -0.52341527, -0.01470083, -0.9174298, 0.4632161, 0.7932013, -0.277965, -0.8106009, -0.5037708, 0.69360644, 0.2316173, 0.3224476, -0.7329255, -1.0309095, -0.96948946, 0.055793762, -0.22979024, 0.5084034, -0.6899143, -0.021253586, -0.8287287, -0.428204, -0.73223245, -0.5021777, -0.28462556, 1.3028238, -1.1249378, -0.39037564, -0.88217235, 0.68625194, 1.3423542, -0.26914448, -1.0224414, -0.8615391, 0.6922265, 0.29324472, -0.117690295, -0.03916049, -1.1120257, -0.7275878, 0.13273042, -0.17438003, -1.6163406, -0.9466374, -0.018555254, 0.25538477, 0.09127553, -1.0842634, -1.2981802, -0.5955806, -0.744963, -0.3695359, 0.69642705, 0.4402286, -0.6328505, 2.1963274, 0.34919924, 0.42382732, -0.3749751, 1.3363868, -0.54305273, 0.48596808, -0.51542217, -0.24943113, 0.2358008, -0.62963164, -0.54893434, -0.76171046, 0.40519762, 0.0784384, 0.22050297, -1.0009973, 0.27207687, -0.11185187, -0.14412445, -0.33293927, -1.6366687, -1.5439298, 0.6808365, -0.15318593, 0.47953132, 0.5240653, -0.7262969, -0.14175862, -1.397191, -0.18418568, -1.9038022, -0.90213895, -0.65354174, 1.520066, -1.6558392, -0.17545867, -0.010802925, 1.4212883, 1.5563737, -0.05937007, -2.0403185, -1.0592717, 1.194292, -0.0027384758, 1.0016289, 0.043625765, -0.49751094, -1.0584332, 0.27738172, -0.91241455, -1.6445348, -1.150138, 0.01122912, 0.5633439, -0.49052614, -1.1206579, -0.97228396, -0.07590395, -0.1152395, -0.027537942, 0.6116285, -1.0160571, -0.6367861, 2.5055501, 0.5168981, 0.6545334, 0.25058904, 1.0228353, -0.8580028, -0.5152104, -0.7230257, -0.8974822, 0.5229243, -0.19310755, -0.5487289, 0.039878357, 0.6711519, -0.8792115, 0.17741308, -1.3371979, -0.1961617, 0.6335035, -0.8021796, -0.078817874, -1.1799505, -1.4792566, 0.6418134, 0.26472825, 1.1811485, -0.20207748, -1.1834872, -0.44472992, -2.4224539, -0.4529459, -2.4597013, -1.5677527, -0.4162615, 1.5087954, -1.4889214, -0.19853692, -0.13274974, 1.625552, 1.4550512, 0.005889848, -2.1495228, -1.601362, 1.2019079, 0.013378695, 0.6099549, 0.42784408, -1.2139057, -1.1785421, 1.6857901, -1.2790203, -2.5763488, -1.2630384, 0.0039878786, -0.210736, -0.7613006, -0.52608365, -0.99684197, 1.3258257, 1.2839009, -0.277347, 0.25388357, -0.24512488, -0.514232, 2.4458942, 1.4738724, 0.030231006, 0.52890396, 1.0714331, -0.48362684, 0.6170784, -0.9918034, -0.7987523, 1.1159091, -0.43808442, -0.3840598, 1.0783707, 1.907819, -0.9782077, -0.69916713, -0.49290812, -0.5168915, 1.0606904, 0.40979087, -0.16950299, -0.48181826, -2.1996486, 0.66137826, 0.5554157, 1.4876434, -1.4431502, -0.32033002, -0.6070663, -3.4813325, -0.6984671, -3.605957, -1.9736409, -0.8122209, 3.1091707, -2.2906868, -1.0402282, 0.03413758, 2.2638936, 1.4243803, 0.21071279, -1.754416, -0.28473663, 1.6373532, -0.39197484, 1.5080018, 1.0018307, -0.7848647, -2.5305023, 1.8920014, -0.47465938, -1.766238, -1.3025115, -0.4484918, 0.19555077]} } ], - "out_last_layer": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [12, 64], "data": "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"}, + "out_last_layer": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [12, 64], "data": "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"}, "tables": [ { "layer": 1, @@ -364,12 +364,12 @@ "forwards": [ { "ids": [45, 82, 31, 83, 29, 57, 90, 25, 8, 92, 52, 3], - "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [259], "data": "3hEOwSlcdb93B37AlmLyQI0KeD/hgAE/t3soP4Hqt8BYcr7A5BRiPzoG4T+9jBRAJywWPTbXgUBGLZ9APvesP+jyFMDNUVxAuLuPPwzg/z9wMK9Am+xaP2zrdUBluxHAaOd0vFswz8Aj4lfAqH6wQGNchMDKKb+/w7irQIMdxECjbJc/I4dhP3QIXsAPNzc/nCFLvihk+j4W/eq/a/WSP10AFcABRX2/k9VBQBSx0b/QC5O/cpFPwNBkREDMDR3AxC6FP2Y/XMCZImq+be38wP2vyMCZjPDATNmHP5+Rqr9C5o9Azq5hv9MA+0BP1ay/p+Nhvkhcj0AU9QM/6cMgwJhCH79+EuY/0z6SwGrhHUD3YbjAjh0rQABx50DNdfi/LGzFvwciEEAdMMS/+2M7QBZOdcBQk5o7Gre0vcJZ2L07WhG/CreOwBqJfEDjFmfAO7EwwTBe18AiOlu+JPUwv8Mtm79wfwrAMhRWP/12072orA7BjWgHQIXg479S2zE/8sS0QL/mJ0Db/Ri/MMh4vylmrr4kTixA36Z7P7uIi0CqXCxAETuOQN43vUCqrLTAnAWwwHrRE0AbG5u/F2UawL6lBr5q0ww/DRVXwEx9v8DlrmS+AE4tQByK7T5dZMI/cl5+PrBAMkC+/4W/TAu5QDBKl0CJEGHAaBE7QMvTuj9RMIvATn1aQJh/oUADZH7AQwfQP57Xdj9VrZnAioI1vlaIwL+mvW/A2GqtvnopGkBwG1K+/kcyQLGMX8ApNYS/+RYcQMN8ur+cqWbA7+6sPylaF78zzL5At+dJwAQ6qkBQf7k/8W6gPQ5rTD67QRLA/trwv3SEE7+0tmPAL741P1Q8z8DpmIPApl8KwFZaVz+Qh3BAPrxHQHWo5kDJoIzAfW6CveNpvD+cDEm/614iwdbvUkAHdQq/dvJiQOTHWr+unl3A5rM/wPeFMEAt13C/xOxCwMILmz98PRW/ByThP1UBDsCr4GHA5EgjwWQt7j8wP8c/JHnMP5Ugl0D5bi5ACAFwwPAXFcAunyS/i/ERwBXnFUDqBh1AfQeDPxN6KsCtcjM/WIpbwC/k+z9/dpW/0+8/wDQCpb/UsR1B31UQwPESqL+3XvY/eZSrQLBpIEBRN5rAszDfPzHGPD/uRMm/fO9gQFxcccAsd4nAVuxPwFJ1CkAVL0tApjUAQJRhukAl7YPAGr/cvlhnnD4VUQfAl7ZVv2WayD9m97U//fAyP8GQoz7fmt5ASJPFP6yoE75+LQM/r4qpQCI3Mj8JML6/LVvLP5Ayzbs+lm+/3GB3v3Puuz+N278/i0x/QO4R9L9Gky1AEm3Av2qymL9lxXy/KlPRv6Bs1b0aM8G/HSvLwPFCWT3/YU3A26pEwA=="}, + "logits": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [259], "data": "DbETwWQveL9QlXvAbRH7QMXtsD/VrWM/iDonP9lIrsC+IdHA9JliP6F/0z83nAhAvflTPniRc0DIJ5pA12/cP/1VLMCOA1VAp3BIP7xfwT/0ebNAIV9cP8kcX0DKHgbAah42vQy2zMBlsnHA/setQLFyh8CZJ7K/MAeqQJLev0Cy3aA/3VpQPyrvccClO0I/YcXMvqq+Bj/JGs2/Mma8P3PtEsD98YC/vLo1QFHNwb96KqC/2phHwClQO0D1oOO/qeFXP2K8T8AHCBq+Ycj6wAqWycANZuvAljR+P7Kjj7/i5oxA0O9Dv9OR9EBfiqa/fz2BvgrihkAENoy8qnsGwGxinb6WD+8/pr+TwFOK7j+BBLvAUbwvQLMB50DhSfO/pkXSv9srL0Dwq6y/FRgvQIrDacC81YU+dlTyPYerVL1O4qm+xXGFwKTXcUBiiGbAdf4mwSfp2MDnw9++S/U3v5MVlb9Y/wDAc3VrP4su174n6A3B7osMQAvMz7+TSSI/xn+qQGIFM0ALpcQ9ARiHv3Sdjr4ZxCZAWSKGP44Yk0D79jNAXAB6QGTCtECi86zAeeOhwLb9CkDga5W/HngZwKbWAD+jf04/PrtIwB6wu8BIPNS8AlotQDwyAz+j/rE/PZW2PnQ9DkAxZJW/8DS3QJ/IkkC/F2PAA040QDmm0j/UWZXA3wpmQDWMqUB4f2vAaT0CQOfJaT/Zg5rAcNdsPo9lpL9Dzm3AeG5/vLFlM0Dayv2+04gmQFD4bcBhXVK/aNwxQNTZAsBEMmPAhY+wPySZDL8gEcFAHWUpwNbKqEAQd7k/N0PWveCnxD1aZwjAs3wFwLvNrr57NVjAZ0XGPj9y08CmCoHAHgoMwJ6sYj+gSX5Am2tFQLPb60CLUITAijQavl/W1D84SGe/G2Yiwa2gQ0DoMkK+891JQOER4L6yoWfA1WNRwOPOGkBKxHq/ls5VwAzNkD/Xy8q9bjvMP0ntBcCtXV/AG/wfwd+P/D8b7tQ//T62P5/Ik0Co0C5Ayc5zwB72LMAkVha/LrYGwNelCkBHdBBAC5hYP5e9DMChhkg/SW54wMevCkANnqe/GlkgwO3VsL/J3hpBSUDvv8nT0b+sQwVA06OTQEizLEAgb5jANpynP9AAcD9BVOe/C3pNQKIPd8DSjYXAnXtJwKhyGUDF1EdAGVPvP5abtUA+WHXAe6QdvyRuDT70zQjAgTZfvwiaqT9PncU/4xR0P/ZSBj6L4eRAaB+vP5gnGL4+PJ8/M6utQPiQ7j6cqJW/FA/FPxxOWb/WQ16/HnXKvtoqBECUWMA/72RbQIPs+L/q3jVAJYiZv1LLwL9IrFm/SkQGwD/uYT1xJa+/UfPTwI5s+jx+0kXA/XBAwA=="}, "out_rows": [0, 1, 11], - "out": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 3, 64], "data": "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"} + "out": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [4, 3, 64], "data": "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"} } ], - "out_last_layer": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [12, 64], "data": "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"}, + "out_last_layer": {"dtype": "float32", "encoding": "float32-le-base64", "shape": [12, 64], "data": "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"}, "tables": [ { "layer": 2, diff --git a/tests/model/test_model_numerics.py b/tests/model/test_model_numerics.py index 6fbd71ec8..12ac843c6 100644 --- a/tests/model/test_model_numerics.py +++ b/tests/model/test_model_numerics.py @@ -130,7 +130,7 @@ def test_final_residual_identity_lens_matches_model_logits(model: Any): @pytest.mark.parametrize("ablate", [False, True]) def test_steering_manager_matches_independent_block_intervention(model: Any, ablate: bool): - from drowse.steering.hooks import SteeringManager, SteeringPlan + from drowse.steering.hooks import _SUBSPACE_GAIN, SteeringManager, SteeringPlan from drowse.geometry.subspace import LayerSubspace from drowse.geometry.inject import SynthesizedSubspace @@ -157,7 +157,9 @@ def intervene(_module: Any, _args: Any, output: Any): h = output[0] if isinstance(output, tuple) else output values = h.detach().numpy().astype(np.float64) coords = (values - mean.numpy()) @ basis.numpy().T - expected = values + (16 * target.numpy() - kappa.numpy() * coords) @ basis.numpy() + expected = values + ( + _SUBSPACE_GAIN * target.numpy() - kappa.numpy() * coords + ) @ basis.numpy() replaced = torch.tensor(expected, dtype=h.dtype) return (replaced, *output[1:]) if isinstance(output, tuple) else replaced From 31635ef80508323ded2b18a085d1757ff2c29ad3 Mon Sep 17 00:00:00 2001 From: a9lim Date: Tue, 10 Nov 2026 15:09:33 -0500 Subject: [PATCH 4/4] GPU numerics test derives its expected push from _SUBSPACE_GAIN --- tests/gpu/test_model_numerics_gpu.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/gpu/test_model_numerics_gpu.py b/tests/gpu/test_model_numerics_gpu.py index 71f762352..090293287 100644 --- a/tests/gpu/test_model_numerics_gpu.py +++ b/tests/gpu/test_model_numerics_gpu.py @@ -90,7 +90,7 @@ def test_native_decode_matches_direct_cached_reference(loaded: tuple[Any, Any]): @pytest.mark.parametrize("ablate", [False, True]) def test_native_steering_matches_manual_intervention(loaded: tuple[Any, Any], ablate: bool): - from drowse.steering.hooks import SteeringManager, SteeringPlan + from drowse.steering.hooks import _SUBSPACE_GAIN, SteeringManager, SteeringPlan from drowse.geometry.subspace import LayerSubspace from drowse.geometry.inject import SynthesizedSubspace @@ -119,8 +119,10 @@ def test_native_steering_matches_manual_intervention(loaded: tuple[Any, Any], ab def intervene(_module: Any, _args: Any, output: Any): h = output[0] if isinstance(output, tuple) else output replacement = h.float().clone() - replacement[..., 3] += 4. - replacement[..., 7] = replacement[..., 7] * .5 if ablate else replacement[..., 7] - 2. + replacement[..., 3] += .25 * _SUBSPACE_GAIN + replacement[..., 7] = ( + replacement[..., 7] * .5 if ablate else replacement[..., 7] - .125 * _SUBSPACE_GAIN + ) replacement = replacement.to(h.dtype) return (replacement, *output[1:]) if isinstance(output, tuple) else replacement