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