package Ġorg . ev om aster . core . search . gene . regex Ċ Ċ import Ġorg . ev om aster . core . output . Output Format Ċ import Ġorg . ev om aster . core . search . gene . Gene Ċ import Ġorg . ev om aster . core . search . gene . Gene Utils Ċ import Ġorg . ev om aster . core . search . service . Adaptive Parameter Control Ċ import Ġorg . ev om aster . core . search . service . Random ness Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . lang . IllegalArgumentException ĊĊ Ċ class ĠQuant ifier Rx Gene ( ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtemplate : ĠRx Atom , ĊĠĠĠĠĠĠĠ Ġval Ġmin : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġval Ġmax : ĠInt Ġ= Ġ 1 Ċ ) Ġ: ĠRx Term ( name ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Quant ifier Rx Gene :: class . java ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġatoms Ġ= Ġmutable ListOf < Rx Atom >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠA Ġ* Ġquant ifier Ġcould Ġlead Ġto Ġbill ions Ġof Ġatom Ġelements . ĊĠĠĠĠ Ġ* Ġ ĠHere , Ġto Ġavoid Ġan Ġunnecessary Ġhuge Ġsearch Ġspace , Ġwe Ġput ĊĠĠĠĠ Ġ* Ġ Ġa Ġlimit Ġon Ġthe Ġnumber Ġof Ġvariable Ġelements . ĊĠĠĠĠ Ġ* Ġ ĠBut Ġstill Ġconstr ained Ġby Ġmin Ġand Ġmax ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠLIMIT Ġ= Ġ 2 ĊĊĠĠĠ Ġval Ġlimited Max : ĠInt ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( min Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġmin Ġvalue Ġ'$ min ': Ġshould Ġbe Ġpositive ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( max Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġmax Ġvalue Ġ'$ max ': Ġshould Ġbe Ġat Ġleast Ġ 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( min Ġ> Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġmin - max Ġvalues Ġ'$ min -$ max ': Ġmin Ġis Ġgreater Ġthan Ġmax ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlimited Max Ġ= Ġif Ġ(( max Ġ- Ġmin ) Ġ> ĠLIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ+ ĠLIMIT ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( min Ġ== Ġlimited Max Ġ&& Ġ! template . is Mutable ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġmeans Ġthis Ġwhole Ġgene Ġis Ġimmutable . Ġstill Ġneed Ġto Ġinitialize Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġmin ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġtemplate . copy () Ġas ĠRx Atom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . parent Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatoms . add ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠGene Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠQuant ifier Rx Gene ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate . copy () Ġas ĠRx Atom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcopy . atoms . clear () ĊĠĠĠĠĠĠĠ Ġthis . atoms . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġit . copy () Ġas ĠRx Atom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . parent Ġ= Ġcopy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . atoms . add ( a ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġrandomize ( random ness : ĠRandom ness , Ġforce NewValue : ĠBoolean , Ġall Gen es : ĠList < Gene >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġrandom ness . nextInt ( min , Ġlimited Max ) ĊĊĠĠĠĠĠĠĠ Ġatoms . clear () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// nothing Ġto Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġadd New Atom ( random ness , Ġforce NewValue , Ġall Gen es ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Mutable (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin Ġ!= Ġlimited Max Ġ|| Ġtemplate . is Mutable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstandard Mutation ( random ness : ĠRandom ness , Ġap c : ĠAdapt ive Parameter Control , Ġall Gen es : ĠList < Gene >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġatoms . size ĊĊĠĠĠĠĠĠĠ Ġif ( Ġlength Ġ> Ġmin Ġ Ġ&& Ġrandom ness . next Boolean ( 0 . 1 )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace (" Removing Ġatom ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatoms . remove At ( random ness . nextInt ( length )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( length Ġ< Ġlimited Max Ġ&& Ġrandom ness . next Boolean ( 0 . 1 )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd New Atom ( random ness , Ġfalse , ĠlistOf ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġatoms Ġ= Ġatoms . filter Ġ{ Ġit . is Mutable () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( atoms . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġatom Ġ= Ġrandom ness . choose ( atoms ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatom . standard Mutation ( random ness , Ġap c , Ġall Gen es ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd New Atom ( random ness : ĠRandom ness , Ġforce NewValue : ĠBoolean , Ġall Gen es : ĠList < Gene > ){ ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġtemplate . copy () Ġas ĠRx Atom ĊĠĠĠĠĠĠĠ Ġbase . parent Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġif Ġ( base . is Mutable ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase . random ize ( random ness , Ġforce NewValue , Ġall Gen es ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġatoms . add ( base ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue As Print able String ( previous Gen es : ĠList < Gene >, Ġmode : ĠGene Utils . Escape Mode ?, Ġtarget Format : ĠOutput Format ?): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġatoms . map Ġ{ Ġit . getValue As Print able String ( previous Gen es , Ġmode , Ġtarget Format ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcopy Value From ( other : ĠGene ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠQuant ifier Rx Gene ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġgene Ġtype Ġ${ other . java Class }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . atoms . size Ġ== Ġother . atoms . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// same Ġsize , Ġso Ġjust Ġcopy Ġover Ġthe Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġother . atoms . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . atoms [ i ]. copy Value From ( other . atoms [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// different Ġsize , Ġso Ġclear Ġand Ġcreate Ġnew Ġcopies ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . atoms . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . atoms . forEach { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġit . copy () Ġas ĠRx Atom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . parent Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . atoms . add ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains Same Value As ( other : ĠGene ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠQuant ifier Rx Gene ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġgene Ġtype Ġ${ other . java Class }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . atoms . size Ġ!= Ġother . atoms . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġother . atoms . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . atoms [ i ]. contains Same Value As ( other . atoms [ i ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġflat View ( exclude Predicate : Ġ( Gene ) Ġ-> ĠBoolean ): ĠList < Gene > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( exclude Predicate ( this )) ĠlistOf ( this ) ĊĠĠĠĠĠĠĠ Ġelse ĠlistOf ( this ). plus ( atoms . flatMap Ġ{ Ġit . flat View ( exclude Predicate ) Ġ}) ĊĠĠĠ Ġ} Ċ }