package Ġjump aku . commons . math . linear Ċ Ċ import Ġjump aku . commons . control . Option Ċ import Ġjump aku . commons . control . Result Ċ import Ġjump aku . commons . control . result Ċ import Ġjump aku . commons . math . try Div Ċ import Ġorg . apache . commons . math 3 . util . Fast Math Ċ import Ġorg . apache . commons . math 3 . util . Math Arrays Ċ import Ġkotlin . collections . Abstract List Ċ import Ġkotlin . collections . List Ċ import Ġkotlin . collections . Map Ċ import Ġkotlin . collections . component 1 Ċ import Ġkotlin . collections . component 2 Ċ import Ġkotlin . collections . empty Map Ċ import Ġkotlin . collections . filter Values Ċ import Ġkotlin . collections . getValue Ċ import Ġkotlin . collections . intersect Ċ import Ġkotlin . collections . map Ċ import Ġkotlin . collections . map Keys Ċ import Ġkotlin . collections . map Values Ċ import Ġkotlin . collections . mutable Map Of Ċ import Ġkotlin . collections . set Ċ import Ġkotlin . collections . toList Ċ import Ġkotlin . collections . toMap Ċ import Ġkotlin . collections . zip ĊĊ Ċ infix Ġoperator Ġfun ĠDouble . times ( v : ĠVector ): ĠVector Ġ= Ġv . times ( this ) Ċ Ċ internal Ġfun Ġrequire Same Dimension ( v 0 : ĠVector , Ġv 1 : ĠVector ) Ġ= ĊĠĠĠ Ġrequire ( v 0 . size Ġ== Ġv 1 . size ) Ġ{ Ġ" Dimension Ġmismatch Ġ${ v 0 . size } Ġ!= Ġ${ v 1 . size }" Ġ} Ċ Ċ interface ĠVector : ĠList < Double > Ġ{ ĊĊĠĠĠ Ġfun Ġmap Indexed ( f : Ġ( Int , ĠDouble ) Ġ-> ĠDouble ): ĠVector Ġ= ĠVector Impl . Array (( 0 Ġuntil Ġsize ). map Ġ{ Ġf ( it , Ġget ( it )) Ġ}) ĊĊĠĠĠ Ġfun Ġmap ( f : Ġ( Double ) Ġ-> ĠDouble ): ĠVector Ġ= Ġmap Indexed Ġ{ Ġ_, Ġvalue Ġ-> Ġf ( value ) Ġ} ĊĊĠĠĠ Ġin fix Ġoperator Ġfun Ġtimes ( a : ĠDouble ): ĠVector ĊĊĠĠĠ Ġin fix Ġoperator Ġfun Ġdiv ( div isor : ĠDouble ): ĠResult < Vector > ĊĊĠĠĠ Ġoperator Ġfun Ġunary Plus (): ĠVector Ġ= Ġthis ĊĊĠĠĠ Ġoperator Ġfun Ġunary Minus (): ĠVector Ġ= Ġtimes (- 1 . 0 ) ĊĊĠĠĠ Ġin fix Ġoperator Ġfun Ġplus ( other : ĠVector ): ĠVector ĊĊĠĠĠ Ġin fix Ġoperator Ġfun Ġminus ( other : ĠVector ): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Same Dimension ( this , Ġother ) ĊĠĠĠĠĠĠĠ Ġreturn Ġplus ( other . unary Minus ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdot ( other : ĠVector ): ĠDouble ĊĊĠĠĠ Ġfun Ġsquare (): ĠDouble Ġ= Ġdot ( this ) ĊĊĠĠĠ Ġfun Ġnorm (): ĠDouble Ġ= ĠFast Math . sqrt ( square ()) ĊĊĠĠĠ Ġfun Ġdist Square ( other : ĠVector ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Same Dimension ( this , Ġother ) ĊĠĠĠĠĠĠĠ Ġreturn Ġminus ( other ). square () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdist ( other : ĠVector ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Same Dimension ( this , Ġother ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFast Math . sqrt ( dist Square ( other )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormalize (): ĠOption < Vector > Ġ= Ġdiv ( norm ()). value () ĊĊĠĠĠ Ġfun Ġas Row (): ĠMatrix ĊĊĠĠĠ Ġfun Ġas Column (): ĠMatrix ĊĊĠĠĠ Ġfun Ġto Double Array (): ĠDouble Array Ġ= ĠDouble Array ( size ) Ġ{ Ġget ( it ) Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġof ( size : ĠInt , Ġdata : ĠMap < Int , ĠDouble >): ĠVector Ġ= ĠVector Impl . Sparse ( size , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġof ( data : ĠList < Double >): ĠVector Ġ= ĠVector Impl . Array ( data ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġof ( data : ĠDouble Array ): ĠVector Ġ= ĠVector Impl . Array ( data ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġzeros ( size : ĠInt ): ĠVector Ġ= Ġof ( size , Ġempty Map ()) ĊĊĠĠĠĠĠĠĠ Ġfun Ġones ( size : ĠInt ): ĠVector Ġ= Ġof ( Double Array ( size ) Ġ{ Ġ 1 . 0 Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġsealed Ġclass ĠVector Impl ( override Ġval Ġsize : ĠInt ) Ġ: ĠAbstract List < Double >(), ĠVector Ġ{ ĊĊĠĠĠ Ġoverride Ġin fix Ġoperator Ġfun Ġtimes ( a : ĠDouble ): ĠVector Ġ= Ġwhen ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠArray Ġ-> Ġmap Ġ{ Ġit Ġ* Ġa Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSparse Ġ-> ĠSparse ( size , Ġdata . map Values Ġ{ Ġit . value Ġ* Ġa Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġin fix Ġoperator Ġfun Ġdiv ( div isor : ĠDouble ): ĠResult < Vector > Ġ= Ġresult Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray Ġ-> Ġmap Ġ{ Ġit . try Div ( div isor ). or Throw () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSparse Ġ-> ĠSparse ( size , Ġdata . map Values Ġ{ Ġit . value . try Div ( div isor ). or Throw () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġin fix Ġoperator Ġfun Ġplus ( other : ĠVector ): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Same Dimension ( this , Ġother ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠSparse Ġ&& Ġother Ġis ĠSparse Ġ-> ĠSparse ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Int , ĠDouble >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . forEach Ġ{ Ġindex , Ġvalue Ġ-> Ġresult [ index ] Ġ= Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . data . forEach Ġ{ Ġindex , Ġvalue Ġ-> Ġresult [ index ] Ġ= Ġvalue Ġ+ Ġ( result [ index ] Ġ?: Ġ 0 . 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . filter Values Ġ{ Ġ 1 . 0 . try Div ( it ). is Success Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠArray ( toDouble Array (). zip ( other . toDouble Array (), ĠDouble :: plus )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdot ( other : ĠVector ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Same Dimension ( this , Ġother ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠSparse Ġ&& Ġother Ġis ĠSparse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġmin Of ( data , Ġother . data , Ġcompare By Ġ{ Ġit . size Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġmax Of ( other . data , Ġdata , Ġcompare By Ġ{ Ġit . size Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġs . keys . intersect ( l . keys ). toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys . isEmpty ()) Ġ 0 . 0 Ġelse ĠMath Arrays . linear Combination ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Array ( keys . size ) Ġ{ Ġdata . getValue ( keys [ it ]) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Array ( keys . size ) Ġ{ Ġother . data . getValue ( keys [ it ]) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠSparse Ġ&& Ġother Ġis ĠArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġdata . keys . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath Arrays . linear Combination ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Array ( keys . size ) Ġ{ Ġdata . getValue ( keys [ it ]) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Array ( keys . size ) Ġ{ Ġother . data [ keys [ it ]] Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠArray Ġ&& Ġother Ġis ĠSparse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġother . data . keys . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath Arrays . linear Combination ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Array ( keys . size ) Ġ{ Ġdata [ keys [ it ]] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Array ( keys . size ) Ġ{ Ġother . data . getValue ( keys [ it ]) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠMath Arrays . linear Combination ( toDouble Array (), Ġother . toDouble Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġas Row (): ĠMatrix Ġ= Ġwhen ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSparse Ġ-> ĠMatrix . sparse ( 1 , Ġsize , Ġdata . map Keys Ġ{ Ġ( index , Ġ_) Ġ-> ĠMatrix . Key ( 0 , Ġindex ) Ġ}) ĊĠĠĠĠĠĠĠ Ġis ĠArray Ġ-> ĠMatrix . of ( array Of ( toDouble Array ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġas Column (): ĠMatrix Ġ= Ġwhen ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSparse Ġ-> ĠMatrix . sparse ( size , Ġ 1 , Ġdata . map Keys Ġ{ Ġ( index , Ġ_) Ġ-> ĠMatrix . Key ( index , Ġ 0 ) Ġ}) ĊĠĠĠĠĠĠĠ Ġis ĠArray Ġ-> ĠMatrix . of ( Array ( size ) Ġ{ Ġdouble ArrayOf ( get ( it )) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSparse ( size : ĠInt , Ġdata : ĠMap < Int , ĠDouble >): ĠVector Impl ( size ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconstructor ( size : ĠInt , Ġbuilder : Ġ( size : ĠInt ) Ġ-> ĠMap < Int , ĠDouble >): Ġthis ( size , Ġbuilder ( size )) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠMap < Int , ĠDouble > Ġ= Ġdata . toMap () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġoperator Ġfun Ġget ( index : ĠInt ): ĠDouble Ġ= Ġdata [ index ] Ġ?: Ġ 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠArray ( data : ĠList < Double >): ĠVector Impl ( data . size ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconstructor ( data : ĠDouble Array ): Ġthis ( data . toList ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠList < Double > Ġ= Ġdata . toList () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġoperator Ġfun Ġget ( index : ĠInt ): ĠDouble Ġ= Ġdata [ index ] ĊĠĠĠ Ġ} Ċ } Ċ