#pragma once
#include <config.h>
#include <map>
#include <string>
#include <vector>
#include <set>
#include <utils/common/SUMOTime.h>
#include <utils/distribution/RandomDistributor.h>
#include <utils/common/Named.h>
#include "RODFRouteCont.h"
class RODFRouteCont;
class RODFDetectorFlows;
class ROEdge;
class RODFEdge;
class RODFDetectorCon;
class RODFNet;
struct RODFRouteDesc;
class OutputDevice;
class SUMOVTypeParameter;
enum RODFDetectorType {
TYPE_NOT_DEFINED = 0,
DISCARDED_DETECTOR,
BETWEEN_DETECTOR,
SOURCE_DETECTOR,
SINK_DETECTOR
};
class RODFDetector : public Named {
public:
RODFDetector(const std::string& id, const std::string& laneID,
double pos, const RODFDetectorType type);
RODFDetector(const std::string& id, const RODFDetector& f);
~RODFDetector();
const std::string& getLaneID() const {
return myLaneID;
};
std::string getEdgeID() const;
double getPos() const {
return myPosition;
};
RODFDetectorType getType() const {
return myType;
};
void setType(RODFDetectorType type);
void addRoute(RODFRouteDesc& nrd);
void addRoutes(RODFRouteCont* routes);
bool hasRoutes() const;
const std::vector<RODFRouteDesc>& getRouteVector() const;
void addPriorDetector(const RODFDetector* det);
void addFollowingDetector(const RODFDetector* det);
const std::set<const RODFDetector*>& getPriorDetectors() const;
const std::set<const RODFDetector*>& getFollowerDetectors() const;
bool writeEmitterDefinition(const std::string& file,
const std::map<SUMOTime, RandomDistributor<int>* >& dists,
const RODFDetectorFlows& flows,
SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset,
bool includeUnusedRoutes, double scale,
bool insertionsOnly, double defaultSpeed) const;
bool writeRoutes(std::vector<std::string>& saved,
OutputDevice& out);
void writeSingleSpeedTrigger(const std::string& file,
const RODFDetectorFlows& flows,
SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset,
double defaultSpeed);
void writeEndRerouterDetectors(const std::string& file);
void buildDestinationDistribution(const RODFDetectorCon& detectors,
SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset,
const RODFNet& net,
std::map<SUMOTime, RandomDistributor<int>* >& into) const;
void computeSplitProbabilities(const RODFNet* net, const RODFDetectorCon& detectors,
const RODFDetectorFlows& flows,
SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset);
const std::vector<std::map<RODFEdge*, double> >& getSplitProbabilities() const {
return mySplitProbabilities;
}
protected:
int getFlowFor(const ROEdge* edge, SUMOTime time) const;
double computeDistanceFactor(const RODFRouteDesc& rd) const;
protected:
std::string myLaneID;
double myPosition;
RODFDetectorType myType;
RODFRouteCont* myRoutes;
std::set<const RODFDetector*> myPriorDetectors, myFollowingDetectors;
std::vector<std::map<RODFEdge*, double> > mySplitProbabilities;
std::map<std::string, RODFEdge*> myRoute2Edge;
private:
RODFDetector(const RODFDetector& src);
RODFDetector& operator=(const RODFDetector& src);
};
class RODFDetectorCon {
public:
RODFDetectorCon();
~RODFDetectorCon();
bool addDetector(RODFDetector* dfd);
void removeDetector(const std::string& id);
bool detectorsHaveCompleteTypes() const;
bool detectorsHaveRoutes() const;
const std::vector<RODFDetector*>& getDetectors() const;
void save(const std::string& file) const;
void saveAsPOIs(const std::string& file) const;
void saveRoutes(const std::string& file) const;
const RODFDetector& getDetector(const std::string& id) const;
RODFDetector& getModifiableDetector(const std::string& id) const;
const RODFDetector& getAnyDetectorForEdge(const RODFEdge* const edge) const;
bool knows(const std::string& id) const;
void writeEmitters(const std::string& file,
const RODFDetectorFlows& flows,
SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset,
const RODFNet& net,
bool writeCalibrators, bool includeUnusedRoutes,
double scale,
bool insertionsOnly);
void writeEmitterPOIs(const std::string& file,
const RODFDetectorFlows& flows);
void writeSpeedTrigger(const RODFNet* const net, const std::string& file,
const RODFDetectorFlows& flows,
SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset);
void writeValidationDetectors(const std::string& file,
bool includeSources, bool singleFile, bool friendly);
void writeEndRerouterDetectors(const std::string& file);
int getAggFlowFor(const ROEdge* edge, SUMOTime time, SUMOTime period,
const RODFDetectorFlows& flows) const;
void guessEmptyFlows(RODFDetectorFlows& flows);
void mesoJoin(const std::string& nid, const std::vector<std::string>& oldids);
void setSpeedFactorAndDev(SUMOVTypeParameter& type, double maxFactor, double avgFactor, double dev, bool forceDev);
protected:
void clearDists(std::map<SUMOTime, RandomDistributor<int>* >& dists) const;
protected:
std::vector<RODFDetector*> myDetectors;
std::map<std::string, RODFDetector*> myDetectorMap;
std::map<std::string, std::vector<RODFDetector*> > myDetectorEdgeMap;
private:
RODFDetectorCon(const RODFDetectorCon& src);
RODFDetectorCon& operator=(const RODFDetectorCon& src);
};