package Ġorg . grand test auto . math s . mon oid Ċ Ċ import Ġjava . util . HashSet Ċ Ċ /** Ċ Ġ* ĠA Ġgeneral ised Ġgeneration Ġalgorithm ĊĊ Ġ* Ġ@ author ĠTim ĠLa vers Ċ Ġ*/ Ċ internal Ġclass ĠGeneration < out ĠT >( private Ġval Ġgenerators : ĠSet < T >, Ġprivate Ġval Ġcreator : ĠCreate New < T >) Ġ{ ĊĠĠĠ Ġinterface ĠCreate New < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate New ( t : ĠT ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate New ( s : ĠT , Ġt : ĠT ): ĠT ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate (): ĠSet < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgenerated : ĠSet < T > Ġ= ĠHashSet ( generators ) ĊĠĠĠĠĠĠĠ Ġval Ġnext Generation Ġ= ĠHashSet < T >() ĊĠĠĠĠĠĠĠ Ġvar Ġnew Element Found : ĠBoolean ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Element Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( g Ġin Ġgenerated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Generation . add ( g ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Self Ġ= Ġcreator . createNew ( g ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( from Self Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Element Found Ġ= Ġnew Element Found Ġor Ġnext Generation . add ( from Self ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( h Ġin Ġgenerated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Ġ= Ġcreator . createNew ( g , Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( product Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Element Found Ġ= Ġnew Element Found Ġor Ġnext Generation . add ( product ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Ġ= ĠHashSet ( next Generation ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( new Element Found ) ĊĠĠĠĠĠĠĠ Ġreturn Ġgenerated ĊĠĠĠ Ġ} Ċ }