package Ġai . plat on . pulsar . dom . features Ċ Ċ import Ġai . plat on . pulsar . common . ge ometric . str Ċ import Ġai . plat on . pulsar . common . math . vectors . get Ċ import Ġai . plat on . pulsar . common . to HexString Ċ import Ġai . plat on . pulsar . dom . Feature d Document Ċ import Ġai . plat on . pulsar . dom . nodes . V _ OWNER _ BODY Ċ import Ġai . plat on . pulsar . dom . nodes . node . ext . get Feature Ċ import Ġai . plat on . pulsar . dom . nodes . node . ext . name Ċ import Ġcom . google . common . collect . Iter ables Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . apache . commons . math 3 . linear . Real Vector Ċ import Ġorg . apache . commons . math 3 . util . Precision Ċ import Ġorg . js oup . nodes . Element Ċ import Ġorg . js oup . nodes . Node Ċ import Ġjava . awt . Color Ċ import Ġjava . awt . Rectangle Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ data Ġclass ĠFeature Entry ( val Ġkey : ĠInt , Ġval Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠ Ġconstructor ( key : ĠInt , Ġvalue : ĠInt ): Ġthis ( key , Ġvalue . toDouble ()) ĊĠĠĠ Ġconstructor ( key : ĠInt , Ġvalue : ĠBoolean ): Ġthis ( key , Ġif Ġ( value ) Ġ 1 . 0 Ġelse Ġ 0 . 0 ) Ċ } Ċ Ċ object ĠFeature Registry Ġ{ ĊĊĠĠĠ Ġvar Ġregistered Features : ĠSet < Node Feature > Ġ= Ġset Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġval Ġdimension Ġget () Ġ= Ġregistered Features . size ĊĊĠĠĠ Ġvar Ġprimary Features : ĠList < Node Feature > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġfloat Features : ĠList < Node Feature > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġfeature Keys : ĠList < Int > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġprimary Feature Keys : ĠList < Int > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġfloat Feature Keys : ĠList < Int > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġfeature Names : ĠList < String > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġprimary Feature Names : ĠList < String > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġfloat Feature Names : ĠList < String > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġfeature Names To Keys : ĠMap < String , ĠInt > Ġ= Ġmap Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġfeature Keys To Names : ĠMap < Int , ĠString > Ġ= Ġmap Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġprimary Feature Names To Keys : ĠMap < String , ĠInt > Ġ= Ġmap Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġprimary Feature Keys To Names Ġ: ĠMap < Int , ĠString > Ġ= Ġmap Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġfloat Feature Names To Keys : ĠMap < String , ĠInt > Ġ= Ġmap Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġfloat Feature Keys To Names : ĠMap < Int , ĠString > Ġ= Ġmap Of () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġregister ( features : ĠIterable < Node Feature >) Ġ{ ĊĠĠĠĠĠĠĠ Ġregistered Features Ġ= Ġfeatures . toSet () ĊĊĠĠĠĠĠĠĠ Ġprimary Features Ġ= Ġregistered Features . filter Ġ{ Ġit . is Primary Ġ} ĊĠĠĠĠĠĠĠ Ġfloat Features Ġ= Ġregistered Features . filter Ġ{ Ġit . is Float Ġ} ĊĊĠĠĠĠĠĠĠ Ġfeature Keys Ġ= Ġregistered Features . map Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠ Ġprimary Feature Keys Ġ= Ġprimary Features . map Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠ Ġfloat Feature Keys Ġ= Ġfloat Features . map Ġ{ Ġit . key Ġ} ĊĊĠĠĠĠĠĠĠ Ġfeature Names Ġ= Ġregistered Features . map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġprimary Feature Names Ġ= Ġprimary Features . map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠ Ġfloat Feature Names Ġ= Ġfloat Features . map Ġ{ Ġit . name Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġfeature Names To Keys Ġ= Ġregistered Features . associate Ġ{ Ġit . name Ġto Ġit . key Ġ} ĊĠĠĠĠĠĠĠ Ġfeature Names To Keys Ġ= Ġregistered Features . associate By ({ Ġit . name Ġ}, Ġ{ Ġit . key Ġ}) ĊĠĠĠĠĠĠĠ Ġfeature Keys To Names Ġ= Ġregistered Features . associate By ({ Ġit . key Ġ}, Ġ{ Ġit . name Ġ}) ĊĊĠĠĠĠĠĠĠ Ġprimary Feature Names To Keys Ġ= Ġprimary Features . associate By ({ Ġit . name Ġ}, Ġ{ Ġit . key Ġ}) ĊĠĠĠĠĠĠĠ Ġprimary Feature Keys To Names Ġ= Ġprimary Features . associate By ({ Ġit . key Ġ}, Ġ{ Ġit . name Ġ}) ĊĊĠĠĠĠĠĠĠ Ġfloat Feature Names To Keys Ġ= Ġfloat Features . associate By ({ Ġit . name Ġ}, Ġ{ Ġit . key Ġ}) ĊĠĠĠĠĠĠĠ Ġfloat Feature Keys To Names Ġ= Ġfloat Features . associate By ({ Ġit . key Ġ}, Ġ{ Ġit . name Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠNode Feature ( val Ġkey : ĠInt , Ġval Ġname : ĠString , Ġval Ġis Primary : ĠBoolean Ġ= Ġtrue , Ġval Ġis Float : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠ Ġvar Ġvalue : ĠDouble Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġval Ġto Entry Ġ= ĠFeature Entry ( key , Ġvalue ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTODO : Ġavoid Ġobject ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* Ġaffect Ġ_ sep ĊĠĠĠĠĠĠĠĠ Ġ* Ġcan Ġbe Ġmodified Ġin Ġconfiguration ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠSE PAR ATORS Ġ= ĠarrayOf (" :", Ġ" ï¼ļ ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġkey Gen Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġkey Ġshould Ġreturn Ġby Ġinc Key ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Key Ġget () Ġ= Ġkey Gen . get () ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġkey Ġmust Ġstart Ġwith Ġ 0 , Ġit Ġmight Ġbe Ġan Ġarray Ġindex Ġlater ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġinc Key : ĠInt Ġget () Ġ= Ġkey Gen . get And Increment () ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetKey ( name : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFeature Registry . feature Names To Keys [ name . toLowerCase ()] ?: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unknown Ġfeature Ġname Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetValue ( name : ĠString , Ġnode : ĠNode ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode . get Feature ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Floating ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFeature Registry . float Feature Names . contains ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Floating ( key : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFeature Registry . float Feature Keys . contains ( key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠFeature Formatter Ġ{ ĊĠĠĠ Ġval Ġcommon Variables Ġ= ĠarrayOf ( V _ OWNER _ BODY ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġstring Ġrepresentation Ġof Ġthis Ġfeature ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġformat ( feature : ĠFeature Entry ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġfeature . key ĊĠĠĠĠĠĠĠ Ġreturn Ġkey . toString () Ġ+ Ġ":" Ġ+ Ġformat Value ( key , Ġfeature . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġformat ( features : ĠReal Vector , Ġsb : ĠStringBuilder Ġ= ĠStringBuilder (), Ġeps : ĠDouble Ġ= Ġ 0 . 0 0 1 ): ĠStringBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġformat ( features , ĠlistOf (), Ġsb , Ġeps ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġstring Ġrepresentation Ġof Ġthe Ġfeatures ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ features ĠThe Ġfeature Ġvector ĊĠĠĠĠ Ġ* Ġ@ feature Keys ĠThe Ġfeature Ġkeys Ġto Ġformat ĊĠĠĠĠ Ġ* Ġ@ sb ĠThe Ġstring Ġbuilder ĊĠĠĠĠ Ġ* Ġ@ eps ĠThe Ġamount Ġof Ġallowed Ġabsolute Ġerror Ġto Ġjudge Ġif Ġa Ġdouble Ġvalue Ġis Ġzero Ġwhich Ġis Ġignored ĊĠĠĠĠ Ġ* Ġ@ return Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġformat ( features : ĠReal Vector , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Keys : ĠIterable < Int >, Ġsb : ĠStringBuilder Ġ= ĠStringBuilder (), Ġeps : ĠDouble Ġ= Ġ 0 . 0 0 1 ): ĠStringBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠIter ables . size ( feature Keys ) ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠFeature Registry . feature Names . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfeatures [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Precision . equals ( value , Ġ 0 . 0 , Ġeps )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( Feature Registry . feature Names [ i ]). append (": "). append ( format Value ( i , Ġvalue , Ġeps )). append (' Ġ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfeature Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfeatures . getEntry ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Precision . equals ( value , Ġ 0 . 0 , Ġeps )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( Feature Registry . feature Names [ i ]). append (": "). append ( format Value ( i , Ġvalue , Ġeps )). append (' Ġ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( sb . endsWith (' Ġ')) Ġsb . delete Char At ( sb . length Ġ- Ġ 1 ) Ġelse Ġsb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġformat ( variables : ĠMap < String , ĠAny >, Ġsb : ĠStringBuilder Ġ= ĠStringBuilder (), Ġeps : ĠDouble Ġ= Ġ 0 . 0 0 1 ): ĠStringBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġformat ( variables , ĠlistOf (), Ġsb , Ġeps ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġformat ( variables : ĠMap < String , ĠAny >, Ġnames : ĠCollection < String >): ĠStringBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFeature Formatter . format ( variables , Ġnames , ĠStringBuilder (), Ġ 0 . 0 0 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġformat ( variables : ĠMap < String , ĠAny >, Ġnames : ĠCollection < String >, Ġsb : ĠStringBuilder Ġ= ĠStringBuilder (), Ġeps : ĠDouble Ġ= Ġ 0 . 0 0 1 ): ĠStringBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġvariables . filter Ġ{ Ġit . key Ġ! in Ġcommon Variables Ġ}. forEach Ġ{ Ġ( name , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( names . isEmpty () Ġ|| Ġname Ġin Ġnames ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġformat Value ( value , Ġtrue , Ġeps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠColor Ġ-> Ġvalue . to HexString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRectangle Ġ-> Ġvalue . str ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠElement Ġ-> Ġvalue . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeature d Document Ġ-> Ġvalue . location ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= ĠStringUtils . abbre vi ate ( s , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( name ). append (': '). append ( s ). append (' Ġ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( sb . endsWith (' Ġ')) Ġsb . delete Char At ( sb . length Ġ- Ġ 1 ) Ġelse Ġsb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġformat Value ( key : ĠInt , Ġvalue : ĠDouble , Ġeps : ĠDouble Ġ= Ġ 0 . 0 0 1 ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġformat Value ( value , ĠNode Feature . is Floating ( key )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġformat Value ( value : ĠDouble , Ġis Floating : ĠBoolean Ġ= Ġtrue , Ġeps : ĠDouble Ġ= Ġ 0 . 0 0 1 ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Floating ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Precision . equals ( value , Ġ 0 . 0 , Ġeps )) Ġ"" Ġelse ĠString . format ("% . 2 f ", Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ("% d ", Ġvalue . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ