/*
* Copyright (C) 2010, 2011, 2012 by Arne Kesting, Martin Treiber, Ralph Germ, Martin Budden
* <movsim.org@gmail.com>
* -----------------------------------------------------------------------------------------
*
* This file is part of
*
* MovSim - the multi-model open-source vehicular-traffic simulator.
*
* MovSim is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MovSim is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MovSim. If not, see <http://www.gnu.org/licenses/>
* or <http://www.movsim.org>.
*
* -----------------------------------------------------------------------------------------
*/
package org.movsim.output;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.movsim.autogen.ConsumptionCalculation;
import org.movsim.autogen.FloatingCarOutput;
import org.movsim.autogen.OutputConfiguration;
import org.movsim.autogen.SpatioTemporalConfiguration;
import org.movsim.autogen.Trajectories;
import org.movsim.autogen.TravelTimes;
import org.movsim.output.floatingcars.FloatingCars;
import org.movsim.output.route.ConsumptionOnRoute;
import org.movsim.output.route.FileTrajectories;
import org.movsim.output.route.SpatioTemporal;
import org.movsim.output.route.TravelTimeOnRoute;
import org.movsim.simulator.SimulationTimeStep;
import org.movsim.simulator.roadnetwork.RoadNetwork;
import org.movsim.simulator.roadnetwork.routing.Route;
import org.movsim.simulator.roadnetwork.routing.Routing;
import org.movsim.simulator.vehicles.VehicleFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
/**
* The Class SimulationOutput.
*/
public class SimulationOutput implements SimulationTimeStep {
/** The Constant LOG. */
private static final Logger logger = LoggerFactory.getLogger(SimulationOutput.class);
private List<FloatingCars> floatingCarOutputs = new ArrayList<>();
private final List<SpatioTemporal> spatioTemporals = new ArrayList<>();
private final Map<Route, FileTrajectories> filesTrajectories = new HashMap<>();
private final Map<Route, ConsumptionOnRoute> consumptionOnRoutes = new HashMap<>();
private final Map<Route, TravelTimeOnRoute> travelTimeOnRoutes = new HashMap<>();
private final RoadNetwork roadNetwork;
private final Routing routing;
public SimulationOutput(double simulationTimestep, boolean writeOutput, OutputConfiguration outputConfiguration,
RoadNetwork roadNetwork, Routing routing, VehicleFactory vehicleFactory) {
Preconditions.checkNotNull(outputConfiguration);
this.roadNetwork = Preconditions.checkNotNull(roadNetwork);
this.routing = Preconditions.checkNotNull(routing);
initFloatingCars(writeOutput, outputConfiguration);
initConsumption(writeOutput, simulationTimestep, outputConfiguration);
initTravelTimes(writeOutput, simulationTimestep, outputConfiguration);
initSpatioTemporalOutput(writeOutput, outputConfiguration);
initTrajectories(writeOutput, outputConfiguration);
}
private Route getCheckedRoute(final String routeLabel) {
return routing.get(routeLabel);
}
private void initConsumption(boolean writeOutput, double simulationTimestep,
final OutputConfiguration outputConfiguration) {
for (final ConsumptionCalculation fuelRouteInput : outputConfiguration.getConsumptionCalculation()) {
final Route route = getCheckedRoute(fuelRouteInput.getRoute());
final ConsumptionOnRoute consumption = new ConsumptionOnRoute(simulationTimestep, fuelRouteInput,
roadNetwork, route, writeOutput);
consumptionOnRoutes.put(route, consumption);
}
}
private void initTravelTimes(boolean writeOutput, double simulationTimestep,
final OutputConfiguration outputConfiguration) {
for (final TravelTimes travelTimeInput : outputConfiguration.getTravelTimes()) {
final Route route = getCheckedRoute(travelTimeInput.getRoute());
final TravelTimeOnRoute travelTime = new TravelTimeOnRoute(simulationTimestep, travelTimeInput,
roadNetwork, route, writeOutput);
travelTimeOnRoutes.put(route, travelTime);
}
}
private void initTrajectories(boolean writeOutput, final OutputConfiguration outputConfiguration) {
if (writeOutput) {
for (final Trajectories traj : outputConfiguration.getTrajectories()) {
final Route route = getCheckedRoute(traj.getRoute());
if (filesTrajectories.containsKey(route)) {
logger.warn("trajectory output for route \"{}\" already defined!", route.getName());
continue;
}
filesTrajectories.put(route, new FileTrajectories(traj, route));
}
}
}
private void initSpatioTemporalOutput(boolean writeOutput, final OutputConfiguration outputConfiguration) {
for (final SpatioTemporalConfiguration spatioTemporalInput : outputConfiguration
.getSpatioTemporalConfiguration()) {
final Route route = getCheckedRoute(spatioTemporalInput.getRoute());
final SpatioTemporal spatioTemporal = new SpatioTemporal(spatioTemporalInput.getDx(),
spatioTemporalInput.getDt(), roadNetwork, route, writeOutput);
spatioTemporals.add(spatioTemporal);
}
}
private void initFloatingCars(boolean writeOutput, OutputConfiguration outputInput) {
for (FloatingCarOutput floatingCarOutput : outputInput.getFloatingCarOutput()) {
Route route = getCheckedRoute(floatingCarOutput.getRoute());
floatingCarOutputs.add(new FloatingCars(floatingCarOutput, route, writeOutput));
}
}
@Override
public void timeStep(double dt, double simulationTime, long iterationCount) {
for (FloatingCars floatingCars : floatingCarOutputs) {
floatingCars.timeStep(dt, simulationTime, iterationCount);
}
for (final SpatioTemporal sp : spatioTemporals) {
sp.timeStep(dt, simulationTime, iterationCount);
}
for (final FileTrajectories filetraj : filesTrajectories.values()) {
filetraj.timeStep(dt, simulationTime, iterationCount);
}
for (final TravelTimeOnRoute travelTime : travelTimeOnRoutes.values()) {
travelTime.timeStep(dt, simulationTime, iterationCount);
}
for (final ConsumptionOnRoute consumption : consumptionOnRoutes.values()) {
consumption.timeStep(dt, simulationTime, iterationCount);
}
}
}