#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_(thread uint3* const tint_symbol_2, const device ssbA* const tint_symbol_3) {
  uint const x_42 = (*(tint_symbol_2))[0];
  float const x_44 = (*(tint_symbol_3)).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_(thread int* const flatIndex, thread float* const value, device ssbOut* const tint_symbol_4) {
  int const x_27 = *(flatIndex);
  float const x_28 = *(value);
  (*(tint_symbol_4)).result[x_27] = x_28;
  return;
}

void main_1(thread uint3* const tint_symbol_5, const constant Uniforms* const tint_symbol_6, const device ssbA* const tint_symbol_7, device ssbOut* const tint_symbol_8) {
  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_5))[0];
  index = as_type<int>(x_61);
  int const x_63 = index;
  int const x_70 = (*(tint_symbol_6)).size;
  if ((x_63 < x_70)) {
    float const x_75 = getAAtOutCoords_(tint_symbol_5, tint_symbol_7);
    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_(&(param_1), &(param_2), tint_symbol_8);
  }
  return;
}

void tint_symbol_1_inner(uint3 gl_GlobalInvocationID_param, thread uint3* const tint_symbol_9, const constant Uniforms* const tint_symbol_10, const device ssbA* const tint_symbol_11, device ssbOut* const tint_symbol_12) {
  *(tint_symbol_9) = gl_GlobalInvocationID_param;
  main_1(tint_symbol_9, tint_symbol_10, tint_symbol_11, tint_symbol_12);
}

kernel void tint_symbol_1(const constant Uniforms* tint_symbol_14 [[buffer(0)]], const device ssbA* tint_symbol_15 [[buffer(2)]], device ssbOut* tint_symbol_16 [[buffer(1)]], uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]]) {
  thread uint3 tint_symbol_13 = 0u;
  tint_symbol_1_inner(gl_GlobalInvocationID_param, &(tint_symbol_13), tint_symbol_14, tint_symbol_15, tint_symbol_16);
  return;
}

