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..e7b92c130 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,12 +362,12 @@ 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 | | `@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 @@ -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 @@ -1074,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/README.md b/README.md index 92c11463d..75b72bbd2 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,14 +164,14 @@ 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 | | `@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 @@ -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..2bd94567b 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: @@ -322,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 @@ -336,10 +368,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 +391,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 +408,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/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..ec9edf918 100644 --- a/drowse/lens/AGENTS.md +++ b/drowse/lens/AGENTS.md @@ -568,19 +568,29 @@ 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`). 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 - 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 +665,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/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..1ab329f8d 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 @@ -405,26 +406,26 @@ 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. ### 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/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/drowse/steering/hooks.py b/drowse/steering/hooks.py index e9f898af5..73a206086 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 @@ -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 @@ -155,31 +167,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 +238,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 +263,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 +285,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 +343,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 +363,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 +383,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 +765,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 +780,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 +793,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 +825,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/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 7235f272b..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"]) @@ -179,11 +200,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 +218,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 # --------------------------------------------------------------------------- @@ -225,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 @@ -243,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"]) # --------------------------------------------------------------------------- @@ -262,7 +312,97 @@ 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 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() + 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") + 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: fixture = json.loads(AFFINE_FISHER.read_text()) @@ -295,6 +435,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 +476,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 +557,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 +685,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, @@ -649,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}"] @@ -1197,6 +1355,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 +1786,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-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-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/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 f7803b50f..fb4876706 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": 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]} ] } ] }, { "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": 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 8ac8f1e28..3e4af1eac 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": 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]} ] } ] }, { "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": 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": "2f3xuWSzQkCMeTA9CW3yu1MhAD9oWGg+uiodvWontz53+ra7PTIUPcUb878aPyk+1HRGvgfHU7xfhhC89Vk0PsPBbrzIzh2+ihADv01Lmz3sO5K8GoGQviN8Uj7Hak6+g8alv8hOjzvwzrI/USwzPbMiGD3rHIG+nCWZP4/Toz5TAbA+6Ql+va5mrTy5nqu7U807vVm8UjwtjIo9SjMHP9ywYDwVtwy+reUnOQ1jxj2K6KdAe8m6vPkOpbz8b8Y9tVMgPhfT2jokY1k96YMQPplm9L48wZK/d0+GvQIH+Ds6CqS98eWHvcLRo72L01I8LXy1PBoCizxnT3I/kMOKvb1Noz7EPqq8UimZPSCPtD0bjma8zxkOvdsHG77wnJ+5XI8TPgXWQL73vaw9+hJJvRoXQ77HR7M8GPoHvX/NYb09yOw/61zmvJGfPDyg0wO+TWyNv0/nfr5Mh0C+muxPvfTEvj6zDfI9pCU4veNF7TvI4obAAG9hvZApHL13wzQ7XW2Gvmj58r2M2oU9N2qkPSzOgTtBsTA9G5a6vc8R2b9Bh1g+OijWv1R4XrwE/mg/TnEsPorElLlmaYQ9UUw2Pq+h1b8ULo09yYy5vQKv4rywQ5c99O2VPjs7vT2vMJW+bZ66PvA6Wr73P5y8LOkXvglP2z3cC4a7s3ekvVJmiL3xSYG8CR1zvIP2Tz6rh5Y8iFCbPYoXOruI/H8+3yF1O53oKr/d+8w/WeyYPnslR777noc7ctFHvAsIZ72HMS+4DM5xvkslJz3KMDu+zgQyP4Dk+778m1e9ToMZPzTNyj8BiPq80swuPZsmKz3P21C+mBaOvpHO0L3s/UW+XUZ1vLkIhT76o4A/bdmNPJ4N3j2R/kQ96s5MvFa//L29bky9hqLtvWbMg74fwX064VrBuw4/Bb1iRrS9K9XVPta/8rzswD+8nxjYPOKXML217T69JKZDPj0Tq76oLcC9bFuJuQH2273T/nk+2tEeQHP9Vb0y95G7+AcuvB0/8LtCbPy8v/itvdujlb+pGLe9iG38PhBe+TztzWG7xPSQPI18sz3+iAA+bpXSPiu5hT4omtM8KBJWPjM6PL4ASiM92cmtuvtwr70/6Vu++8ElviV6vr2SCVA/Om9YO1kFSz2xoeg+QUS7PW5qw74YDSQ9y/zkPaEQWT0Djei+xwGOuzamDL6wyRvAI9bmvBqdODv84xI+ZZUVvUNF1LyVyFK9VWIXvNlpBD6Cn3498qquwIgAozth3vs9/08kPaKB/z3DaDq+AIYiPVxn071jPEg7jvrKvcPCVzyOGCE/wS4cuprZqj1FZO29tbz4vCu9i7x092+/i5/oPXXa/7y8z0K94gLIvad4+r1WzLI+6qFPPZ7egb5NY5k9XEAEPvGmD73s+Xa+i2utvPk+WL1qXVC/qW5UPK5mWDvA7tm9KqIdvXGTe77JVp89Xi29vd2YqDw32w7A4Zu6v9rMKr+lln8+PJwRPqNVIL1rWaq+CFgKP0Wu3r5zmgi7vTZsvaLq4r3sa+G9yCDWvqt/dL/nM4k85hzuvu4YRj15mfY6DOW4O9nzGb2Mz7S9IrL3PRT55L3MvzC/vA5svaFmkj2jIEA+/oy1vlA9nD5Qy/A8SvimPSrtmD3yAJK8dwTtPylrV76aGY4/Io0NvAfxR7zY11W9MjeWv5CJPbsR+wE+SVYbvpqu2TxPlUe9kY1Tvo/p1jza6CQ9sqE/PJBxlryNXFc+IJMqPPq6Zj8WhIS9LrKTPRn/qLzCmZ673NAeO656gj1vbYU879aHPufrgb3QJ6k9w4YsPjwlAL4MLU0+UPFBvkovI7wMUhO+TS4rvFxbnb2TZ8s/ni6sva84qL0zQvG7P85Bv0cSeL6tg8k/mMVBPMBStT6g4429M2H5vX8Itz7Ryhe7WErpvdfgEL7IuLa6ClU8vvnAWb1TfKY8Dy+GPVUTZr/O7qu/LonCPelwtb1wI/69Dr8PPaS4PL1ItxU8aCrnvhDb9DxVkoe8ziiZPc7nlz5anIM9ineKPV29wj3VHTC+"}, + "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": "EBHftiiJAz4/vhe7rPVRuu8o2LscMPC6SOzGusIJUTqG+BC5TvMBOuD0czpvyZi825NaO084+jmZUZw52fCKu+sC0jlrFhm7gOfzPPEt8jooiYW6pUuoOfD9iDuOWBG8zFpHvvXpxTkEcZW9QreVOwjVkLszZwc9Oo/UPCYYYLx/YB49yzLvubl/2jnhdEG5TdE0OgPpODmiLI06G2GXvO7mVTrVsZG8CXoft9EJwbvpPbi8UIpauQJ5nLrKgWA8Mmxmu6Aq/Dg4h+c6S3G4OmWIDjo6Cdo8Xz4Qu88U1DjVYKc6An5LOxc4QTsAZDg6xmSsOORJvzmUWdy9ik3du3AeW7wAmG06t1BeutlLUDvjU3W6GQYbONDaybyetFI3tLCoPAN2srtvYWk7bnrwOj6yzbtOrgI6Ft4CO2G+QDvCRNm9Ru0ut5Uh77lrebS6osssPW0cDT3msBE8+HZNufdc6DtDfH468I0+u3U8gzkeyIo+5wy0urDf77m2xUo4J75pPCL9XjwGDbQ7xPZJuvl/pLk+QEm69cJNO9kOIL0aftY8DGe8PRjjg7nVo5Q8jIc7PHvuETjqSTO8YvkEPBB9LL7MrHM7IBsFPG9+TzpSCxw8tL62OY9vIbvv4oI9FzjvPJtsy7rleD06aC6QPHaTIjzKkTs5x4Hlu9J5FrsYf9w6d1UouuJXuTzNyaM5orGNu/e9Zzkc4Ek7Xl/oua8M37vqApE86+2KO+ShXTwt+Xg5rT0HOsBVFbqWyBq2figHvXzaJrupWZc8osXmPdqkmjywo3+7wJT2vQdiiLxSf0o78bndu5NBHTtzMg48odZIPMkB/LuAcfa7KB9tuprdCb1MoB++GiepuvDCVrtr0cw7ZooxupaggzuRmp27YZnJu0/wojxcNb+3v3aBuUqSHDm1aq+76M5rPSMpHDh2vte56GbvN4gogbpOBW25sqXJuzIfibyYWac7EbO7N57YfLt//B06XImBPsm3Bbw9ZP25z7icukr8hjoFRMO6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaYWPQg4QL7sR4E67MG5PPhfDrs5IaS4st0duqh1zzsOtQy7ch6CvDirPDy0FVY8OZ3xOi77VjtAFDs7Iy17PbWQK70KcSE8LEjWu6ZC37qQqkk6OY8dPtVOmLxCAT695imyOU8FObvxp6k4oxk8PtqRF7mvPHO8l9PKvNVAqDo0UBQ75D38PKxWYTtC56a6gBI7ubp66TrY0AE89mQSuqT0DL5u8PW7BrAJPH6vGbtyIrk69XOOOda9SLvPRxu6lKS7PChWNrv00jC8ACPOPEyaFbxf+Lk71YoPPCT0irq+u3G8ktiLuvUBcjrrwhK+0wJLuSbghDxysSy6E4pfvV/IBb3fCIy+Ej51un+6T7yrkWA8CK6nuhmm6Tx/LtU4uI4nvOfbnbgyMn64wYehPAgqDjqo0tM68ZjbOrafKL40iF4+HvDNuRHoTDtGJHA7Gdnpug4cmLvHUjG4+BF+PfJgnbmBUDQ7o53iOpKbVDyMdbg7GgoAO4EZ4zuRaCA7"}, + "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": "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"}, - "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": "bYdHPMoJjb0g7J49SHJrupksHz0OLZQ9nRQ/vGhAbb0frLk7u3UsPuGpHD202la9eBXgvDJ72LuH0mq97bWyPa+37TyVW5E+/XiVPDQc4btzRxu9gm9XvUXHUDyfESQ7b8sRP4BF6byT2U88PI95PNhzlD+/K6q6rrfSvQUyC75LvaQ80bYrvm79nzoKxNM8BtpKvB7TODlLqyI9My+yOI2vIb+gT6i8cJTIPfS9Ej6K8QC/olSlOndcRb1h4+G7v9IgPX47MroLW8E9hRaXOE35mbxwUoI7juYkuoktNj1cagq74HSWOY5fHjvfd6k9NpMSPVNsFD0sUAa55TvPOfGoJr70AW+8VD0cPb5k4z3yk0881D79vMPR27vCm++8DqE2PNGCVLwwv907FTuLuv5d0rvQ9AQ8G28NPC+eTT0nwFA82L8NvOLPCD0Hm9a8YtjgPF5MW7sbjVg9GbotP1RRTjgGcmS62dWnveGpDjxJ0ea7FAgFvD+WBL5q3AU7f4AMO90XQLqmDFI6t0HqO+R6n7kHhyM9sNoHPVAY+LymjYa+TdDvPD2n0b0nupg+jnMGuknJQLtc3YA849Q3vM3gNj5JQhM9sZO8Pad2OLrUTII7LSkiPcytOrxg1A48TOLuvT+JgD3+qI890lkkt9F1qDu8RaG7c0lOvqiJqToPYx67aFckPTjGDzqIL7u89puaPQN6bjzNKG09h/fqPKfj1D41LzK9Z4+8PfXdAD7TiBA8x9rzum/1DTz9h866h2+lO0Dk5zzBY6I92xdRvljosj7CZzy7QUAtPIL1Cjrs6qo84VI9PmdZurybhjo7G/kHvv6E1Dy+PHM+OLx0vA7vJbvb1mw951aeO6dAmj3KAyA8LQ6RO0aGrrs9dKW8BfhjvmCKjb0EC0o9ypJFPFXKtTy+YUc8d7nePR08GjnKqSq4Q/FSvDSPOb14oza9sI6RO2bQ/7sE/9M9V4iqupmQtTk2GDU7lEnmu2DlI7018SE9Db8tOt8S4LrLczW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP6STPrbstLyh1I27RpKXPZafnTxClAQ9NBbcu+retjy85FE/ampRO8W9z7zBeWo+teA3P0RTRbfip5s8q9Pku2E7ljy9Zue8GWg2PgOdh7rl5Om9zYCVu3aVZ7pRYWe7leESPa63oDq7zuk8FADyuxf6Cb1pUgI7E4OsOqdZ9DvOmg47ojQNu+e1yTmT9NW8OjGHPGY1sTuCzhE9MzZGPbtvwTyWEb09ouB6vdUfqbwrunS++5PeOsCLAD5qyoQ87aT+uw70Jb2Uerg9w7aGu/FLj74SV6O6lsa7PIev8ThfEJm9riMEO3F3tbxFjFu8b95pu4dRBz3FdjU9TW+KPeKJlj0noB47pTacNwivPrwn9kE7fAgbvKFcRDikMja5WDiBPVBT3DnPk4i6s3+aOgLGATzNDxM9JFkXPDPK6Tu5RKS86RqMP1jMmTvC/bY8L/PMu9K9Gjwms+S6Y2cDPZCZSD1heAU//SnlvPVsHbo6YPA8sz3vuZrdWT1qunm9"}, + "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": "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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/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": "p4x5PgPoLz+SXYM/sN8tPgzeIkBqX3y+QkwDwLfEML7c9BBAlk8EQIPTEEAkt/E+QMS9vC5OcT9deWPAYK2yvAiFj75TEy8/OF4BQFQWy75ymY4/pM2dv/DDXL7O2zw/OTowv10cmD67JB3A4GszQITNyz+H9dO9Kig7P34Lf79+xzfAxLULwH7qfL9IOCXAaCqLP96n+7/Gg7G/+amqv+QjG8BAsQk/nPx8PuQiHkACfyo+IOYOPuzKZb+EgaY+N1jLv9zQyT9UjRtAsxC+P6SVLkBGehfAMTpXP5GEgD9ZqXk/BC6UvlC5Cj+cmrq/bjUFP6DjuT7Uljg+7AyCvoThHr+sNdQ/GuLnPmE7Qb8Lxds/UkBAQNBlMj7Y2j1AdPMFPcLbwT7FMTW/ASs4Pznurj9GV6c/CsBKv+Z4tT6yJre/+Bl4v+NT1T9qgTTA+zeQP5buBb8VkfA/2fy8viO0jT+R67i/3Ym9PiAqsz34wiZAtDGrv6zfXL+c5te/Tt4hwBhvXb9IpoC/SMU+vvn3AsC4lzs+R9WRv2cksj+0EXnAw6HNP1BHB0DeBew/t0xnQMAduD5MMGA/OdOavsu59j681fO/0D+Pvt+9VMDv9eg/xiKwv4olBkDbAs6+cCptv/iJvb+jmAVANwHhPlAiDz4tSR9AvjstvwoK3b++B7y/UKRWPYBaQ73fizK/7C9VP1rrhL6aSPa/hRjgP++XpD9wsk+/BtWvPxpd9T8ICz69FIEbQH7L7D/owv6+xoS1vq5CAsBI3cs/upEPwMKVvL+wkoO+nvnBP4w4VL+432y94jj9PisNDcBOlsM/9uKmP04KJsDQRDA/wsoiwGO0HMAzkJ4/LryGP5oyKMAWI7Y/BDo1vjJS479f0Ii/Pp0DwMDSej09ryC/JJqvP7IDT7/2qE+9h1q+vpsXVj+UK6A/pLmHPbKdqL+b02W/eua5PjEW4r6ZZkFA7irCv/Fk776wM4g93spiQHYKlb4TpcA/7qrSPvCgsz1sBhC/m0j6voR9LT/CDIY+9EoWv/q5kb8bOpI/9z+/vsqw0j8onPW8XEHyPjD/DUAZbYK+uagWPzAlOECaOSxAFuwYv4BcHr6KlQY/LhywP5T3VL+FFpA/fgFZvwBiYT/mExVA6gS/P/eXV78zYBDAKn9bP8vQ4j/IhYO9v9IXwPB91j6dxxc/mt9vP4g58r4GSYc/S1xOwE4WJT+lEQRAKBiAQJhc2L9B7pK+RBK1v/puS0AAZvY/UsMDQDyTHL9s8jk+xIo0vkgAqT90hhLAEJtbvoS/272SwuS/T8YAQP44zr4QLPK+7F2rPLzYmT8DqRNA2Ok5QPSTcT/KQY0/DiUjPy5BN79pBrm/t/hCP1amXj8WJ1G/eayDP/pli77wd5g+WM/pPnhmir845t2+qGdIv/mAtb/Jd0lAhAoYPjQ5oj+ialc/e5W1Pgt4xb6ae4K+LJBJP9z0iD/zCZU/AMuPvHgElj4RiYO/+rmZvvIEpz+HI4A/liwQvwTCcb+Gh8e/WaagP4l/2T9Ca6I/Xg1jv3IGAL+SPSa/DC/3vqi3Zj9jh9C/8MU4v34jXr832yxAxuGiv+EKtL+egMU/almJPgBAkbm0tl2/ssngP8bZCj55qgw/fZXQv2Nt7z9zX8A+kGc7vxuHf7/dQ7U9FeE9v+mmoD4Xf+S/aGCwPgHJKb9x2gHABMjcv3d1LT/UGYW/2jS0vk/rmL/ANv08t6Zav5Wdg76VO0U/2FHZPVTgyL4wKIG+oKe7P2WdnL4DbrW9SweqPwqdJj9F3cs/GmRjv9A+Wb8xpkA9AECxPwARyzxki9o+8GVsv2JFz76syeo+bX7BPk1Olr9u0r4/FjSZv5oGnL6hHsI/JGcFQEyOPsBAa20/Yj24PwzKyb+GzsS/NWpWwFkTJEAjLEK/De2fP4A3nb7ScRHAI10hPiniOz80tdA+WjDlvqh4jb++DQk/qMa8P8WkLb/4c9A/5mOSPmGKdr+vgse/OJIEQPA7I78K3AhAnmxjv2Y2pb/0bZ0/hKMdPlRfHcCIx5Y/91AlQHHEkr4UAyw+DK5/P9JPbr5chUs+QO4GQKvEo76QSGW90jm+vjVCHkDOGbY/VtiWP5iT+T/T2cG+EJpzPjQ4FT58g28/dYhLQN6SYj9dmZq/OXDBvtOPTT6jpbO/GryHPu29oz83ucu/zAbFvhcSQ8Dqgqo/A/ygP6LCmz9cM4m/DV/Cv4IWWL+/OmK/LeWMP4ftK8CeLVu/DvSGv9SjQ0DwIZS/IKpeP7mcDL/0BiU/dmMvPXHtOUDYy6Q9rVsAvzwLPEAAYIu/WkYoP9upjD86nrq/v84vwHUsWT9f05E/RWsAQJrIvb+I18k8CVqqvaFVH8Coyfy+f8GHv+jPhD8To8G/SSbZv8wrg75uJVq/6nNHvz+uLb+GEvq+eLuOu1hmJ8CweMk/BMSPPgAI77pN/e4+QdXavzAdH7/XNka/WdGTvysI8T8nHl4+KtYUwErUeL/nnMg/QrnLvhGaEsDxERpAGiE+P7ZBsz7V6Nu/YQ2oP+ZCzb6Eg7A/GEprvSqzGb4WUZm+shgswAThsr/s3E3ALhpBvyeuyL8LlCZAXBPxvvWrDMALKp0/htAkQMhjvz7Qk20/tiidPk4w3z9j1PA/Pcnpv6VTgT+fj0s/Mw0TPh52sr/sVuA/1tLsP0ZHHb5kEs2+BBfHv9BK7L+GhP6/3rJlPgTXMUD8n60/0Ybfv47Vzj41DBY+V+z4voDQRjw8xrm9lfOnPzJCK0CQwZS/ejGPv2lfhb9veAvAqYDnPn5aSL/nUaS+mTnBvyyL7z8OS5I/VcWtPrtuScDpySI/7dUmPzL9rT8gmoa/U19NP8hcnr2ylQpAxwGKvqvco7+PMdu/QF5PQLlrK7/FP5i+bHYTwD44I8Aa4B6/7hOKwK3tub6+u4S+L5NWv7amMz/UBVk/8soEQAf1Cz+kGRs/DDHEPgAALru+7ni/L4y2P3Msc79uJPM/wGTkPH4n5r5AfSk9z2SEP1tN1r4+Fpc/gNdRvy5zFD/hVd8+SPJQP8iwKb/A3tg/bqjmPjljtT+Y088/tGGMPSjeyL6x2hzACqOev1U1FT4MpIS/39ojwFQNPkAZtxg/F42BPxRK/z2b8Yc+B9M9v5F2/710X/Q/B+fZPgFhbr9e3lfAYlAvvz8UzT/+Iy+/LuawP4IInz9iLrW+WkHIP0mXp7+yK50+aKMVvkhpEcAuK4c/sD26v7S6ML9oLzY9eEpmPw1pNsDQoMO/WPR5vm7hvb8qNZs+jjfEP1trZb+/nBRA4B/SP4RULz+EwM6+DYScvyoqx780t7G+mer0P4xeAD7gQFK9gpU8vxqpEz+eCdA/jGqFP5hz5b7vcN6+6nBBvyiyjb/dYri+Buz2PhTB0r74P/2/MsfNP5iiIMC4ACu++RMov6x51z4N3JU/oH8UPhSNIsCersW/0K2+vuzk6L76IAg+cS4cv4Db/75WkYy+OORLP1jIKL8deXs/yVPTv4VSRr9sV4w+qNGgPowHuz4WIqQ+V5Gjv1yqiz+LRqW++AIUv83Foz4EiKc/mRSlvrNQJ8CJ2oQ/YIIywFPDir/y+1S/d9gRP1Br6T0f/pI/ijK2vybe6b8rHCJA5myiP3u5jz5Q/Hc8/Ri/Pqb3vz7zC9Q+2s8Pv2Rw8b5Izog+v/NUP7hY2z3saN4/LY2ZP96JVL/Gf42/6ChtPR34YD8PHZO/coz5PaNhpb/kBk0/ILH2PLq4PEA2Diy/vzoLP1Oxqr/mak4/tP2svxzHtj4OLvm+/sEkvtlgJ78s1ju/Cb9iv4QsNb5wV0A/ADWUv8YgBr6BzWI/lbU+v5aynL/PL4k+KgCzv90JAcA03UQ/vJDiP6o3mb+o97M+KV7GvaK9l7+ZZeU/wL+GvNPxYr84eh3ANPI/P0BUFb8004o/egcpwJtuO7/sR8Y/Yms1PzALWLz0g7A9TvGSvwbkc78ZmoW/xPzQPeNqeD6wA+6+EC/+PsUzqr+3MAs/UkgxwNusmr9FH6e/MJNtPbiMAD/IsEE/xwMgP6yGLb9K8HS/"}, "tables": [ { "layer": 2, 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/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..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 @@ -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() @@ -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 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") diff --git a/tests/model/test_model_numerics.py b/tests/model/test_model_numerics.py index a67da12c3..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 @@ -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) @@ -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 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(), ), },