From 3d7164f997e793287360bc530ec01243613e4c27 Mon Sep 17 00:00:00 2001
From: Romain BERNARD <romain.bernard@uca.fr>
Date: Tue, 17 Sep 2024 18:42:02 +0200
Subject: [PATCH] if request was unfulfilled, emplace its ID for future
 reference to insert it via SAEV-only best insertion in the last step of
 algorithm

---
 .../Heuristics/MultimodalModularHeuristic.cpp          | 10 +++++++++-
 .../Multimodal/Heuristics/MultimodalModularHeuristic.h |  9 +++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/algorithm/Multimodal/Heuristics/MultimodalModularHeuristic.cpp b/src/algorithm/Multimodal/Heuristics/MultimodalModularHeuristic.cpp
index c250981..463d697 100644
--- a/src/algorithm/Multimodal/Heuristics/MultimodalModularHeuristic.cpp
+++ b/src/algorithm/Multimodal/Heuristics/MultimodalModularHeuristic.cpp
@@ -122,7 +122,11 @@ MultimodalModularHeuristic::insertBestTransitAccessInRoute(const std::vector<Req
     if(accessSubRequestsList.empty()) { //If no valid subrequest was given, still create a fake subrequest and mention failure in the appropriate vector
         DEBUG_MSG("UNFULFILLED SUBREQUEST");
         updateSubRequest(baseRequestId, (*_requestsVect)[baseRequestId], isEntry);
-        updateUnfulfilledSubrequest(baseRequestId, isEntry, true);
+        updateUnfulfilledSubrequest(baseRequestId, isEntry, true); //mark failures for debug/statistics
+        if(!isEntry) { //Exit subrequest : remove entry subrequest and add baseRequest to the "unfulfilled list"
+            _route->removeRequestWithPropagation(baseRequestId, true);
+        }
+        emplaceDARPRequest(baseRequestId);
     } else {
         //If no active vehicle insertion worked, do best insertion on a new vehicle with the first subrequest (supposedly it's the most advantageous)
         DEBUG_MSG("CREATE VEHICLE");
@@ -260,3 +264,7 @@ const std::vector<Request> &MultimodalModularHeuristic::getEntrySubRequests() co
 const std::vector<Request> &MultimodalModularHeuristic::getExitSubRequests() const {
     return _exitSubRequests;
 }
+
+void MultimodalModularHeuristic::emplaceDARPRequest(size_t baseRequestId) {
+    _darpRequestList.emplace_back(baseRequestId);
+}
diff --git a/src/algorithm/Multimodal/Heuristics/MultimodalModularHeuristic.h b/src/algorithm/Multimodal/Heuristics/MultimodalModularHeuristic.h
index 7dfbe95..0437dcd 100644
--- a/src/algorithm/Multimodal/Heuristics/MultimodalModularHeuristic.h
+++ b/src/algorithm/Multimodal/Heuristics/MultimodalModularHeuristic.h
@@ -53,6 +53,13 @@ private:
      */
     std::vector<bool> _unfulfilledTransitExit;
 
+    /**
+     * Vector containing every base request (referenced via its _requestsVect index) that needs to be fulfilled in SAEV-only DARP \n
+     * \n
+     * This includes non-multimodal requests and requests that couldn't be fulfilled in the entry/exit step of the multimodal procedure
+     */
+    std::vector<size_t> _darpRequestList;
+
     //Add friend test classes to test inner workings without making the whole API public
     FRIEND_TEST(MultimodalInsertionHeuristicDebug, DebugBaseInstance);
     FRIEND_TEST(MultimodalInsertionHeuristicDebug, DebugInstanceAlain);
@@ -203,6 +210,8 @@ protected:
     void updateUnfulfilledSubrequest(size_t baseRequestId, bool isEntry, bool value);
 
     bool isEntryFulfilled(size_t baseRequestId);
+
+    void emplaceDARPRequest(size_t baseRequestId);
 };
 
 
-- 
GitLab