Topic Coverage
- Classes, Methods, Attributes and Methods
- Abstraction, Encapsulation, Inheritance and Polymorphism
- Collections
- Abstract Classes
- SOLID principles
- Generics
Please download the files needed for the examΒ here.
Problem Description
We are in the midst of a global crisis. SARS-CoV-2 (SARS CoronaVirus 2), the virus that causes COVID-19, has infected millions and killed thousands of people worldwide.
In Singapore, we have implemented two systems, SafeEntry and TraceTogether. Right now, you are a junior developer in the team that is developing theΒ DiseaseΒ OutbreakΒ ResponseΒ ManagementΒ System (DORMS), that brings both of these systems together. In addition, DORMS will automatically issue Stay-Home Notices (similar to a quarantine order).
The actual system needs a lot of time to develop. You’re in charge of completing a simulation of DORMS, which simulates how DORMS will operate when it has been implemented, and keeps track of statistics and the efficacy of the policies enacted.
The simulation environment of DORMS is extremely complex. As such, read the following explanations carefully.
The simulation
Viruses
In the simulation, there are three types of viruses. All viruses have some probability of mutating, and spread by creating another virus of the same type, or another virus of a different type (mutation). Here is how each virus spreads:
- AlphaCoronavirus: Every time it spreads, it has some probability of mutating into SARS-CoV-2. In the event that it doesn’t mutate, the virus will simply create another AlphaCoronavirus, but the probability of that new virus mutating is reduced by 10% (given byΒ SimulationParameters#VIRUS_MUTATION_PROBABILITY_REDUCTION).
- SARS-CoV-2: This is the target virus of the simulation, and this causes COVID-19. Every time it spreads, it has some probability of mutating into a BetaCoronavirus. In the event that it doesn’t mutate, the probability of that new virus mutating is also reduced by 10%.
- BetaCoronavirus: This virus has no probability of mutating. As such, every time it spreads, it simply creates another BetaCoronavirus.
People
Of course, people are the key of this simulation, who are the primary vectors of the viruses above. People can transmit (give out) viruses they have, and can be infected with (take in) viruses from a contact. This simulation concerns itself with two types of people:
- Person: Represents the average person like you and me. When transmitting viruses, the person will transmit all the viruses he/she is infected with.
- MaskedPerson: This person is wearing a mask. In the simulation, masks are 60% effective (given byΒ SimulationParameters#MASK_EFFECTIVENESS). This means that there is a 60% chance that at any given contact, no viruses will be transmitted. Likewise, there is a 60% chance that at any given contact, this person will not be infected with any virus.
DORMS
As a junior developer, you are not required to implement the full solution yourself. The higher level classes have already been implemented for you. All you need to do is to implement the concrete classes that represent different entities of the simulation. However, for clarity, the following explains how DORMS works and provides some specifications for you as you complete the implementation.
DORMS is essentially a combination of two existing solutions:
- SafeEntry: This is a system that allows users to check in and out of different locations. This allows us to keep track of all the contacts made in a location, to prevent and control the transmission of diseases and identify disease clusters. With SafeEntry, it is assumed that a person entering a location makes contact with everyone in that location, and diseases are spread via each contact.
- TraceTogether: This is a programme to enhance Singapore’s contact tracing efforts. The TraceTogether app is a mobile application that uses bluetooth to detect other nearby TraceTogether-enabled devices. On device detection, it is assumed that contact is made and diseases are spread via that contact.
Given these two systems, DORMS is a single platform that interacts with both of these systems for contact tracing. It allows users to check in to a location (viaΒ checkIn), check out of a location (viaΒ checkOut), keeps track of other contacts for TraceTogether (viaΒ contact). It also notes any person who presents with symptoms of respiratory illnesses (viaΒ presentSymptoms). DORMS will conduct a serological test on anyone who presents themselves with these symptoms, and take the necessary action if the person tests positive for the target virus (SARS-CoV-2). The following describes the action that needs to be taken by DORMS on a positive SARS-CoV-2 test:
- The person who tested positive will be given a 28-day Stay-Home-Notice and will not be allowed to leave their home during that period.
- All recent (14 days, orΒ SimulationParameters#TRACING_PERIOD) contacts made by this person will be served a 14-day (orΒ SimulationParameters#SHN_DURATION) Stay-Home-Notice as well.
However, the current implementation of DORMS does not support it, but thanks to SOLID principles, the developers of DORMS have made it open for extension, and it will be simple to implement this behaviour.
Your Task
You are given the incomplete implementation of the DORMS simulation. Your task is to complete the implementation of the missing classes.
After completing the program, you may run the DORMS simulation:
$ java Main
===== RUNNING SIMULATION =====
Mask policy not implemented and SHN not issued
===== STATISTICS =====
Infected population: 9
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy not implemented and SHN issued
===== STATISTICS =====
Infected population: 6
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy implemented and SHN not issued
===== STATISTICS =====
Infected population: 5
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy implemented and SHN issued
===== STATISTICS =====
Infected population: 4
Total Population: 19
===== SIMULATION COMPLETED =====
Or you can run the simulation in verbose mode by issuing theΒ -vΒ flag, such as by runningΒ java Main -v
This task is divided into several levels. Read through all the levels to see how the different levels are related. You are to completeΒ ALLΒ levels.
All the files given to you should not be modified. You may modify them for your own testing, but we will replace them to conduct our own tests on your solutions.
Level 1
Creating the immutableΒ VirusΒ class
The first thing we’d define is theΒ VirusΒ class, because most of the entities of this simulation relies on its implementation.
Define anΒ abstract VirusΒ class with the following specifications:
- The constructorΒ Virus(String name, double probabilityOfMutating)Β creates a newΒ VirusΒ object where it’s name isΒ nameΒ and probability of mutating upon spreading isΒ probabilityOfMutating.
- Virus spread(double random). This method causes the virus to spread, returning a new virus. It takes in aΒ randomΒ value as aΒ double. Essentially, ifΒ random <= probabilityOfMutating, then the virus mutates.
- The string representation of virus objects is shown in the jshell output
In addition, define the following concrete classes:
- AlphaCoronavirus. It’s constructor,Β AlphaCoronavirus(double probabilityOfMutating)Β initialises it withΒ nameΒ "Alpha Coronavirus".
CallingΒ spread(random)Β returns aΒ new SARS_CoV_2(this.probabilityOfMutating)Β ifΒ random <= this.probabilityOfMutating, otherwise, it will return aΒ new AlphaCoronavirus(this.probabilityOfMutating * SimulationParameters.VIRUS_MUTATION_PROBABILITY_REDUCTION).
- SARS_CoV_2. It’s constructor,Β SARS_CoV_2(double probabilityOfMutating)Β initialises it withΒ nameΒ "SARS-CoV-2"
CallingΒ spread(random)Β returns aΒ new BetaCoronavirus()Β ifΒ random <= this.probabilityOfMutating, otherwise, it will return a newΒ SARS_CoV_2(this.probabilityOfMutating * SimulationParameters.VIRUS_MUTATION_PROBABILITY_REDUCTION).
- BetaCoronavirus. It’s constructor takes no arguments, and automatically initialises withΒ 0.0Β as itsΒ probabilityOfMutating. When callingΒ betaCoronavirus.spread(random), it will always return aΒ new BetaCoronavirus()Β as it does not mutate.
Note the naming, especially withΒ SARS_CoV_2Β where we use a small ‘o’. Note that the name of the virus is spelt with – instead of _; we use _ as the name of the class instead, for obvious reasons.
$ jshell -q your_files_in_ascending_dependency_order < test1.jsh
jshell> new AlphaCoronavirus(0.5)
$.. ==> Alpha Coronavirus with 0.500 probability of mutating
jshell> new SARS_CoV_2(0.5)
$.. ==> SARS-CoV-2 with 0.500 probability of mutating
jshell> new BetaCoronavirus()
$.. ==> Beta Coronavirus with 0.000 probability of mutating
jshell> new AlphaCoronavirus(0.99).spread(0.99)
$.. ==> SARS-CoV-2 with 0.990 probability of mutating
jshell> new AlphaCoronavirus(0.99).spread(1)
$.. ==> Alpha Coronavirus with 0.891 probability of mutating
jshell> new SARS_CoV_2(0.5).spread(0.5)
$.. ==> Beta Coronavirus with 0.000 probability of mutating
jshell> new SARS_CoV_2(0.5).spread(0.51)
$.. ==> SARS-CoV-2 with 0.450 probability of mutating
jshell> new BetaCoronavirus().spread(0)
$.. ==> Beta Coronavirus with 0.000 probability of mutating
jshell> /exit
|
|
Level 2
Representing People
Now, we are going to implement anΒ immutableΒ PersonΒ class.
These are the specifications for theΒ PersonΒ class:
- The constructorΒ Person(String name)Β creates aΒ PersonΒ object where his/her name isΒ name
- List<Virus> transmit(double random)Β causes all the viruses in theΒ PersonΒ toΒ spread(random), where the resulting viruses are stored in aΒ List, which is returned.Β randomΒ is used to determine if each virus mutates or not.
- Person infectWith(List<Virus> listOfViruses, double random)Β returns a newΒ PersonΒ that represents the person being infected with theΒ listOfViruses.Β randomΒ is insignificant here because the viruses do not mutate before entering the human body, but only when exiting.
- boolean test(String name)Β checks if theΒ PersonΒ is infected with anyΒ VirusΒ where its name isΒ name.
- TheΒ StringΒ representation is simply theΒ Person‘s name.
$ jshell -q your_files_in_ascending_dependency_order < test2.jsh
jshell> Person illio = new Person("Illio");
jshell> Person phillmont = new Person("phillmont")
jshell> phillmont
phillmont ==> phillmont
jshell> illio.infectWith(List.of(new AlphaCoronavirus(1)), 0).test("Alpha Coronavirus");
$.. ==> true
jshell> Arrays.toString(illio.infectWith(List.of(new AlphaCoronavirus(1)), 0).transmit(1).toArray())
$.. ==> "[SARS-CoV-2 with 1.000 probability of mutating]"
jshell> List<Virus> l = illio.infectWith(List.of(new AlphaCoronavirus(0.5)), 0).transmit(1)
jshell> Arrays.toString(l.toArray())
$.. ==> "[Alpha Coronavirus with 0.450 probability of mutating]"
jshell> Arrays.toString(phillmont.infectWith(l, 1).transmit(1).toArray())
$.. ==> "[Alpha Coronavirus with 0.405 probability of mutating]"
jshell> Arrays.toString(phillmont.infectWith(l, 1).transmit(0).toArray())
$.. ==> "[SARS-CoV-2 with 0.450 probability of mutating]"
jshell> /exit
|
|
Level 3
Making Contact
Now we are going to get two people to contact each other and spread viruses.
Create anΒ immutableΒ ContactΒ class that keeps track of a contact between two people, and transmits viruses between them.
The following are the specifications of theΒ ContactΒ class:
- Contact(Person first, Person second, double time). This is the constructor which keeps the references of the two people in contact
- List<Person> transmit(double random)Β simultaneously transmits viruses between the two people in theΒ Contact, returning aΒ ListΒ of the resultingΒ PersonΒ objects. Note that the transmission and infection of viruses happen in parallel, meaning thatΒ aΒ infectsΒ bΒ at the same time thatΒ bΒ infectsΒ a.
For example, personΒ aΒ has aΒ AlphaCoronavirus with 1.000 probability of mutating.
personΒ bΒ has aΒ SARS-CoV-2 with a 1.000 probability of mutating.
After transmission, personΒ aΒ would have:
- Alpha Coronavirus with 1.000 probability of mutating
- a newly receivedΒ Beta Coronavirus with 0.000 probability of mutating
and personΒ bΒ would have:
- SARS-CoV-2 with a 1.000 probability of mutating
- a newly receivedΒ SARS-CoV-2 with a 1.000 probability of mutating.
- List<Person> getPeopleΒ this returns the people involved in theΒ Contact
- double timeOfContact(). This method simply returns the time of contact
Remember that cyclic dependencies are not allowed.
$ jshell -q your_files_in_ascending_dependency_order < test3.jsh
jshell> Person a = new Person("A").infectWith(List.of(new AlphaCoronavirus(1)), 1)
jshell> Person b = new Person("B").infectWith(List.of(new SARS_CoV_2(1)), 1)
jshell> Contact e = new Contact(a, b, 1)
jshell> e.transmit(1).get(0).test("Alpha Coronavirus")
$.. ==> true
jshell> e.transmit(1).get(0).test("SARS-CoV-2")
$.. ==> false
jshell> e.transmit(1).get(0).test("Beta Coronavirus")
$.. ==> true
jshell> e.transmit(1).get(1).test("Alpha Coronavirus")
$.. ==> false
jshell> e.transmit(1).get(1).test("SARS-CoV-2")
$.. ==> true
jshell> e.transmit(1).get(1).test("Beta Coronavirus")
$.. ==> false
jshell> Arrays.toString(e.getPeople().toArray())
$.. ==> "[A, B]"
jshell> e.timeOfContact()
$.. ==> 1.0
jshell> /exit
|
|
Level 4
Locations
So far, we’ve only dealt with contact tracing, and have yet to deal with SafeEntry’s cluster tracking. DORMS has specified anΒ immutableΒ LocationΒ class that keeps track of its occupants at any given time.
The following defines the specifications for theΒ LocationΒ class:
- Location(String name)Β creates a new emptyΒ Location
- List<Person> getOccupants. This essentially returns a list of all the occupants in theΒ Location.
- Location accept(Person person). This returns a newΒ LocationΒ which represents the original location acceptingΒ person.
- Location remove(String personName). This returns the newΒ LocationΒ object where theΒ PersonΒ whose name isΒ personNameΒ was removed from thisΒ Location.
- The String representation is simply its name.
$ jshell -q your_files_in_ascending_dependency_order < test4.jsh
jshell> Person mingsoon = new Person("Ming Soon")
jshell> Person longThePerson = new Person("Long")
jshell> Location l = new Location("LT19")
jshell> l
l ==> LT19
jshell> Arrays.toString(l.getOccupants().toArray())
$.. ==> "[]"
jshell> Arrays.toString(l.accept(mingsoon)
...> .getOccupants().toArray())
$.. ==> "[Ming Soon]"
jshell> Arrays.toString(l.accept(mingsoon)
...> .accept(longThePerson)
...> .getOccupants().toArray())
$.. ==> "[Ming Soon, Long]"
jshell> Arrays.toString(l.accept(mingsoon)
...> .accept(longThePerson)
...> .remove(mingsoon.toString())
...> .getOccupants().toArray())
$.. ==> "[Long]"
jshell> Arrays.toString(l.accept(mingsoon)
...> .accept(longThePerson)
...> .remove(mingsoon.toString())
...> .remove(longThePerson.toString())
...> .getOccupants().toArray())
$.. ==> "[]"
jshell> /exit
|
|
Level 5
Mask Policy
We are aiming to simulate the efficacy of a mask-wearing policy. As such, we need some way to represent the behaviour of people wearing masks.
Hopefully, you have kept yourΒ PersonΒ class open for extension. As such, we can quite simply extend from theΒ PersonΒ class to create aΒ MaskedPersonΒ class, which follows the same specifications.
Note that for both transmissions and infections, if the random value supplied is less than or equal to the mask’s effectiveness (seeΒ SimulationParameters#MASK_EFFECTIVENESS), then nothing is transmitted / infected.
The remaining specifications can be inferred from the jshell test. Note that you should adhere to the DRY (Don’t-Repeat-Yourself) principle as much as possible. Expect to make calls toΒ superΒ in your overriden methods.
$ jshell -q your_files_in_ascending_dependency_order < test5.jsh
jshell> MaskedPerson frederick = new MaskedPerson("Frederick")
jshell> frederick.infectWith(List.of(new AlphaCoronavirus(0.5)), 0.61).test("Alpha Coronavirus")
$.. ==> true
jshell> frederick.infectWith(List.of(new AlphaCoronavirus(0.5)), 0.6).test("Alpha Coronavirus")
$.. ==> false
jshell> Arrays.toString(frederick.infectWith(List.of(new AlphaCoronavirus(0.5)), 0.61).transmit(0.61).toArray())
$.. ==> "[Alpha Coronavirus with 0.450 probability of mutating]"
jshell> Arrays.toString(frederick.infectWith(List.of(new AlphaCoronavirus(0.5)), 0.61).transmit(0.6).toArray())
$.. ==> "[]"
jshell> /exit
|
|
Level 6
Stay-Home-Notice (SHN) Policy
We are aiming to simulate the efficacy of an SHN policy. Because DORMS currently does not support this, we need to extend theΒ DormsΒ class to implement this behaviour.
Because we need to be able to check if a person is on SHN, DORMS has specified the following method in theΒ PersonΒ class:
- boolean onSHN(double currentTime). This takes in the current time and returnsΒ trueΒ if theΒ PersonΒ is on SHN.
You are also allowed to implement more methods inΒ PersonΒ andΒ MaskedPersonΒ to help you support the SHN issuance.
Your job now is to implement theΒ DormsWithShnΒ class which is basically DORMS + automatic issuance of SHNs. Remember that you are not allowed to modify theΒ DormsΒ class. Many methods were purposefully declaredΒ finalΒ to prevent extension.
Read the remaining classes provided to you carefully. In particular, here are some tips to help you implement the feature:
- The main logic you need to override isΒ handleSickPerson. You do not need to override other methods or define other behaviours.
- The constructor forΒ DormsWithShnΒ class should be the same asΒ Dorms.
- Make use of theΒ Dorms#queryContactsΒ method. This retrieves all theΒ Contacts that are related to the sickΒ Person. This also queries theΒ ContactsΒ up toΒ SimulationParameters#TRACING_PERIODΒ in history.
- BecauseΒ PersonΒ objects are immutable,Β Dorms#updatePersonΒ updates the state of theΒ PersonΒ in theΒ PersonDatabaseΒ andΒ Dorms#getUpdatedPersonΒ retrieves the most updated state of aΒ Person
- Remember to log every SHN served. The format of the output can be seen in the verbose output of the simulation below. Do not useΒ System.out.println(), but useΒ logΒ instead.
- The behaviour of people checking in or making contact while on SHN is well defined. You do not need to implement this behaviour.
Once you’re done with the implementation, you may proceed to run the DORMS simulation by compilingΒ Main.javaΒ and runningΒ MainΒ on the JVM. You may also supply theΒ -vΒ flag for verbose mode, which shows all your logs.
We hope you enjoyed this mock PE, best of luck for next Friday π
One final question, do you think DORMS was well designed? How can we improve the design of DORMS?
– CS2030/S Teaching Team
$ java Main
===== RUNNING SIMULATION =====
Mask policy not implemented and SHN not issued
===== STATISTICS =====
Infected population: 9
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy not implemented and SHN issued
===== STATISTICS =====
Infected population: 6
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy implemented and SHN not issued
===== STATISTICS =====
Infected population: 5
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy implemented and SHN issued
===== STATISTICS =====
Infected population: 4
Total Population: 19
===== SIMULATION COMPLETED =====
$ java Main -v
===== RUNNING SIMULATION =====
Mask policy not implemented and SHN not issued
Initial Disease Carrier visits LT19 at time 0.000
Prof Henry visits LT19 at time 0.000
Prof Terence visits LT19 at time 0.000
Yong Qi visits LT19 at time 0.100
Kevin visits LT19 at time 0.110
Prof Henry leaves LT19 at time 0.200
Sean visits LT19 at time 0.230
Yong Qi leaves LT19 at time 0.300
Yong Qi met Eric at time 0.330
Eric met De Zhang at time 0.340
Prof Terence leaves LT19 at time 0.400
Prof Henry visits i3 at time 0.450
Initial Disease Carrier leaves LT19 at time 0.500
Kevin leaves LT19 at time 0.500
Sean leaves LT19 at time 0.500
De Zhang visits i3 at time 0.900
Prof Henry leaves i3 at time 0.950
Yong Qi tests positive for SARS-CoV-2 at time 1.000
Sean visits i3 at time 1.200
Initial Disease Carrier visits i3 at time 1.300
De Zhang leaves i3 at time 1.300
Initial Disease Carrier leaves i3 at time 1.300
Sean leaves i3 at time 1.300
Prof Henry met De Zhang at time 1.300
Eric met Prof Henry at time 1.400
De Zhang tests positive for SARS-CoV-2 at time 3.000
Initial Disease Carrier visits COM1-B113 at time 3.100
Marcus visits COM1-B113 at time 3.100
Jerryl visits COM1-B113 at time 3.200
Yong Qi visits COM1-B113 at time 3.300
Prof Henry visits COM1-B113 at time 3.400
Kevin visits COM1-B114 at time 3.500
Destinee visits COM1-B114 at time 3.600
Jerryl tests positive for SARS-CoV-2 at time 3.600
Yong Qi leaves COM1-B113 at time 3.600
Initial Disease Carrier leaves COM1-B113 at time 4.000
Marcus leaves COM1-B113 at time 4.000
Jerryl leaves COM1-B113 at time 4.000
Prof Henry leaves COM1-B113 at time 4.000
Kevin leaves COM1-B114 at time 4.000
Destinee leaves COM1-B114 at time 4.000
Siddarth Raj met Yong Qi at time 5.000
Xuan Ming met Yong Qi at time 7.000
Xuan Ming visits ION Orchard at time 9.000
Jerryl visits ION Orchard at time 9.400
Xuan Ming leaves ION Orchard at time 9.500
Xuan Ming met Le Yang at time 10.000
Le Yang met Joel at time 10.500
Mario met Jeremy at time 10.500
Bryan visits ION Orchard at time 10.500
Geyu visits ION Orchard at time 10.500
Jerryl leaves ION Orchard at time 10.500
Geyu leaves ION Orchard at time 10.500
Bryan leaves ION Orchard at time 10.500
Mario test negative for SARS-CoV-2 at time 11.000
===== STATISTICS =====
Infected population: 9
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy not implemented and SHN issued
Initial Disease Carrier visits LT19 at time 0.000
Prof Henry visits LT19 at time 0.000
Prof Terence visits LT19 at time 0.000
Yong Qi visits LT19 at time 0.100
Kevin visits LT19 at time 0.110
Prof Henry leaves LT19 at time 0.200
Sean visits LT19 at time 0.230
Yong Qi leaves LT19 at time 0.300
Yong Qi met Eric at time 0.330
Eric met De Zhang at time 0.340
Prof Terence leaves LT19 at time 0.400
Prof Henry visits i3 at time 0.450
Initial Disease Carrier leaves LT19 at time 0.500
Kevin leaves LT19 at time 0.500
Sean leaves LT19 at time 0.500
De Zhang visits i3 at time 0.900
Prof Henry leaves i3 at time 0.950
Yong Qi tests positive for SARS-CoV-2 at time 1.000
Yong Qi has been served a SHN that ends at 29.000
Initial Disease Carrier has been served a SHN that ends at 14.100
Prof Henry has been served a SHN that ends at 14.100
Prof Terence has been served a SHN that ends at 14.100
Kevin has been served a SHN that ends at 14.110
Sean has been served a SHN that ends at 14.230
Eric has been served a SHN that ends at 14.330
De Zhang leaves i3 at time 1.300
De Zhang tests positive for SARS-CoV-2 at time 3.000
De Zhang has been served a SHN that ends at 31.000
Eric has been served a SHN that ends at 14.340
Prof Henry has been served a SHN that ends at 14.900
Marcus visits COM1-B113 at time 3.100
Jerryl visits COM1-B113 at time 3.200
Destinee visits COM1-B114 at time 3.600
Jerryl test negative for SARS-CoV-2 at time 3.600
Marcus leaves COM1-B113 at time 4.000
Jerryl leaves COM1-B113 at time 4.000
Destinee leaves COM1-B114 at time 4.000
Xuan Ming visits ION Orchard at time 9.000
Jerryl visits ION Orchard at time 9.400
Xuan Ming leaves ION Orchard at time 9.500
Xuan Ming met Le Yang at time 10.000
Le Yang met Joel at time 10.500
Mario met Jeremy at time 10.500
Bryan visits ION Orchard at time 10.500
Geyu visits ION Orchard at time 10.500
Jerryl leaves ION Orchard at time 10.500
Geyu leaves ION Orchard at time 10.500
Bryan leaves ION Orchard at time 10.500
Mario test negative for SARS-CoV-2 at time 11.000
===== STATISTICS =====
Infected population: 6
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy implemented and SHN not issued
Initial Disease Carrier visits LT19 at time 0.000
Prof Henry visits LT19 at time 0.000
Prof Terence visits LT19 at time 0.000
Yong Qi visits LT19 at time 0.100
Kevin visits LT19 at time 0.110
Prof Henry leaves LT19 at time 0.200
Sean visits LT19 at time 0.230
Yong Qi leaves LT19 at time 0.300
Yong Qi met Eric at time 0.330
Eric met De Zhang at time 0.340
Prof Terence leaves LT19 at time 0.400
Prof Henry visits i3 at time 0.450
Initial Disease Carrier leaves LT19 at time 0.500
Kevin leaves LT19 at time 0.500
Sean leaves LT19 at time 0.500
De Zhang visits i3 at time 0.900
Prof Henry leaves i3 at time 0.950
Yong Qi tests positive for SARS-CoV-2 at time 1.000
Sean visits i3 at time 1.200
Initial Disease Carrier visits i3 at time 1.300
De Zhang leaves i3 at time 1.300
Initial Disease Carrier leaves i3 at time 1.300
Sean leaves i3 at time 1.300
Prof Henry met De Zhang at time 1.300
Eric met Prof Henry at time 1.400
De Zhang tests positive for SARS-CoV-2 at time 3.000
Initial Disease Carrier visits COM1-B113 at time 3.100
Marcus visits COM1-B113 at time 3.100
Jerryl visits COM1-B113 at time 3.200
Yong Qi visits COM1-B113 at time 3.300
Prof Henry visits COM1-B113 at time 3.400
Kevin visits COM1-B114 at time 3.500
Destinee visits COM1-B114 at time 3.600
Jerryl test negative for SARS-CoV-2 at time 3.600
Yong Qi leaves COM1-B113 at time 3.600
Initial Disease Carrier leaves COM1-B113 at time 4.000
Marcus leaves COM1-B113 at time 4.000
Jerryl leaves COM1-B113 at time 4.000
Prof Henry leaves COM1-B113 at time 4.000
Kevin leaves COM1-B114 at time 4.000
Destinee leaves COM1-B114 at time 4.000
Siddarth Raj met Yong Qi at time 5.000
Xuan Ming met Yong Qi at time 7.000
Xuan Ming visits ION Orchard at time 9.000
Jerryl visits ION Orchard at time 9.400
Xuan Ming leaves ION Orchard at time 9.500
Xuan Ming met Le Yang at time 10.000
Le Yang met Joel at time 10.500
Mario met Jeremy at time 10.500
Bryan visits ION Orchard at time 10.500
Geyu visits ION Orchard at time 10.500
Jerryl leaves ION Orchard at time 10.500
Geyu leaves ION Orchard at time 10.500
Bryan leaves ION Orchard at time 10.500
Mario test negative for SARS-CoV-2 at time 11.000
===== STATISTICS =====
Infected population: 5
Total Population: 19
===== SIMULATION COMPLETED =====
===== RUNNING SIMULATION =====
Mask policy implemented and SHN issued
Initial Disease Carrier visits LT19 at time 0.000
Prof Henry visits LT19 at time 0.000
Prof Terence visits LT19 at time 0.000
Yong Qi visits LT19 at time 0.100
Kevin visits LT19 at time 0.110
Prof Henry leaves LT19 at time 0.200
Sean visits LT19 at time 0.230
Yong Qi leaves LT19 at time 0.300
Yong Qi met Eric at time 0.330
Eric met De Zhang at time 0.340
Prof Terence leaves LT19 at time 0.400
Prof Henry visits i3 at time 0.450
Initial Disease Carrier leaves LT19 at time 0.500
Kevin leaves LT19 at time 0.500
Sean leaves LT19 at time 0.500
De Zhang visits i3 at time 0.900
Prof Henry leaves i3 at time 0.950
Yong Qi tests positive for SARS-CoV-2 at time 1.000
Yong Qi has been served a SHN that ends at 29.000
Initial Disease Carrier has been served a SHN that ends at 14.100
Prof Henry has been served a SHN that ends at 14.100
Prof Terence has been served a SHN that ends at 14.100
Kevin has been served a SHN that ends at 14.110
Sean has been served a SHN that ends at 14.230
Eric has been served a SHN that ends at 14.330
De Zhang leaves i3 at time 1.300
De Zhang tests positive for SARS-CoV-2 at time 3.000
De Zhang has been served a SHN that ends at 31.000
Eric has been served a SHN that ends at 14.340
Prof Henry has been served a SHN that ends at 14.900
Marcus visits COM1-B113 at time 3.100
Jerryl visits COM1-B113 at time 3.200
Destinee visits COM1-B114 at time 3.600
Jerryl test negative for SARS-CoV-2 at time 3.600
Marcus leaves COM1-B113 at time 4.000
Jerryl leaves COM1-B113 at time 4.000
Destinee leaves COM1-B114 at time 4.000
Xuan Ming visits ION Orchard at time 9.000
Jerryl visits ION Orchard at time 9.400
Xuan Ming leaves ION Orchard at time 9.500
Xuan Ming met Le Yang at time 10.000
Le Yang met Joel at time 10.500
Mario met Jeremy at time 10.500
Bryan visits ION Orchard at time 10.500
Geyu visits ION Orchard at time 10.500
Jerryl leaves ION Orchard at time 10.500
Geyu leaves ION Orchard at time 10.500
Bryan leaves ION Orchard at time 10.500
Mario test negative for SARS-CoV-2 at time 11.000
===== STATISTICS =====
Infected population: 4
Total Population: 19
===== SIMULATION COMPLETED =====
|
|