MemoryBase.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <functional>
4 #include <list>
5 
6 
7 // BaseClass
8 #include "MemoryItem.h"
9 
10 // ChildType
11 
12 // ArmarX
15 #include <ArmarXCore/core/time.h>
16 #include <ArmarXCore/interface/core/UserException.h>
17 
22 #include <RobotAPI/libraries/armem/server/test/ForgettingExperiments.h>
24 
26 {
27  enum class RecordingMode
28  {
29  CONSOLIDATE_REMOVED, // only store whats removed from the WM
30  CONSOLIDATE_ALL, // store whats in the WM (on commit)
31  CONSOLIDATE_LATEST // store the latest snapshots at a fixed frequency (for now 1Hz)
32  };
33 } // namespace armarx::armem::server::ltm
34 
36 {
37  /// @brief Interface functions for the longterm memory classes
38  template <class _CoreSegmentT>
39  class MemoryBase : public MemoryItem
40  {
41  public:
42  struct Statistics
43  {
46  bool firstStart = true;
47  bool firstStop = true;
52  };
53 
54  public:
55  using CoreSegmentT = _CoreSegmentT;
56 
57  MemoryBase(const std::string& exportName, const MemoryID& id) :
58  MemoryItem(exportName, id), enabled(false)
59  {
60  }
61 
62  void
63  setRecordingMode(const std::string& m)
64  {
65  if (m == "CONSOLIDATE_REMOVED")
66  {
68  }
69  else if (m == "CONSOLIDATE_ALL")
70  {
72  }
73  else if (m == "CONSOLIDATE_LATEST")
74  {
76  }
77  else
78  {
79  ARMARX_WARNING << "Unknown recording mode: " << m;
80  }
81  }
82 
83  void
85  {
86  this->recordingMode = m;
87  }
88 
91  {
92  return recordingMode;
93  }
94 
95  /// initialize config
96  void
98  {
99  bool en = p.enabled_on_startup;
103 
104  this->setExportName(p.export_name);
106 
107  try
108  {
109  const auto json = nlohmann::json::parse(p.configuration_on_startup);
110 
111  // Processors are shared. So we only need to configure the root
112  processors->configure(json);
113 
114  this->_configure(json);
115  }
116  catch (...)
117  {
118  ARMARX_WARNING << "Failed to parse `" << p.configuration_on_startup << "`";
119  en = false;
120  }
121 
122  if (en)
123  {
124  this->startRecording();
125  }
126  }
127 
128  /// enable this LTM
129  void
131  {
132  processors->resetFilterStatisticsForNewEpisode(); //make sure the statistics are
133  //resetted before the recording starts
135  ARMARX_INFO << "Enabling LTM " << id().str() << " at " << now.toDateTimeString();
136  ARMARX_INFO << "Storing information at " << this->getExportName();
137  enabled = true;
139  {
140  statistics.firstStarted = now;
141  statistics.firstStart = false;
142  }
143  statistics.lastStarted = now;
144  this->_enable();
145  }
146 
147  /// disable this LTM
148  void
150  {
152  ARMARX_INFO << "Disabling LTM " << id().str() << " at " << now.toDateTimeString();
153  enabled = false;
154  if (statistics.firstStop)
155  {
156  statistics.firstStopped = now;
157  statistics.firstStop = false;
158  }
159  statistics.lastStopped = now;
160  this->_disable();
161  ARMARX_INFO << "Disabling of LTM finished";
162  }
163 
164  /// return the full ltm as a wm::Memory with only references
165  /// the ltm may be huge, use with caution
168  {
171  return ret;
172  }
173 
174  void
176  {
177  TIMING_START(LTM_Memory_LoadAll);
179  TIMING_END_STREAM(LTM_Memory_LoadAll, ARMARX_DEBUG);
180  }
181 
182  //return the newest part of the ltm as a wm::Memory with only references
183  //will return the newest n snapshots of each entity
186  {
189  return ret;
190  }
191 
192  //return the newest part of the ltm as a wm::Memory with only references
193  //will return the newest n snapshots of each entity for only the CoreSegments matching one of the name sin the list
194  void
195  loadLatestNReferences(int n, armem::wm::Memory& memory, std::list<std::string> coreSegNames)
196  {
197  TIMING_START(LTM_Memory_loadNewestn_someCoreSegs);
198  _loadLatestNReferences(n, memory, coreSegNames);
199  TIMING_END_STREAM(LTM_Memory_loadNewestn_someCoreSegs, ARMARX_DEBUG);
200  }
201 
202  void
204  {
205  TIMING_START(LTM_Memory_loadNewestn);
207  TIMING_END_STREAM(LTM_Memory_loadNewestn, ARMARX_DEBUG);
208  }
209 
210  /// return the full ltm as a wm::Memory and resolves the references
211  /// the ltm may be huge, use with caution
214  {
217  return ret;
218  }
219 
220  void
222  {
223  TIMING_START(LTM_Memory_LoadAllAndResolve);
225  _resolve(memory);
226  TIMING_END_STREAM(LTM_Memory_LoadAllAndResolve, ARMARX_DEBUG);
227  }
228 
229  /// convert the references of the input into a wm::Memory
230  void
232  {
233  TIMING_START(LTM_Memory_Load);
234  _resolve(memory);
235  TIMING_END_STREAM(LTM_Memory_Load, ARMARX_DEBUG);
236  }
237 
238  /// append a wm::Memory instance to the ltm
239  void
241  {
242  TIMING_START(LTM_Memory_Append);
243 
244  for (auto& f : processors->memFilters)
245  {
246  if (!f->accept(memory))
247  {
249  << "Ignoring to put a Memory into the LTM because it got filtered.";
250  return;
251  }
252  }
254  TIMING_END_STREAM(LTM_Memory_Append, ARMARX_DEBUG);
255  }
256 
257  /// append a wm::Memory instance to the ltm
258  void
259  store(const armem::server::wm::Memory& serverMemory)
260  {
261  armem::wm::Memory memory(serverMemory.name());
262  memory.update(armem::toCommit(serverMemory), true, false);
263  this->store(memory);
264  }
265 
266  /// iterate over all core segments of this ltm
267  virtual bool forEachCoreSegment(std::function<void(CoreSegmentT&)> func) const = 0;
268 
269  /// check if core segment exists
270  virtual bool hasCoreSegment(const std::string&) const = 0;
271 
272  /// find core segment
273  virtual std::unique_ptr<CoreSegmentT> findCoreSegment(const std::string&) const = 0;
274 
275  /// default parameters. Implementation should use the configuration to configure
276  virtual void
277  createPropertyDefinitions(PropertyDefinitionsPtr& defs, const std::string& prefix)
278  {
279  defs->optional(p.enabled_on_startup, prefix + "enabled");
280  defs->optional(p.recordingMode, prefix + "recordingMode");
281  defs->optional(p.configuration_on_startup, prefix + "configuration");
282  defs->optional(p.export_name, prefix + "exportName");
283  defs->optional(p.storeOnStop, prefix + "storeOnStop");
284 
285  defs->optional(p.importOnStartUp, prefix + "importOnStartUp");
286  defs->optional(p.maxAmountOfSnapshotsLoaded, prefix + "maxAmountSnapshotsLoaded");
287  defs->optional(p.coreSegmentsToLoad, prefix + "loadedCoreSegments");
288  }
289 
290  /// enable/disable
291  void
293  {
295 
296  enable();
297  }
298 
299  void
301  {
302 
303  disable();
304  }
305 
306  bool
307  isRecording() const
308  {
309  return enabled;
310  }
311 
312  /// statistics
313  virtual void
315  {
316  // enabled stays the same
319  }
320 
321  Statistics
323  {
324  return statistics;
325  }
326 
327  std::map<std::string, processor::SnapshotFilter::FilterStatistics>
329  {
330  try
331  {
332  ARMARX_INFO << "Trying to save statistics";
333  auto stats = processors->getSnapshotFilterStatistics();
334  return stats;
335  }
336  catch (InvalidArgumentException& e)
337  { //no data was actually recorded
338  ARMARX_INFO << e.what();
339  }
340  catch (...)
341  {
342  ARMARX_WARNING << "Saving statistics did not work";
343  }
344  std::map<std::string, processor::SnapshotFilter::FilterStatistics> emptyStatistics;
345  return emptyStatistics;
346  }
347 
348  /// get level name1
349  static std::string
351  {
352  return "LT-Memory";
353  }
354 
355  void
357  {
358  _loadOnStartup();
359  }
360 
361 
362  protected:
363  /// configuration
364  virtual void
365  _configure(const nlohmann::json&)
366  {
367  }
368 
369  virtual void
371  {
372  }
373 
374  virtual void
376  {
377  }
378 
379  virtual void
380  _setExportName(const std::string&)
381  {
382  }
383 
384  virtual void _loadAllReferences(armem::wm::Memory& memory) = 0;
385  virtual void _resolve(armem::wm::Memory& memory) = 0;
386  virtual void _store(const armem::wm::Memory& memory) = 0;
387  virtual void _directlyStore(const armem::wm::Memory& memory,
388  bool simulatedVersion = false) = 0;
389  virtual void _loadOnStartup() = 0;
390  virtual void _loadLatestNReferences(int n, armem::wm::Memory& memory) = 0;
391  virtual void _loadLatestNReferences(int n,
393  std::list<std::string> coreSegNames) = 0;
394 
395  public:
396  // stuff for scenario parameters
397  struct Properties
398  {
399  // whether the LTM is enabled on startup
400  bool enabled_on_startup = false;
401 
402  // How data is stored, if the LTM is enabled
403  std::string recordingMode = "CONSOLIDATE_REMOVED";
404 
405  // Name and export path (TODO: Should this be part of the base class? Export path is a disk memory thing)
406  std::string export_name = "MemoryExport";
407  std::string export_path = "/tmp/ltm";
408  bool storeOnStop = false;
409 
410  // TODO: belong more to WM, but no good solution for that currently:
411  bool importOnStartUp = false;
413  std::string coreSegmentsToLoad = "";
414 
415  // Other configuration
417  "{ \"SnapshotFrequencyFilter\": "
418  "{\"WaitingTimeInMsForFilter\" : 50}}"; //record with 20 fps as standard
419 
420  } p;
421 
422  protected:
423  mutable std::recursive_mutex ltm_mutex;
424 
425  mutable Statistics statistics;
426 
427  std::atomic_bool enabled = true;
428 
430  };
431 } // namespace armarx::armem::server::ltm::detail
armarx::armem::server::ltm::detail::MemoryBase::isRecording
bool isRecording() const
Definition: MemoryBase.h:307
armarx::armem::server::ltm::detail::MemoryBase::_disable
virtual void _disable()
Definition: MemoryBase.h:375
armarx::armem::server::ltm::detail::MemoryBase::getStatistics
Statistics getStatistics() const
Definition: MemoryBase.h:322
armarx::armem::server::ltm::detail::MemoryBase::Statistics
Definition: MemoryBase.h:42
TIMING_START
#define TIMING_START(name)
Definition: TimeUtil.h:289
armarx::armem::server::ltm::detail
Definition: CoreSegmentBase.cpp:3
armarx::armem::server::ltm::detail::MemoryBase::_resolve
virtual void _resolve(armem::wm::Memory &memory)=0
armarx::armem::server::ltm::detail::MemoryBase::Statistics::firstStopped
armarx::core::time::DateTime firstStopped
Definition: MemoryBase.h:49
armarx::aron::ret
ReaderT::InputType T & ret
Definition: rw.h:13
armarx::armem::server::ltm::detail::MemoryBase::recordingMode
RecordingMode recordingMode
Definition: MemoryBase.h:429
armarx::armem::server::ltm::detail::MemoryItem::processors
std::shared_ptr< Processors > processors
Definition: MemoryItem.h:54
armarx::armem::server::ltm::detail::MemoryBase::loadLatestNReferences
void loadLatestNReferences(int n, armem::wm::Memory &memory)
Definition: MemoryBase.h:203
armarx::armem::server::ltm::detail::MemoryBase::disable
void disable()
disable this LTM
Definition: MemoryBase.h:149
armarx::armem::server::ltm::detail::MemoryBase::findCoreSegment
virtual std::unique_ptr< CoreSegmentT > findCoreSegment(const std::string &) const =0
find core segment
armarx::armem::server::ltm::detail::MemoryBase::Statistics::lastStarted
armarx::core::time::DateTime lastStarted
Definition: MemoryBase.h:50
armarx::armem::server::ltm::detail::MemoryBase::getRecordingMode
RecordingMode getRecordingMode() const
Definition: MemoryBase.h:90
armarx::core::time::DateTime::Now
static DateTime Now()
Definition: DateTime.cpp:51
armarx::armem::server::ltm::detail::MemoryBase::Properties::coreSegmentsToLoad
std::string coreSegmentsToLoad
Definition: MemoryBase.h:413
MemoryID.h
armarx::armem::server::ltm::detail::MemoryBase::_loadAllReferences
virtual void _loadAllReferences(armem::wm::Memory &memory)=0
armarx::armem::MemoryID::str
std::string str(bool escapeDelimiters=true) const
Get a string representation of this memory ID.
Definition: MemoryID.cpp:102
armarx::armem::server::ltm::detail::MemoryBase::Statistics::firstStart
bool firstStart
Definition: MemoryBase.h:46
armarx::armem::server::ltm::detail::MemoryBase::Statistics::firstStarted
armarx::core::time::DateTime firstStarted
Definition: MemoryBase.h:48
armarx::armem::server::ltm::detail::MemoryBase::Properties::importOnStartUp
bool importOnStartUp
Definition: MemoryBase.h:411
armarx::armem::server::ltm::detail::MemoryBase::CoreSegmentT
_CoreSegmentT CoreSegmentT
Definition: MemoryBase.h:55
armarx::armem::base::MemoryBase::name
std::string & name()
Definition: MemoryBase.h:92
armarx::armem::server::ltm::detail::MemoryBase::p
struct armarx::armem::server::ltm::detail::MemoryBase::Properties p
armarx::armem::server::ltm::detail::MemoryBase::Properties
Definition: MemoryBase.h:397
aron_conversions.h
armarx::armem::server::ltm::detail::MemoryBase::enabled
std::atomic_bool enabled
Definition: MemoryBase.h:427
armarx::armem::server::ltm::detail::MemoryBase::Properties::configuration_on_startup
std::string configuration_on_startup
Definition: MemoryBase.h:416
armarx::armem::server::ltm::detail::MemoryBase::getLevelName
static std::string getLevelName()
get level name1
Definition: MemoryBase.h:350
armarx::memory
Brief description of class memory.
Definition: memory.h:38
armarx::armem::server::ltm::detail::MemoryBase::MemoryBase
MemoryBase(const std::string &exportName, const MemoryID &id)
Definition: MemoryBase.h:57
armarx::armem::server::ltm::detail::MemoryBase::Statistics::recordedCoreSegments
long recordedCoreSegments
Definition: MemoryBase.h:45
TIMING_END_STREAM
#define TIMING_END_STREAM(name, os)
Definition: TimeUtil.h:310
armarx::armem::server::ltm::detail::MemoryBase::Properties::export_path
std::string export_path
Definition: MemoryBase.h:407
armarx::armem::server::ltm::detail::MemoryBase::statistics
Statistics statistics
Definition: MemoryBase.h:425
armarx::armem::server::ltm::detail::MemoryBase
Interface functions for the longterm memory classes.
Definition: MemoryBase.h:39
armarx::armem::server::ltm::detail::MemoryBase::hasCoreSegment
virtual bool hasCoreSegment(const std::string &) const =0
check if core segment exists
armarx::armem::server::ltm::detail::MemoryBase::enable
void enable()
enable this LTM
Definition: MemoryBase.h:130
armarx::armem::server::ltm::detail::MemoryBase::_enable
virtual void _enable()
Definition: MemoryBase.h:370
memory_definitions.h
deactivateSpam
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition: Logging.cpp:75
armarx::armem::server::wm::Memory
Definition: memory_definitions.h:122
armarx::armem::server::ltm::detail::MemoryBase::resolve
void resolve(armem::wm::Memory &memory)
convert the references of the input into a wm::Memory
Definition: MemoryBase.h:231
armarx::armem::server::ltm::detail::MemoryBase::_configure
virtual void _configure(const nlohmann::json &)
configuration
Definition: MemoryBase.h:365
armarx::armem::server::ltm::detail::MemoryBase::setRecordingMode
void setRecordingMode(const std::string &m)
Definition: MemoryBase.h:63
armarx::armem::server::ltm::detail::MemoryBase::Properties::storeOnStop
bool storeOnStop
Definition: MemoryBase.h:408
armarx::armem::server::ltm::detail::MemoryBase::loadAllAndResolve
void loadAllAndResolve(armem::wm::Memory &memory)
Definition: MemoryBase.h:221
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::server::ltm::detail::MemoryBase::resetStatistics
virtual void resetStatistics()
statistics
Definition: MemoryBase.h:314
armarx::armem::server::ltm::detail::MemoryBase::store
void store(const armem::server::wm::Memory &serverMemory)
append a wm::Memory instance to the ltm
Definition: MemoryBase.h:259
armarx::armem::server::ltm::detail::MemoryBase::_loadOnStartup
virtual void _loadOnStartup()=0
armarx::armem::server::ltm::detail::MemoryBase::ltm_mutex
std::recursive_mutex ltm_mutex
Definition: MemoryBase.h:423
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::armem::server::ltm::detail::MemoryBase::loadLatestNReferences
armem::wm::Memory loadLatestNReferences(int n)
Definition: MemoryBase.h:185
armarx::armem::server::ltm::detail::MemoryBase::_directlyStore
virtual void _directlyStore(const armem::wm::Memory &memory, bool simulatedVersion=false)=0
armarx::armem::server::ltm::detail::MemoryBase::Statistics::firstStop
bool firstStop
Definition: MemoryBase.h:47
armarx::armem::wm::Memory
Client-side working memory.
Definition: memory_definitions.h:133
armarx::armem::server::ltm::detail::MemoryBase::forEachCoreSegment
virtual bool forEachCoreSegment(std::function< void(CoreSegmentT &)> func) const =0
iterate over all core segments of this ltm
armarx::armem::server::ltm::detail::MemoryBase::Properties::maxAmountOfSnapshotsLoaded
int maxAmountOfSnapshotsLoaded
Definition: MemoryBase.h:412
armarx::armem::server::ltm::detail::MemoryBase::loadAllAndResolve
armem::wm::Memory loadAllAndResolve()
return the full ltm as a wm::Memory and resolves the references the ltm may be huge,...
Definition: MemoryBase.h:213
armarx::armem::server::ltm::detail::MemoryBase::stopRecording
void stopRecording()
Definition: MemoryBase.h:300
armarx::armem::server::ltm::detail::MemoryBase::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::Properties::enabled_on_startup
bool enabled_on_startup
Definition: MemoryBase.h:400
operations.h
armarx::armem::server::ltm::detail::MemoryBase::getFilterStatistics
std::map< std::string, processor::SnapshotFilter::FilterStatistics > getFilterStatistics()
Definition: MemoryBase.h:328
armarx::armem::server::ltm::detail::MemoryBase::startRecording
void startRecording()
enable/disable
Definition: MemoryBase.h:292
armarx::armem::server::ltm::detail::MemoryBase::Properties::recordingMode
std::string recordingMode
Definition: MemoryBase.h:403
Component.h
memory_definitions.h
LoggingUtil.h
armarx::armem::server::ltm::detail::MemoryBase::setRecordingMode
void setRecordingMode(const RecordingMode m)
Definition: MemoryBase.h:84
armarx::armem::server::ltm::detail::MemoryBase::loadAllReferences
void loadAllReferences(armem::wm::Memory &memory)
Definition: MemoryBase.h:175
armarx::armem::server::ltm::detail::MemoryBase::Statistics::lastEnabled
armarx::core::time::DateTime lastEnabled
Definition: MemoryBase.h:44
armarx::armem::server::ltm::RecordingMode::CONSOLIDATE_LATEST
@ CONSOLIDATE_LATEST
armarx::armem::server::ltm
Definition: forward_declarations.h:20
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::armem::server::ltm::detail::MemoryBase::Statistics::lastStopped
armarx::core::time::DateTime lastStopped
Definition: MemoryBase.h:51
armarx::armem::server::ltm::detail::MemoryItem::id
MemoryID id() const
Definition: MemoryItem.cpp:37
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::armem::server::ltm::CoreSegment
Definition: CoreSegment.h:13
armarx::armem::server::ltm::detail::MemoryBase::loadAllReferences
armem::wm::Memory loadAllReferences()
return the full ltm as a wm::Memory with only references the ltm may be huge, use with caution
Definition: MemoryBase.h:167
armarx::armem::server::ltm::detail::MemoryBase::loadOnStartup
void loadOnStartup()
Definition: MemoryBase.h:356
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:198
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::armem::server::ltm::detail::MemoryItem::setExportName
void setExportName(const std::string &n)
Definition: MemoryItem.cpp:23
time.h
armarx::armem::server::ltm::RecordingMode
RecordingMode
Definition: MemoryBase.h:27
armarx::armem::server::ltm::detail::MemoryBase::_setExportName
virtual void _setExportName(const std::string &)
Definition: MemoryBase.h:380
armarx::armem::server::ltm::detail::MemoryBase::loadLatestNReferences
void loadLatestNReferences(int n, armem::wm::Memory &memory, std::list< std::string > coreSegNames)
Definition: MemoryBase.h:195
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::server::ltm::detail::MemoryBase::_store
virtual void _store(const armem::wm::Memory &memory)=0
armarx::armem::server::ltm::RecordingMode::CONSOLIDATE_ALL
@ CONSOLIDATE_ALL
armarx::armem::toCommit
Commit toCommit(const ContainerT &container)
Definition: operations.h:23
armarx::armem::server::ltm::detail::MemoryItem
Interface functions for the longterm memory classes.
Definition: MemoryItem.h:13
MemoryItem.h
armarx::core::time::DateTime::Invalid
static DateTime Invalid()
Definition: DateTime.cpp:57
armarx::armem::server::ltm::detail::MemoryBase::_loadLatestNReferences
virtual void _loadLatestNReferences(int n, armem::wm::Memory &memory)=0
armarx::armem::server::ltm::RecordingMode::CONSOLIDATE_REMOVED
@ CONSOLIDATE_REMOVED
armarx::armem::server::ltm::detail::MemoryBase::Properties::export_name
std::string export_name
Definition: MemoryBase.h:406
armarx::armem::server::ltm::detail::MemoryBase::configure
void configure()
initialize config
Definition: MemoryBase.h:97
armarx::armem::server::ltm::detail::MemoryBase::store
void store(const armem::wm::Memory &memory)
append a wm::Memory instance to the ltm
Definition: MemoryBase.h:240