Skip to content

Commit 26072fd

Browse files
committed
Refactor travel time and distance containers
1 parent 9692e75 commit 26072fd

File tree

2 files changed

+23
-37
lines changed

2 files changed

+23
-37
lines changed

src/dsm/dsm.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
static constexpr uint8_t DSM_VERSION_MAJOR = 2;
88
static constexpr uint8_t DSM_VERSION_MINOR = 3;
9-
static constexpr uint8_t DSM_VERSION_PATCH = 13;
9+
static constexpr uint8_t DSM_VERSION_PATCH = 14;
1010

1111
static auto const DSM_VERSION =
1212
std::format("{}.{}.{}", DSM_VERSION_MAJOR, DSM_VERSION_MINOR, DSM_VERSION_PATCH);

src/dsm/headers/RoadDynamics.hpp

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ namespace dsm {
5151
std::optional<double> m_passageProbability;
5252

5353
protected:
54-
std::vector<double> m_travelTimes;
55-
std::vector<double> m_travelDistances;
54+
std::vector<std::pair<double, double>> m_travelDTs;
5655
std::unordered_map<Id, Id> m_agentNextStreetId;
5756
bool m_forcePriorities;
5857
std::optional<delay_t> m_dataUpdatePeriod;
@@ -158,10 +157,6 @@ namespace dsm {
158157
/// @param clearData If true, the travel times and distances are cleared after the computation
159158
/// @return Measurement<double> The mean travel speed of the agents and the standard deviation
160159
Measurement<double> meanTravelSpeed(bool clearData = false);
161-
/// @brief Get the travel speeds of the agents
162-
/// @return std::vector<double> The travel speeds
163-
/// @details The travel speed is computed as the travel distance divided by the travel time
164-
std::vector<double> travelSpeeds() const;
165160
/// @brief Get the turn counts of the agents
166161
/// @return const std::array<unsigned long long, 3>& The turn counts
167162
/// @details The array contains the counts of left (0), straight (1), right (2) and U (3) turns
@@ -322,8 +317,7 @@ namespace dsm {
322317
if (pStreet->dequeue(queueIndex) == std::nullopt) {
323318
continue;
324319
}
325-
m_travelTimes.push_back(pAgent->time());
326-
m_travelDistances.push_back(pAgent->distance());
320+
m_travelDTs.push_back({pAgent->distance(), static_cast<double>(pAgent->time())});
327321
if (reinsert_agents) {
328322
// reset Agent's values
329323
pAgent->reset();
@@ -821,11 +815,13 @@ namespace dsm {
821815
requires(is_numeric_v<delay_t>)
822816
Measurement<double> RoadDynamics<delay_t>::meanTravelTime(bool clearData) {
823817
std::vector<double> travelTimes;
824-
if (!m_travelTimes.empty()) {
818+
if (!m_travelDTs.empty()) {
819+
travelTimes.reserve(m_travelDTs.size());
820+
for (auto const& [distance, time] : m_travelDTs) {
821+
travelTimes.push_back(time);
822+
}
825823
if (clearData) {
826-
travelTimes = std::move(m_travelTimes);
827-
} else {
828-
travelTimes = m_travelTimes;
824+
m_travelDTs.clear();
829825
}
830826
}
831827
return Measurement<double>(travelTimes);
@@ -834,11 +830,13 @@ namespace dsm {
834830
requires(is_numeric_v<delay_t>)
835831
Measurement<double> RoadDynamics<delay_t>::meanTravelDistance(bool clearData) {
836832
std::vector<double> travelDistances;
837-
if (!m_travelDistances.empty()) {
833+
if (!m_travelDTs.empty()) {
834+
travelDistances.reserve(m_travelDTs.size());
835+
for (auto const& [distance, time] : m_travelDTs) {
836+
travelDistances.push_back(distance);
837+
}
838838
if (clearData) {
839-
travelDistances = std::move(m_travelDistances);
840-
} else {
841-
travelDistances = m_travelDistances;
839+
m_travelDTs.clear();
842840
}
843841
}
844842
return Measurement<double>(travelDistances);
@@ -847,26 +845,16 @@ namespace dsm {
847845
requires(is_numeric_v<delay_t>)
848846
Measurement<double> RoadDynamics<delay_t>::meanTravelSpeed(bool clearData) {
849847
std::vector<double> travelSpeeds;
850-
for (auto i{0}; i < m_travelTimes.size(); ++i) {
851-
travelSpeeds.push_back(m_travelDistances[i] / m_travelTimes[i]);
848+
travelSpeeds.reserve(m_travelDTs.size());
849+
for (auto const& [distance, time] : m_travelDTs) {
850+
travelSpeeds.push_back(distance / time);
852851
}
853852
if (clearData) {
854-
m_travelTimes.clear();
855-
m_travelDistances.clear();
853+
m_travelDTs.clear();
856854
}
857855
return Measurement<double>(travelSpeeds);
858856
}
859857

860-
template <typename delay_t>
861-
requires(is_numeric_v<delay_t>)
862-
std::vector<double> RoadDynamics<delay_t>::travelSpeeds() const {
863-
std::vector<double> travelSpeeds;
864-
for (auto i{0}; i < m_travelTimes.size(); ++i) {
865-
travelSpeeds.push_back(m_travelDistances[i] / m_travelTimes[i]);
866-
}
867-
return std::move(travelSpeeds);
868-
}
869-
870858
template <typename delay_t>
871859
requires(is_numeric_v<delay_t>)
872860
std::unordered_map<Id, std::array<double, 4>> RoadDynamics<delay_t>::turnProbabilities(
@@ -906,18 +894,16 @@ namespace dsm {
906894
file << "time;speeds" << std::endl;
907895
}
908896
file << this->time() << ';';
909-
for (auto i{0}; i < m_travelTimes.size(); ++i) {
910-
file << std::fixed << std::setprecision(2)
911-
<< m_travelDistances[i] / m_travelTimes[i];
912-
if (i < m_travelTimes.size() - 1) {
897+
for (auto it = m_travelDTs.cbegin(); it != m_travelDTs.cend(); ++it) {
898+
file << std::fixed << std::setprecision(2) << it->first / it->second;
899+
if (it != m_travelDTs.cend() - 1) {
913900
file << ',';
914901
}
915902
}
916903
file << std::endl;
917904
file.close();
918905
if (reset) {
919-
m_travelTimes.clear();
920-
m_travelDistances.clear();
906+
m_travelDTs.clear();
921907
}
922908
}
923909
}; // namespace dsm

0 commit comments

Comments
 (0)