/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġem u fog Ġcontributors Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġem u fog . fog Ċ Ċ import Ġem u fog . container . Fog Container Ċ import Ġem u fog . graph . Node Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠA Ġbase Ġnode Ġtracks Ġconnections Ġfrom Ġstarting Ġnodes Ġin Ġthe Ġgraph Ġup Ġto Ġthis Ġnode . ĠTherefore Ġall Ġsuch Ġconnections Ġare Ċ Ġ* Ġstored Ġusing Ġthe Ġpre decessor Ġon Ġthe Ġpath Ġto Ġthis Ġnode Ġand Ġthe Ġoverall Ġcosts . ĠIt Ġcan Ġalso Ġbe Ġa Ġpossible Ġplacement Ġfor Ċ Ġ* Ġa Ġfog Ġnode . Ċ Ġ* Ċ Ġ* Ġ@ property Ġnode Ġthe Ġnode Ġin Ġthe Ġoriginal Ġgraph Ġmodel Ċ Ġ*/ Ċ internal Ġopen Ġclass ĠBase Node ( internal Ġval Ġnode : ĠNode ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( Base Node :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmapping Ġof Ġstarting Ġnodes Ġto Ġtheir Ġrespective Ġtuple Ġof Ġpre decessor Ġin Ġthe Ġpath Ġand Ġthe Ġoverall Ġconnection Ġcosts ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcosts : ĠMutable Map < Starting Node , ĠFloat > Ġ= ĠHashMap () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġindicator Ġif Ġthe Ġconnections Ġhave Ġbeen Ġupdated Ġand Ġtherefore Ġneeds Ġto Ġbe Ġre evalu ated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġmodified Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġthe Ġfog Ġtype Ġwith Ġthe Ġoptimal Ġcosts , Ġdevice Ġcount Ġr ation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtype : ĠF og Container ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġnumber Ġof Ġdevices Ġcovered Ġby Ġthis Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcovered Count Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġaverage Ġconnection Ġcosts Ġof Ġall Ġassociated Ġconnections ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġaverage Connection Cost s Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġstarting Ġnodes Ġthis Ġnode Ġis Ġconnected Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġstarting Nodes : ĠSet < Starting Node > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcosts . keys ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġaverage Ġdeployment Ġcosts Ġfor Ġall Ġedge Ġnodes Ġconnected Ġto Ġthis Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġaverage Deployment Cost s : ĠFloat ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcalc Average Deployment Cost s () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġconnection Ġcosts Ġfor Ġthe Ġgiven Ġstarting Ġnode . ĠIf Ġthis Ġnode Ġis Ġnot Ġconnected Ġto Ġthe Ġgiven Ġnode ĊĠĠĠĠ Ġ* Ġ` null ` Ġis Ġreturned . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġnode Ġto Ġretrieve Ġconnection Ġcosts Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġconnection Ġcosts Ġfor Ġthe Ġgiven Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġget Cost s ( node : ĠStarting Node ): ĠFloat ? Ġ= Ġcosts [ node ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġconnection Ġcosts Ġfor Ġa Ġpath Ġfrom Ġthe Ġgiven Ġstarting Ġnode Ġto Ġthis Ġnode . ĠRequires Ġthe Ġpre decessor Ġon Ġthe ĊĠĠĠĠ Ġ* Ġpath Ġand Ġthe Ġconnection Ġcosts . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġstarting Ġnode Ġin Ġthe Ġconnection Ġpath ĊĠĠĠĠ Ġ* Ġ@ param Ġcosts Ġconnection Ġcosts ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġset Cost s ( node : ĠStarting Node , Ġcosts : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . costs [ node ] Ġ= Ġcosts ĊĠĠĠĠĠĠĠ Ġcalculate Average Connection Cost s () ĊĠĠĠĠĠĠĠ Ġnode . add Possible Node ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġthere Ġare Ġconnections Ġto Ġthis Ġnode Ġare Ġavailable Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġconnections Ġare Ġavailable , Ġ` false ` Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġhas Connections (): ĠBoolean Ġ= Ġcosts . isNotEmpty () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġall Ġcovered Ġstarting Ġnodes Ġby Ġthis Ġnode . ĠThe Ġlist Ġcontains Ġof Ġa Ġtuple Ġof Ġthe Ġstarting Ġnode ĊĠĠĠĠ Ġ* Ġthat Ġis Ġcovered Ġand Ġthe Ġnumber Ġof Ġdevices Ġthat Ġare Ġcovered Ġby Ġthis Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġcovered Ġstarting Ġnode Ġand Ġtheir Ġrespective Ġdevice Ġcount ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġget Cover ed Starting Nodes (): ĠList < Pair < Starting Node , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsort Ġthe Ġconnections Ġbased Ġon Ġtheir Ġconnection Ġcosts Ġin Ġascending Ġorder ĊĠĠĠĠĠĠĠ Ġval Ġstarting Nodes Ġ= Ġcosts . keys . sorted By Ġ{ Ġcosts [ it ] !! Ġ}. map Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Pair < Starting Node , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġvar Ġremaining Ġ= Ġcovered Count ĊĊĠĠĠĠĠĠĠ Ġ// Ġpick Ġstarting Ġnodes Ġg reedy Ġthat Ġadd Ġup Ġto Ġcovered Count ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġstarting Nodes . size Ġ&& Ġremaining Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġstarting Nodes [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( node Ġto Ġmin ( remaining , Ġnode . device Count )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Ġ-= Ġnode . device Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġthe Ġgiven Ġstarting Ġnode Ġfrom Ġthe Ġlist Ġof Ġpossible Ġconnections . ĠUpdates Ġ[. modified ] Ġaccording Ġto Ġthe ĊĠĠĠĠ Ġ* Ġoutcome Ġof Ġthe Ġdelete . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġstarting Ġnode Ġto Ġdelete Ġthe Ġconnection Ġfor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġremove Starting Node ( node : ĠStarting Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodified Ġ= Ġcosts . remove ( node ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( modified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Average Connection Cost s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġa Ġnew Ġoptimal Ġfog Ġtype Ġfor Ġthis Ġnode . ĠOpt imal Ġsolutions Ġare Ġcalculated Ġby Ġthe Ġratio Ġof Ġ[ Fog Container . costs ] ĊĠĠĠĠ Ġ* Ġand Ġthe Ġnumber Ġof Ġconnections Ġto Ġthat Ġnode . ĠUpdates Ġthe Ġ[. modified ] Ġto Ġ` false ` Ġonce Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfog Types Ġcollection Ġof Ġpossible Ġfog Ġtypes Ġto Ġassign ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind Fog Type ( fog Types : ĠCollection < Fog Container >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġskip Ġre assign ing Ġon Ġnon Ġmodified Ġnodes ĊĠĠĠĠĠĠĠ Ġif Ġ(! modified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcovered Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcosts Per Connection Ġ= ĠFloat . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġval Ġdevice Count Ġ= Ġcosts . keys . sum By Ġ{ Ġit . device Count Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( fog Type Ġin Ġfog Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnections Ġ= Ġmin ( device Count , Ġfog Type . max Clients ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connections Ġ!= Ġ 0 Ġ&& Ġfog Type . costs Ġ/ Ġconnections Ġ< Ġcosts Per Connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġfog Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcovered Count Ġ= Ġconnections ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcosts Per Connection Ġ= Ġfog Type . costs Ġ/ Ġconnections ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠcheckNotNull ( type ) Ġ{ Ġ" The Ġnode 's Ġtype Ġis Ġnull ." Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( covered Count Ġ> Ġ 0 ) Ġ{ Ġ" No Ġnode Ġis Ġcovered Ġby Ġthis Ġbase Ġnode " Ġ} ĊĊĠĠĠĠĠĠĠ ĠLOG . debug (" Set Ġthe Ġfog Ġtype Ġfor Ġ{} Ġto Ġ{}", Ġnode , Ġtype ) ĊĠĠĠĠĠĠĠ Ġmodified Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPre - calcul ates Ġthe Ġaverage Ġconnection Ġcosts Ġfor Ġall Ġpossible Ġconnections Ġand Ġsets Ġthe Ġ[ average Connection Cost s ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcalculate Average Connection Cost s () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( costs . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaverage Connection Cost s Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġcosts . values . sum By Double Ġ{ Ġit . toDouble () Ġ} ĊĠĠĠĠĠĠĠ Ġaverage Connection Cost s Ġ= Ġ( sum Ġ/ Ġcosts . size ). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe Ġaverage Ġdeployment Ġcosts Ġfor Ġthis Ġbase Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġaverage Ġdeployment Ġcosts ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcalc Average Deployment Cost s (): ĠFloat ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġnull Ġ|| Ġcovered Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtype !!. costs Ġ/ Ġcovered Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠBase Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnode Ġ== Ġother . node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġnode . hashCode () Ċ } Ċ