/**
** School.java
**
** Copyright 2011 by Joseph Harrison, Mark Coletti, Cristina Metgher, Andrew Crooks
** George Mason University.
**
** Licensed under the Academic Free License version 3.0
**
** See the file "LICENSE" for more information
**
** $Id$
**/
package sim.app.geo.sickStudents;
import java.util.ArrayList;
import sim.engine.SimState;
import sim.engine.Steppable;
@SuppressWarnings("serial")
public class School implements Steppable
{
public enum SchoolType {
ElementarySchool,
MiddleSchool,
HighSchool,
Other
};
public SickStudentsModel model;
public ArrayList<Student> students = new ArrayList<Student>();
public String name;
public SchoolType type;
public boolean closed = false;
public int catchmentCount = 0;
public School(SickStudentsModel model, String name, String schoolType) {
this.model = model;
this.name = name;
if (schoolType.equals("ES"))
{
type = SchoolType.ElementarySchool;
}
else if (schoolType.equals("MS"))
{
type = SchoolType.MiddleSchool;
}
else if (schoolType.equals("HS"))
{
type = SchoolType.HighSchool;
}
else
{
type = SchoolType.Other;
}
}
private Student getRandomStudent(Student butNotThisStudent) {
Student s;
do
{
s = students.get(model.random.nextInt(students.size()));
} while (!(!s.homebound && (s != butNotThisStudent)));
return s;
}
public double getProportionOfSickStudents() {
if (students.isEmpty())
{
return 0;
}
int sick = 0;
for (Student s : students)
{
if (s.status == Status.INFECTED)
{
sick++;
}
}
return sick / (double)students.size();
}
public double getProportionOfHomeboundStudents() {
if (students.isEmpty())
{
return 0;
}
int homebound = 0;
for (Student s : students)
{
if (s.homebound)
{
homebound++;
}
}
return homebound / (double)students.size();
}
@Override
public void step(SimState state) {
if (closed)
{
return;
}
int inAttendence = 0;
for (Student s : students)
{
if (!s.homebound)
{
inAttendence++;
}
}
if (inAttendence < 2)
{
return;
}
// TODO the number of interactions should have some justification
for (int i = 0; i < students.size(); i++) {
// pick two random students and have them interact
Student s1 = getRandomStudent(null);
Student s2 = getRandomStudent(s1);
if (s1.status == Status.INFECTED)
{
s2.expose();
}
if (s2.status == Status.INFECTED)
{
s1.expose();
}
}
}
}