Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
SAXWeightsHandler.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2007-2025 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
20// An XML-handler for network weights
21/****************************************************************************/
22#include <config.h>
23
25
26#include "SAXWeightsHandler.h"
27
28
29// ===========================================================================
30// method definitions
31// ===========================================================================
32
33// ---------------------------------------------------------------------------
34// SAXWeightsHandler::ToRetrieveDefinition methods
35// ---------------------------------------------------------------------------
36
38 bool edgeBased, EdgeFloatTimeLineRetriever& destination) :
39 myAttributeName(attributeName),
40 myAmEdgeBased(edgeBased),
41 myDestination(destination),
42 myAggValue(0),
43 myNoLanes(0),
45 myHadNonNumeric(false)
46{ }
47
48
51
52// ---------------------------------------------------------------------------
53// SAXWeightsHandler methods
54// ---------------------------------------------------------------------------
55
56SAXWeightsHandler::SAXWeightsHandler(const std::vector<ToRetrieveDefinition*>& defs, const std::string& file) :
57 SUMOSAXHandler(file),
58 myDefinitions(defs),
61}
62
63
65 SUMOSAXHandler(file),
66 myDefinitions({def}),
67 myCurrentTimeBeg(-1),
68myCurrentTimeEnd(-1) {
69}
70
71
73 for (const auto& definition : myDefinitions) {
74 delete definition;
75 }
76}
77
78
79void
81 switch (element) {
82 case SUMO_TAG_INTERVAL: {
83 bool ok = true;
84 myCurrentID = attrs.getOpt<std::string>(SUMO_ATTR_ID, nullptr, ok, "");
88 WRITE_ERROR("Interval end time " + toString(myCurrentTimeEnd) + " is lower than interval begin time " + toString(myCurrentTimeBeg));
90 }
91 }
92 break;
93 case SUMO_TAG_EDGE: {
94 bool ok = true;
95 myCurrentEdgeID = attrs.getOpt<std::string>(SUMO_ATTR_ID, nullptr, ok, "");
96 tryParse(attrs, true);
97 }
98 break;
99 case SUMO_TAG_EDGEREL: {
100 tryParseEdgeRel(attrs);
101 }
102 break;
103 case SUMO_TAG_TAZREL: {
104 tryParseTazRel(attrs);
105 }
106 break;
107 case SUMO_TAG_LANE: {
108 tryParse(attrs, false);
109 }
110 break;
111 default:
112 break;
113 }
114}
115
116
117void
119 if (isEdge) {
120 // process all that want values directly from the edge
121 for (const auto& definition : myDefinitions) {
122 if (definition->myAmEdgeBased) {
123 if (attrs.hasAttribute(definition->myAttributeName)) {
124 try {
125 definition->myAggValue = attrs.getFloat(definition->myAttributeName);
126 definition->myNoLanes = 1;
127 definition->myHadAttribute = true;
128 } catch (EmptyData&) {
129 WRITE_ERRORF(TL("Missing value '%' in edge '%'."), definition->myAttributeName, myCurrentEdgeID);
130 } catch (NumberFormatException&) {
131 if (!definition->myHadNonNumeric) {
132 // warn only once
133 definition->myHadNonNumeric = true;
134 WRITE_ERRORF(TL("The value '%' of attribute '%' should be numeric in edge '%' at time step %."),
135 attrs.getStringSecure(definition->myAttributeName, ""), definition->myAttributeName,
137 }
138 }
139 } else {
140 definition->myHadAttribute = false;
141 }
142 } else {
143 definition->myAggValue = 0;
144 definition->myNoLanes = 0;
145 }
146 }
147 } else {
148 // process the current lane values
149 for (const auto& definition : myDefinitions) {
150 if (!definition->myAmEdgeBased) {
151 try {
152 definition->myAggValue += attrs.getFloat(definition->myAttributeName);
153 definition->myNoLanes++;
154 definition->myHadAttribute = true;
155 } catch (EmptyData&) {
156 WRITE_ERRORF(TL("Missing value '%' in edge '%'."), definition->myAttributeName, myCurrentEdgeID);
157 } catch (NumberFormatException&) {
158 if (!definition->myHadNonNumeric) {
159 // warn only once
160 definition->myHadNonNumeric = true;
161 WRITE_ERRORF(TL("The value '%' of attribute '%' should be numeric in edge '%' at time step %."),
162 attrs.getStringSecure(definition->myAttributeName, ""), definition->myAttributeName,
164 }
165 }
166 }
167 }
168 }
169}
170
171
172void
175 bool ok = true;
176 const std::string from = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
177 const std::string to = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
179 if (attrs.hasAttribute(ret->myAttributeName)) {
180 ret->myDestination.addEdgeRelWeight(from, to,
181 attrs.getFloat(ret->myAttributeName),
183 }
184 }
185 }
186}
187
188void
191 bool ok = true;
192 const std::string from = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
193 const std::string to = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
195 if (attrs.hasAttribute(ret->myAttributeName)) {
196 ret->myDestination.addTazRelWeight(myCurrentID, from, to,
197 attrs.getFloat(ret->myAttributeName),
199 }
200 }
201 }
202}
203
204
205void
207 if (element == SUMO_TAG_EDGE) {
208 for (const auto& definition : myDefinitions) {
209 if (definition->myHadAttribute) {
210 definition->myDestination.addEdgeWeight(myCurrentEdgeID,
211 definition->myAggValue / (double)definition->myNoLanes,
213 }
214 }
215 }
216}
217
218
219/****************************************************************************/
#define WRITE_ERRORF(...)
Definition MsgHandler.h:296
#define WRITE_ERROR(msg)
Definition MsgHandler.h:295
#define TL(string)
Definition MsgHandler.h:304
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define TIME2STEPS(x)
Definition SUMOTime.h:57
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_EDGEREL
a relation between two edges
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_TAZREL
a relation between two TAZs
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_TO
@ SUMO_ATTR_FROM
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_ID
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
Interface for a class which obtains read weights for named edges.
Complete definition about what shall be retrieved and where to store it.
std::string myAttributeName
The attribute name that shall be parsed.
EdgeFloatTimeLineRetriever & myDestination
The class that shall be called when new data is avaiable.
bool myHadNonNumeric
Information whether the attribute was found to contain non-numerical data (for any edge).
ToRetrieveDefinition(const std::string &attributeName, bool edgeBased, EdgeFloatTimeLineRetriever &destination)
Constructor.
int myNoLanes
The number of lanes read for the current edge.
double myAggValue
Aggregated value over the lanes read within the current edge.
bool myAmEdgeBased
Information whether edge values shall be used (lane value if false).
bool myHadAttribute
Information whether the attribute has been found for the current edge.
double myCurrentTimeEnd
the end of the time period that is currently processed
double myCurrentTimeBeg
the begin of the time period that is currently processed
void myEndElement(int elemente)
Called when a closing tag occurs.
void tryParseTazRel(const SUMOSAXAttributes &attrs)
Parses the data of an tazRelation for the previously read times.
~SAXWeightsHandler()
Destructor.
void tryParseEdgeRel(const SUMOSAXAttributes &attrs)
Parses the data of an edgeRelation for the previously read times.
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
void tryParse(const SUMOSAXAttributes &attrs, bool isEdge)
Parses the data of an edge or lane for the previously read times.
SAXWeightsHandler(const std::vector< ToRetrieveDefinition * > &defs, const std::string &file)
Constructor.
std::string myCurrentEdgeID
the edge which is currently being processed
std::string myCurrentID
the id of the interval being parsed
std::vector< ToRetrieveDefinition * > myDefinitions
List of definitions what shall be read and whereto stored while parsing the file.
Encapsulated SAX-Attributes.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
virtual std::string getStringSecure(int id, const std::string &def) const =0
Returns the string-value of the named (by its enum-value) attribute.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
SUMOTime getSUMOTimeReporting(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
double getFloat(int id) const
Returns the double-value of the named (by its enum-value) attribute.
SUMOSAXHandler(const std::string &file="", const std::string &expectedRoot="")
Constructor.