package Ġorg . al bar oss . agents 4 j . extraction . extract ors Ċ Ċ import Ġorg . al bar oss . agents 4 j . extraction .* Ċ import Ġorg . al bar oss . agents 4 j . extraction . bases . TreeMap KB Ċ import Ġorg . al bar oss . agents 4 j . extraction . collections . Multi set Ċ import Ġjava . util .* Ċ Ċ type alias ĠTrip le < A > Ġ= Ġkotlin . Triple < State , ĠCollection < Pair < State , ĠA >>, ĠCollection < Rule < A >>> Ċ Ċ class ĠMem Extractor < A >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnew : Ġ() Ġ-> ĠKnowledge Base < A > Ġ= Ġ{ ĠTreeMap KB () Ġ}, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġorder : ĠComparator < A >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmin supp : ĠDouble Ġ= Ġ 0 . 0 , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmin conf : ĠDouble Ġ= Ġ 0 . 0 ) Ġ: ĠExtract or < A > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġextract ( input : ĠCollection < Pair < State , ĠA >> ): ĠKnowledge Base < A > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkb Ġ= Ġnew () ĊĠĠĠĠĠĠĠ Ġif Ġ( input . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkb ĊĊĠĠĠĠĠĠĠ Ġval Ġinitial Ġ= Ġcreate ( empty Set (), Ġinput ) ĊĠĠĠĠĠĠĠ Ġkb . addAll ( initial ) ĊĠĠĠĠĠĠĠ Ġvar Ġitems Ġ= Ġinitialize ( input , Ġinitial ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( k Ġin Ġ 1 .. input . first (). state . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( k Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġmerge ( items , Ġinput ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġitems . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( state , Ġpairs , Ġrules ) Ġ= Ġitems [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreated Ġ= Ġcreate ( state , Ġpairs , Ġrules ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! created . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ i ] Ġ= ĠTrip le ( state , Ġpairs , Ġcreated ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkb . addAll ( created ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate ( state : ĠState , Ġsupporting : ĠCollection < Pair < State , ĠA >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting : ĠCollection < Rule < A >> Ġ= Ġempty List ()): ĠCollection < Rule < A >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġgrouped Ġ= Ġsupporting . groupBy Ġ{ Ġit . action Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmax Count Ġ= Ġgrouped . values . map Ġ{ Ġit . size Ġ}. max () ĊĠĠĠĠĠĠĠ Ġval Ġcreated Ġ= ĠArrayList < Rule < A >>() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( action , Ġpairs ) Ġin Ġgrouped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max Count Ġ== Ġpairs . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconf Ġ= Ġpairs Ġ/ Ġsupporting ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( conf Ġ<= Ġexisting . weight ( or Ġ= Ġmin conf )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! existing . isEmpty () Ġ&& Ġexisting . all Ġ{ Ġaction Ġ== Ġit . action Ġ}) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated . add ( Rule ( state , Ġaction , Ġconf )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( order Ġ!= Ġnull Ġ&& Ġcreated . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Action Ġ= Ġcreated . map Ġ{ Ġit . action Ġ}. min With ( order ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreated . filter Ġ{ Ġmin Action Ġ== Ġit . action Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreated ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize ( input : ĠCollection < Pair < State , ĠA >>, Ġinitial : ĠCollection < Rule < A >> ): ĠMutable List < Triple < A >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpartitions Ġ= ĠHashMap < String , ĠMulti set < Pair < State , ĠA >> >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( pair Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġpair . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsupporting Ġ= Ġpartitions . get Or Put ( s ) Ġ{ ĠMulti set () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupporting . add ( pair ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠArrayList < Triple < A >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ(( s , Ġsupporting ) Ġin Ġpartitions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( min supp Ġ> Ġ 0 . 0 Ġ&& Ġsupporting Ġ/ Ġinput Ġ<= Ġmin supp ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . add ( Triple ( set Of ( s ), Ġsupporting , Ġinitial )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġitems ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmerge ( items : ĠCollection < Triple < A >>, Ġinput : ĠCollection < Pair < State , ĠA >> ): ĠMutable List < Triple < A >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmerged Ġ= ĠArrayList < Triple < A >>() ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġitems Ġas ĠList ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlist . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( k Ġin Ġ( i Ġ+ Ġ 1 ) Ġuntil Ġlist . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( state _ i , Ġpairs _ i , Ġrules _ i ) Ġ= Ġlist [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( state _ k , Ġpairs _ k , Ġrules _ k ) Ġ= Ġlist [ k ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġ( state _ i Ġas ĠSorted Set Ġor Ġstate _ k Ġas ĠSorted Set ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpairs Ġ= Ġ( pairs _ i Ġas ĠMulti set Ġand Ġpairs _ k Ġas ĠMulti set ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( min supp Ġ> Ġ 0 . 0 Ġ&& Ġpairs Ġ/ Ġinput Ġ<= Ġmin supp ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrules Ġ= Ġrules _ i Ġmax Ġrules _ k ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerged . add ( Triple ( state , Ġpairs , Ġrules )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmerged ĊĠĠĠ Ġ} Ċ Ċ }