Memory.cpp
Go to the documentation of this file.
1 #include "Memory.h"
2 
5 
7 
9 {
10  void
11  Memory::_configure(const nlohmann::json& json)
12  {
13  std::lock_guard l(ltm_mutex);
14 
19  }
20 
21  Memory::Memory() : Memory(std::filesystem::path("/tmp/ltm"), {}, "MemoryExport", "Test")
22  {
23  }
24 
26 
27  const std::string& exportName,
28  const std::string& memoryName /* UNESCAPED */) :
29  Memory(p, {}, exportName, memoryName)
30  {
31  }
32 
35 
36  const std::string& exportName,
37  const std::string& memoryName /* UNESCAPED */) :
38  MemoryBase(exportName, MemoryID(memoryName, "")),
41  DiskMemoryItemMixin(p, exportName, MemoryID(memoryName, "")),
42  MongoDBStorageMixin(s, exportName, MemoryID(memoryName, ""))
43  {
44  ARMARX_INFO << "Creating a new memory at " << p.string() << " and " << exportName;
45  }
46 
47  void
48  Memory::_setExportName(const std::string& n)
49  {
52  }
53 
54  void
56  {
58  //MongoDBStorageMixin::start();
59  }
60 
61  void
63  {
65  //MongoDBStorageMixin::stop();
66  ARMARX_IMPORTANT << "Storing of data finished, starting to generate and save statistics...";
68  }
69 
70  void
72  {
73  std::lock_guard l(ltm_mutex);
74 
79  }
80 
81  bool
82  Memory::forEachCoreSegment(std::function<void(CoreSegment&)> func) const
83  {
84  std::lock_guard l(ltm_mutex);
85 
86  // legacy: check fs
87  if (fullPathExists())
88  {
89  for (const auto& subdirName : getAllDirectories())
90  {
91  const std::string& segmentName_one = util::fs::detail::unescapeName(subdirName);
92  auto segmentName = util::fs::detail::extractLastDirectoryFromPath(segmentName_one);
94  getSettings(),
95  getExportName(),
96  id().withCoreSegmentName(segmentName),
97  processors);
98  func(c);
99  }
100  }
101  else
102  {
103  ARMARX_WARNING << "Could not load the core segments of LTM " << id().str()
104  << " as the path " << getFullPath().string() << " does not exist.";
105  }
106 
107  ARMARX_DEBUG << "All CoreSegments handeled";
108 
109  return true;
110  }
111 
112  bool
113  Memory::hasCoreSegment(const std::string& name) const
114  {
115  std::lock_guard l(ltm_mutex);
116 
118  {
119  return true;
120  }
121 
122  // check if collection exists
123  /*if (connected() && collectionExists())
124  {
125  auto c = CoreSegment(getMemoryBasePath(),
126  getSettings(),
127  getExportName(),
128  id().withCoreSegmentName(name),
129  processors);
130 
131  return (bool)c.collectionExists();
132  }*/
133 
134  // legacy: check if segment is stored on hard drive without db
135  if (fullPathExists())
136  {
138  getSettings(),
139  getExportName(),
140  id().withCoreSegmentName(name),
141  processors);
142 
143  return c.fullPathExists();
144  }
145 
146  return false;
147  }
148 
149  std::unique_ptr<CoreSegment>
150  Memory::findCoreSegment(const std::string& coreSegmentName) const
151  {
152  std::lock_guard l(ltm_mutex);
153 
154  if (!hasCoreSegment(coreSegmentName))
155  {
156  return nullptr;
157  }
158 
159  return std::make_unique<CoreSegment>(getMemoryBasePath(),
160  getSettings(),
161  getExportName(),
162  id().withCoreSegmentName(coreSegmentName),
163  processors);
164  }
165 
166  void
168  {
172  }
173 
174  void
176  {
177  std::lock_guard l(ltm_mutex);
178 
179  m.id() = id().getMemoryID().cleanID();
180 
182  [&m](auto& x)
183  {
185  x.loadAllReferences(s);
186  m.addCoreSegment(s);
187  });
188  }
189 
190  void
192  {
193  std::lock_guard l(ltm_mutex);
194  m.id() = id().getMemoryID().cleanID();
195 
197  [&m, &n](auto& x)
198  {
200  x.loadLatestNReferences(n, s);
201  m.addCoreSegment(s);
202  });
203  }
204 
205  void
206  Memory::_loadLatestNReferences(int n, armem::wm::Memory& m, std::list<std::string> coreSegNames)
207  {
208  std::lock_guard l(ltm_mutex);
209  m.id() = id().getMemoryID().cleanID();
210 
212  [&m, &n, &coreSegNames](auto& x)
213  {
214  bool loadCoreSeg =
215  (std::find(coreSegNames.begin(), coreSegNames.end(), x.id().coreSegmentName) !=
216  coreSegNames.end());
217  if (loadCoreSeg)
218  {
220  x.loadLatestNReferences(n, s);
221  m.addCoreSegment(s);
222  }
223  else
224  {
225  ARMARX_DEBUG << "Skipping loading CoreSegment with name "
226  << x.id().coreSegmentName
227  << " from LTM into WM as it is not in the defined list";
228  }
229  });
230  }
231 
232  void
234  {
235  std::lock_guard l(ltm_mutex); // we cannot load a memory multiple times simultaneously
236 
238 
239  if (/*(connected() && collectionExists()) ||*/ fullPathExists())
240  {
242  [&](auto& e)
243  {
244  //ARMARX_INFO << "resolve for CoreSegment " << e.id().str();
246  getSettings(),
247  getExportName(),
248  id().withCoreSegmentName(e.id().coreSegmentName),
249  processors);
250  c.resolve(e);
251  });
252  }
253  else
254  {
255  ARMARX_WARNING << "You are trying to resolve an LTM from a path that does not exist: "
256  << getFullPath();
257  }
258  }
259 
260  void
262  {
264  }
265 
266  void
267  Memory::_directlyStore(const armem::wm::Memory& memory, bool simulatedVersion)
268  {
269  std::lock_guard l(ltm_mutex); // we cannot store a memory multiple times simultaneously
270 
271  if (id().memoryName.empty())
272  {
274  << "During storage of memory '" << memory.id().str()
275  << "' I noticed that the corresponding LTM has no id set. "
276  << "I set the id of the LTM to the same name, however this should not happen!";
277  setMemoryID(memory.id());
278  }
279 
280  /*if (!connected())
281  {
282  ARMARX_WARNING << "LTM NOT CONNECTED ALTHOUGH ENABLED " << id().str();
283  return;
284  }*/
285 
286  ARMARX_DEBUG << "CoreSegments: " << memory.getCoreSegmentNames().size();
287 
288  memory.forEachCoreSegment(
289  [&](const auto& core)
290  {
292  getSettings(),
293  getExportName(),
294  id().withCoreSegmentName(core.id().coreSegmentName),
295  processors);
296 
297  // 2. store data
298  c.store(core, simulatedVersion);
299 
300 
301  // 3. update statistics
302  statistics.recordedCoreSegments++;
303  });
304 
305  // 4. update cache
306  //CachedBase::addToCache(memory);
307  }
308 
309  void
311  {
312  //not used any more
313  }
314 
315  void
317  {
318  auto firstTimeStarted = this->statistics.firstStarted;
319  if (!firstTimeStarted.isValid())
320  {
321  //No statistics to be saved, as recording was never started
322  ARMARX_DEBUG << "No Statistics will be saved because firstStarted is invalid: "
323  << VAROUT(this->statistics.firstStarted);
324  return;
325  }
326 
327  ARMARX_INFO << "Preparing to save statistics for " << this->name();
328  try
329  {
330  auto first_stats = this->getFilterStatistics();
331  if (first_stats.empty())
332  {
333  //empty statistics mean no data was recorded and no statistics should be saved
334  ARMARX_DEBUG << "No Statistics will be saved because no actual data was recorded.";
335  return;
336  }
337  std::map<std::string,
338  std::map<std::string, ltm::processor::SnapshotFilter::FilterStatistics>>
339  information;
340  std::map<std::string, armarx::core::time::DateTime> times;
341 
342  try
343  {
344  times["Started LTM1"] = this->getStatistics().lastStarted;
345  times["Stopped LTM1"] = this->getStatistics().lastStopped;
346  information["LTM"] = first_stats;
347  }
348  catch (...)
349  {
350  ARMARX_INFO << "Something went wrong after getting the statistics";
351  }
352  auto exportPath = this->getMemoryBasePath();
353  auto exportName = this->getExportName();
354  auto recording_started = this->getStatistics().lastStarted;
355  auto recording_stopped = this->getStatistics().lastStopped;
356  test::save_statistics(information,
357  times,
358  recording_started,
359  recording_stopped,
360  exportPath,
361  exportName,
362  this->name());
363  }
364  catch (...)
365  {
366  ARMARX_INFO << "Something went wrong with the statistics saving process";
367  }
368  }
369 } // namespace armarx::armem::server::ltm
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::getStatistics
Statistics getStatistics() const
Definition: MemoryBase.h:322
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::stop
void stop()
Definition: BufferedMemoryMixin.h:82
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::setMixinMemoryID
void setMixinMemoryID(const MemoryID &id)
Definition: BufferedMemoryMixin.h:58
armarx::armem::server::ltm::Memory::_loadAllReferences
void _loadAllReferences(armem::wm::Memory &) final
Definition: Memory.cpp:175
armarx::armem::server::ltm::detail::mixin::CachedMemoryMixin< CoreSegment >::setMixinMemoryID
void setMixinMemoryID(const MemoryID &id)
Definition: CachedMemoryMixin.h:35
armarx::armem::server::ltm::Memory::_setExportName
void _setExportName(const std::string &n) final
Definition: Memory.cpp:48
armarx::armem::server::ltm::detail::MemoryItem::processors
std::shared_ptr< Processors > processors
Definition: MemoryItem.h:54
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
armarx::armem::server::ltm::Memory::Memory
Memory()
Definition: Memory.cpp:21
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::configureMixin
void configureMixin(const nlohmann::json &json)
configuration
Definition: MongoDBStorageMixin.cpp:456
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::getMemoryBasePath
Path getMemoryBasePath() const
Definition: DiskStorageMixin.cpp:71
armarx::armem::server::ltm::Memory::getAndSaveStatistics
void getAndSaveStatistics()
getAndSaveStatistics generates and saves statistics for a LTM recording
Definition: Memory.cpp:316
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::createPropertyDefinitions
void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix)
Definition: DiskStorageMixin.cpp:236
armarx::armem::server::ltm::Memory::createPropertyDefinitions
void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix) override
default parameters. Implementation should use the configuration to configure
Definition: Memory.cpp:167
armarx::armem::MemoryID::str
std::string str(bool escapeDelimiters=true) const
Get a string representation of this memory ID.
Definition: MemoryID.cpp:102
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::setMixinMemoryID
void setMixinMemoryID(const MemoryID &n)
Definition: DiskStorageMixin.cpp:54
armarx::armem::server::ltm::Memory::_disable
void _disable() final
Definition: Memory.cpp:62
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::p
struct armarx::armem::server::ltm::detail::MemoryBase::Properties p
armarx::memory
Brief description of class memory.
Definition: memory.h:38
armarx::armem::server::ltm::Memory::_configure
void _configure(const nlohmann::json &config) final
configuration
Definition: Memory.cpp:11
armarx::armem::server::ltm::util::fs::detail::unescapeName
std::string unescapeName(const std::string &escapedName)
Definition: filesystem.cpp:31
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::statistics
Statistics statistics
Definition: MemoryBase.h:425
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >
armarx::armem::server::ltm::Memory::_loadOnStartup
void _loadOnStartup() final
Definition: Memory.cpp:310
armarx::armem::base::MemoryBase::forEachCoreSegment
bool forEachCoreSegment(CoreSegmentFunctionT &&func)
Definition: MemoryBase.h:186
armarx::armem::server::ltm::Memory
A memory storing data on the hard drive and in mongodb (needs 'armarx memory start' to start the mong...
Definition: Memory.h:19
memory_definitions.h
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::setMixinMemoryID
void setMixinMemoryID(const armem::MemoryID &)
setter
Definition: MongoDBStorageMixin.cpp:442
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::getAllDirectories
std::vector< Path > getAllDirectories() const
Definition: DiskStorageMixin.cpp:222
armarx::armem::server::ltm::Memory::_resolve
void _resolve(armem::wm::Memory &) final
Definition: Memory.cpp:233
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::addToBuffer
void addToBuffer(const armem::wm::Memory &memory)
Definition: BufferedMemoryMixin.h:144
armarx::armem::server::ltm::Memory::_store
void _store(const armem::wm::Memory &m) final
Definition: Memory.cpp:261
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::server::ltm::detail::MemoryItem::setMemoryID
void setMemoryID(const MemoryID &)
Definition: MemoryItem.cpp:30
armarx::armem::server::ltm::Memory::_setMemoryID
void _setMemoryID(const MemoryID &id) final
Definition: Memory.cpp:71
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::start
void start()
Definition: BufferedMemoryMixin.h:67
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::ltm_mutex
std::recursive_mutex ltm_mutex
Definition: MemoryBase.h:423
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::armem::wm::CoreSegment
Client-side working memory core segment.
Definition: memory_definitions.h:119
armarx::armem::server::ltm::detail::mixin::CachedMemoryMixin< CoreSegment >::configureMixin
void configureMixin(const nlohmann::json &json)
configuration
Definition: CachedMemoryMixin.h:29
armarx::armem::wm::Memory
Client-side working memory.
Definition: memory_definitions.h:133
armarx::armem::server::ltm::util::fs::detail::extractLastDirectoryFromPath
std::string extractLastDirectoryFromPath(const std::string &path)
Definition: filesystem.cpp:44
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::setMixinExportName
void setMixinExportName(const std::string &n)
Definition: DiskStorageMixin.cpp:47
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::getSettings
MongoDBSettings getSettings() const
Definition: MongoDBStorageMixin.cpp:436
armarx::armem::base::MemoryBase::addCoreSegment
CoreSegmentT & addCoreSegment(const std::string &name, aron::type::ObjectPtr coreSegmentType=nullptr, const std::vector< PredictionEngine > &predictionEngines={})
Add an empty core segment with the given name, type and prediction engines.
Definition: MemoryBase.h:259
armarx::armem::server::ltm::Memory::forEachCoreSegment
bool forEachCoreSegment(std::function< void(CoreSegment &)> func) const final
iterate over all core segments of this ltm
Definition: Memory.cpp:82
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::createPropertyDefinitions
virtual void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix)
default parameters. Implementation should use the configuration to configure
Definition: MemoryBase.h:277
armarx::armem::server::ltm::detail::MemoryItem::getExportName
virtual std::string getExportName() const
Definition: MemoryItem.h:27
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::getFilterStatistics
std::map< std::string, processor::SnapshotFilter::FilterStatistics > getFilterStatistics()
Definition: MemoryBase.h:328
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin
Definition: MongoDBStorageMixin.h:45
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::setMixinExportName
void setMixinExportName(const std::string &n)
Definition: MongoDBStorageMixin.cpp:450
armarx::armem::base::detail::MemoryItem::id
MemoryID & id()
Definition: MemoryItem.h:25
armarx::armem::server::ltm::Memory::_directlyStore
void _directlyStore(const armem::wm::Memory &m, bool simulatedVersion) final
Definition: Memory.cpp:267
armarx::armem::server::ltm::detail::mixin::CachedMemoryMixin< CoreSegment >
armarx::armem::server::ltm
Definition: forward_declarations.h:20
Memory.h
armarx::armem::server::ltm::Memory::_enable
void _enable() final
Definition: Memory.cpp:55
armarx::armem::server::ltm::detail::MemoryItem::id
MemoryID id() const
Definition: MemoryItem.cpp:37
armarx::armem::MemoryID::cleanID
MemoryID cleanID() const
Definition: MemoryID.cpp:133
armarx::armem::MemoryID::getMemoryID
MemoryID getMemoryID() const
Definition: MemoryID.cpp:286
TimeUtil.h
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::configureMixin
void configureMixin(const nlohmann::json &json)
configuration
Definition: BufferedMemoryMixin.h:124
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::armem::server::ltm::CoreSegment
Definition: CoreSegment.h:13
std
Definition: Application.h:66
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:198
armarx::armem::laser_scans::constants::memoryName
const std::string memoryName
Definition: constants.h:28
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::fullPathExists
bool fullPathExists() const
Definition: DiskStorageMixin.cpp:113
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >
armarx::armem::server::ltm::detail::mixin::CachedMemoryMixin< CoreSegment >::cacheHasCoreSegment
bool cacheHasCoreSegment(const std::string &n) const
Definition: CachedMemoryMixin.h:50
armarx::armem::server::ltm::Memory::_loadLatestNReferences
void _loadLatestNReferences(int n, armem::wm::Memory &m) final
Definition: Memory.cpp:191
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::createPropertyDefinitions
void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix)
Definition: BufferedMemoryMixin.h:135
armarx::armem::server::ltm::detail::mixin::MongoDBSettings
Definition: MongoDBStorageMixin.h:15
armarx::armem::server::ltm::detail::mixin::Path
std::filesystem::path Path
Definition: DiskStorageMixin.h:17
armarx::armem::server::ltm::Memory::findCoreSegment
std::unique_ptr< CoreSegment > findCoreSegment(const std::string &coreSegmentName) const final
find core segment
Definition: Memory.cpp:150
armarx::armem::server::ltm::Memory::hasCoreSegment
bool hasCoreSegment(const std::string &name) const final
check if core segment exists
Definition: Memory.cpp:113
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::configureMixin
void configureMixin(const nlohmann::json &json)
Definition: DiskStorageMixin.cpp:62
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::getFullPath
Path getFullPath() const
Definition: DiskStorageMixin.cpp:89
armarx::armem::server::ltm::detail::MemoryItem::name
std::string name() const
Definition: MemoryItem.cpp:43