type RTArr = [[stride(4)]] array<f32>;

type RTArr_1 = [[stride(4)]] array<f32>;

[[block]]
struct ssbOut {
  result : RTArr_1;
};

[[block]]
struct ssbA {
  A : RTArr_1;
};

[[block]]
struct Uniforms {
  NAN : f32;
  aShape : i32;
  outShape : i32;
  outShapeStrides : i32;
  size : i32;
};

[[group(0), binding(0)]] var<storage, read_write> x_16 : ssbOut;

[[group(0), binding(1)]] var<storage, read> x_20 : ssbA;

var<private> gl_GlobalInvocationID : vec3<u32>;

[[group(0), binding(2)]] var<uniform> x_24 : Uniforms;

fn getAAtOutCoords_() -> f32 {
  let x_42 : u32 = gl_GlobalInvocationID.x;
  let x_44 : f32 = x_20.A[x_42];
  return x_44;
}

fn unaryOperation_f1_(a : ptr<function, f32>) -> f32 {
  let x_47 : f32 = *(a);
  if ((x_47 < 0.0)) {
    return 0x1p+128;
  }
  let x_55 : f32 = *(a);
  return log(x_55);
}

fn setOutput_i1_f1_(flatIndex : ptr<function, i32>, value : ptr<function, f32>) {
  let x_27 : i32 = *(flatIndex);
  let x_28 : f32 = *(value);
  x_16.result[x_27] = x_28;
  return;
}

fn main_1() {
  var index : i32;
  var a_1 : f32;
  var param : f32;
  var param_1 : i32;
  var param_2 : f32;
  let x_61 : u32 = gl_GlobalInvocationID.x;
  index = bitcast<i32>(x_61);
  let x_63 : i32 = index;
  let x_70 : i32 = x_24.size;
  if ((x_63 < x_70)) {
    let x_75 : f32 = getAAtOutCoords_();
    a_1 = x_75;
    let x_77 : f32 = a_1;
    param = x_77;
    let x_78 : f32 = unaryOperation_f1_(&(param));
    let x_80 : i32 = index;
    param_1 = x_80;
    param_2 = x_78;
    setOutput_i1_f1_(&(param_1), &(param_2));
  }
  return;
}

[[stage(compute), workgroup_size(128, 1, 1)]]
fn main([[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
  gl_GlobalInvocationID = gl_GlobalInvocationID_param;
  main_1();
}
