package Ġcom . mir f . features . deep learning . tensorflow Ċ Ċ import Ġcom . mir f . core . log . Mir f Log Factory Ċ import Ġorg . apache . commons . compress . utils . IO Utils Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . tensorflow .* Ċ import Ġorg . tensorflow . types . UInt 8 Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . nio .* ĊĊ Ċ // ĠTODO ( mus at ian ): Ġuncomment Ġstand art Ġlogs Ġand Ġreplace Ġthem Ġwith Ġcustom ĠM IR F Ġlogs Ċ /** Ċ Ġ* ĠWrapper Ġover Ġthe ĠTensorFlow ĠAPI Ġ([ Graph ], Ġ[ Session ]) Ġproviding Ġa Ġsmaller ĠAPI Ġsurface Ċ Ġ* Ġfor Ġinference . Ċ Ġ*/ Ċ class ĠTensor flow Inference Interface Ġ{ ĊĊĠĠĠ Ġ// ĠImmutable Ġstate . ĊĠĠĠ Ġprivate Ġval Ġmodel Name : ĠString ĊĠĠĠ Ġprivate Ġval Ġg : ĠGraph ĊĠĠĠ Ġprivate Ġval Ġsess : ĠSession ĊĊĠĠĠ Ġ// ĠState Ġreset Ġon Ġevery Ġcall Ġto Ġrun . ĊĠĠĠ Ġprivate Ġvar Ġrunner : ĠSession . Runner ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġfeed Names Ġ= ĠArrayList < String >() ĊĠĠĠ Ġprivate Ġval Ġfeed T ensors Ġ= ĠArrayList < Tensor <* >>() ĊĠĠĠ Ġprivate Ġval Ġfetch Names Ġ= ĠArrayList < String >() ĊĠĠĠ Ġprivate Ġvar Ġfetch T ensors : ĠMutable List < Tensor <* >> Ġ= ĠArrayList () ĊĊĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠMir f Log Factory . current Logger ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠLoad Ġa ĠTensorFlow Ġmodel Ġfrom Ġthe ĠInputStream . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĠThe ĠInputStream Ġto Ġuse Ġto Ġload Ġthe Ġmodel Ġfile . ĊĠĠĠĠ Ġ* Ġ@ param Ġmodel ĠThe Ġfilepath Ġto Ġthe ĠGraph Def Ġproto Ġrepresenting Ġthe Ġmodel . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( input : ĠInputStream ?, Ġmodel : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprintln (" MODEL : Ġ$ model ") ĊĊĠĠĠĠĠĠĠ Ġthis . model Name Ġ= Ġmodel ĊĠĠĠĠĠĠĠ Ġthis . g Ġ= ĠGraph () ĊĠĠĠĠĠĠĠ Ġthis . sess Ġ= ĠSession ( g ) ĊĠĠĠĠĠĠĠ Ġthis . runner Ġ= Ġsess . runner () ĊĊĠĠĠĠĠĠĠ Ġvar Ġ` is `: ĠInputStream ? ĊĠĠĠĠĠĠĠ Ġ` is ` Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġif Ġ(` is ` Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` is ` Ġ= Ġjava Class . class Loader . getResource AsStream ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" MODEL : Ġ$ model ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" INPUT ĠST REAM : Ġ" Ġ+ Ġ(` is ` Ġ== Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(` is ` Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġload Ġmodel Ġfrom Ġ'$ model '", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Def Ġ= ĠIO Utils . toByteArray (` is `) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Graph ( graph Def , Ġg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` is `. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Successfully Ġloaded Ġmodel Ġfrom Ġ'$ model '") ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġload Ġmodel Ġfrom Ġ'$ model '", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠLoad Ġa ĠTensorFlow Ġmodel Ġfrom Ġprovided ĠInputStream . ĊĠĠĠĠ Ġ* ĠNote : ĠThe ĠInputStream Ġwill Ġnot Ġbe Ġclosed Ġafter Ġloading Ġmodel , Ġusers Ġneed Ġto ĊĠĠĠĠ Ġ* Ġclose Ġit Ġthemselves . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġis ĠThe ĠInputStream Ġto Ġuse Ġto Ġload Ġthe Ġmodel . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor (` is `: ĠInputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmodel Name Ġis Ġredundant Ġfor Ġmodel Ġloading Ġfrom Ġinput Ġstream , Ġhere Ġis Ġfor ĊĠĠĠĠĠĠĠ Ġ// Ġavoid ing Ġerror Ġin Ġinitialization Ġas Ġmodel Name Ġis Ġmarked Ġfinal . ĊĠĠĠĠĠĠĠ Ġthis . model Name Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġthis . g Ġ= ĠGraph () ĊĠĠĠĠĠĠĠ Ġthis . sess Ġ= ĠSession ( g ) ĊĠĠĠĠĠĠĠ Ġthis . runner Ġ= Ġsess . runner () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġba os Init Size Ġ= Ġif Ġ(` is `. available () Ġ> Ġ 1 6 3 8 4 ) Ġ` is `. available () Ġelse Ġ 1 6 3 8 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġba os Ġ= ĠByteArrayOutputStream ( ba os Init Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnum Bytes Read : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠByteArray ( 1 6 3 8 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Bytes Read Ġ= Ġ` is `. read ( buf , Ġ 0 , Ġbuf . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Bytes Read Ġ< Ġ 0 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġba os . write ( buf , Ġ 0 , Ġnum Bytes Read ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Def Ġ= Ġba os . toByteArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Graph ( graph Def , Ġg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Successfully Ġloaded Ġmodel Ġfrom Ġthe Ġinput Ġstream ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġload Ġmodel Ġfrom Ġthe Ġinput Ġstream ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠConstruct Ġa ĠTensor flow Inference Interface Ġwith Ġprovided ĠGraph ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġg ĠThe ĠGraph Ġto Ġuse Ġto Ġconstruct Ġthis Ġinterface . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( g : ĠGraph ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġmodel Name Ġis Ġredundant Ġhere , Ġhere Ġis Ġfor ĊĠĠĠĠĠĠĠ Ġ// Ġavoid ing Ġerror Ġin Ġinitialization Ġas Ġmodel Name Ġis Ġmarked Ġfinal . ĊĠĠĠĠĠĠĠ Ġthis . model Name Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġthis . g Ġ= Ġg ĊĠĠĠĠĠĠĠ Ġthis . sess Ġ= ĠSession ( g ) ĊĠĠĠĠĠĠĠ Ġthis . runner Ġ= Ġsess . runner () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAn Ġover loaded Ġversion Ġof Ġrun Inference Ġthat Ġallows Ġsupply ing Ġtarget Node Names Ġas Ġwell Ġ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġrun ( output Names : ĠArray < String >, Ġenable Stats : ĠBoolean Ġ= Ġfalse , Ġtarget Node Names : ĠArray < String > Ġ= ĠarrayOf ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRelease Ġany ĠT ensors Ġfrom Ġthe Ġprevious Ġrun Ġcalls . ĊĠĠĠĠĠĠĠ Ġclose F etches () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġf etches . ĊĠĠĠĠĠĠĠ Ġfor Ġ( o Ġin Ġoutput Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Names . add ( o ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtid Ġ= ĠTensor Id . parse ( o ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunner !!. fetch ( tid . name , Ġtid . output Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġtargets . ĊĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġtarget Node Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunner !!. add Target ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġthe Ġsession . ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch T ensors Ġ= Ġif Ġ( enable Stats ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġrunner !!. set Options ( byte ArrayOf ( 0 x 0 8 , Ġ 0 x 0 3 )). run And Fetch Metadata () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . outputs ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunner !!. run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlways Ġrelease Ġthe Ġfeeds Ġ( to Ġsave Ġresources ) Ġand Ġreset Ġthe Ġrunner , Ġthis Ġrun Ġis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġover . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Feed s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunner Ġ= Ġsess . runner () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġreference Ġto Ġthe ĠGraph Ġdescribing Ġthe Ġcomputation Ġrun Ġduring Ġinference . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġgraph (): ĠGraph Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġg ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgraph Operation ( operation Name : ĠString ): ĠOperation Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġg . operation ( operation Name ) Ġ?: Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Node Ġ'$ operation Name ' Ġdoes Ġnot Ġexist Ġin Ġmodel Ġ'$ model Name '") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠC le ans Ġup Ġthe Ġstate Ġassociated Ġwith Ġthis ĠObject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe ĠT enos r Flow Inference Interface Ġobject Ġis Ġno Ġlonger Ġusable Ġafter Ġthis Ġmethod Ġreturns . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġclose Feed s () ĊĠĠĠĠĠĠĠ Ġclose F etches () ĊĠĠĠĠĠĠĠ Ġsess . close () ĊĠĠĠĠĠĠĠ Ġg . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Throwable :: class ) ĊĠĠĠ Ġprotected Ġfun Ġfinalize () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠMethods Ġfor Ġtaking Ġa Ġnative ĠTensor Ġand Ġfilling Ġit Ġwith Ġvalues Ġfrom ĠKotlin Ġarrays . ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġarray Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġcopy Ġthe Ġcontents Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġinput ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġarray Ġ[ src ] Ġmust Ġhave Ġat Ġleast ĊĠĠĠĠ Ġ* Ġas Ġmany Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠBoolean Array , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠByteArray ( src . size ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsrc . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb [ i ] Ġ= Ġif Ġ( src [ i ]) Ġ 1 . to Byte () Ġelse Ġ 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( Boolean :: class . java , Ġdims , ĠByteBuffer . wrap ( b ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġarray Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġcopy Ġthe Ġcontents Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġinput ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġarray Ġ[ src ] Ġmust Ġhave Ġat Ġleast ĊĠĠĠĠ Ġ* Ġas Ġmany Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠFloat Array , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( dims , ĠFloat Buffer . wrap ( src ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġarray Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġcopy Ġthe Ġcontents Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġinput ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġarray Ġ[ src ] Ġmust Ġhave Ġat Ġleast ĊĠĠĠĠ Ġ* Ġas Ġmany Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠInt Array , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( dims , ĠInt Buffer . wrap ( src ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġarray Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġcopy Ġthe Ġcontents Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġinput ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġarray Ġ[ src ] Ġmust Ġhave Ġat Ġleast ĊĠĠĠĠ Ġ* Ġas Ġmany Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠLong Array , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( dims , ĠLong Buffer . wrap ( src ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġarray Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġcopy Ġthe Ġcontents Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġinput ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġarray Ġ[ src ] Ġmust Ġhave Ġat Ġleast ĊĠĠĠĠ Ġ* Ġas Ġmany Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠDouble Array , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( dims , ĠDouble Buffer . wrap ( src ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġarray Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġcopy Ġthe Ġcontents Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġinput ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġarray Ġ[ src ] Ġmust Ġhave Ġat Ġleast ĊĠĠĠĠ Ġ* Ġas Ġmany Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠByteArray , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( UInt 8 :: class . java , Ġdims , ĠByteBuffer . wrap ( src ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCopy Ġa Ġbyte Ġsequence Ġinto Ġthe Ġinput ĠTensor Ġwith Ġname Ġ[ input Name ] Ġas Ġa Ġstring - valu ed ĊĠĠĠĠ Ġ* Ġscalar Ġtensor . ĠIn Ġthe ĠTensorFlow Ġtype Ġsystem , Ġa Ġ" string " Ġis Ġan Ġarbitrary Ġsequence Ġof Ġbytes , Ġnot ĊĠĠĠĠ Ġ* Ġa ĠJava Ġ` String ` Ġ( which Ġis Ġa Ġsequence Ġof Ġcharacters ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed String ( input Name : ĠString , Ġsrc : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠT ensors . create ( src )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCopy Ġan Ġarray Ġof Ġbyte Ġsequences Ġinto Ġthe Ġinput ĠTensor Ġwith Ġname Ġ[ input Name ] Ġas Ġa ĊĠĠĠĠ Ġ* Ġstring - valu ed Ġone - dimensional Ġtensor Ġ( vector ). ĠIn Ġthe ĠTensorFlow Ġtype Ġsystem , Ġa Ġ" string " Ġis Ġan ĊĠĠĠĠ Ġ* Ġarbitrary Ġsequence Ġof Ġbytes , Ġnot Ġa ĠJava Ġ` String ` Ġ( which Ġis Ġa Ġsequence Ġof Ġcharacters ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed String ( input Name : ĠString , Ġsrc : ĠArray < ByteArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠT ensors . create ( src )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠMethods Ġfor Ġtaking Ġa Ġnative ĠTensor Ġand Ġfilling Ġit Ġwith Ġsrc Ġfrom ĠJava Ġnative ĠIO Ġbuffers . ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġbuffer Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġboth Ġstored Ġas ĊĠĠĠĠ Ġ* Ġ** direct ** Ġand Ġ** native Ġordered ** Ġjava . nio Ġbuffers , Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġinput ĊĠĠĠĠ Ġ* ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġbuffer Ġ[ src ] Ġmust Ġhave Ġat Ġleast Ġas Ġmany ĊĠĠĠĠ Ġ* Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠFloat Buffer , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( dims , Ġsrc )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġbuffer Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġboth Ġstored Ġas ĊĠĠĠĠ Ġ* Ġ** direct ** Ġand Ġ** native Ġordered ** Ġjava . nio Ġbuffers , Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġinput ĊĠĠĠĠ Ġ* ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġbuffer Ġ[ src ] Ġmust Ġhave Ġat Ġleast Ġas Ġmany ĊĠĠĠĠ Ġ* Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠInt Buffer , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( dims , Ġsrc )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġbuffer Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġboth Ġstored Ġas ĊĠĠĠĠ Ġ* Ġ** direct ** Ġand Ġ** native Ġordered ** Ġjava . nio Ġbuffers , Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġinput ĊĠĠĠĠ Ġ* ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġbuffer Ġ[ src ] Ġmust Ġhave Ġat Ġleast Ġas Ġmany ĊĠĠĠĠ Ġ* Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠLong Buffer , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( dims , Ġsrc )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġbuffer Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġboth Ġstored Ġas ĊĠĠĠĠ Ġ* Ġ** direct ** Ġand Ġ** native Ġordered ** Ġjava . nio Ġbuffers , Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġinput ĊĠĠĠĠ Ġ* ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġbuffer Ġ[ src ] Ġmust Ġhave Ġat Ġleast Ġas Ġmany ĊĠĠĠĠ Ġ* Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠDouble Buffer , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( dims , Ġsrc )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġsource Ġbuffer Ġwith Ġshape Ġ[ dims ] Ġand Ġcontent Ġ[ src ], Ġboth Ġstored Ġas ĊĠĠĠĠ Ġ* Ġ** direct ** Ġand Ġ** native Ġordered ** Ġjava . nio Ġbuffers , Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġinput ĊĠĠĠĠ Ġ* ĠTensor Ġwith Ġname Ġ[ input Name ]. ĠThe Ġsource Ġbuffer Ġ[ src ] Ġmust Ġhave Ġat Ġleast Ġas Ġmany ĊĠĠĠĠ Ġ* Ġelements Ġas Ġthat Ġof Ġthe Ġdestination ĠTensor . ĠIf Ġ[ src ] Ġhas Ġmore Ġelements Ġthan Ġthe ĊĠĠĠĠ Ġ* Ġdestination Ġhas Ġcapacity , Ġthe Ġcopy Ġis Ġtruncated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfeed ( input Name : ĠString , Ġsrc : ĠByteBuffer , Ġvar arg Ġdims : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Feed ( input Name , ĠTensor . create ( UInt 8 :: class . java , Ġdims , Ġsrc )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġa ĠJava Ġarray . Ġ[ Ġ] Ġmust Ġhave Ġlength Ġgreater Ġthan Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill ĊĠĠĠĠ Ġ* Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠFloat Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch ( output Name , ĠFloat Buffer . wrap ( dst )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġa ĠJava Ġarray . Ġ[ Ġ] Ġmust Ġhave Ġlength Ġgreater Ġthan Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill ĊĠĠĠĠ Ġ* Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch ( output Name , ĠInt Buffer . wrap ( dst )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġa ĠJava Ġarray . Ġ[ Ġ] Ġmust Ġhave Ġlength Ġgreater Ġthan Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill ĊĠĠĠĠ Ġ* Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠLong Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch ( output Name , ĠLong Buffer . wrap ( dst )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġa ĠJava Ġarray . Ġ[ Ġ] Ġmust Ġhave Ġlength Ġgreater Ġthan Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill ĊĠĠĠĠ Ġ* Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠDouble Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch ( output Name , ĠDouble Buffer . wrap ( dst )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġa ĠJava Ġarray . Ġ[ Ġ] Ġmust Ġhave Ġlength Ġgreater Ġthan Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill ĊĠĠĠĠ Ġ* Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch ( output Name , ĠByteBuffer . wrap ( dst )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġ** direct ** Ġand ĊĠĠĠĠ Ġ* Ġ** native Ġordered ** Ġjava . nio Ġbuffer Ġ[ dst ]. Ġ[ dst ] Ġmust Ġhave Ġcapacity Ġgreater Ġthan ĊĠĠĠĠ Ġ* Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe ĊĠĠĠĠ Ġ* Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠFloat Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Tensor ( output Name ). writeTo ( dst ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġ** direct ** Ġand ĊĠĠĠĠ Ġ* Ġ** native Ġordered ** Ġjava . nio Ġbuffer Ġ[ dst ]. Ġ[ dst ] Ġmust Ġhave Ġcapacity Ġgreater Ġthan ĊĠĠĠĠ Ġ* Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe ĊĠĠĠĠ Ġ* Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠInt Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Tensor ( output Name ). writeTo ( dst ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġ** direct ** Ġand ĊĠĠĠĠ Ġ* Ġ** native Ġordered ** Ġjava . nio Ġbuffer Ġ[ dst ]. Ġ[ dst ] Ġmust Ġhave Ġcapacity Ġgreater Ġthan ĊĠĠĠĠ Ġ* Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe ĊĠĠĠĠ Ġ* Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠLong Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Tensor ( output Name ). writeTo ( dst ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġ** direct ** Ġand ĊĠĠĠĠ Ġ* Ġ** native Ġordered ** Ġjava . nio Ġbuffer Ġ[ dst ]. Ġ[ dst ] Ġmust Ġhave Ġcapacity Ġgreater Ġthan ĊĠĠĠĠ Ġ* Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe ĊĠĠĠĠ Ġ* Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠDouble Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Tensor ( output Name ). writeTo ( dst ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġfrom Ġa ĠTensor Ġnamed Ġ[ output Name ] Ġand Ġcopy Ġthe Ġcontents Ġinto Ġthe Ġ** direct ** Ġand ĊĠĠĠĠ Ġ* Ġ** native Ġordered ** Ġjava . nio Ġbuffer Ġ[ dst ]. Ġ[ dst ] Ġmust Ġhave Ġcapacity Ġgreater Ġthan ĊĠĠĠĠ Ġ* Ġor Ġequal Ġto Ġthat Ġof Ġthe Ġsource ĠTensor . ĠThis Ġoperation Ġwill Ġnot Ġaffect Ġdst 's Ġcontent Ġpast Ġthe ĊĠĠĠĠ Ġ* Ġsource ĠTensor 's Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch ( output Name : ĠString , Ġdst : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Tensor ( output Name ). writeTo ( dst ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġload Graph ( graph Def : ĠByteArray , Ġg : ĠGraph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ms Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . import Graph Def ( graph Def ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Not Ġa Ġvalid ĠTensorFlow ĠGraph Ġserialization : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġend Ms Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġlog . info (" Model Ġload Ġtook Ġ${ end Ms Ġ- Ġstart Ms } Ġms , ĠTensorFlow Ġversion : Ġ${ Tensor Flow . version () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Feed ( input Name : ĠString , Ġt : ĠTensor <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġstring Ġformat Ġaccepted Ġby ĠTensor flow Inference Interface Ġis Ġnode _ name [: output _ index ]. ĊĠĠĠĠĠĠĠ Ġval Ġtid Ġ= ĠTensor Id . parse ( input Name ) ĊĠĠĠĠĠĠĠ Ġrunner !!. feed ( tid . name , Ġtid . output Index , Ġt ) ĊĠĠĠĠĠĠĠ Ġfeed Names . add ( input Name ) ĊĠĠĠĠĠĠĠ Ġfeed T ensors . add ( t ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTensor Id Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġname : ĠString ĊĠĠĠĠĠĠĠ Ġvar Ġoutput Index : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠParse Ġoutput Ġnames Ġinto Ġa ĠTensor Id . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠE . g ., Ġ" foo " Ġ--> Ġ(" foo ", Ġ 0 ), Ġwhile Ġ" foo : 1 " Ġ--> Ġ(" foo ", Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse ( name : ĠString ): ĠTensor Id Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtid Ġ= ĠTensor Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolon Index Ġ= Ġname . lastIndexOf (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( colon Index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtid . output Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtid . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtid . output Index Ġ= ĠInteger . parseInt ( name . substring ( colon Index Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtid . name Ġ= Ġname . substring ( 0 , Ġcolon Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtid . output Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtid . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tensor ( output Name : ĠString ): ĠTensor < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġn ) Ġin Ġfetch Names . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ== Ġoutput Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfetch T ensors [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Node Ġ'$ output Name ' Ġwas Ġnot Ġprovided Ġto Ġrun (), Ġso Ġit Ġcannot Ġbe Ġread ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Feed s () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġfeed T ensors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfeed T ensors . clear () ĊĠĠĠĠĠĠĠ Ġfeed Names . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose F etches () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġfetch T ensors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfetch T ensors . clear () ĊĠĠĠĠĠĠĠ Ġfetch Names . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Tensor flow Inference Interface " ĊĠĠĠ Ġ} Ċ Ċ }