#include <metal_stdlib>

using namespace metal;
struct ssbOut {
  /* 0x0000 */ float result[1];
};
struct ssbA {
  /* 0x0000 */ float A[1];
};
struct Uniforms {
  /* 0x0000 */ float tint_symbol;
  /* 0x0004 */ int aShape;
  /* 0x0008 */ int outShape;
  /* 0x000c */ int outShapeStrides;
  /* 0x0010 */ int size;
};

float getAAtOutCoords_(const device ssbA& x_20, thread uint3* const tint_symbol_3) {
  uint const x_42 = (*(tint_symbol_3)).x;
  float const x_44 = x_20.A[x_42];
  return x_44;
}

float unaryOperation_f1_(thread float* const a) {
  float const x_47 = *(a);
  if ((x_47 < 0.0f)) {
    return INFINITY;
  }
  float const x_55 = *(a);
  return log(x_55);
}

void setOutput_i1_f1_(device ssbOut& x_16, thread int* const flatIndex, thread float* const value) {
  int const x_27 = *(flatIndex);
  float const x_28 = *(value);
  x_16.result[x_27] = x_28;
  return;
}

void main_1(constant Uniforms& x_24, const device ssbA& x_20, device ssbOut& x_16, thread uint3* const tint_symbol_4) {
  int index = 0;
  float a_1 = 0.0f;
  float param = 0.0f;
  int param_1 = 0;
  float param_2 = 0.0f;
  uint const x_61 = (*(tint_symbol_4)).x;
  index = as_type<int>(x_61);
  int const x_63 = index;
  int const x_70 = x_24.size;
  if ((x_63 < x_70)) {
    float const x_75 = getAAtOutCoords_(x_20, tint_symbol_4);
    a_1 = x_75;
    float const x_77 = a_1;
    param = x_77;
    float const x_78 = unaryOperation_f1_(&(param));
    int const x_80 = index;
    param_1 = x_80;
    param_2 = x_78;
    setOutput_i1_f1_(x_16, &(param_1), &(param_2));
  }
  return;
}

kernel void tint_symbol_1(uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]], constant Uniforms& x_24 [[buffer(2)]], const device ssbA& x_20 [[buffer(1)]], device ssbOut& x_16 [[buffer(0)]]) {
  thread uint3 tint_symbol_5 = 0u;
  tint_symbol_5 = gl_GlobalInvocationID_param;
  main_1(x_24, x_20, x_16, &(tint_symbol_5));
  return;
}

