Download build/webgpu/test.json from webgpu-kernels/com.microsoft.LinearAttention: direct link, hf CLI and curl.
- Browser
- Download file 139 kB
-
https://huggingface.co/kernels/webgpu-kernels/com.microsoft.LinearAttention/resolve/v1/build/webgpu/test.json
- Command line
-
hf download hf://webgpu-kernels/com.microsoft.LinearAttention@v1/build/webgpu/test.json
-
curl -L -o test.json https://huggingface.co/kernels/webgpu-kernels/com.microsoft.LinearAttention/resolve/v1/build/webgpu/test.json
139 kB
| { | |
| "cases": [ | |
| { | |
| "name": "linear_zero_state", | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.7, "chunk_size": 17 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 3], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 6], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 2, 3], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "ort_linear_rule_single_token", | |
| "provenance": { | |
| "source": "onnxruntime/test/contrib_ops/linear_attention_op_test.cc", | |
| "test": "ContribOpLinearAttentionTest.LinearRule_SingleToken" | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.5, -0.5] } | |
| }, | |
| "keyT": { "dtype": "float32", "shape": [1, 1, 4], "data": { "kind": "values", "values": [0.5, 0.5, 0.0, 1.0] } }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0] } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "ort_linear_rule_multi_token", | |
| "provenance": { | |
| "source": "onnxruntime/test/contrib_ops/linear_attention_op_test.cc", | |
| "test": "ContribOpLinearAttentionTest.LinearRule_MultiToken" | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.5, -0.5, 0.5, 1.0, -0.5, 0.0, 0.0, -1.0, 1.0, 0.5] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [0.5, 0.5, 0.0, 1.0, 1.0, 0.0, 1.0, 0.5, -0.5, 1.0, 0.5, 0.0] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 2.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 2.0] } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "ort_linear_rule_with_initial_state", | |
| "provenance": { | |
| "source": "onnxruntime/test/contrib_ops/linear_attention_op_test.cc", | |
| "test": "ContribOpLinearAttentionTest.LinearRule_WithInitialState" | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.5, -0.5, 0.5, 1.0, -0.5, 0.0] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "values", "values": [0.5, 0.5, 0.0, 1.0, 1.0, 0.0, 1.0, 0.5] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 2.0, 1.0, 0.0, 3.0] } | |
| }, | |
| "pastStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "data": { "kind": "constant", "value": 0.1 } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "ort_gated_rule_single_token", | |
| "provenance": { | |
| "source": "onnxruntime/test/contrib_ops/linear_attention_op_test.cc", | |
| "test": "ContribOpLinearAttentionTest.GatedRule_SingleToken" | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.5, -0.5] } | |
| }, | |
| "keyT": { "dtype": "float32", "shape": [1, 1, 4], "data": { "kind": "values", "values": [0.5, 0.5, 0.0, 1.0] } }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0] } | |
| }, | |
| "pastStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "data": { "kind": "constant", "value": 1.0 } }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4], | |
| "data": { "kind": "values", "values": [-0.1, -0.2, -0.05, -0.15] } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "ort_delta_rule_multi_token", | |
| "provenance": { | |
| "source": "onnxruntime/test/contrib_ops/linear_attention_op_test.cc", | |
| "test": "ContribOpLinearAttentionTest.DeltaRule_MultiToken" | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "delta", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.5, -0.5, 0.5, 1.0, -0.5, 0.0, 0.0, -1.0, 1.0, 0.5] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [0.5, 0.5, 0.0, 1.0, 1.0, 0.0, 1.0, 0.5, -0.5, 1.0, 0.5, 0.0] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 2.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 2.0] } | |
| }, | |
| "betaT": { "dtype": "float32", "shape": [1, 3, 1], "data": { "kind": "values", "values": [0.8, 0.6, 0.9] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "ort_gated_rule_broadcast_decay", | |
| "provenance": { | |
| "source": "onnxruntime/test/contrib_ops/linear_attention_op_test.cc", | |
| "test": "ContribOpLinearAttentionTest.GatedRule_BroadcastDecay" | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.5, -0.5, 0.5, 1.0, -0.5, 0.0, 0.0, -1.0, 1.0, 0.5] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [0.5, 0.5, 0.0, 1.0, 1.0, 0.0, 1.0, 0.5, -0.5, 1.0, 0.5, 0.0] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 2.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 2.0] } | |
| }, | |
| "pastStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "data": { "kind": "constant", "value": 0.5 } }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 1], | |
| "data": { "kind": "values", "values": [-0.1, -0.2, -0.05] } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_batch2_mqa_head_dim1", | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 2], | |
| "data": { "kind": "values", "values": [1.0, 0.5, -1.0, 2.0, 0.25, -0.75, 1.5, -0.5] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 1], | |
| "data": { "kind": "values", "values": [1.0, 2.0, -1.0, 0.5] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 2], | |
| "data": { "kind": "values", "values": [3.0, -3.0, 4.0, -4.0, 5.0, 6.0, -7.0, 8.0] } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 2, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 2], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "ort_linear_rule_default_scale", | |
| "provenance": { | |
| "source": "onnxruntime/test/contrib_ops/linear_attention_op_test.cc", | |
| "test": "ContribOpLinearAttentionTest.LinearRule_DefaultScale" | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear" }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.5, -0.5] } | |
| }, | |
| "keyT": { "dtype": "float32", "shape": [1, 1, 4], "data": { "kind": "values", "values": [0.5, 0.5, 0.0, 1.0] } }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0] } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "ort_linear_rule_multi_batch_multi_head", | |
| "provenance": { | |
| "source": "onnxruntime/test/contrib_ops/linear_attention_op_test.cc", | |
| "test": "ContribOpLinearAttentionTest.LinearRule_MultiBatchMultiHead" | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 2, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 8], | |
| "data": { "kind": "fillFloat32", "scale": 0.7, "sinStep": 0.3, "cosStep": 0.0 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 8], | |
| "data": { "kind": "fillFloat32", "scale": 0.7, "sinStep": 0.0, "cosStep": 0.5 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 8], | |
| "data": { "kind": "fillFloat32", "scale": 0.7, "sinStep": 0.7, "cosStep": 0.13 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 2, 8], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 2, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_scalar_gqa_headdim6_dv_tiled", | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta" }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 5, 24], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.21, "cosStep": 0.33 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 5, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.27 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 5, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.09, "cosStep": 0.43 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 6, 10], | |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.19, "cosStep": 0.37 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [2, 5, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.15, "offset": -0.2, "sinStep": 0.29, "cosStep": 0.53 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [2, 5, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.25, "offset": 0.5, "sinStep": 0.37, "cosStep": 0.19 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 5, 40] }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 2, 6, 10] } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_scalar_headdim6_seq128_state", | |
| "provenance": { | |
| "notes": "A compact multi-token gated-delta recurrence uses four query/KV heads, non-four-wide key head size 6, past state, and per-head decay and beta." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 4, "update_rule": "gated_delta", "scale": 0.25 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 24], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.021, "cosStep": 0.033, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 24], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.043, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 6, 12], | |
| "data": { "kind": "fillFloat32", "scale": 0.02, "sinStep": 0.019, "cosStep": 0.037 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.08, "offset": -0.2, "sinStep": 0.029, "cosStep": 0.053 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.08, "offset": 0.5, "sinStep": 0.037, "cosStep": 0.019 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 128, 48], "tolerance": 0.00005, "relTolerance": 0.00005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 6, 12], "tolerance": 0.00005, "relTolerance": 0.00005 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_headdim6_seq128_offset_value_scale", | |
| "provenance": { | |
| "notes": "A 128-step gated-delta recurrence with 4 query and 4 key/value heads, head width 6 (key) by 12 (value). Key values scale to |k|^2 near 0.7 and V is offset to 1.0, so decay, beta, and the running update change the output measurably at each step." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 4, "update_rule": "gated_delta", "scale": 0.25 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 24], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.021, "cosStep": 0.033, "scale": 1.0 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 24], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.043, "scale": 0.3, "offset": 1.0 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 6, 12], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.019, "cosStep": 0.037 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.08, "offset": -0.2, "sinStep": 0.029, "cosStep": 0.053 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 128, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.08, "offset": 0.5, "sinStep": 0.037, "cosStep": 0.019 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 128, 48], "tolerance": 0.001, "relTolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 6, 12], "tolerance": 0.001, "relTolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_scalar_elementwise_decay_shared_key_head", | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 2, "update_rule": "gated_delta", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 10], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.41 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 5], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.31, "cosStep": 0.17 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.47 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 5, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.27, "cosStep": 0.13 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 10], | |
| "data": { "kind": "fillFloat32", "scale": 0.15, "offset": -0.25, "sinStep": 0.43, "cosStep": 0.61 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 1], | |
| "data": { "kind": "fillFloat32", "scale": 0.2, "offset": 0.45, "sinStep": 0.53, "cosStep": 0.29 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 4, 8] }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 2, 5, 4] } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_vec4_gqa_headdim12_dv_tiled", | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta" }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 6, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.29 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 6, 24], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.15, "cosStep": 0.39 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 6, 24], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.51 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 12, 12], | |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.33, "cosStep": 0.21 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [2, 6, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.15, "offset": -0.2, "sinStep": 0.47, "cosStep": 0.31 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [2, 6, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.25, "offset": 0.5, "sinStep": 0.41, "cosStep": 0.23 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 6, 48] }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 2, 12, 12] } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_vec4_elementwise_decay_beta_dim1", | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 1, "update_rule": "gated_delta", "scale": 0.4 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 5, 24], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.25, "cosStep": 0.37 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 5, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.49 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 5, 9], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.57 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 8, 9], | |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.21, "cosStep": 0.43 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 5, 8], | |
| "data": { "kind": "fillFloat32", "scale": 0.15, "offset": -0.25, "sinStep": 0.59, "cosStep": 0.27 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 5, 1], | |
| "data": { "kind": "fillFloat32", "scale": 0.2, "offset": 0.5, "sinStep": 0.61, "cosStep": 0.33 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 5, 27] }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 8, 9] } | |
| } | |
| }, | |
| { | |
| "name": "linear_zero_scalar_f16_seq128", | |
| "provenance": { | |
| "notes": "Float16 query and state over a 128-token zero-state linear recurrence check the output at every token." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "scale": 0.25 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.012, "cosStep": 0.023, "scale": 0.03 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.014, "cosStep": 0.019, "scale": 0.03 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.008, "cosStep": 0.017, "scale": 0.03 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 128, 64], "tolerance": 0.00004, "relTolerance": 0.002 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 2, 16, 16], "tolerance": 0.00004, "relTolerance": 0.002 } | |
| } | |
| }, | |
| { | |
| "name": "linear_zero_f16_seq128_offset_value_scale", | |
| "provenance": { | |
| "notes": "A 128-token float16 recurrence omits past state but does not produce zero output. Positive-offset keys and values around 0.5 keep output and present state at order-one magnitude, making multiplicative errors observable on the serial, scalar, and vec4 zero-state routes." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "scale": 0.25 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.012, "cosStep": 0.023, "scale": 0.2 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.014, "cosStep": 0.019, "scale": 0.15, "offset": 0.02 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.008, "cosStep": 0.017, "scale": 0.2, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 128, 64], "tolerance": 0.01, "relTolerance": 0.01 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 2, 16, 16], "tolerance": 0.01, "relTolerance": 0.01 } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_scalar_f16_seq128", | |
| "provenance": { | |
| "notes": "A compact float16 recurrence with a supplied initial state verifies that the first output incorporates that state." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "scale": 0.25 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.03 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.015, "cosStep": 0.018, "scale": 0.03 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.016, "scale": 0.03 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 16, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.011, "scale": 0.01 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 128, 64], "tolerance": 0.0002, "relTolerance": 0.004 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 2, 16, 16], "tolerance": 0.0002, "relTolerance": 0.004 } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_f16_seq128_offset_value_scale", | |
| "provenance": { | |
| "notes": "A supplied past state at amplitude 0.3, positive-offset keys, and values around 0.5 keep both outputs at order-one magnitude. Dropping the initial state or uniformly rescaling either output therefore exceeds tolerance." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "scale": 0.25 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.2 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.015, "cosStep": 0.018, "scale": 0.15, "offset": 0.02 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 128, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.016, "scale": 0.2, "offset": 0.5 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 16, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.011, "scale": 0.3 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 128, 64], "tolerance": 0.01, "relTolerance": 0.01 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 2, 16, 16], "tolerance": 0.01, "relTolerance": 0.01 } | |
| } | |
| }, | |
| { | |
| "name": "empty_zero_dim", | |
| "provenance": { | |
| "notes": "Zero-length batch axis of query/key/value (empty input). head/packed dims stay normal; output=[0,seq,qHeads*vHeadDim] and present_state=[0,kvHeads,headDimK,vHeadDim] => both EMPTY. linear rule, no past state." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.7 }, | |
| "inputs": { | |
| "queryT": { "dtype": "float32", "shape": [0, 3, 4], "data": { "kind": "values", "values": [] } }, | |
| "keyT": { "dtype": "float32", "shape": [0, 3, 2], "data": { "kind": "values", "values": [] } }, | |
| "valueT": { "dtype": "float32", "shape": [0, 3, 3], "data": { "kind": "values", "values": [] } } | |
| }, | |
| "outputs": { | |
| "outputT": { | |
| "dtype": "float32", | |
| "shape": [0, 3, 6], | |
| "tolerance": 0, | |
| "data": { "kind": "values", "values": [] } | |
| }, | |
| "presentStateT": { | |
| "dtype": "float32", | |
| "shape": [0, 1, 2, 3], | |
| "tolerance": 0, | |
| "data": { "kind": "values", "values": [] } | |
| } | |
| } | |
| }, | |
| { | |
| "name": "empty_zero_dim_f16", | |
| "provenance": { | |
| "notes": "Zero-length batch axis of query/key/value (empty input). head/packed dims stay normal; output=[0,seq,qHeads*vHeadDim] and present_state=[0,kvHeads,headDimK,vHeadDim] => both EMPTY. linear rule, no past state. f16 variant." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.7 }, | |
| "inputs": { | |
| "queryT": { "dtype": "float16", "shape": [0, 3, 4], "data": { "kind": "values", "values": [] } }, | |
| "keyT": { "dtype": "float16", "shape": [0, 3, 2], "data": { "kind": "values", "values": [] } }, | |
| "valueT": { "dtype": "float16", "shape": [0, 3, 3], "data": { "kind": "values", "values": [] } } | |
| }, | |
| "outputs": { | |
| "outputT": { | |
| "dtype": "float16", | |
| "shape": [0, 3, 6], | |
| "tolerance": 0, | |
| "data": { "kind": "values", "values": [] } | |
| }, | |
| "presentStateT": { | |
| "dtype": "float16", | |
| "shape": [0, 1, 2, 3], | |
| "tolerance": 0, | |
| "data": { "kind": "values", "values": [] } | |
| } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_zero_seqlen_present_equals_past", | |
| "provenance": { | |
| "notes": "T=0 (zero-length seq axis) with a past_state. outputT=[1,0,8] is EMPTY but presentStateT=[1,1,4,4] is NON-empty, so allOutputsEmpty does NOT short-circuit and the kernel runs with seqLength==0: the recurrence loop runs zero times, so present_state must equal past_state bit-for-bit. linear rule, headDimK=4 (%4==0). Distinct from empty_zero_dim which zeros the batch axis." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { "dtype": "float32", "shape": [1, 0, 8], "data": { "kind": "values", "values": [] } }, | |
| "keyT": { "dtype": "float32", "shape": [1, 0, 4], "data": { "kind": "values", "values": [] } }, | |
| "valueT": { "dtype": "float32", "shape": [1, 0, 4], "data": { "kind": "values", "values": [] } }, | |
| "pastStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "data": { "kind": "constant", "value": 0.1 } } | |
| }, | |
| "outputs": { | |
| "outputT": { | |
| "dtype": "float32", | |
| "shape": [1, 0, 8], | |
| "tolerance": 0, | |
| "data": { "kind": "values", "values": [] } | |
| }, | |
| "presentStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4, 4], | |
| "tolerance": 0, | |
| "data": { "kind": "constant", "value": 0.1 } | |
| } | |
| } | |
| }, | |
| { | |
| "name": "linear_zero_zero_seqlen_present_all_zeros", | |
| "provenance": { | |
| "notes": "T=0 (zero-length seq axis), no past_state. outputT=[1,0,8] EMPTY, presentStateT=[1,1,4,4] NON-empty must be all zeros (state zero-initialized, zero-trip recurrence). linear rule, headDimK=4 (%4==0). Exercises zero-init path with a live kernel dispatch." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { "dtype": "float32", "shape": [1, 0, 8], "data": { "kind": "values", "values": [] } }, | |
| "keyT": { "dtype": "float32", "shape": [1, 0, 4], "data": { "kind": "values", "values": [] } }, | |
| "valueT": { "dtype": "float32", "shape": [1, 0, 4], "data": { "kind": "values", "values": [] } } | |
| }, | |
| "outputs": { | |
| "outputT": { | |
| "dtype": "float32", | |
| "shape": [1, 0, 8], | |
| "tolerance": 0, | |
| "data": { "kind": "values", "values": [] } | |
| }, | |
| "presentStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4, 4], | |
| "tolerance": 0, | |
| "data": { "kind": "constant", "value": 0.0 } | |
| } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_scalar_headdimk_gt_128_partial_dv_tile", | |
| "provenance": { | |
| "notes": "A gated-delta step with 2 query heads sharing 1 key/value head. Key head width 130 exceeds 128 and is not a multiple of four; value head width 10 leaves a two-element remainder after grouping into fours, exercising both the key and value tails together." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "gated_delta", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 260], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.017, "cosStep": 0.023 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 130], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.013, "cosStep": 0.029 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 10], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.09, "cosStep": 0.43 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 130, 10], | |
| "data": { "kind": "fillFloat32", "scale": 0.1, "sinStep": 0.019, "cosStep": 0.037 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 1], | |
| "data": { "kind": "fillFloat32", "scale": 0.15, "offset": -0.2, "sinStep": 0.29, "cosStep": 0.53 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 1], | |
| "data": { "kind": "fillFloat32", "scale": 0.25, "offset": 0.5, "sinStep": 0.37, "cosStep": 0.19 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 4, 20], "tolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 130, 10], "tolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_default_rule_no_updateRule_arg", | |
| "provenance": { | |
| "notes": "Omitting `update_rule` requests the schema-default gated-delta recurrence with decay, beta, and past state. Key head size four checks a compact reduction." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.25, "cosStep": 0.37 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.49 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.57 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.21, "cosStep": 0.43 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 1], | |
| "data": { "kind": "fillFloat32", "scale": 0.15, "offset": -0.25, "sinStep": 0.59, "cosStep": 0.27 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 1], | |
| "data": { "kind": "fillFloat32", "scale": 0.2, "offset": 0.5, "sinStep": 0.61, "cosStep": 0.33 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 8], "tolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_f32_dk128_dv128_compact", | |
| "provenance": { | |
| "notes": "A compact gated-delta case preserves Bonsai's 128-wide key/value heads, four query heads, two KV heads, shared GQA state, and the float32 vec4 path." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta", "scale": 0.08838834764831845 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 512], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.023, "scale": 0.03 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.029, "scale": 0.03 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.043, "scale": 0.03 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 128, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.037, "scale": 0.01 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.029, "cosStep": 0.053, "scale": 0.08, "offset": -0.2 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.037, "cosStep": 0.019, "scale": 0.08, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 512], "tolerance": 0.000005, "relTolerance": 0.0005 }, | |
| "presentStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 128, 128], | |
| "tolerance": 0.000005, | |
| "relTolerance": 0.0005 | |
| } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_f32_dk128_dv128_offset_value_scale", | |
| "provenance": { | |
| "notes": "For float32 dK=dV=128, key magnitude near 0.7 makes the gated-delta correction visible; O(1) values and queries expose incorrect decay, beta or output scaling in both output and state." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta", "scale": 0.08838834764831845 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 512], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.023, "scale": 1.0 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.029, "scale": 0.1 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.043, "scale": 0.3, "offset": 1.0 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 128, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.037, "scale": 0.3 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.029, "cosStep": 0.053, "scale": 0.08, "offset": -0.2 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.037, "cosStep": 0.019, "scale": 0.08, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 512], "tolerance": 0.001, "relTolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 2, 128, 128], "tolerance": 0.001, "relTolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_f16_dk128_dv128_compact", | |
| "provenance": { | |
| "notes": "Float16 tensors with 128-wide key/value heads exercise the scalar gated-delta route at a compact sequence length." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta", "scale": 0.08838834764831845 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 512], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.023, "scale": 0.03 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.029, "scale": 0.03 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.043, "scale": 0.03 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 128, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.037, "scale": 0.01 } | |
| }, | |
| "decayT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.029, "cosStep": 0.053, "scale": 0.08, "offset": -0.2 } | |
| }, | |
| "betaT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.037, "cosStep": 0.019, "scale": 0.08, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 2, 512], "tolerance": 0.000015, "relTolerance": 0.003 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 2, 128, 128], "tolerance": 0.0002, "relTolerance": 0.003 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_f16_dk128_dv128_offset_value_scale", | |
| "provenance": { | |
| "notes": "For float16 dK=dV=128, key magnitude near 0.7 makes the gated-delta correction visible; O(1) values and queries expose incorrect decay, beta or output scaling in both output and state." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta", "scale": 0.08838834764831845 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 512], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.023, "scale": 1.0 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.029, "scale": 0.1 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.043, "scale": 0.3, "offset": 1.0 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 128, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.037, "scale": 0.3 } | |
| }, | |
| "decayT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.029, "cosStep": 0.053, "scale": 0.08, "offset": -0.2 } | |
| }, | |
| "betaT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.037, "cosStep": 0.019, "scale": 0.08, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 2, 512], "tolerance": 0.01, "relTolerance": 0.01 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 2, 128, 128], "tolerance": 0.01, "relTolerance": 0.01 } | |
| } | |
| }, | |
| { | |
| "name": "linear_zero_vec4_dk256_wg_gt_subgroup", | |
| "provenance": { | |
| "source": "onnxruntime/contrib_ops/webgpu/bert/linear_attention.wgsl.template", | |
| "test": "two-level subgroup reduction", | |
| "notes": "The dk reduction must span the whole workgroup. head_dim_k/4 lanes exceed the subgroup size here, so a bare subgroupAdd only sums one subgroup's partial dot products." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear" }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.29 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.15, "cosStep": 0.39 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.51 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 8], "tolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 256, 8], "tolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_vec4_dk132_wg_gt_subgroup", | |
| "provenance": { | |
| "source": "onnxruntime/contrib_ops/webgpu/bert/linear_attention.wgsl.template", | |
| "test": "two-level subgroup reduction", | |
| "notes": "The dk reduction must span the whole workgroup. head_dim_k/4 lanes exceed the subgroup size here, so a bare subgroupAdd only sums one subgroup's partial dot products." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "gated_delta" }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 264], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.29 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 132], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.15, "cosStep": 0.39 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 6], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.51 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 132, 6], | |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.33, "cosStep": 0.21 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 1], | |
| "data": { "kind": "fillFloat32", "scale": 0.15, "offset": -0.2, "sinStep": 0.47, "cosStep": 0.31 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 1], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "offset": 0.4, "sinStep": 0.23, "cosStep": 0.17 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 12], "tolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 132, 6], "tolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_zero_vec4_dk2048_wide_workgroup", | |
| "requires": { "limits": { "maxComputeInvocationsPerWorkgroup": 512, "maxComputeWorkgroupSizeX": 512 } }, | |
| "provenance": { | |
| "source": "onnxruntime/contrib_ops/webgpu/bert/linear_attention.cc", | |
| "test": "head-size-driven workgroup sizing", | |
| "notes": "One vec4 lane handles four key rows, so key head size 2048 requires a 512-invocation workgroup and declares that adapter limit. Positive query/key cycles of coprime lengths 5 and 6 avoid cancellation while ensuring every four-wide lane sees every value." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear" }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 2048], | |
| "data": { "kind": "cycle", "values": [0.25, 0.5, 0.75, 1.0, 0.375] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 2048], | |
| "data": { "kind": "cycle", "values": [0.5, 0.25, 1.0, 0.125, 0.75, 0.625] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.51 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1, 2], "tolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 2048, 2], "tolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_zero_scalar_dk17_above_serial_cap_unaligned", | |
| "provenance": { | |
| "notes": "A linear-attention step (no gating) from a zero initial state, with 1 query and 1 key/value head, key head width 17 (odd, not a multiple of four) and value head width 2." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 17], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.29 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 17], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.15, "cosStep": 0.39 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.51 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 17, 2], "tolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_scalar_dk17_above_serial_cap_unaligned", | |
| "provenance": { "notes": "Key head size 17 has a partial four-lane tail and a supplied past state." }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 17], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.21, "cosStep": 0.33 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 17], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.27 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.09, "cosStep": 0.43 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 17, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.19, "cosStep": 0.37 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 17, 2], "tolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_vec4_dk20_above_serial_cap", | |
| "provenance": { | |
| "notes": "A key head dimension of 20 uses five four-value vectors in an eight-lane workgroup, while value head dimension 3 produces a partial output and present-state tile." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.25, "cosStep": 0.37 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.49 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 3], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.57 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 20, 3], | |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.21, "cosStep": 0.43 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 3], "tolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 20, 3], "tolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_window2_pinned", | |
| "provenance": { | |
| "notes": "Hand-computed linear-rule window. state += k (outer) v each token, so the state after each token is exact in f32; slot j must hold the state after token (seq - W + j), slot W-1 must equal the unwindowed present_state, and slots below max(0, W - seq) must be zero. A kernel that only wrote the final state would leave the earlier slots untouched." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 1, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.0, 1.0, 1.0, 1.0] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.0, 1.0, 1.0, 1.0] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "tolerance": 0.00001, | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 14.0, 18.0] } | |
| }, | |
| "presentStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 1, 2, 2], | |
| "tolerance": 0.00001, | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 6.0, 8.0, 8.0, 10.0] } | |
| } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_window4_longer_than_sequence", | |
| "provenance": { | |
| "notes": "Hand-computed linear-rule window. state += k (outer) v each token, so the state after each token is exact in f32; slot j must hold the state after token (seq - W + j), slot W-1 must equal the unwindowed present_state, and slots below max(0, W - seq) must be zero. A kernel that only wrote the final state would leave the earlier slots untouched." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 1, "state_window": 4 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.0, 1.0, 1.0, 1.0] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.0, 1.0, 1.0, 1.0] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 2], | |
| "tolerance": 0.00001, | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 14.0, 18.0] } | |
| }, | |
| "presentStateT": { | |
| "dtype": "float32", | |
| "shape": [4, 1, 1, 2, 2], | |
| "tolerance": 0.00001, | |
| "data": { | |
| "kind": "values", | |
| "values": [0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0, 2.0, 3.0, 4.0, 6.0, 8.0, 8.0, 10.0] | |
| } | |
| } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_scalar_dk17_window3", | |
| "provenance": { | |
| "notes": "A three-slot window on the scalar, key-head-size-17 route verifies per-token state snapshots and slot indexing with a supplied initial state." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5, "state_window": 3 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 17], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.21, "cosStep": 0.33 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 17], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.27 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.09, "cosStep": 0.43 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [3, 1, 1, 17, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.19, "cosStep": 0.37 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [3, 1, 1, 17, 2], "tolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_vec4_dk20_window2", | |
| "provenance": { | |
| "notes": "A two-slot window on the vec4, key-head-size-20 route verifies per-token state snapshots and slot indexing with a supplied initial state." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.25, "cosStep": 0.37 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.49 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 3], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.57 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 1, 20, 3], | |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.21, "cosStep": 0.43 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 3], "tolerance": 0.001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 20, 3], "tolerance": 0.001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_serial_window2_past_slot", | |
| "provenance": { | |
| "notes": "A small-head-dimension serial recurrence with a past state and state_window=2 must gather slot stateWindow-1 rather than the unwindowed offset." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.5, -0.5, 0.5, 1.0, -0.5, 0.0] } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "values", "values": [0.5, 0.5, 0.0, 1.0, 1.0, 0.0, 1.0, 0.5] } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 2.0, 1.0, 0.0, 3.0] } | |
| }, | |
| "pastStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 4], "data": { "kind": "constant", "value": 0.1 } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 4], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_zero_vec4_window2", | |
| "provenance": { | |
| "notes": "A zero-state linear recurrence writes per-token present-state slots on the vec4 route." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.5, "sinStep": 0.07, "cosStep": 0.41 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 2], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_zero_window2_all_routes", | |
| "provenance": { | |
| "notes": "A zero-state gated recurrence exercises window publication on its serial, scalar, and vec4 routes." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.5, "sinStep": 0.07, "cosStep": 0.41 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [-0.2, -0.1] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 2], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_state_window2_all_routes", | |
| "provenance": { | |
| "notes": "A carried-state gated recurrence exercises window publication on its serial, scalar, and vec4 routes." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.5, "sinStep": 0.07, "cosStep": 0.41 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 1, 4, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.1, "sinStep": 0.13, "cosStep": 0.19 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [-0.2, -0.1] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 2], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "delta_zero_window2_all_routes", | |
| "provenance": { | |
| "notes": "A zero-state delta recurrence exercises window publication on its scalar and vec4 routes." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "delta", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.5, "sinStep": 0.07, "cosStep": 0.41 } | |
| }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.7, 0.4] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 2], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "delta_state_window2_all_routes", | |
| "provenance": { | |
| "notes": "A carried-state delta recurrence exercises window publication on its scalar and vec4 routes." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "delta", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.5, "sinStep": 0.07, "cosStep": 0.41 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 1, 4, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.1, "sinStep": 0.13, "cosStep": 0.19 } | |
| }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.7, 0.4] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 2], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_zero_window2_all_routes", | |
| "provenance": { | |
| "notes": "A zero-state gated-delta recurrence exercises window publication on its serial, scalar, and vec4 routes." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated_delta", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.5, "sinStep": 0.07, "cosStep": 0.41 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [-0.2, -0.1] } }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.7, 0.4] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 2], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_state_window2_all_routes", | |
| "provenance": { | |
| "notes": "A carried-state gated-delta recurrence exercises window publication on its serial, scalar, and vec4 routes." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated_delta", "scale": 0.5, "state_window": 2 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.5, "sinStep": 0.07, "cosStep": 0.41 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 1, 4, 2], | |
| "data": { "kind": "fillFloat32", "scale": 0.1, "sinStep": 0.13, "cosStep": 0.19 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [-0.2, -0.1] } }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.7, 0.4] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 1, 4, 2], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "inverse_gqa_linear_zero_q2_kv4", | |
| "provenance": { | |
| "notes": "Inverse GQA: kvNumHeads exceeds qNumHeads, so the output carries one head per KV head rather than per query head and several KV heads share a query head (KV head h reads query head floor(h * qNumHeads / kvNumHeads)). Linear rule with no carried state; the four KV heads pair onto query heads 0, 0, 1, 1." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "scale": 0.7 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 16], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "inverse_gqa_linear_state_q2_kv4", | |
| "provenance": { | |
| "notes": "Inverse GQA: kvNumHeads exceeds qNumHeads, so the output carries one head per KV head rather than per query head and several KV heads share a query head (KV head h reads query head floor(h * qNumHeads / kvNumHeads)). Linear rule continuing from a carried state, so the state layout is exercised on the KV-head axis while the query axis is narrower." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.29 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.37 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.11 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 4, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.31, "cosStep": 0.07 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 16], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "inverse_gqa_gated_delta_state_q2_kv4", | |
| "provenance": { | |
| "notes": "Inverse GQA: kvNumHeads exceeds qNumHeads, so the output carries one head per KV head and several KV heads share a query head (KV head h reads query head floor(h * qNumHeads / kvNumHeads)), under the gated-delta update rule." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "gated_delta", "scale": 0.6 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.21, "cosStep": 0.13 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.09, "cosStep": 0.33 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 3, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.27 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 4, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.29, "cosStep": 0.05 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 3, 4], "data": { "kind": "linspace", "start": -0.9, "end": -0.1 } }, | |
| "betaT": { "dtype": "float32", "shape": [1, 3, 4], "data": { "kind": "linspace", "start": 0.2, "end": 0.8 } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 3, 16], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 4, 4], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "inverse_gqa_gated_delta_state_q4_kv8_dk8", | |
| "provenance": { | |
| "notes": "Inverse GQA: kvNumHeads exceeds qNumHeads, so the output carries one head per KV head rather than per query head and several KV heads share a query head (KV head h reads query head floor(h * qNumHeads / kvNumHeads)). A head dimension divisible by four and eight KV heads over four query heads, so the vectorized kernel runs the inverse mapping too." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 8, "update_rule": "gated_delta", "scale": 0.4 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.17 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.29 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.31, "cosStep": 0.19 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 8, 8, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.43 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 8], | |
| "data": { "kind": "linspace", "start": -1.1, "end": -0.05 } | |
| }, | |
| "betaT": { "dtype": "float32", "shape": [1, 4, 8], "data": { "kind": "linspace", "start": 0.15, "end": 0.85 } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 4, 64], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 8, 8, 8], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "inverse_gqa_gated_delta_state_dk32_tiled", | |
| "provenance": { "notes": "Inverse GQA with head dimension 32 checks the recurrent output across grouped heads." }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "gated_delta", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.37 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.29, "cosStep": 0.11 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.23 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 32, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.31 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "linspace", "start": -0.8, "end": -0.15 } | |
| }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 4], "data": { "kind": "linspace", "start": 0.25, "end": 0.75 } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 32], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 32, 8], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_zero_state_without_past", | |
| "provenance": { | |
| "notes": "The public schema defaults an omitted past_state to zeros for every update rule; this covers the gated path without a recurrent-state input." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23, "scale": 0.3 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 3], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41, "scale": 0.5 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [-0.2, -0.1] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 3], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 3], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_zero_state_without_past", | |
| "provenance": { | |
| "notes": "Covers the default gated-delta recurrence with an omitted past_state, which is initialized to zeros by the public contract." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated_delta", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23, "scale": 0.3 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 3], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41, "scale": 0.5 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [-0.2, -0.1] } }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.7, 0.4] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 3], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 3], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "delta_with_initial_state", | |
| "provenance": { | |
| "notes": "A schema-valid delta recurrence consumes the optional `past_state`, which has consistent meaning across all four update rules." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "delta", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23, "scale": 0.3 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 3], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41, "scale": 0.5 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4, 3], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.19, "scale": 0.1 } | |
| }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.7, 0.4] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 3], "tolerance": 0.0001 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 3], "tolerance": 0.0001 } | |
| } | |
| }, | |
| { | |
| "name": "linear_f32_with_f16_state", | |
| "provenance": { | |
| "notes": "Connects the independently typed T and S schema variables: float32 activations consume and return a float16 recurrent state." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.3 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23, "scale": 0.3 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41, "scale": 0.3 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [1, 1, 4, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.19, "scale": 0.1 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 4], "tolerance": 0.0002 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 1, 4, 4], "tolerance": 0.002, "relTolerance": 0.002 } | |
| } | |
| }, | |
| { | |
| "name": "linear_f16_with_f32_state", | |
| "provenance": { | |
| "notes": "Connects the independently typed T and S schema variables in the opposite direction: float16 activations consume and return a float32 recurrent state." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.5 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.3 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23, "scale": 0.3 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41, "scale": 0.3 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 1, 4, 4], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.19, "scale": 0.1 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 2, 4], "tolerance": 0.002, "relTolerance": 0.002 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 4, 4], "tolerance": 0.0002 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_zero_scalar_dk17_no_past", | |
| "provenance": { | |
| "notes": "An omitted past state and key head size 17 check zero-state recurrence with a partial four-lane tail." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated_delta", "scale": 0.25 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 17], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.3 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 17], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23, "scale": 0.3 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 5], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41, "scale": 0.3 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [-0.2, -0.1] } }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.7, 0.4] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 5], "tolerance": 0.0002 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 17, 5], "tolerance": 0.0002 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_zero_vec4_dk20_no_past", | |
| "provenance": { | |
| "notes": "An omitted past state with key head size 20 checks zero-state recurrence and a partial value-head tile." | |
| }, | |
| "attrs": { "q_num_heads": 1, "kv_num_heads": 1, "update_rule": "gated_delta", "scale": 0.25 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.3 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23, "scale": 0.3 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 6], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41, "scale": 0.3 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [-0.2, -0.1] } }, | |
| "betaT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.7, 0.4] } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 2, 6], "tolerance": 0.0002 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 20, 6], "tolerance": 0.0002 } | |
| } | |
| }, | |
| { | |
| "name": "gated_zero_chunked_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token gated recurrence with compact heads, zero entry state, and elementwise decay checks every output and final state." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "gated", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.12, "cosStep": 0.24000000000000002, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.08, "cosStep": 0.32, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.14, "cosStep": 0.2, "scale": 0.4 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.18000000000000002, "cosStep": 0.42, "scale": 0.1 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 16], "tolerance": 0.0005, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 8, 8], "tolerance": 0.0005, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "gated_state_chunked_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token gated recurrence with compact heads, supplied entry state, and per-head decay checks every output and final state." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.25, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.09000000000000001, "cosStep": 0.33, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.15, "cosStep": 0.21, "scale": 0.4 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 8, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.31, "cosStep": 0.39, "scale": 0.2 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.43, "scale": 0.1 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 32], "tolerance": 0.0005, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 2, 8, 8], "tolerance": 0.0005, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "delta_zero_chunked_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token delta recurrence with compact heads, zero entry state, and shared beta checks every output and final state." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "delta", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.14, "cosStep": 0.26, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.1, "cosStep": 0.33999999999999997, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.16, "cosStep": 0.22, "scale": 0.4 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 1], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.26, "cosStep": 0.31999999999999995, "scale": 0.3 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 16], "tolerance": 0.0005, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 8, 8], "tolerance": 0.0005, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "delta_state_chunked_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token delta recurrence with compact heads, supplied entry state, and per-head beta checks every output and final state." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "delta", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.15, "cosStep": 0.27, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.11000000000000001, "cosStep": 0.35, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.23, "scale": 0.4 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 8, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.32999999999999996, "cosStep": 0.41, "scale": 0.2 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.27, "cosStep": 0.32999999999999996, "scale": 0.3 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 32], "tolerance": 0.0005, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 2, 8, 8], "tolerance": 0.0005, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_zero_chunked_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token gated-delta recurrence with compact heads, zero entry state, elementwise decay, and shared beta checks every output and final state." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "gated_delta", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.16, "cosStep": 0.28, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.12000000000000001, "cosStep": 0.36, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.18, "cosStep": 0.24, "scale": 0.4 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { | |
| "kind": "fillFloat32", | |
| "sinStep": 0.22000000000000003, | |
| "cosStep": 0.45999999999999996, | |
| "scale": 0.1 | |
| } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 1], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.28, "cosStep": 0.33999999999999997, "scale": 0.3 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 16], "tolerance": 0.0005, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 8, 8], "tolerance": 0.0005, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_zero_chunked_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token linear recurrence with compact heads and zero entry state checks every output and final state." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 1, "update_rule": "linear", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { | |
| "kind": "fillFloat32", | |
| "sinStep": 0.16999999999999998, | |
| "cosStep": 0.29000000000000004, | |
| "scale": 0.4 | |
| } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.37, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.25, "scale": 0.4 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 16], "tolerance": 0.0005, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 1, 8, 8], "tolerance": 0.0005, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_state_chunked_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token linear recurrence with compact heads, supplied entry state, and grouped query heads checks every output and final state." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.18, "cosStep": 0.30000000000000004, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.14, "cosStep": 0.38, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.2, "cosStep": 0.26, "scale": 0.4 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 8, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.36, "cosStep": 0.44, "scale": 0.2 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 32], "tolerance": 0.0005, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 2, 8, 8], "tolerance": 0.0005, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_state_chunked_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token gated-delta recurrence with compact heads, supplied entry state, per-head decay, and per-head beta checks every output and final state." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.31, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.15000000000000002, "cosStep": 0.39, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.21000000000000002, "cosStep": 0.27, "scale": 0.4 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 2, 8, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.45, "scale": 0.2 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.25, "cosStep": 0.49, "scale": 0.1 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.31, "cosStep": 0.37, "scale": 0.3 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 32], "tolerance": 0.0005, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 2, 8, 8], "tolerance": 0.0005, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_state_chunked_f16_seq1024", | |
| "provenance": { | |
| "notes": "A 1,024-token chunked prefill uses float16 activations and state. Every pass accumulates in float32 and narrows only loads and stores." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta", "scale": 0.35 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 1024, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.27, "scale": 0.4 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.15, "cosStep": 0.33, "scale": 0.4 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.21, "cosStep": 0.25, "scale": 0.4 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [1, 2, 8, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.31, "cosStep": 0.39, "scale": 0.2 } | |
| }, | |
| "decayT": { | |
| "dtype": "float16", | |
| "shape": [1, 1024, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.43, "scale": 0.1 } | |
| }, | |
| "betaT": { | |
| "dtype": "float16", | |
| "shape": [1, 1024, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.27, "cosStep": 0.35, "scale": 0.3 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 1024, 32], "tolerance": 0.04, "relTolerance": 0.04 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 2, 8, 8], "tolerance": 0.04, "relTolerance": 0.04 } | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_chunked_strong_decay_prefix_underflow", | |
| "provenance": { | |
| "notes": "Per-head decay -8 on every token of a 1024-token prefill: over a 16-token chunk the within-chunk decay prefix reaches exp(-128), below the f32 subnormal floor, so a chunked formulation that divides keys by exp(prefix) produces Inf/NaN while the recurrence itself applies a finite exp(-8) per token. Bounded Q/K/V, beta 0.5, no past state." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta" }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.021, "cosStep": 0.033, "scale": 1.0 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 1.0 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.043, "scale": 1.0 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 1024, 2], "data": { "kind": "constant", "value": -8.0 } }, | |
| "betaT": { "dtype": "float32", "shape": [1, 1024, 2], "data": { "kind": "constant", "value": 0.5 } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 128], "tolerance": 0.0002, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 2, 32, 32], "tolerance": 0.0002, "relTolerance": 0.0005 } | |
| }, | |
| "skipGpu": { | |
| "category": "todo", | |
| "reason": "The chunked prefill decomposition materializes a normalized key as k divided by exp(the within-chunk decay prefix). A sustained decay of -8 drives that prefix to -128 over a 16-token chunk, so the exponential underflows to zero and the division returns Inf/NaN, while every pairwise term the decomposition actually needs carries the bounded ratio exp(p_t - p_s) <= 1. The serial route applies a finite exp(-8) per token and stays finite. Fixing this needs the chunk operands re-anchored to a per-chunk pivot, with the entry-state terms kept in their absolute form." | |
| } | |
| }, | |
| { | |
| "name": "gated_delta_chunked_moderate_decay_control", | |
| "provenance": { | |
| "notes": "Decay -4 keeps each 16-token chunk prefix at -64, within the float32 exponent range, so `k / exp(prefix)` remains finite. It is the finite-prefix control for `gated_delta_chunked_strong_decay_prefix_underflow`." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "gated_delta" }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.021, "cosStep": 0.033, "scale": 1.0 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 1.0 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 1024, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.043, "scale": 1.0 } | |
| }, | |
| "decayT": { "dtype": "float32", "shape": [1, 1024, 2], "data": { "kind": "constant", "value": -4.0 } }, | |
| "betaT": { "dtype": "float32", "shape": [1, 1024, 2], "data": { "kind": "constant", "value": 0.5 } } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 128], "tolerance": 0.0002, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 2, 32, 32], "tolerance": 0.0002, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float32_g0_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "state_window": 3, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 14], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 33, 28] }, | |
| "presentStateT": { "dtype": "float32", "shape": [3, 2, 2, 8, 7] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float32_g0_state", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "state_window": 3, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 14], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [3, 2, 2, 8, 7], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 33, 28] }, | |
| "presentStateT": { "dtype": "float32", "shape": [3, 2, 2, 8, 7] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float32_g1_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "state_window": 0, "scale": 0 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 17, 20] }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 6, 5] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float32_g1_state", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "state_window": 0, "scale": 0 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 6, 5], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 17, 20] }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 6, 5] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float32_g2_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 3, "update_rule": "linear", "state_window": 2, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 0, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 0, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 0, 27], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 0, 27] }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 2, 3, 16, 9] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float32_g2_state", | |
| "provenance": { | |
| "notes": "A one-token update inside a two-slot state window verifies zero-fill of the leading slot and a nonuniform updated state in the final slot, with shared keys, odd value dimensions, and independent activation/state dtypes." | |
| }, | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 3, "update_rule": "linear", "state_window": 2, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 27], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 3, 16, 9], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 1, 27] }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 2, 3, 16, 9] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float16_g0_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "state_window": 3, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 14], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [2, 33, 28], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float16", "shape": [3, 2, 2, 8, 7], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float16_g0_state", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "state_window": 3, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 14], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [3, 2, 2, 8, 7], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [2, 33, 28], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float16", "shape": [3, 2, 2, 8, 7], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float16_g1_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "state_window": 0, "scale": 0 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 17, 20], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 4, 6, 5], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float16_g1_state", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "state_window": 0, "scale": 0 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [1, 4, 6, 5], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 17, 20], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 4, 6, 5], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float16_g2_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 3, "update_rule": "linear", "state_window": 2, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [2, 0, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [2, 0, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [2, 0, 27], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [2, 0, 27], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float16", "shape": [2, 2, 3, 16, 9], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float16_g2_state", | |
| "provenance": { | |
| "notes": "A one-token update inside a two-slot state window verifies zero-fill of the leading slot and a nonuniform updated state in the final slot, with shared keys, odd value dimensions, and independent activation/state dtypes." | |
| }, | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 3, "update_rule": "linear", "state_window": 2, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [2, 1, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [2, 1, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [2, 1, 27], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [2, 2, 3, 16, 9], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [2, 1, 27], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float16", "shape": [2, 2, 3, 16, 9], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float32_g0_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "state_window": 3, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 14], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [2, 33, 28], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [3, 2, 2, 8, 7] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float32_g0_state", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "state_window": 3, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [2, 33, 14], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [3, 2, 2, 8, 7], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [2, 33, 28], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [3, 2, 2, 8, 7] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float32_g1_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "state_window": 0, "scale": 0 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 17, 20], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 6, 5] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float32_g1_state", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "state_window": 0, "scale": 0 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [1, 17, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [1, 4, 6, 5], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [1, 17, 20], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [1, 4, 6, 5] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float32_g2_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 3, "update_rule": "linear", "state_window": 2, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [2, 0, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [2, 0, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [2, 0, 27], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [2, 0, 27], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 2, 3, 16, 9] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float16_float32_g2_state", | |
| "provenance": { | |
| "notes": "A one-token update inside a two-slot state window verifies zero-fill of the leading slot and a nonuniform updated state in the final slot, with shared keys, odd value dimensions, and independent activation/state dtypes." | |
| }, | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 3, "update_rule": "linear", "state_window": 2, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float16", | |
| "shape": [2, 1, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float16", | |
| "shape": [2, 1, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float16", | |
| "shape": [2, 1, 27], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 3, 16, 9], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float16", "shape": [2, 1, 27], "tolerance": 6e-8, "relTolerance": 0.0005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 2, 3, 16, 9] } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float16_g0_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "state_window": 3, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 14], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 33, 28] }, | |
| "presentStateT": { "dtype": "float16", "shape": [3, 2, 2, 8, 7], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float16_g0_state", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 4, "kv_num_heads": 2, "update_rule": "linear", "state_window": 3, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 8], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 33, 14], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [3, 2, 2, 8, 7], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 33, 28] }, | |
| "presentStateT": { "dtype": "float16", "shape": [3, 2, 2, 8, 7], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float16_g1_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "state_window": 0, "scale": 0 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 17, 20] }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 4, 6, 5], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float16_g1_state", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 2, "kv_num_heads": 4, "update_rule": "linear", "state_window": 0, "scale": 0 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 12], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [1, 17, 20], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [1, 4, 6, 5], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [1, 17, 20] }, | |
| "presentStateT": { "dtype": "float16", "shape": [1, 4, 6, 5], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float16_g2_zero", | |
| "provenance": { | |
| "notes": "Small-head linear recurrence with shared keys, standard or inverse query grouping, odd value dimensions, independent state dtype, and retained or empty-sequence state windows." | |
| }, | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 3, "update_rule": "linear", "state_window": 2, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 0, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 0, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 0, 27], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 0, 27] }, | |
| "presentStateT": { "dtype": "float16", "shape": [2, 2, 3, 16, 9], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "linear_geometry_float32_float16_g2_state", | |
| "provenance": { | |
| "notes": "A one-token update inside a two-slot state window verifies zero-fill of the leading slot and a nonuniform updated state in the final slot, with shared keys, odd value dimensions, and independent activation/state dtypes." | |
| }, | |
| "attrs": { "q_num_heads": 3, "kv_num_heads": 3, "update_rule": "linear", "state_window": 2, "scale": 0.375 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 48], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 16], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 1, 27], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.37, "cosStep": 0.31, "scale": 0.05 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float16", | |
| "shape": [2, 2, 3, 16, 9], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.31, "scale": 0.05 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 1, 27] }, | |
| "presentStateT": { "dtype": "float16", "shape": [2, 2, 3, 16, 9], "tolerance": 6e-8, "relTolerance": 0.0005 } | |
| } | |
| }, | |
| { | |
| "name": "ort_gated_delta_state_window3_dk128_dv128_decode", | |
| "attrs": { | |
| "update_rule": "gated_delta", | |
| "q_num_heads": 2, | |
| "kv_num_heads": 2, | |
| "state_window": 3, | |
| "scale": 0.08838834764831843 | |
| }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 4, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.017, "scale": 0.1 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 4, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.013, "scale": 0.1 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 4, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.023, "cosStep": 0.019, "scale": 0.1 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [3, 2, 2, 128, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.007, "scale": 0.1 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [2, 4, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.29, "cosStep": 0.31, "scale": 0.5, "offset": -0.5 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [2, 4, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.23, "scale": 0.4, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 4, 256], "tolerance": 0.001, "relTolerance": 0.005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [3, 2, 2, 128, 128], "tolerance": 0.005, "relTolerance": 0.005 } | |
| } | |
| }, | |
| { | |
| "name": "ort_gated_delta_state_window5_wider_than_sequence_with_past", | |
| "attrs": { | |
| "update_rule": "gated_delta", | |
| "q_num_heads": 2, | |
| "kv_num_heads": 2, | |
| "state_window": 5, | |
| "scale": 0.08838834764831843 | |
| }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.017, "scale": 0.1 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.013, "scale": 0.1 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.023, "cosStep": 0.019, "scale": 0.1 } | |
| }, | |
| "pastStateT": { | |
| "dtype": "float32", | |
| "shape": [5, 2, 2, 128, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.007, "scale": 0.1 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.29, "cosStep": 0.31, "scale": 0.5, "offset": -0.5 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [2, 2, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.23, "scale": 0.4, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 2, 256], "tolerance": 0.001, "relTolerance": 0.005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [5, 2, 2, 128, 128], "tolerance": 0.005, "relTolerance": 0.005 } | |
| } | |
| }, | |
| { | |
| "name": "ort_gated_delta_standard_gqa_n4_q8_kv2", | |
| "attrs": { "update_rule": "gated_delta", "q_num_heads": 8, "kv_num_heads": 2, "scale": 0.17677669529663687 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 256], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.017, "scale": 0.1 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.013, "scale": 0.1 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 128], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.023, "cosStep": 0.019, "scale": 0.1 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.29, "cosStep": 0.31, "scale": 0.5, "offset": -0.5 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 2], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.23, "scale": 0.4, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 10, 512], "tolerance": 0.00056, "relTolerance": 0.005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 2, 32, 64], "tolerance": 0.000084, "relTolerance": 0.005 } | |
| } | |
| }, | |
| { | |
| "name": "ort_gated_delta_standard_gqa_n16_q16_kv1", | |
| "attrs": { "update_rule": "gated_delta", "q_num_heads": 16, "kv_num_heads": 1, "scale": 0.17677669529663687 }, | |
| "inputs": { | |
| "queryT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 512], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.017, "scale": 0.1 } | |
| }, | |
| "keyT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 32], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.013, "scale": 0.1 } | |
| }, | |
| "valueT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 64], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.023, "cosStep": 0.019, "scale": 0.1 } | |
| }, | |
| "decayT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 1], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.29, "cosStep": 0.31, "scale": 0.5, "offset": -0.5 } | |
| }, | |
| "betaT": { | |
| "dtype": "float32", | |
| "shape": [2, 10, 1], | |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.23, "scale": 0.4, "offset": 0.5 } | |
| } | |
| }, | |
| "outputs": { | |
| "outputT": { "dtype": "float32", "shape": [2, 10, 1024], "tolerance": 0.00075, "relTolerance": 0.005 }, | |
| "presentStateT": { "dtype": "float32", "shape": [2, 1, 32, 64], "tolerance": 0.00074, "relTolerance": 0.005 } | |
| } | |
| } | |
| ] | |
| } | |