@@ -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