package Ġio . kin ference . compiler . generation . operators . tensor Ċ Ċ import Ġio . kin ference . compiler . generation . info . Tensor Info Ċ import Ġio . kin ference . compiler . generation . operators . Operator Generation Info Ċ import Ġio . kin ference . compiler . generation . operators . common . Type And Shape Aware Operator Generator Ċ import Ġio . kin ference . compiler . generation . utils .* Ċ import Ġio . kin ference . ndarray . Stride s Ċ import Ġio . kin ference . operators . tensor . Gather Ċ import Ġkotlin . time . Experimental Time Ċ Ċ /** Ċ Ġ* ĠG ather Ġgenerator . Ċ Ġ* Ċ Ġ* Ġ[ ON NX Ġdocumentation ]( https :// github . com / onnx / onnx / blob / master / docs / Operators . md # Gather ) Ċ Ġ* Ċ Ġ* ĠK Inference Ġclass : Ġ[ Gather ] Ċ Ġ*/ Ċ @ Opt In ( Experimental Time :: class ) Ċ class ĠG ather Generator ( ĊĠĠĠ Ġprivate Ġval Ġoperator : ĠG ather , ĊĠĠĠ Ġinfo : ĠOperator Generation Info Ċ ) Ġ: ĠType And Shape Aware Operator Generator ( operator , Ġinfo ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġaxis Ġ= Ġoperator . getAttribute < Number >(" axis "). toInt () ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Impl In ferred () Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( data , Ġindices ) Ġ= Ġinput Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinputs Ġ= ĠlistOf (" data " Ġto Ġdata , Ġ" indices " Ġto Ġindices ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Axis Ġ= Ġdata . shape . actual Axis ( axis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( result Shape , Ġresult Type ) Ġ= Ġresult Info (). values . first () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Stride s Ġ= Ġinputs . map Ġ{ Ġ( name , Ġinput ) Ġ-> Ġname Ġto ĠSt rides ( shape Ġ= Ġinput . shape . drop Last ( 1 ). to IntArray ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( data Stride s , Ġindices Stride s ) Ġ= Ġinput Stride s . map Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Stride s Ġ= ĠSt rides ( shape Ġ= Ġresult Shape . drop Last ( 1 ). to IntArray ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinputs . forEach Indexed Ġ{ Ġindex , Ġ( name , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val Ġ$ name Ġ= Ġinput $ index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val Ġ${ name } Blocks Ġ= Ġ$ name . array . blocks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val Ġresult Stride s Ġ= Ġ% T ( shape Ġ= Ġint ArrayOf (${ result Shape . join ToString ()} )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val Ġresult Array Ġ= Ġ% T ( strides Ġ= Ġresult Stride s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val Ġresult Blocks Ġ= Ġresult Array . blocks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSt rides :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Type . t iled Array TypeName () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloop Indices Ġ= ĠIndex Storage () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Nested Lo ops ({ Ġ" i $ it " Ġ}, Ġindices Stride s . shape . map Ġ{ Ġ 0 Ġto Ġit Ġ}, Ġloop Indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Loop (" i Block ", Ġ 0 Ġto Ġindices . shape . blocks In Row (), Ġloop Indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġindices Block Ġ= Ġindices Blocks [ ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindices Stride s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Indices Ġ= Ġ{ Ġ" i $ it " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Offset Ġ= Ġ" i Block ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Storage Ġ= Ġloop Indices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Loop (" i Idx ", Ġ 0 Ġto Ġindices . shape . block Size (), Ġloop Indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Index Ġ= Ġloop Indices . inline Literal (" i Block ") Ġ* Ġindices . shape . block Size (). to Literal () Ġ+ Ġloop Indices . inline Literal (" i Idx ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop Indices . put (" i ${ indices . shape . last Index }", Ġ 0 Ġto Ġlast Index . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line (" val Ġi ${ indices . shape . last Index } Ġ= Ġ$ last Index ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line (" val Ġk Ġ= Ġindices Block [ ${ loop Indices . inline (" i Idx ")} ]. toInt (). let Ġ{ Ġif Ġ( it Ġ< Ġ 0 ) Ġit Ġ+ Ġ${ data . shape [ actual Axis ]} Ġelse Ġit Ġ} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual Axis Ġ== Ġdata . shape . last Index Ġ&& Ġdata . shape . blocks In Row () Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val Ġk Block Ġ= Ġk Ġ/ Ġ${ data . shape . block Size ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| val Ġk Idx Ġ= Ġk Ġ- Ġk Block Ġ* Ġ${ data . shape . block Size ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop Indices . put (" k ", Ġ 0 Ġto Ġdata . shape . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop Indices . put (" k Block ", Ġ 0 Ġto Ġdata . shape . blocks In Row ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop Indices . put (" k Idx ", Ġ 0 Ġto Ġdata . shape . block Size ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Nested Lo ops ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" j ${ if Ġ( it Ġ< Ġactual Axis ) Ġit Ġelse Ġit Ġ+ Ġ 1 }" Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Stride s . shape . filter Indexed Ġ{ Ġindex , Ġ_ Ġ-> Ġindex Ġ!= Ġactual Axis Ġ}. map Ġ{ Ġ 0 Ġto Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop Indices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual Axis Ġ== Ġdata . shape . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġdata Block Ġ= Ġdata Blocks [ ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Stride s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Indices Ġ= Ġ{ Ġ" j $ it " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Offset Ġ= Ġ" k Block ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Storage Ġ= Ġloop Indices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġresult Block Ġ= Ġresult Blocks [ ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Stride s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Indices Ġ= Ġ{ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġactual Axis Ġ-> Ġ" j $ it " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" i ${ it Ġ- Ġactual Axis }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Offset Ġ= Ġ" i Block ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Storage Ġ= Ġloop Indices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd (" result Block [ i Idx ] Ġ= Ġdata Block [ ${ if Ġ( data . shape . blocks In Row () Ġ== Ġ 1 ) Ġ" k " Ġelse Ġ" k Idx "} ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Loop (" j Block ", Ġ 0 Ġto Ġdata . shape . blocks In Row (), Ġloop Indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġdata Block Ġ= Ġdata Blocks [ ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Stride s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Indices Ġ= Ġ{ Ġif Ġ( it Ġ!= Ġactual Axis ) Ġ" j $ it " Ġelse Ġ" k " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Offset Ġ= Ġ" j Block ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Storage Ġ= Ġloop Indices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġresult Block Ġ= Ġresult Blocks [ ${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Stride s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Indices Ġ= Ġ{ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġactual Axis Ġ-> Ġ" j $ it " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ- Ġactual Axis Ġ< Ġindices . shape . size Ġ-> Ġ" i ${ it Ġ- Ġactual Axis }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" j ${ it Ġ- Ġindices . shape . size Ġ+ Ġ 1 }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Offset Ġ= Ġ" j Block ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Storage Ġ= Ġloop Indices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Loop (" j Idx ", Ġ 0 Ġto Ġdata . shape . block Size (), Ġloop Indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line (" result Block [ ${ loop Indices . inline (" j Idx ") }] Ġ= Ġdata Block [ ${ loop Indices . inline (" j Idx ") }] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġoperator . outputs [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% L Ġ= Ġ% T ( array Ġ= Ġresult Array , Ġstrides Ġ= Ġresult Stride s ) Ġ/* Ġ% L Ġ*/ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Mapping ( output ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Type . nd Array TypeName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtensor Info [ output ] Ġ= ĠTensor Info ( shape Ġ= Ġresult Shape , ĠdataType Ġ= Ġresult Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresult Info (): ĠMap < String , ĠTensor Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( data , Ġindices ) Ġ= Ġinput Info ĊĠĠĠĠĠĠĠ Ġval Ġactual Axis Ġ= Ġif Ġ( axis Ġ< Ġ 0 ) Ġdata . shape . size Ġ+ Ġaxis Ġelse Ġaxis ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Shape Ġ= Ġdata . shape . slice ( 0 Ġuntil Ġactual Axis ). to IntArray () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindices . shape Ġ+ Ġdata . shape . slice ( actual Axis Ġ+ Ġ 1 Ġuntil Ġdata . shape . size ). to IntArray () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Type Ġ= Ġinput Info . first (). dataType ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( operator . outputs . first () Ġto ĠTensor Info ( shape Ġ= Ġresult Shape , ĠdataType Ġ= Ġresult Type )) ĊĠĠĠ Ġ} Ċ } Ċ