license import { KernelConfig , KernelFunc , LRN , LRNAttrs , LRNInputs , TensorInfo , TypedArray , util } from '@tensorflow/tfjs-core' ; import { MathBackendCPU } from '../backend_cpu' ; import { assertNotComplex } from '../cpu_util' ; export function lRN ( args ) { const { inputs , backend , attrs } = args ; const { x } = inputs ; const { depthRadius , bias , alpha , beta } = attrs ; assertNotComplex ( x , 'LRN' ) ; const channels = x . shape [ 3 ] ; const maxD = channels - 1 ; const xValues = backend . data . get ( x . dataId ) . values as TypedArray ; const size = util . sizeFromShape ( x . shape ) ; const result = new Float32Array ( size ) ; function sumAcrossChannels ( offset ) { const currentChannel = offset % channels ; let beginSumOffset = offset - currentChannel + Math . max ( 0 , currentChannel - depthRadius ) ; const endSumOffset = offset - currentChannel + Math . min ( currentChannel + depthRadius , maxD ) ; let sum = 0.0 ; for ( ; beginSumOffset <= endSumOffset ; beginSumOffset ++ ) { const z = xValues [ beginSumOffset ] ; sum += z * z ; } return sum ; } for ( let offset = 0 ; offset < size ; offset ++ ) { const sum = sumAcrossChannels ( offset ) ; const val = xValues [ offset ] * Math . pow ( bias + alpha * sum , - beta ) ; result [ offset ] = val ; } return backend . makeTensorInfo ( x . shape , x . dtype , result ) ; } export const LRNConfig = { kernelName : LRN , backendName : 'cpu' , kernelFunc : lRN as { } as KernelFunc } ;