package Ġnz . co . j ed sim son . lg p . core . environment Ċ Ċ import Ġnz . co . j ed sim son . lg p . core . environment . config .* Ċ import Ġnz . co . j ed sim son . lg p . core . environment . constants . Constant Loader Ċ import Ġnz . co . j ed sim son . lg p . core . environment . dataset . Target Ċ import Ġnz . co . j ed sim son . lg p . core . environment . events . Diagnostics Ċ import Ġnz . co . j ed sim son . lg p . core . environment . operations . Operation Loader Ċ import Ġnz . co . j ed sim son . lg p . core . e volution . Result Aggregator Ċ import Ġnz . co . j ed sim son . lg p . core . e volution . Result Ag greg ators Ċ import Ġnz . co . j ed sim son . lg p . core . e volution . fitness . Fitness Function Provider Ċ import Ġnz . co . j ed sim son . lg p . core . modules .* Ċ import Ġnz . co . j ed sim son . lg p . core . program . instructions . Operation Ċ import Ġnz . co . j ed sim son . lg p . core . program . registers . Register Set Ċ import Ġnz . co . j ed sim son . lg p . core . program . Output Ċ import Ġnz . co . j ed sim son . lg p . core . program . registers . Array Register Set Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* ĠA Ġspecification Ġfor Ġbuilding Ġan Ġ[ Environment ]. Ċ Ġ* Ċ Ġ* Ġ@ property Ġconfiguration Loader ĠA Ġcomponent Ġthat Ġcan Ġload Ġconfiguration Ġinformation . Ċ Ġ* Ġ@ property Ġconstant Loader ĠA Ġcomponent Ġthat Ġcan Ġload Ġconstants . Ċ Ġ* Ġ@ property Ġoperation Loader ĠA Ġcomponent Ġthat Ġcan Ġload Ġoperations Ġfor Ġthe ĠL GP Ġsystem . Ċ Ġ* Ġ@ property ĠdefaultValue Provider ĠA Ġcomponent Ġthat Ġprovides Ġdefault Ġvalues Ġfor Ġthe Ġregisters Ġin Ġthe Ġregister Ġset . Ċ Ġ* Ġ@ property Ġfitness Function Provider ĠA Ġfunction Ġused Ġto Ġevaluate Ġthe Ġfitness Ġof ĠL GP Ġprograms . Ċ Ġ* Ġ@ property Ġrandom State Seed ĠSets Ġthe Ġseed Ġof Ġthe Ġrandom Ġnumber Ġgenerator . ĠIf Ġa Ġvalue Ġis Ġgiven , Ġthe Ġseed Ġwill Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġbe Ġset , Ġand Ġwill Ġproduce Ġdeterministic Ġruns . ĠIf Ġnull Ġis Ġgiven , Ġa Ġrandom Ġseed Ġwill Ġbe Ġchosen . Ċ Ġ*/ Ċ data Ġclass ĠEnvironment Specification < T Program , ĠT Output Ġ: ĠOutput < T Program >, ĠT Target Ġ: ĠTarget < T Program >>( ĊĠĠĠ Ġval Ġconfiguration Loader : ĠConfiguration Loader , ĊĠĠĠ Ġval Ġconstant Loader : ĠConstant Loader < T Program >, ĊĠĠĠ Ġval Ġoperation Loader : ĠOperation Loader < T Program >, ĊĠĠĠ Ġval ĠdefaultValue Provider : ĠDefault Value Provider < T Program >, ĊĠĠĠ Ġval Ġfitness Function Provider : ĠF itness Function Provider < T Program , ĠT Output , ĠT Target >, ĊĠĠĠ Ġval Ġresult Aggregator : ĠResult Aggregator < T Program >? Ġ= Ġnull , ĊĠĠĠ Ġval Ġrandom State Seed : ĠLong ? Ġ= Ġnull Ċ ) Ċ Ċ /** Ċ Ġ* ĠA Ġcentral Ġrepository Ġfor Ġcore Ġcomponents Ġmade Ġavailable Ġto Ġthe ĠL GP Ġsystem . Ċ Ġ* Ċ Ġ* ĠAn Ġenvironment Ġshould Ġbe Ġbuilt Ġby Ġproviding Ġthe Ġcorrect Ġcomponents . ĠThe Ġenvironment Ġwill Ċ Ġ* Ġmaintain Ġthese Ġcomponents Ġso Ġthat Ġcan Ġbe Ġaccessed Ġby Ġthe ĠL GP Ġsystem Ġfrom Ġwhere ver Ġthey Ġare Ġneeded . Ċ Ġ* Ċ Ġ* ĠThe Ġcomponents Ġrequired Ġby Ġthe Ġenvironment Ġare Ġsplit Ġinto Ġthree Ġcategories : Ċ Ġ* Ċ Ġ* Ġ 1 . ĠCon struction Ġcomponents : ĠGiven Ġto Ġan Ġenvironment Ġat Ġconstruction Ġtime . Ċ Ġ* Ġ 2 . ĠInitial isation Ġcomponents : ĠResolved Ġinternally Ġgiven Ġvalid Ġconstruction Ġcomponents . Ċ Ġ* Ġ 3 . ĠRegistered Ġcomponents : ĠResolved Ġmanually Ġby Ġregistering Ġwith Ġan Ġenvironment Ġafter Ġconstruction . Ċ Ġ* Ċ Ġ* ĠAfter Ġan Ġenvironment Ġis Ġbuilt Ġand Ġall Ġcomponents Ġare Ġresolved , Ġit Ġcan Ġbe Ġused Ġto Ġinitiate Ġthe Ġcore Ċ Ġ* Ġevolution Ġprocess Ġof ĠL GP . Ċ Ġ* Ċ Ġ* Ġ@ param Ġspecification ĠA Ġspecification Ġfor Ġan Ġ[ Environment ]. Ċ Ġ* Ġ@ constructor ĠBuilds Ġan Ġ[ Environment ] Ġfrom Ġthe Ġgiven Ġ[ Environment Specification ]. Ċ Ġ*/ Ċ class ĠEnvironment < T Program , ĠT Output Ġ: ĠOutput < T Program >, ĠT Target Ġ: ĠTarget < T Program >>( ĊĠĠĠ Ġprivate Ġval Ġspecification : ĠEnvironment Specification < T Program , ĠT Output , ĠT Target > Ċ ) ĊĠĠĠ Ġ: ĠEnvironment Facade < T Program , ĠT Output , ĠT Target > Ġ{ ĊĊĠĠĠ Ġ// ĠThese Ġdependencies Ġare Ġgenerally Ġinitial ised Ġwhen Ġthe Ġenvironment Ġis Ġconstructed . ĊĠĠĠ Ġ// ĠAccess Ġto Ġthese Ġare Ġmod erated Ġthrough Ġthe ĠEnvironment Facade . ĊĠĠĠ Ġprivate Ġval Ġconfiguration Loader : ĠConfiguration Loader ĊĠĠĠ Ġprivate Ġval Ġconstant Loader : ĠConstant Loader < T Program > ĊĠĠĠ Ġprivate Ġval Ġoperation Loader : ĠOperation Loader < T Program > ĊĠĠĠ Ġprivate Ġval ĠdefaultValue Provider : ĠDefault Value Provider < T Program > ĊĠĠĠ Ġprivate Ġval Ġrandom State Seed : ĠLong ? ĊĠĠĠ Ġprivate Ġvar Ġcontainer : ĠModule Container < T Program , ĠT Output , ĠT Target > ĊĊĠĠĠ Ġ// ĠThe Ġpublic Ġenvironment Ġinterface ĊĠĠĠ Ġ// ĠSome Ġdependencies Ġare Ġinitial ised Ġlate Ġas Ġthey Ġare Ġcreated Ġduring Ġthe Ġenvironment Ġconstruction . ĊĠĠĠ Ġoverride Ġval Ġrandom State : ĠRandom ĊĠĠĠ Ġoverride Ġval Ġfitness Function Provider : ĠF itness Function Provider < T Program , ĠT Output , ĠT Target > ĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġconfiguration : ĠConfiguration ĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġconstants : ĠList < T Program > ĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġoperations : ĠList < Operation < T Program >> ĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġregister Set : ĠRegister Set < T Program > ĊĠĠĠ Ġoverride Ġval Ġresult Aggregator : ĠResult Aggregator < T Program > ĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġmodule Factory : ĠModule Factory < T Program , ĠT Output , ĠT Target > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġan Ġenvironment Ġwith Ġthe Ġspecified Ġconstruction Ġcomponents . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġconfiguration Loader ĠA Ġcomponent Ġthat Ġcan Ġload Ġconfiguration Ġinformation . ĊĠĠĠĠ Ġ* Ġ@ param Ġconstant Loader ĠA Ġcomponent Ġthat Ġcan Ġload Ġconstants . ĊĠĠĠĠ Ġ* Ġ@ param Ġoperation Loader ĠA Ġcomponent Ġthat Ġcan Ġload Ġoperations Ġfor Ġthe ĠL GP Ġsystem . ĊĠĠĠĠ Ġ* Ġ@ param ĠdefaultValue Provider ĠA Ġcomponent Ġthat Ġprovides Ġdefault Ġvalues Ġfor Ġthe Ġregisters Ġin Ġthe Ġregister Ġset . ĊĠĠĠĠ Ġ* Ġ@ param Ġfitness Function Provider ĠA Ġfunction Ġused Ġto Ġevaluate Ġthe Ġfitness Ġof ĠL GP Ġprograms . ĊĠĠĠĠ Ġ* Ġ@ param Ġrandom State Seed ĠSets Ġthe Ġseed Ġof Ġthe Ġrandom Ġnumber Ġgenerator . ĠIf Ġa Ġvalue Ġis Ġgiven , Ġthe Ġseed Ġwill ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ Ġbe Ġset , Ġand Ġwill Ġproduce Ġdeterministic Ġruns . ĠIf Ġnull Ġis Ġgiven , Ġa Ġrandom Ġseed Ġwill Ġbe Ġchosen . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated (" This Ġconstructor Ġis Ġdeprecated .", ĠReplace With (" Environment ( specification )", Ġ" nz . co . j ed sim son . lg p . core . environment "), ĠDeprec ation Level . WARNING ) ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġconfiguration Loader : ĠConfiguration Loader , ĊĠĠĠĠĠĠĠ Ġconstant Loader : ĠConstant Loader < T Program >, ĊĠĠĠĠĠĠĠ Ġoperation Loader : ĠOperation Loader < T Program >, ĊĠĠĠĠĠĠĠ ĠdefaultValue Provider : ĠDefault Value Provider < T Program >, ĊĠĠĠĠĠĠĠ Ġfitness Function Provider : ĠF itness Function Provider < T Program , ĠT Output , ĠT Target >, ĊĠĠĠĠĠĠĠ Ġresult Aggregator : ĠResult Aggregator < T Program >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġrandom State Seed : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: Ġthis ( Environment Specification ( ĊĠĠĠĠĠĠĠ Ġconfiguration Loader Ġ= Ġconfiguration Loader , ĊĠĠĠĠĠĠĠ Ġconstant Loader Ġ= Ġconstant Loader , ĊĠĠĠĠĠĠĠ Ġoperation Loader Ġ= Ġoperation Loader , ĊĠĠĠĠĠĠĠ ĠdefaultValue Provider Ġ= ĠdefaultValue Provider , ĊĠĠĠĠĠĠĠ Ġfitness Function Provider Ġ= Ġfitness Function Provider , ĊĠĠĠĠĠĠĠ Ġresult Aggregator Ġ= Ġresult Aggregator , ĊĠĠĠĠĠĠĠ Ġrandom State Seed Ġ= Ġrandom State Seed ĊĠĠĠ Ġ)) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠDi agnostics . trace (" Environment : construction - start ") ĊĊĠĠĠĠĠĠĠ Ġthis . configuration Loader Ġ= Ġthis . specification . configuration Loader ĊĠĠĠĠĠĠĠ Ġthis . constant Loader Ġ= Ġthis . specification . constant Loader ĊĠĠĠĠĠĠĠ Ġthis . operation Loader Ġ= Ġthis . specification . operation Loader ĊĠĠĠĠĠĠĠ Ġthis . defaultValue Provider Ġ= Ġthis . specification . defaultValue Provider ĊĠĠĠĠĠĠĠ Ġthis . fitness Function Provider Ġ= Ġthis . specification . fitness Function Provider ĊĠĠĠĠĠĠĠ Ġthis . random State Seed Ġ= Ġthis . specification . random State Seed ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġresult Ġag gregator Ġis Ġprovided Ġthen Ġuse Ġthe Ġdefault Ġag gregator Ġwhich Ġdoesn 't Ġcollect Ġresults . ĊĠĠĠĠĠĠĠ Ġthis . result Aggregator Ġ= Ġthis . specification . result Aggregator Ġ?: ĠResult Ag greg ators . Default Result Aggregator () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġwhether Ġwe Ġneed Ġto Ġseed Ġthe ĠR NG Ġor Ġnot . ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this . random State Seed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġthis . random State Ġ= ĠRandom ( this . random State Seed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠ Ġ-> Ġthis . random State Ġ= ĠRandom . Default ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠEmpty Ġmodule Ġcontainer Ġto Ġbegin ĊĠĠĠĠĠĠĠ Ġthis . container Ġ= ĠModule Container ( modules Ġ= Ġmutable Map Of ()) ĊĠĠĠĠĠĠĠ Ġthis . module Factory Ġ= ĠC aching Module Factory ( this . container ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠK ick Ġoff Ġinitial isation ĊĠĠĠĠĠĠĠ ĠDi agnostics . trace With Time (" Environment : initial ise ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . initial ise () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠDi agnostics . trace (" Environment : construction - end ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialise () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġcomponents Ġeach Ġloader Ġis Ġresponsible Ġfor . ĊĠĠĠĠĠĠĠ Ġthis . configuration Ġ= ĠDi agnostics . trace With Time (" Environment : initial ise - configuration ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . configuration Loader . load () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . constants Ġ= ĠDi agnostics . trace With Time (" Environment : initial ise - constants ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . constant Loader . load () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . operations Ġ= ĠDi agnostics . trace With Time (" Environment : initial ise - operations ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . operation Loader . load () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠEarly Ġexit Ġif Ġthe Ġconfiguration Ġprovided Ġis Ġinvalid ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġconfig Validity Ġ= Ġthis . configuration . isValid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConfiguration Validity . Invalid Ġ-> Ġthrow ĠInvalid ConfigurationException ( config Validity . reason ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ/* ĠNo - op Ġ*/ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠInstead Ġof Ġinitial ising , Ġallow Ġuser Ġto Ġregister ? ĊĠĠĠĠĠĠĠ ĠDi agnostics . trace With Time (" Environment : initial ise - register - set ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . initial ise Register Set () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthe Ġmodules Ġhave Ġaccess Ġto Ġthis Ġenvironment . ĊĠĠĠĠĠĠĠ Ġthis . container . environment Ġ= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialise Register Set () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġenvironment Ġtakes Ġcare Ġof Ġits Ġown Ġbase Ġregister Ġset Ġthat Ġis Ġnot Ġmodified Ġby Ġprograms . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġthat Ġanything Ġthat Ġcan Ġaccess Ġthe Ġenvironment Ġhas Ġaccess Ġto Ġa Ġblank Ġregister Ġset . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠPass Ġenvironment Ġto Ġregister Ġset Ġand Ġmake Ġit Ġa Ġdependency Ġthat Ġmust Ġbe Ġregistered . ĊĊĠĠĠĠĠĠĠ Ġthis . register Set Ġ= ĠArray Register Set ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Registers Ġ= Ġthis . configuration . num Features , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculation Registers Ġ= Ġthis . configuration . num Calculation Registers , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstants Ġ= Ġthis . constants , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue Provider Ġ= Ġthis . defaultValue Provider ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister Modules ( container : ĠModule Container < T Program , ĠT Output , ĠT Target >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . container Ġ= Ġcontainer ĊĠĠĠĠĠĠĠ Ġthis . module Factory Ġ= ĠC aching Module Factory ( this . container ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġcontainers Ġenvironment Ġdependency . ĊĠĠĠĠĠĠĠ Ġthis . container . environment Ġ= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister Module ( type : ĠRegistered Module Type , Ġbuilder : Ġ( Environment Facade < T Program , ĠT Output , ĠT Target >) Ġ-> ĠModule ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . container . modules [ type ] Ġ= Ġbuilder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIt Ġshould Ġbe Ġnoted Ġthat Ġbecause Ġan Ġenvironment Ġinstance Ġhas Ġits Ġown ĠR NG Ġassociated Ġwith Ġit , ĊĠĠĠĠ Ġ* Ġwhen Ġmaking Ġa Ġcopy , Ġit Ġis Ġrequired Ġthat Ġthe Ġcopied Ġenvironment Ġhave Ġits Ġown ĠR NG Ġtoo . ĊĠĠĠĠ Ġ* ĠTo Ġful fil Ġthis Ġrequirement , Ġwhen Ġan Ġenvironment Ġis Ġcopied , Ġit Ġwill Ġinitialise Ġa Ġnew ĠR NG Ġthat Ġis ĊĠĠĠĠ Ġ* Ġsee ded Ġwith Ġa Ġseed Ġgiven Ġfrom Ġthe ĠR NG Ġof Ġthe Ġenvironment Ġinstance Ġperforming Ġthe Ġcopy Ġ( conf using Ġ-- Ġyes ! ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġmain Ġreason Ġbehind Ġthis Ġcomp lication Ġis Ġto Ġensure Ġthat Ġthere Ġare Ġno Ġcontent ion Ġissues Ġwhen Ġmultiple ĊĠĠĠĠ Ġ* Ġenvironment Ġinstances Ġare Ġoperating Ġin Ġa Ġmulti - threaded Ġcontext Ġ( e . g . Ġthrough Ġa Ġ[ Distributed Trainer ]). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFurthermore , Ġany Ġmodules Ġthat Ġare Ġregistered Ġwith Ġthe Ġenvironment Ġbeing Ġcopied , Ġwill Ġbe Ġupdated Ġso ĊĠĠĠĠ Ġ* Ġthat Ġthe Ġreference Ġthe Ġcorrect Ġenvironment Ġinstance Ġ( i . e . Ġthe Ġcopy ). ĠThis Ġensures Ġthat Ġwhile Ġthe ĊĠĠĠĠ Ġ* Ġmodule Ġregist rations Ġthemselves Ġare Ġshared Ġbetween Ġcopies , Ġwhen Ġa Ġmodule Ġis Ġaccessed , Ġit Ġgets Ġinitial ised ĊĠĠĠĠ Ġ* Ġcorrectly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠEnvironment < T Program , ĠT Output , ĠT Target > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġa Ġcopy Ġwith Ġthe Ġcorrect Ġconstruction / initial ised Ġcomponents . ĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠEnvironment ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnvironment Specification ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . configuration Loader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . constant Loader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . operation Loader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . defaultValue Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fitness Function Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result Aggregator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . random State . next Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow , Ġthe Ġtricky Ġpart . ĠWe Ġhave Ġto Ġensure Ġthat Ġthe Ġcontainers Ġmodules ĊĠĠĠĠĠĠĠ Ġ// Ġhave Ġa Ġreference Ġto Ġthe Ġcopied Ġenvironment , Ġand Ġnot Ġthe Ġold Ġenvironment . ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠModule Container ( this . container . modules ) ĊĠĠĠĠĠĠĠ Ġcontainer . environment Ġ= Ġcopy ĊĊĠĠĠĠĠĠĠ Ġcopy . register Modules ( container ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġalso Ġneed Ġto Ġclear Ġany Ġcached Ġmodules , Ġjust Ġin Ġcase Ġthere Ġare Ġany Ġreferences ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġthe Ġprevious Ġenvironment Ġlay ing Ġaround . ĠGener ally , Ġany Ġenvironment Ġinstances ĊĠĠĠĠĠĠĠ Ġ// Ġwould Ġbe Ġcopied Ġbefore Ġmodules Ġare Ġaccessed Ġ-- Ġbut Ġit Ġdoesn 't Ġh urt Ġto Ġbe Ġc aut ious ! ĊĠĠĠĠĠĠĠ Ġcopy . module Factory Ġ= ĠC aching Module Factory ( container ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠ Ġ} Ċ } Ċ