From d3d655187744cd560b76e885d6663d44d03ef5db Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 2 Sep 2021 10:04:16 +0200
Subject: [PATCH] Add snapshot loading

---
 .../NavigationMemory/NavigationMemory.cpp     | 52 +++++++++++++++++++
 .../NavigationMemory/NavigationMemory.h       |  1 +
 2 files changed, 53 insertions(+)

diff --git a/source/Navigation/components/NavigationMemory/NavigationMemory.cpp b/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
index c16efecf..d2267148 100644
--- a/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
+++ b/source/Navigation/components/NavigationMemory/NavigationMemory.cpp
@@ -35,7 +35,11 @@
 #include <RobotAPI/libraries/armem/server/query_proc/ltm.h>
 #include <RobotAPI/libraries/armem/client/query.h>
 #include <RobotAPI/libraries/armem/core/operations.h>
+
 #include <ArmarXCore/core/time/CycleUtil.h>
+#include <ArmarXCore/core/system/ArmarXDataPath.h>
+
+#include <filesystem>
 
 
 namespace armarx::nav
@@ -58,6 +62,10 @@ namespace armarx::nav
 
 
         workingMemory().name() = "Navigation";
+        def->optional(properties.snapshotToLoad, "p.snapshotToLoad",
+                      "Memory snapshot to load at start up \n"
+                      "(e.g. 'PriorKnowledgeData/navigation-graphs/snapshot').");
+
         def->optional(properties.locationGraph.visuLocations, "p.locationGraph.visuLocation",
                       "Enable visualization of locations.");
         def->optional(properties.locationGraph.visuGraphEdges, "p.locationGraph.visuGraphEdges",
@@ -69,6 +77,25 @@ namespace armarx::nav
     }
 
 
+    std::optional<std::filesystem::path>
+    findSnapshotDirectory(const std::filesystem::path& specifiedPath, const std::string& memoryName)
+    {
+        std::vector<std::filesystem::path> candidates
+        {
+            specifiedPath,
+            specifiedPath / memoryName,
+        };
+        for (const auto& candidate : candidates)
+        {
+            if (candidate.filename() == memoryName and std::filesystem::is_directory(candidate))
+            {
+                return candidate;
+            }
+        }
+        return std::nullopt;
+    }
+
+
     void
     NavigationMemory::onInitComponent()
     {
@@ -98,6 +125,31 @@ namespace armarx::nav
         workingMemory().addCoreSegment(nav::graph::coreSegmentID.coreSegmentName,
                                      nav::graph::arondto::Graph::toAronType());
 
+
+        if (not properties.snapshotToLoad.empty())
+        {
+            std::string resolved = ArmarXDataPath::resolvePath(properties.snapshotToLoad);
+            if (auto path = findSnapshotDirectory(resolved, workingMemory().name()))
+            {
+                const std::string key = path->filename();
+                armem::server::ltm::disk::MemoryManager manager;
+                manager.setName(key);
+                manager.setBasePath(path.value());
+                manager.reload();
+
+                armem::client::QueryBuilder builder;
+                builder.all();
+                armem::client::QueryInput queryInput = builder.buildQueryInput();
+                queryInput.addQueryTargetToAll(armem::query::data::QueryTarget::LTM);
+
+                armem::server::query_proc::ltm::MemoryQueryProcessor processor;
+                armem::wm::Memory memory = processor.process(queryInput.toIce(), manager.getCacheAndLutNotConverted());
+                manager.convert(memory);
+
+                ARMARX_INFO << "Loaded " << armem::print(memory);
+                workingMemory().update(armem::toCommit(memory));
+            }
+        }
     }
 
 
diff --git a/source/Navigation/components/NavigationMemory/NavigationMemory.h b/source/Navigation/components/NavigationMemory/NavigationMemory.h
index 58b274bd..f769f90a 100644
--- a/source/Navigation/components/NavigationMemory/NavigationMemory.h
+++ b/source/Navigation/components/NavigationMemory/NavigationMemory.h
@@ -95,6 +95,7 @@ namespace armarx::nav
         /// Properties shown in the Scenario GUI.
         struct Properties
         {
+            std::string snapshotToLoad = "";
 
             struct LocationGraph
             {
-- 
GitLab