package cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support; import cz.agents.agentpolis.darptestbed.siminfrastructure.request.GPS; import cz.agents.agentpolis.simmodel.environment.model.citymodel.restaurantnetwork.elements.RestaurantNode; import org.apache.commons.math3.random.RandomGenerator; import org.openstreetmap.osm.data.coordinates.LatLon; import java.util.Map; public class TimeAwareRestaurantDensityBasedDistribution implements GPSPositionGenerator { private final RestaurantDensityCalculator calculator; private final RandomGenerator rnd; private final Map<RestaurantNode, Integer> histogram; private final long marginal; private LatLon latLon; public TimeAwareRestaurantDensityBasedDistribution(String osmFileName, String benchmarkDir, RandomGenerator rnd) { this.rnd = rnd; calculator = new RestaurantDensityCalculator(osmFileName, benchmarkDir, null); histogram = calculator.calculateFrequencies(); marginal = calculateMarginal(histogram); } private long calculateMarginal(Map<RestaurantNode, Integer> histogram) { int marginal = 0; for (Map.Entry<RestaurantNode, Integer> node : histogram.entrySet()) { marginal += node.getValue(); } return marginal; } public RestaurantNode sample() { int value = (int) (rnd.nextDouble() * marginal); for (Map.Entry<RestaurantNode, Integer> nodeEntry : histogram.entrySet()) { value -= nodeEntry.getValue(); if (value < 0) { return nodeEntry.getKey(); } } return null; } @Override public GPS generateGPSPosition() { latLon = sample().getLatLon(); return new GPS(latLon.lat(), latLon.lon()); } }