package ignition; import rescuecore2.config.Config; import rescuecore2.log.Logger; import rescuecore2.standard.entities.StandardWorldModel; import rescuecore2.standard.entities.StandardEntity; import rescuecore2.standard.entities.Building; import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; import java.util.Iterator; import java.util.Collections; import org.uncommons.maths.random.PoissonGenerator; /** An IgnitionModel that ignites unburnt buildings in a random order. The number of ignitions per timestep is drawn from a Poisson distribution. */ public class RandomIgnitionModel implements IgnitionModel { private static final String MEAN_KEY = "ignition.random.lambda"; private PoissonGenerator generator; private Iterator<Building> it; /** Construct a RandomIgnitionModel. @param world The world model. @param config The system configuration. */ public RandomIgnitionModel(StandardWorldModel world, Config config) { List<Building> unburnt = new ArrayList<Building>(); for (StandardEntity next : world) { if (next instanceof Building) { unburnt.add((Building)next); } } Collections.shuffle(unburnt, config.getRandom()); double mean = config.getFloatValue(MEAN_KEY); generator = new PoissonGenerator(mean, config.getRandom()); it = unburnt.iterator(); } @Override public Set<Building> findIgnitionPoints(StandardWorldModel world, int time) { Set<Building> result = new HashSet<Building>(); if (it.hasNext()) { int number = generator.nextValue(); Logger.debug("Igniting " + number + " buildings"); for (int i = 0; i < number && it.hasNext(); ++i) { result.add(it.next()); } } return result; } }