license import { GPGPUProgram , useShapeUniforms } from './gpgpu_math' ; export class UnaryOpProgram implements GPGPUProgram { variableNames = [ 'A' ] ; userCode : string ; outputShape : number [ ] ; enableShapeUniforms : boolean ; constructor ( aShape , opSnippet ) { this . outputShape = aShape ; this . enableShapeUniforms = useShapeUniforms ( this . outputShape . length ) ; this . userCode = `
      float unaryOperation(float x) {
        ${ opSnippet }
      }

      void main() {
        float x = getAAtOutCoords();
        float y = unaryOperation(x);

        setOutput(y);
      }
    ` ; } } export const CHECK_NAN_SNIPPET = `if (isnan(x)) return x;` ; export const LINEAR = `return x;` ; export const ABS = `return abs(x);` ; export function STEP ( alpha = 0.0 ) { return CHECK_NAN_SNIPPET + `
    return x > 0.0 ? 1.0 : float(${ alpha });
  ` ; } export const ELU = `return (x >= 0.0) ? x : (exp(x) - 1.0);` ; export const RELU = CHECK_NAN_SNIPPET + `
  return (x < 0.0) ? 0.0 : x;
` ; export const RELU6 = CHECK_NAN_SNIPPET + `
  return (x < 0.0) ? 0.0 : min(6.0, x);
` ; export const CLONE = 'return x;' ; export const SIGMOID = `return 1.0 / (1.0 + exp(-1.0 * x));` ;