From 2a1aa8c2488340952e9a2959aefe345649dfa6ee Mon Sep 17 00:00:00 2001 From: Romain BERNARD <romain.bernard@uca.fr> Date: Fri, 13 Sep 2024 17:23:47 +0200 Subject: [PATCH] stop using base requests vector to save subrequests generated by the algorithm (it used to create multiple side effects wrt request pointers and how we access base/sub requests) --- .../Heuristics/SimpleModularHeuristic.cpp | 31 +++++++++---------- .../Heuristics/SimpleModularHeuristic.h | 23 +++++++++----- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.cpp b/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.cpp index e42e56f..4a44088 100644 --- a/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.cpp +++ b/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.cpp @@ -150,28 +150,17 @@ void SimpleModularHeuristic::setRoute(SAEVRoute *route) { } void SimpleModularHeuristic::updateSubRequest(size_t requestId, const Request &request, bool isEntry) { - size_t subRequestIndex = getSubrequestIndex(requestId, isEntry); - if((_requestsVect->size() - 1) < subRequestIndex) { - _requestsVect->emplace_back(request); - assertm((_requestsVect->size() - 1) == subRequestIndex,"A request seems to have been missed or doesn't have any subrequest defined"); - } else { - (*_requestsVect)[subRequestIndex] = request; - } - - std::vector<Request>& requestVectRef = *_requestsVect; - _route->getEntrySubRequestOrigin(requestId).setRequest(&requestVectRef[subRequestIndex]); - _route->getEntrySubRequestDestination(requestId).setRequest(&requestVectRef[subRequestIndex]); -} - -size_t SimpleModularHeuristic::getSubrequestIndex(size_t requestId, bool isEntry) const { if(isEntry) - return _nbBaseRquests + requestId; + _entrySubRequests[requestId] = request; else - return _nbBaseRquests*2 + requestId; + _exitSubRequests[requestId] = request; + + _route->getEntrySubRequestOrigin(requestId).setRequest(&getSubrequest(requestId, isEntry)); + _route->getEntrySubRequestDestination(requestId).setRequest(&getSubrequest(requestId, isEntry)); } const Request& SimpleModularHeuristic::getSubrequest(size_t requestId, bool isEntry) { - return (*_requestsVect)[getSubrequestIndex(requestId, isEntry)]; + return isEntry ? _entrySubRequests[requestId] : _exitSubRequests[requestId]; } double SimpleModularHeuristic::getTransitExitScore(const Request &baseRequest, const TransitAccess &exitData) const { @@ -263,3 +252,11 @@ const std::vector<bool> &SimpleModularHeuristic::getUnfulfilledTransitEntry() co bool SimpleModularHeuristic::isEntryFulfilled(size_t baseRequestId) { return !_unfulfilledTransitEntry[baseRequestId]; } + +const std::vector<Request> &SimpleModularHeuristic::getEntrySubRequests() const { + return _entrySubRequests; +} + +const std::vector<Request> &SimpleModularHeuristic::getExitSubRequests() const { + return _exitSubRequests; +} diff --git a/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.h b/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.h index e06ec5b..065dcc2 100644 --- a/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.h +++ b/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.h @@ -24,10 +24,14 @@ class SimpleModularHeuristic { private: + //Exterior members const Graph* _graph{nullptr}; - SAEVRoute* _route{nullptr}; - std::vector<Request>* _requestsVect{nullptr}; - size_t _nbBaseRquests; + const std::vector<Request>* _requestsVect{nullptr}; + SAEVRoute* _route{nullptr}; //_route is a pointer here to decorrelate the route from the algorithm and facilitate using multiple modules on the same route + + std::vector<Request> _entrySubRequests; + std::vector<Request> _exitSubRequests; + std::vector<bool> _unfulfilledTransitEntry; std::vector<bool> _unfulfilledTransitExit; @@ -37,18 +41,21 @@ private: //Public interface to interact with the modular heuristic public: - SimpleModularHeuristic(const Graph *graph, SAEVRoute *route, std::vector<Request>* requestsVect) : _graph(graph), _route(route), - _requestsVect(requestsVect), _nbBaseRquests(requestsVect->size()), _unfulfilledTransitEntry(_nbBaseRquests), _unfulfilledTransitExit(_nbBaseRquests) {} + SimpleModularHeuristic(const Graph *graph, SAEVRoute *route, std::vector<Request> const* requestsVect) : _graph(graph), _requestsVect(requestsVect), + _route(route), _entrySubRequests(requestsVect->size()), _exitSubRequests(requestsVect->size()), + _unfulfilledTransitEntry(requestsVect->size()), _unfulfilledTransitExit(requestsVect->size()) {} void multimodalRequestsInsertion(const std::vector<Request>& requestsToInsert); [[nodiscard]] size_t getNbBaseRquests() const { - return _nbBaseRquests; + return _requestsVect->size(); } - const std::vector<bool> &getUnfulfilledTransitExit() const; + [[nodiscard]] const std::vector<Request> &getEntrySubRequests() const; + [[nodiscard]] const std::vector<Request> &getExitSubRequests() const; - const std::vector<bool> &getUnfulfilledTransitEntry() const; + [[nodiscard]] const std::vector<bool> &getUnfulfilledTransitEntry() const; + [[nodiscard]] const std::vector<bool> &getUnfulfilledTransitExit() const; //Define useful struct to order transit access objects struct ScoredTransitAccess : public TransitAccess { -- GitLab