license import { env , KernelConfig , KernelFunc , Neg , NegInputs , TensorInfo , TypedArray } from '@tensorflow/tfjs-core' ; import { MathBackendWebGL } from '../backend_webgl' ; import { negImplCPU } from '../kernel_utils/shared' ; import { CHECK_NAN_SNIPPET , UnaryOpProgram } from '../unaryop_gpu' ; import { UnaryOpPackedProgram } from '../unaryop_packed_gpu' ; const NEG = CHECK_NAN_SNIPPET + `
  return -x;
` ; const NEG_PACKED = `
  vec4 result = -x;
  bvec4 isNaN = isnan(x);

  result.r = isNaN.r ? x.r : result.r;
  result.g = isNaN.g ? x.g : result.g;
  result.b = isNaN.b ? x.b : result.b;
  result.a = isNaN.a ? x.a : result.a;

  return result;
` ; export function neg ( args ) { const { inputs , backend } = args ; const { x } = inputs ; if ( backend . shouldExecuteOnCPU ( [ x ] ) ) { const xData = backend . texData . get ( x . dataId ) ; const [ outValues , newShape ] = negImplCPU ( xData . values as TypedArray , x . shape , x . dtype ) ; return backend . makeTensorInfo ( newShape , x . dtype , outValues ) ; } let program ; if ( env ( ) . getBool ( 'WEBGL_PACK_UNARY_OPERATIONS' ) ) { program = new UnaryOpPackedProgram ( x . shape , NEG_PACKED ) ; } else { program = new UnaryOpProgram ( x . shape , NEG ) ; } return backend . runWebGLProgram ( program , [ x ] , x . dtype ) ; } export const negConfig = { kernelName : Neg , backendName : 'webgl' , kernelFunc : neg as { } as KernelFunc } ;