package Ġio . kin ference . operators . quant ization Ċ Ċ import Ġio . kin ference . attributes . Attribute Ċ import Ġio . kin ference . data . tensors . Tensor Ċ import Ġio . kin ference . data . tensors . as Tensor Ċ import Ġio . kin ference . graph . Context Ċ import Ġio . kin ference . graph . Profiling Context Ċ import Ġio . kin ference . ndarray . arrays . Float ND Array Ċ import Ġio . kin ference . ndarray . arrays . Mutable U Byte ND Array Ċ import Ġio . kin ference . ndarray . extensions . allocate ND Array Ċ import Ġio . kin ference . ndarray . extensions . create Scalar ND Array Ċ import Ġio . kin ference . operators .* Ċ import Ġio . kin ference . primitives . types . DataType Ċ import Ġio . kin ference . protobuf . message . Tensor Proto Ċ import Ġkotlin . math .* Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ class ĠDynamic Quant ize Linear ( attributes : ĠMap < String , ĠAttribute < Any >>, Ġinputs : ĠList < String >, Ġoutputs : ĠList < String >) Ġ: ĠOperator < Tensor , ĠTensor >( INFO , Ġattributes , Ġinputs , Ġoutputs ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTRIBUT ES _ INFO Ġ= Ġempty List < Attribute Info >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINPUT S _ INFO Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Info ( 0 , Ġset Of ( Tensor Proto . DataType . FLOAT ), Ġ" x ", Ġoptional Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠOUTPUT S _ INFO Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Info ( 0 , Ġset Of ( Tensor Proto . DataType . UINT 8 ), Ġ" y ", Ġoptional Ġ= Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Info ( 1 , Ġset Of ( Tensor Proto . DataType . FLOAT ), Ġ" y _ scale ", Ġoptional Ġ= Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Info ( 2 , Ġset Of ( Tensor Proto . DataType . UINT 8 ), Ġ" y _ zero _ point ", Ġoptional Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINFO Ġ= ĠOperator Info (" Dynamic Quant ize Linear ", ĠATTRIBUT ES _ INFO , ĠINPUT S _ INFO , ĠOUTPUT S _ INFO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclip ( x : ĠFloat , Ġmin : ĠFloat , Ġmax : ĠFloat ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġx Ġ< Ġmin Ġ-> Ġmin ĊĠĠĠĠĠĠĠ Ġx Ġ> Ġmax Ġ-> Ġmax ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġx ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠFloat . to U Byte () Ġ= Ġthis . to UInt (). to U Byte () ĊĊĊĠĠĠ Ġoverride Ġfun Ġapply ( context : ĠContext , Ġinputs : ĠList < Tensor ? >, Ġprofiling Context : ĠPro filing Context ?): ĠList < Tensor ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġinputs . first () !!. data Ġas ĠFloat ND Array ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Min Ġ= Ġmin ( 0 f , Ġinput . min ()) ĊĠĠĠĠĠĠĠ Ġval Ġinput Max Ġ= Ġmax ( 0 f , Ġinput . max ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Scale Ġ= Ġ( input Max Ġ- Ġinput Min ) Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠ Ġval Ġoutput Scale Scalar Ġ= Ġcreate Scalar ND Array ( DataType . FLOAT , Ġoutput Scale ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Zero Point Ġ= Ġclip ( round ((- input Min ) Ġ/ Ġoutput Scale ), Ġ 0 f , Ġ 2 5 5 f ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Zero Point Scalar Ġ= Ġcreate Scalar ND Array ( DataType . UBY TE , Ġoutput Zero Point . to U Byte ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġallocate ND Array ( DataType . UBY TE , Ġinput . strides ) Ġas ĠMutable U Byte ND Array ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġinput . linear Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . array [ i ] Ġ= Ġclip (( round ( input . array [ i ] Ġ/ Ġoutput Scale ) Ġ+ Ġoutput Zero Point ), Ġ 0 f , Ġ 2 5 5 f ). to U Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . as Tensor (" y "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Scale Scalar . as Tensor (" y _ scale "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Zero Point Scalar . as Tensor (" y _ zero _ point ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ