Starting from:

$30

CS2030S-Mock Practical Assessment 1 Disease Outbreak Response Management System (DORMS) Solved

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 =====

More products