package Ġorg . jetbrains . bio . genome . containers . intersection Ċ Ċ import Ġg nu . tro ve . list . array . T Int ArrayList Ċ import Ġorg . apache . commons . csv . CSV Format Ċ import Ġorg . apache . commons . csv . Quote Mode Ċ import Ġorg . jetbrains . bio . util . buffered Reader Ċ import Ġorg . jetbrains . bio . util . buffered Writer Ċ import Ġorg . jetbrains . bio . vik tor . F 6 4 Array Ċ import Ġjava . io . String Writer Ċ import Ġjava . io . Writer Ċ import Ġjava . nio . file . Path Ċ Ċ /** Ċ Ġ* Ġ@ author ĠRoman . Ch ern y atch ik Ċ Ġ* Ġ@ date Ġ 2 0 1 8 - 1 1 - 0 6 Ċ Ġ*/ Ċ data Ġclass ĠIntersection Info ( ĊĠĠĠ Ġval Ġdata : ĠF 6 4 Array , ĊĠĠĠ Ġval Ġrows Merged Loc i Number : ĠInt Array , ĊĠĠĠ Ġval Ġcols Merged Loc i Number : ĠInt Array , ĊĠĠĠ Ġval Ġrow Names : ĠList < String >, ĊĠĠĠ Ġval Ġcol Names : ĠList < String > Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġsave To CSV ( writer : ĠWriter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( nrows , Ġn cols ) Ġ= Ġdata . shape ĊĊĠĠĠĠĠĠĠ ĠCSV Format . DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Quote Mode ( Quote Mode . MIN IMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Comment Marker ('# ') !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. print ( writer ). use Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print (" a _ names ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print (" a _ merged _ loc i _ count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print Record ( col Names ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcols Ġsizes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print (" b _ merged _ loc i _ count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print (".") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn cols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print ( cols Merged Loc i Number [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . println () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn rows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print ( row Names [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print ( rows Merged Loc i Number [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Idx Ġin Ġ 0 Ġuntil Ġn cols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . print ( data [ i , Ġc Idx ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . println () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave To CSV ( path : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsave To CSV ( path . buffered Writer ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġsave To CSV ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠ Ġ. replace ("\ r ", Ġ"") ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSupports Ġsame Ġformat , Ġas Ġour ĠW ASH U Ġtables ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠĠĠĠĠ Ġfun Ġload From CSV ( path : ĠPath ) Ġ= ĠCSV Format . DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Quote Mode ( Quote Mode . MIN IMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Comment Marker ('# ') !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse ( path . buffered Reader ()). use Ġ{ Ġparser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcol Names : ĠList < String >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcols Merged Loc i Number : ĠInt Array ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Merged Loc i Number Ġ= ĠT Int ArrayList () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠArrayList < Double Array >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Names Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser . forEach Indexed Ġ{ Ġrec Idx , Ġcsv Record Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( rec Idx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcol Names Ġ= Ġcsv Record !!. toList (). sub List ( 2 , Ġcsv Record . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( col Names ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcols Merged Loc i Number Ġ= ĠInt Array ( col Names !!. size ) Ġ{ i Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcsv Record . get ( i + 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecords Ġ= Ġcsv Record . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Values Ġ= ĠDouble Array ( col Names !!. size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . forEach Indexed Ġ{ Ġi , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġrow Names . add ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġrows Merged Loc i Number . add ( value . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrow Values [ i Ġ- Ġ 2 ] Ġ= Ġ( value . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . add ( row Values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( col Names Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntersection Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF 6 4 Array ( 0 , Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt Array ( 0 ), ĠInt Array ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List (), Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( col Names ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( cols Merged Loc i Number ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntersection Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF 6 4 Array ( row Names . size , Ġcol Names !!. size ) Ġ{ Ġi , Ġj Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ][ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrows Merged Loc i Number . toArray (), Ġcols Merged Loc i Number !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Names , Ġcol Names !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠIntersection Info ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġother . data ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(! rows Merged Loc i Number . content Equals ( other . rows Merged Loc i Number )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(! cols Merged Loc i Number . content Equals ( other . cols Merged Loc i Number )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( row Names Ġ!= Ġother . row Names ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( col Names Ġ!= Ġother . col Names ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġdata . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġrows Merged Loc i Number . content HashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġcols Merged Loc i Number . content HashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġrow Names . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġcol Names . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }