package Ġio . kin ference . core . operators . tensor Ċ Ċ import Ġio . kin ference . attribute . Attribute Ċ import Ġio . kin ference . core . data . tensor . KIT ensor Ċ import Ġio . kin ference . core . data . tensor . as Tensor Ċ import Ġio . kin ference . data . ON NX Data Ċ import Ġio . kin ference . graph . Contexts Ċ import Ġio . kin ference . operator .* Ċ import Ġio . kin ference . ndarray . arrays .* Ċ import Ġio . kin ference . ndarray . extensions . compute BlockSize Ċ import Ġio . kin ference . protobuf . message . Tensor Proto Ċ import Ġkotlin . time . Experimental Time Ċ Ċ sealed Ġclass ĠS cat ter ND ( info : ĠOperator Info , Ġattributes : ĠMap < String , ĠAttribute < Any >>, Ġinputs : ĠList < String >, Ġoutputs : ĠList < String >) Ġ: ĠOperator < KIT ensor , ĠK IT ensor >( info , Ġattributes , Ġinputs , Ġoutputs ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ VERSION Ġ= ĠVersion Info ( since Version Ġ= Ġ 1 1 , Ġuntil Version Ġ= Ġ 1 6 ) ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( version : ĠInt ?, Ġattributes : ĠMap < String , ĠAttribute < Any >>, Ġinputs : ĠList < String >, Ġoutputs : ĠList < String >) Ġ= Ġwhen Ġ( version Ġ?: ĠDEFAULT _ VERSION . since Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin ĠS cat ter ND Ver 1 1 . VERSION . as Range () Ġ-> ĠS cat ter ND Ver 1 1 ( attributes , Ġinputs , Ġoutputs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġversion Ġof ĠConstant Ġoperator : Ġ$ version ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Time :: class ) Ċ class ĠS cat ter ND Ver 1 1 ( attributes : ĠMap < String , ĠAttribute < Any >>, Ġinputs : ĠList < String >, Ġoutputs : ĠList < String >) Ġ: ĠS cat ter ND ( INFO , Ġattributes , Ġinputs , Ġoutputs ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINPUT S _ INFO Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Info ( 0 , ĠALL _ DATA _ TYPES , Ġ" data ", Ġoptional Ġ= Ġfalse , Ġdifferent iable Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Info ( 1 , Ġset Of ( Tensor Proto . DataType . INT 6 4 ), Ġ" indices ", Ġoptional Ġ= Ġfalse , Ġdifferent iable Ġ= Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Info ( 0 , ĠALL _ DATA _ TYPES , Ġ" updates ", Ġoptional Ġ= Ġfalse , Ġdifferent iable Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠOUTPUT S _ INFO Ġ= ĠlistOf ( IO Info ( 0 , ĠALL _ DATA _ TYPES , Ġ" output ", Ġoptional Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠVERSION Ġ= ĠVersion Info ( since Version Ġ= Ġ 1 1 , Ġuntil Version Ġ= Ġ 1 6 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINFO Ġ= ĠOperator Info (" Scatter ND ", Ġempty List (), ĠINPUT S _ INFO , ĠOUTPUT S _ INFO , ĠVERSION , ĠOperator Info . DEFAULT _ DOMAIN ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Actual Indices ( input : ĠND Array , Ġindices : ĠLong ND Array , Ġk Dim : ĠInt ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Stride s Ġ= Ġinput . strides . strides ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Blocks Ġ= Ġindices . linear Size Ġ/ Ġk Dim ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindices Pointer Ġ= Ġindices . array . pointer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInt Array ( num Blocks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġacc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġk Dim ) Ġacc Ġ+= Ġindices Pointer . get And Increment (). toInt () Ġ* Ġinput Stride s [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< D Ġ: ĠON NX Data < *, Ġ* >> Ġapply ( contexts : ĠContext s < D >, Ġinputs : ĠList < KIT ensor ?> ): ĠList < KIT ensor ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġinputs [ 0 ] !!. data . to Mutable () ĊĠĠĠĠĠĠĠ Ġval Ġindices Ġ= Ġinputs [ 1 ] !!. data Ġas ĠLong ND Array ĊĠĠĠĠĠĠĠ Ġval Ġupdates Ġ= Ġinputs [ 2 ] !!. data ĊĊĠĠĠĠĠĠĠ Ġval Ġk Dim Ġ= Ġindices . shape . last () ĊĠĠĠĠĠĠĠ Ġval ĠblockSize Ġ= Ġinput . compute BlockSize ( from Dim Ġ= Ġk Dim ) ĊĠĠĠĠĠĠĠ Ġval Ġsrc Update Offsets Ġ= Ġget Actual Indices ( input , Ġindices , Ġk Dim ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġoffset ) Ġin Ġsrc Update Offsets . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Off Ġ= Ġi Ġ* ĠblockSize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . copyFrom ( offset , Ġupdates , Ġsrc Off , Ġsrc Off Ġ+ ĠblockSize ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( input . as Tensor (" output ")) ĊĠĠĠ Ġ} Ċ } Ċ