package cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator;
import com.google.common.collect.Lists;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.Driver;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.GPS;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.Passenger;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.PassengerRequest;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support.GPSPositionGenerator;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support.GPSPositionGeneratorFactory;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support.PassengerGenerator;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support.PassengerGenerator.RequestTimeInfo;
import cz.agents.agentpolis.darptestbed.siminfrastructure.request.generator.support.VehicleGenerator;
import cz.agents.agentpolis.simulator.importer.osm.OsmDataGetter;
import cz.agents.agentpolis.simulator.importer.osm.util.OSMBoundsUtil;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.openstreetmap.osm.data.coordinates.Bounds;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Random;
public class AgentRequestGenerator {
public GPSPositionGeneratorFactory getPositionGeneratorFactory() {
return positionGeneratorFactory;
}
public Random getRandom() {
return random;
}
public int getMaxNumberOfRequestPerAgent() {
return maxNumberOfRequestPerAgent;
}
public ObjectMapper getMapper() {
return mapper;
}
private final GPSPositionGeneratorFactory positionGeneratorFactory;
private final Random random;
private final int maxNumberOfRequestPerAgent;
private final ObjectMapper mapper;
public AgentRequestGenerator(GPSPositionGeneratorFactory positionGeneratorFactory, Random random,
int maxNumberOfRequestPerAgent, ObjectMapper mapper) {
super();
this.positionGeneratorFactory = positionGeneratorFactory;
this.random = random;
this.maxNumberOfRequestPerAgent = maxNumberOfRequestPerAgent;
this.mapper = mapper;
}
public void generateDrivers(int numberOfDrivers, VehicleGenerator vehicleCapacityGenerator, String outputFileName,
File osmMap) throws JsonGenerationException, JsonMappingException, IOException {
generateDrivers(numberOfDrivers, vehicleCapacityGenerator, new File(osmMap.getParentFile(), outputFileName),
osmMap);
}
public void generatePassengers(int numberOfAgent, PassengerGenerator requestCallTimeGenerator,
String outputFileName, File osmMap) throws JsonGenerationException, JsonMappingException, IOException {
generatePassengers(numberOfAgent, requestCallTimeGenerator, new File(osmMap.getParentFile(), outputFileName),
osmMap);
}
public void generateDrivers(int numberOfDrivers, VehicleGenerator vehicleCapacityGenerator, File generatorOutput,
File osmMap) throws JsonGenerationException, JsonMappingException, IOException {
GPSPositionGenerator positionGenerator = createGPSPositionGenerator(osmMap);
List<Driver> agentRequestsResults = Lists.newArrayList();
for (int i = 0; i < numberOfDrivers; i++) {
agentRequestsResults.add(new Driver("DriverId" + i, positionGenerator.generateGPSPosition(),
vehicleCapacityGenerator.generateVehicleCapacity(), vehicleCapacityGenerator
.generateVehicleEquipments()));
}
mapper.writeValue(generatorOutput, agentRequestsResults);
}
public void generatePassengers(int numberOfAgent, PassengerGenerator requestCallTimeGenerator,
File generatorOutput, File osmMap) throws JsonGenerationException, JsonMappingException, IOException {
GPSPositionGenerator positionGenerator = createGPSPositionGenerator(osmMap);
List<Passenger> agentRequestsResults = Lists.newArrayList();
for (int i = 0; i < numberOfAgent; i++) {
agentRequestsResults.add(new Passenger("PassengerId" + i, requestCallTimeGenerator
.generateAdditionalRequirements(), generateRequest(positionGenerator, requestCallTimeGenerator)));
}
mapper.writeValue(generatorOutput, agentRequestsResults);
}
protected List<PassengerRequest> generateRequest(GPSPositionGenerator positionGenerator,
PassengerGenerator requestCallTimeGenerator) {
List<PassengerRequest> agentRequestsResults = Lists.newArrayList();
int numberOfRequest = random.nextInt(maxNumberOfRequestPerAgent) + 1;
GPS previousGPS = positionGenerator.generateGPSPosition();
for (int i = 0; i < numberOfRequest; i++) {
GPS nextGPS = positionGenerator.generateGPSPosition();
RequestTimeInfo requestTimeInfo = requestCallTimeGenerator.generateRequestTimeInfo();
agentRequestsResults.add(new PassengerRequest(previousGPS, nextGPS, requestTimeInfo.callTimeInDayRange,
requestTimeInfo.fromTimeWindow, requestTimeInfo.toTimeWindow));
previousGPS = nextGPS;
}
return agentRequestsResults;
}
protected GPSPositionGenerator createGPSPositionGenerator(File osmMap) {
OsmDataGetter osmDataGetter = OsmDataGetter.createOsmDataGetter(osmMap);
Bounds bounds = OSMBoundsUtil.computeBoundsOfSimulationWorld(osmDataGetter);
double maxLon = bounds.getMax().lon();
double minLon = bounds.getMin().lon();
double maxLat = bounds.getMax().lat();
double minLat = bounds.getMin().lat();
return positionGeneratorFactory.createGPSPositionGenerator(minLon, minLat, maxLon, maxLat);
}
}