package Ġedu . p itt . cs 3 7 2 0 . scheduling Ċ Ċ import Ġedu . p itt . cs 3 7 2 0 . scheduling . framework .* Ċ import Ġedu . p itt . cs 3 7 2 0 . scheduling . framework . des . Controller Ċ import Ġedu . p itt . cs 3 7 2 0 . scheduling . framework . des . Event Ċ import Ġedu . p itt . cs 3 7 2 0 . scheduling . framework . util . Sorted ArrayList Ċ import Ġedu . p itt . cs 3 7 2 0 . scheduling . framework . util . duplicate Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ class ĠE DF Predict ive Scheduler : ĠScheduler () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġestimated Completion Times Ġ= Ġmutable Map Of < Device , ĠLong >() ĊĠĠĠ Ġprivate Ġval Ġfailure Rates Ġ= Ġmutable Map Of < Device , ĠFailure Rate Tracker >() ĊĠĠĠ Ġprivate Ġval Ġavailable Devices Ġ= ĠSorted ArrayList < Device >( Comparator Ġ{ Ġlhs , Ġrhs Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠSorted Ġin Ġde creasing Ġorder Ġof Ġcapability ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlhs . capability Ġ< Ġrhs . capability Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlhs . capability Ġ> Ġrhs . capability Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĊĠĠĠ Ġoverride Ġfun Ġdevice Online ( device : ĠDevice ) Ġ{ ĊĠĠĠĠĠĠĠ Ġavailable Devices . add ( device ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! failure Rates . containsKey ( device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Rates [ device ] Ġ= ĠFailure Rate Tracker () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdevice Offline ( device : ĠDevice , Ġjob : ĠJob ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġavailable Devices . remove ( device ) ĊĠĠĠĠĠĠĠ Ġif Ġ( job Ġ!= Ġnull ) Ġfailure Rates [ device ]?. increment Failed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdevice Lost ( device : ĠDevice , Ġjob : ĠJob ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġavailable Devices . remove ( device ) ĊĠĠĠĠĠĠĠ Ġif Ġ( job Ġ!= Ġnull ) Ġfailure Rates [ device ]?. increment Failed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġschedule Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġgoing Ġto Ġcreate Ġa Ġrank Ġof Ġsuitable Ġavailable Ġdevices Ġfor Ġevery Ġjob Ġgiven Ġa Ġfew Ġmetrics : ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ+ ĠDead line : Ġwe Ġwant Ġto Ġtry Ġto Ġschedule Ġjobs Ġwith Ġearlier Ġdead lines Ġfirst ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ+ ĠSize : Ġwe Ġwant Ġto Ġget Ġas Ġmuch Ġwork Ġdone Ġas Ġwe Ġpossibly Ġcan ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ+ ĠRel i ability : Ġwe 'd Ġlike Ġto Ġschedule Ġmore Ġwork Ġon Ġmore Ġreliable Ġdevices ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ+ ĠHow Ġlong Ġit Ġwill Ġtake Ġin Ġidle Ġvs Ġnon - idle Ġdevices : Ġdoes Ġit Ġmake Ġsense Ġto Ġwait Ġuntil Ġnon - idle Ġdevices Ġbecome Ġidle ? ĊĠĠĠĠĠĠĠ Ġval Ġjob Device Map Ġ= Ġmutable Map Of < Job , ĠMutable List < Device >>() ĊĊĠĠĠĠĠĠĠ Ġval Ġjobs D upe Ġ= Ġjobs . duplicate (). sorted By Ġ{ Ġit . deadline Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( job Ġin Ġjobs D upe ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġ 2 0 0 Ġhere Ġis Ġto Ġaccount Ġfor ĠR TT s Ġand Ġsuch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired Capability Ġ= Ġjob . size Ġ/ Ġ( job . deadline - Controller . currentTimeMillis ()+ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Device Map [ job ] Ġ= Ġmutable ListOf < Device >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( device Ġin Ġavailable Devices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġto Ġfilter Ġout Ġdevices Ġthat Ġwould Ġmiss Ġthe Ġdeadline Ġif Ġwe Ġwait Ġuntil Ġthey Ġbecome Ġidle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! device . is Idle ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskip Ġ= Ġestimated Completion Times [ device ]?. let Ġ{ Ġidle Time Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice . capability Ġ< Ġjob . size Ġ/ Ġ( job . deadline Ġ- Ġidle Time Ġ+ Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠRuntimeException (" is Idle () Ġand ĠE TA Ġtracking Ġdis agree ") Ġ// Ġ<- Ġthis Ġshouldn 't Ġhappen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġwant Ġto Ġschedule Ġin Ġdevices Ġthat Ġare Ġcapable Ġenough ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġmargin ally Ġbetter Ġthan Ġa Ġfilter Ġbecause Ġwe Ġknow Ġthe Ġlist Ġis Ġordered ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcould Ġdo Ġbinary Ġsearch , Ġbut ĠI Ġcan 't Ġbe Ġbother ed ; Ġthis Ġis Ġjust Ġa Ġsimulation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAny who , Ġif Ġthe Ġdevice Ġdoesn 't Ġmeet Ġthe Ġrequired Ġcapability Ġwe Ġknow Ġthe Ġrest Ġof Ġthem Ġwon 't ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device . capability Ġ< Ġrequired Capability ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Device Map [ job ]?. add ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Device Map [ job ]?. sort With ( Device Rank ( job )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġschedule Ġpriorit izing Ġrank Ġchoices Ġfor Ġjobs Ġwith Ġthe Ġear liest Ġdeadline ĊĠĠĠĠĠĠĠ Ġfor Ġ( job Ġin Ġjobs D upe ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Device Map [ job ]?. let Ġ{ Ġdevices Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġmay Ġnot Ġbe Ġenough Ġdevices Ġto Ġassign Ġjobs Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( devices . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreferred Device Ġ= Ġdevices [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan Ġonly Ġschedule Ġif Ġthe Ġdevice Ġis Ġidle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( preferred Device . is Idle ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschedule ( job , Ġpreferred Device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Rates [ preferred Device ]?. increment Assigned () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġestimated Completion Times [ preferred Device ] Ġ= ĠController . currentTimeMillis () Ġ+ Ġjob . size Ġ/ Ġpreferred Device . capability ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġtrying Ġto Ġremove Ġthe Ġdevice Ġfrom Ġall Ġother Ġjobs ' Ġpriority Ġlists ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġbecause Ġwe 're Ġre serving Ġthat Ġdevice Ġfor Ġthis Ġjob ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCan 't Ġcome Ġup Ġwith Ġa Ġbetter Ġname Ġfor Ġthese ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( job 2 Ġin Ġjobs D upe ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Device Map [ job 2 ]?. remove ( preferred Device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp ares Ġdevices Ġto Ġrun Ġa Ġjob Ġin . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinner Ġclass ĠDevice Rank ( private Ġval Ġjob : ĠJob ): ĠComparator < Device > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( lhs : ĠDevice , Ġrhs : ĠDevice ) Ġ= Ġrank ( lhs ). compareTo ( rank ( rhs )) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCome s Ġup Ġwith Ġa Ġrank Ġfor Ġa Ġ[ device ]. ĠThe Ġsmaller Ġthe Ġbetter . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrank ( device : ĠDevice ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! device . is Idle ()) Ġreturn ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Controller . currentTimeMillis () Ġ+ Ġjob . size Ġ/ Ġdevice . capability Ġ> Ġjob . deadline ) Ġreturn ĠInt . MAX _ VALUE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPrimary Ġmetric Ġis Ġthe Ġcapability Ġof Ġthe Ġdevice . ĠWe Ġwant Ġjust Ġenough Ġcapable Ġdevices Ġto Ġschedule Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcapability Ġ= Ġdevice . capability ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecondary Ġto Ġthat Ġis Ġthe Ġdevice Ġfailure Ġrate Ġdevices Ġwith Ġhigher Ġfailure Ġrates Ġwill Ġget Ġpen al ized ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġwant Ġto Ġtake Ġthis Ġnumber Ġvery Ġserious ly Ġuntil Ġwe Ġhave Ġgather ed Ġenough Ġdata Ġthough ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġjust Ġin Ġcase Ġa Ġdevice Ġgot Ġun luck y Ġin Ġthe Ġfirst Ġdice Ġroll ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfailure Rates [ device ]?. let Ġ{ Ġtracker Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tracker . total Jobs Assigned Ġ< Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfailure Rate Ġ= Ġif Ġ( 1 - tracker . failure Rate () Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNext Ġbest Ġthing ; Ġavoid Ġdiv iding Ġby Ġzero , Ġavoid Ġover Ġpen al izing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 9 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker . failure Rate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġfailure Ġrate Ġof Ġ 0 . 9 Ġshould Ġproduce Ġa Ġsmaller Ġmultip lic ative Ġpenalty Ġfactor Ġthan Ġ 0 . 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinverse Pen alty Factor Ġ= Ġ 1 /( 1 - failure Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcare Ġto Ġreduce Ġthe Ġfactor Ġon Ġtop Ġof Ġthe Ġunit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġinstance : Ġfor Ġa Ġfailure Ġrate Ġof Ġ 0 . 1 , Ġwe Ġget Ġa Ġfactor Ġof Ġ 1 . 1 , Ġbut Ġwe 're Ġonly Ġinterested Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġmit ig ating Ġthe Ġ 0 . 1 Ġon Ġtop Ġof Ġthe Ġ 1 Ġdue Ġto Ġa Ġlack Ġof Ġhistory ; Ġit 'd Ġbe Ġun fair Ġto Ġdivide Ġ 1 . 1 Ġby Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadjusted Inverse Pen alty Factor Ġ= Ġ 1 - inverse Pen alty Factor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġbigger Ġthe Ġhistory Ġthe Ġless Ġwe Ġcare Ġabout Ġmit ig ating Ġthe Ġadjusted Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġget Ġthe Ġactual Ġpenalty Ġfactor Ġby Ġadding Ġthe Ġone Ġback Ġto Ġthe Ġmit ig ated Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpenalty Factor Ġ= Ġ 1 Ġ+ Ġadjusted Inverse Pen alty Factor /( 1 0 - tracker . total Jobs Assigned ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġmod Ġthe Ġcapability Ġaccordingly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( capability Ġ* Ġpenalty Factor ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( capability Ġ* Ġ 1 /( 1 - tracker . failure Rate ())). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġcapability ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠFailure Rate Tracker ( ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Jobs Assigned : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Jobs Failed : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġincrement Failed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Jobs Failed ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġincrement Assigned () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Jobs Assigned ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfailure Rate () Ġ= Ġtotal Jobs Failed . toFloat ()/ total Jobs Assigned ĊĠĠĠ Ġ} Ċ } ĊĊĊ Ċ class ĠE DF Predict ive Simulation : ĠSimulation () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġscheduler Ġ= ĠE DF Predict ive Scheduler () ĊĠĠĠ Ġprivate Ġval Ġdevices : ĠList < Device > ĊĠĠĠ Ġprivate Ġval Ġevents : ĠList < Event > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdevices Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice ( scheduler , Ġ 1 0 0 0 , Ġ 1 . 1 f , Ġ 0 f , Ġ" Phone Ġ 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice ( scheduler , Ġ 5 0 0 , Ġ 1 f , Ġ 0 f , Ġ" Phone Ġ 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice ( scheduler , Ġ 2 0 0 0 , Ġ 1 . 0 5 f , Ġ 0 . 0 5 f , Ġ" Phone Ġ 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice ( scheduler , Ġ 4 0 0 0 , Ġ 1 . 3 f , Ġ 0 f , Ġ" Phone Ġ 4 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice ( scheduler , Ġ 2 0 0 0 , Ġ 1 . 1 5 f , Ġ 0 . 1 5 f , Ġ" Phone Ġ 5 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevents Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaw ake Event ( 5 0 , Ġdevices [ 0 ]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep Event ( TimeUnit . SECONDS . to Millis ( 1 0 ), Ġdevices [ 0 ]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaw ake Event ( TimeUnit . SECONDS . to Millis ( 1 5 ), Ġdevices [ 0 ]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaw ake Event ( 1 0 0 , Ġdevices [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaw ake Event ( 1 5 0 , Ġdevices [ 2 ]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaw ake Event ( 2 0 0 , Ġdevices [ 3 ]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaw ake Event ( 2 5 0 , Ġdevices [ 4 ]) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġscheduler () Ġ= Ġscheduler ĊĠĠĠ Ġoverride Ġfun Ġdevices () Ġ= Ġdevices ĊĠĠĠ Ġoverride Ġfun Ġsetup Events () Ġ= Ġevents ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠFor Ġthe Ġonline - offline Ġexperiment . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// Ġoverride Ġfun Ġjob Generator () Ġ= ĠJob Generator . Fixed ( scheduler , ĠJob Runs . offline Setup Run ()) Ċ } Ċ