#include <config.h>
#include <string>
#include <iostream>
#include <utils/common/Named.h>
#include <utils/common/StringUtils.h>
#include <utils/common/StdDefs.h>
#include "ROEdge.h"
#include "RORoute.h"
#include "ROHelper.h"
#include <utils/iodevices/OutputDevice.h>
RORoute::RORoute(const std::string& id, double costs, double prop,
const ConstROEdgeVector& route,
const RGBColor* const color,
const StopParVector& stops)
: Named(StringUtils::convertUmlaute(id)), myCosts(costs),
myProbability(prop), myRoute(route), myColor(color), myStops(stops) {}
RORoute::RORoute(const std::string& id, const ConstROEdgeVector& route)
: Named(StringUtils::convertUmlaute(id)), myCosts(0.0),
myProbability(0.0), myRoute(route), myColor(nullptr), myStops() {}
RORoute::RORoute(const RORoute& src)
: Named(src.myID), myCosts(src.myCosts),
myProbability(src.myProbability), myRoute(src.myRoute), myColor(nullptr) {
if (src.myColor != nullptr) {
myColor = new RGBColor(*src.myColor);
}
}
RORoute::~RORoute() {
delete myColor;
}
void
RORoute::setCosts(double costs) {
myCosts = costs;
}
void
RORoute::setProbability(double prob) {
myProbability = prob;
}
void
RORoute::recheckForLoops(const ConstROEdgeVector& mandatory) {
ROHelper::recheckForLoops(myRoute, mandatory);
}
bool
RORoute::isValid(const ROVehicle& veh, bool ignoreErrors) const {
MsgHandler* mh = ignoreErrors ? MsgHandler::getWarningInstance() : MsgHandler::getErrorInstance();
for (ConstROEdgeVector::const_iterator i = myRoute.begin() + 1; i != myRoute.end(); ++i) {
const ROEdge* prev = *(i - 1);
const ROEdge* cur = *i;
if (!prev->isConnectedTo(*cur, veh.getVClass())) {
mh->informf("Edge '%' not connected to edge '%' for vehicle '%'.", prev->getID(), cur->getID(), veh.getID());
return ignoreErrors;
}
}
return true;
}
void
RORoute::addProbability(double prob) {
myProbability += prob;
}
ConstROEdgeVector
RORoute::getNormalEdges() const {
ConstROEdgeVector tempRoute;
for (const ROEdge* roe : myRoute) {
if (!roe->isInternal() && !roe->isTazConnector()) {
tempRoute.push_back(roe);
}
}
return tempRoute;
}
OutputDevice&
RORoute::writeXMLDefinition(OutputDevice& dev, const ROVehicle* const veh,
const bool withCosts,
const bool asAlternatives,
const bool withExitTimes,
const bool withLength,
const std::string& id) const {
dev.openTag(SUMO_TAG_ROUTE);
if (id != "") {
dev.writeAttr(SUMO_ATTR_ID, id);
}
if (withCosts) {
dev.writeAttr(SUMO_ATTR_COST, myCosts);
}
if (asAlternatives) {
dev.setPrecision(8);
dev.writeAttr(SUMO_ATTR_PROB, myProbability);
dev.setPrecision();
}
if (myColor != nullptr) {
dev.writeAttr(SUMO_ATTR_COLOR, *myColor);
}
dev.writeAttr(SUMO_ATTR_EDGES, getNormalEdges());
if (withExitTimes) {
std::vector<double> exitTimes;
double time = STEPS2TIME(veh->getDepartureTime());
for (const ROEdge* const roe : myRoute) {
time += roe->getTravelTime(veh, time);
if (!roe->isInternal() && !roe->isTazConnector()) {
exitTimes.push_back(time);
}
}
dev.writeAttr("exitTimes", exitTimes);
}
if (withLength) {
double length = 0.;
for (const ROEdge* const roe : myRoute) {
length += roe->getLength();
}
dev.writeAttr("routeLength", length);
}
dev.closeTag();
return dev;
}