Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/profile_mem_usage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- uses: actions/checkout@v4

- name: Install valgrind
run: sudo apt install -y valgrind
run: sudo apt update && sudo apt install -y valgrind

- name: Build test simulation
working-directory: ${{github.workspace}}/profiling
Expand Down
2 changes: 1 addition & 1 deletion src/dsm/dsm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

static constexpr uint8_t DSM_VERSION_MAJOR = 2;
static constexpr uint8_t DSM_VERSION_MINOR = 3;
static constexpr uint8_t DSM_VERSION_PATCH = 23;
static constexpr uint8_t DSM_VERSION_PATCH = 24;

static auto const DSM_VERSION =
std::format("{}.{}.{}", DSM_VERSION_MAJOR, DSM_VERSION_MINOR, DSM_VERSION_PATCH);
Expand Down
19 changes: 18 additions & 1 deletion src/dsm/headers/Agent.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ namespace dsm {
std::vector<Id> m_trip;
std::optional<Id> m_streetId;
std::optional<Id> m_srcNodeId;
std::optional<Id> m_nextStreetId;
delay_t m_delay;
double m_speed;
double m_distance; // Travelled distance
Expand All @@ -55,7 +56,10 @@ namespace dsm {
Agent(Id id, std::vector<Id> const& trip, std::optional<Id> srcNodeId = std::nullopt);
/// @brief Set the street occupied by the agent
/// @param streetId The id of the street currently occupied by the agent
void setStreetId(Id streetId) { m_streetId = streetId; }
void setStreetId(Id streetId);
/// @brief Set the id of the next street
/// @param nextStreetId The id of the next street
void setNextStreetId(Id nextStreetId) { m_nextStreetId = nextStreetId; }
/// @brief Set the agent's speed
/// @param speed, The agent's speed
/// @throw std::invalid_argument, if speed is negative
Expand Down Expand Up @@ -114,6 +118,9 @@ namespace dsm {
/// @brief Get the id of the source node of the agent
/// @return The id of the source node of the agent
std::optional<Id> srcNodeId() const { return m_srcNodeId; }
/// @brief Get the id of the next street
/// @return The id of the next street
std::optional<Id> nextStreetId() const { return m_nextStreetId; }
/// @brief Get the agent's speed
/// @return The agent's speed
double speed() const { return m_speed; }
Expand All @@ -138,6 +145,7 @@ namespace dsm {
m_trip{itineraryId.has_value() ? std::vector<Id>{itineraryId.value()}
: std::vector<Id>{}},
m_srcNodeId{srcNodeId},
m_nextStreetId{std::nullopt},
m_delay{0},
m_speed{0.},
m_distance{0.},
Expand All @@ -150,6 +158,7 @@ namespace dsm {
: m_id{id},
m_trip{trip},
m_srcNodeId{srcNodeId},
m_nextStreetId{std::nullopt},
m_delay{0},
m_speed{0.},
m_distance{0.},
Expand All @@ -163,6 +172,14 @@ namespace dsm {
return m_trip[m_itineraryIdx];
}

template <typename delay_t>
requires(is_numeric_v<delay_t>)
void Agent<delay_t>::setStreetId(Id streetId) {
assert(m_nextStreetId.has_value() ? streetId == m_nextStreetId.value() : true);
m_streetId = streetId;
m_nextStreetId = std::nullopt;
}

template <typename delay_t>
requires(is_numeric_v<delay_t>)
void Agent<delay_t>::setSpeed(double speed) {
Expand Down
22 changes: 10 additions & 12 deletions src/dsm/headers/RoadDynamics.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ namespace dsm {

protected:
std::vector<std::pair<double, double>> m_travelDTs;
std::unordered_map<Id, Id> m_agentNextStreetId;
bool m_forcePriorities;
std::optional<delay_t> m_dataUpdatePeriod;
std::unordered_map<Id, std::array<unsigned long long, 4>> m_turnCounts;
Expand Down Expand Up @@ -306,7 +305,6 @@ namespace dsm {
bool bArrived{false};
if (!bCanPass) {
if (pAgent->isRandom()) {
m_agentNextStreetId.erase(agentId);
bArrived = true;
} else {
continue;
Expand All @@ -331,7 +329,8 @@ namespace dsm {
}
continue;
}
auto const& nextStreet{this->m_graph.streetSet()[m_agentNextStreetId[agentId]]};
auto const& nextStreet{
this->m_graph.street(this->agents().at(agentId)->nextStreetId().value())};
if (nextStreet->isFull()) {
continue;
}
Expand Down Expand Up @@ -360,7 +359,8 @@ namespace dsm {
return false;
}
for (auto const [angle, agentId] : intersection.agents()) {
auto const& nextStreet{this->m_graph.streetSet()[m_agentNextStreetId[agentId]]};
auto const& nextStreet{
this->m_graph.street(this->agents().at(agentId)->nextStreetId().value())};
if (nextStreet->isFull()) {
if (m_forcePriorities) {
return false;
Expand All @@ -373,7 +373,6 @@ namespace dsm {
this->agents().at(agentId)->incrementDelay(
std::ceil(nextStreet->length() / this->agents().at(agentId)->speed()));
nextStreet->addAgent(agentId);
m_agentNextStreetId.erase(agentId);
return true;
}
return false;
Expand All @@ -383,7 +382,8 @@ namespace dsm {
return false;
}
auto const agentId{roundabout.agents().front()};
auto const& nextStreet{this->m_graph.streetSet()[m_agentNextStreetId[agentId]]};
auto const& nextStreet{
this->m_graph.street(this->agents().at(agentId)->nextStreetId().value())};
if (!(nextStreet->isFull())) {
if (this->agents().at(agentId)->streetId().has_value()) {
const auto streetId = this->agents().at(agentId)->streetId().value();
Expand All @@ -401,7 +401,6 @@ namespace dsm {
this->agents().at(agentId)->incrementDelay(
std::ceil(nextStreet->length() / this->agents().at(agentId)->speed()));
nextStreet->addAgent(agentId);
m_agentNextStreetId.erase(agentId);
} else {
return false;
}
Expand Down Expand Up @@ -448,8 +447,8 @@ namespace dsm {
} else {
auto const nextStreetId =
this->m_nextStreetId(agentId, street->nodePair().second, street->id());
auto const& pNextStreet{this->m_graph.streetSet()[nextStreetId]};
m_agentNextStreetId.emplace(agentId, nextStreetId);
auto const& pNextStreet{this->m_graph.street(nextStreetId)};
agent->setNextStreetId(nextStreetId);
if (nLanes == 1) {
street->enqueue(agentId, 0);
} else {
Expand Down Expand Up @@ -490,8 +489,7 @@ namespace dsm {
}
}
}
} else if (!agent->streetId().has_value() &&
!m_agentNextStreetId.contains(agentId)) {
} else if (!agent->streetId().has_value() && !agent->nextStreetId().has_value()) {
Id srcNodeId = agent->srcNodeId().has_value() ? agent->srcNodeId().value()
: nodeDist(this->m_generator);
const auto& srcNode{this->m_graph.nodeSet()[srcNodeId]};
Expand All @@ -511,7 +509,7 @@ namespace dsm {
auto& roundabout = dynamic_cast<Roundabout&>(*srcNode);
roundabout.enqueue(agentId);
}
m_agentNextStreetId.emplace(agentId, nextStreet->id());
agent->setNextStreetId(nextStreet->id());
} else if (agent->delay() == 0) {
agent->setSpeed(0.);
}
Expand Down
Loading