diff --git a/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.cpp b/src/algorithm/Multimodal/Heuristics/SimpleModularHeuristic.cpp index e42e56f19f916a0d1bd20859f4c4b525f16249c8..4a44088b24b3ae3364b39ef23683acbe51e426b9 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 e06ec5b82422a3af686f722f279845d47256eeab..065dcc25b02cfed55acd0fe0a77e0388580d9f55 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 {