package Ġthe od ol ite . str ategies . search strategy Ċ Ċ import Ġmu . Kotlin Logging Ċ import Ġthe od ol ite . execution . Benchmark Executor Ċ import Ġthe od ol ite . util . Load Dimension Ċ import Ġthe od ol ite . util . Resource Ċ import Ġthe od ol ite . util . Results Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ /** Ċ Ġ* Ġ ĠSearch Ġstrategy Ġimplementation Ġfor Ġdetermining Ġthe Ġsmallest Ġsuitable Ġresource Ġdemand . Ċ Ġ* Ġ ĠStarting Ġwith Ġa Ġresource Ġamount Ġprovided Ġby Ġa Ġguess Ġstrategy . Ċ Ġ* Ċ Ġ* Ġ@ param Ġbenchmark Executor ĠBenchmark Ġexecutor Ġwhich Ġruns Ġthe Ġindividual Ġbenchmarks . Ċ Ġ* Ġ@ param Ġguess Strategy ĠStrategy Ġthat Ġprovides Ġus Ġwith Ġa Ġguess Ġfor Ġthe Ġfirst Ġresource Ġamount . Ċ Ġ* Ġ@ param Ġresults Ġcurrent Ġresults Ġof Ġall Ġpreviously Ġperformed Ġbenchmarks . Ċ Ġ*/ Ċ class ĠInitial Guess Search Strategy ( benchmark Executor : ĠBenchmark Executor , Ġguess Strategy : ĠGu ess Strategy , Ġresults : ĠResults ) Ġ: ĊĠĠĠĠĠĠĠ ĠSearch Strategy ( benchmark Executor , Ġguess Strategy , Ġresults ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġfind Suit able Resource ( load : ĠLoad Dimension , Ġresources : ĠList < Resource >): ĠResource ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif ( resources . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" You Ġneed Ġto Ġspecify Ġresources Ġto Ġbe Ġchecked Ġfor Ġthe ĠInitial Guess Search Strategy Ġto Ġwork ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( guess Strategy Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Your ĠInitial Guess Search Strategy Ġdoesn 't Ġhave Ġa ĠGu ess Strategy . ĠThis Ġis Ġnot Ġsupported ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( results Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" The Ġresults Ġneed Ġto Ġbe Ġinitialized ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġvar Ġlast Low est Resource Ġ: ĠResource ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠGetting Ġthe Ġlast Low est Resource Ġfrom Ġresults Ġand Ġcalling Ġfirst Guess () Ġwith Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ(! results . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Load : ĠLoad Dimension ? Ġ= Ġthis . results . getMax Benchmark ed Load ( load ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Low est Resource Ġ= Ġthis . results . getMin Required Instances ( max Load ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Low est Resource . get () Ġ== ĠInt . MAX _ VALUE ) Ġlast Low est Resource Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlast Low est Resource Ġ= Ġthis . guess Strategy . first Guess ( resources , Ġlast Low est Resource ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( last Low est Resource Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresources ToCheck : ĠList < Resource > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex : ĠInt Ġ= Ġresources . indexOf ( last Low est Resource ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Running Ġexperiment Ġwith Ġload Ġ'${ load . get () }' Ġand Ġresources Ġ'${ last Low est Resource . get ()} '" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġfirst Ġexperiment Ġpasses , Ġstarting Ġdown ward Ġlinear Ġsearch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġstarting Ġup ward Ġlinear Ġsearch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . benchmark Executor . run Experiment ( load , Ġlast Low est Resource )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources ToCheck Ġ= Ġresources . sub List ( 0 , ĠstartIndex ). reversed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resources ToCheck . isEmpty ()) Ġreturn Ġlast Low est Resource ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Min : ĠResource Ġ= Ġlast Low est Resource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( res Ġin Ġresources ToCheck ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Running Ġexperiment Ġwith Ġload Ġ'${ load . get () }' Ġand Ġresources Ġ'${ res . get ()} '" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . benchmark Executor . run Experiment ( load , Ġres )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Min Ġ= Ġres ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Min ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resources . size Ġ<= ĠstartIndex Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info { Ġ" No Ġmore Ġresources Ġleft Ġto Ġcheck ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources ToCheck Ġ= Ġresources . sub List ( startIndex Ġ+ Ġ 1 , Ġresources . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( res Ġin Ġresources ToCheck ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Running Ġexperiment Ġwith Ġload Ġ'${ load . get () }' Ġand Ġresources Ġ'${ res . get ()} '" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . benchmark Executor . run Experiment ( load , Ġres )) Ġreturn Ġres ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Initial Guess Search Strategy Ġcalled Ġwithout Ġlast Low est Resource Ġvalue , Ġwhich Ġis Ġneeded Ġas Ġa Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" starting Ġpoint !" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ }