Skip to content
Snippets Groups Projects
Commit 4f157d9b authored by Fabian Tërnava's avatar Fabian Tërnava
Browse files

added base classes for filter classes in ltm

parent c1ca68f1
No related branches found
No related tags found
No related merge requests found
Showing
with 140 additions and 134 deletions
...@@ -47,8 +47,8 @@ set(LIB_FILES ...@@ -47,8 +47,8 @@ set(LIB_FILES
ltm/base/extractor/Extractor.cpp ltm/base/extractor/Extractor.cpp
ltm/base/extractor/imageExtractor/ImageExtractor.cpp ltm/base/extractor/imageExtractor/ImageExtractor.cpp
ltm/base/extractor/noExtractor/NoExtractor.cpp
ltm/base/converter/Converter.cpp
ltm/base/converter/dict/Converter.cpp ltm/base/converter/dict/Converter.cpp
ltm/base/converter/dict/json/JsonConverter.cpp ltm/base/converter/dict/json/JsonConverter.cpp
ltm/base/converter/dict/bson/BsonConverter.cpp ltm/base/converter/dict/bson/BsonConverter.cpp
...@@ -119,8 +119,8 @@ set(LIB_HEADERS ...@@ -119,8 +119,8 @@ set(LIB_HEADERS
ltm/base/extractor/Extractor.h ltm/base/extractor/Extractor.h
ltm/base/extractor/imageExtractor/ImageExtractor.h ltm/base/extractor/imageExtractor/ImageExtractor.h
ltm/base/extractor/noExtractor/NoExtractor.h
ltm/base/converter/Converter.h
ltm/base/converter/dict/Converter.h ltm/base/converter/dict/Converter.h
ltm/base/converter/dict/json/JsonConverter.h ltm/base/converter/dict/json/JsonConverter.h
ltm/base/converter/dict/bson/BsonConverter.h ltm/base/converter/dict/bson/BsonConverter.h
......
#include "Converter.h"
#pragma once
// STD/STL
#include <memory>
// ArmarX
#include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
namespace armarx::armem::server::ltm
{
class Converter
{
public:
enum class ConverterType
{
Str,
Binary
};
Converter(const ConverterType t, const std::string& s):
type(t),
suffix(s)
{}
virtual ~Converter() = default;
virtual std::vector<unsigned char> convert(const aron::data::VariantPtr& data) = 0;
virtual aron::data::VariantPtr convert(const std::vector<unsigned char>& data) = 0;
const ConverterType type;
const std::string suffix;
};
}
#include "Converter.h" #include "Converter.h"
namespace armarx::armem::server::ltm
{
std::vector<unsigned char> DictConverter::convert(const aron::data::VariantPtr& data)
{
auto d = aron::data::Dict::DynamicCastAndCheck(data);
return _convert(d);
}
aron::data::VariantPtr DictConverter::convert(const std::vector<unsigned char>& data)
{
auto d = _convert(data);
return d;
}
}
...@@ -3,33 +3,26 @@ ...@@ -3,33 +3,26 @@
// STD/STL // STD/STL
#include <memory> #include <memory>
// BaseClass
#include "../Converter.h"
// ArmarX // ArmarX
#include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h> #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
namespace armarx::armem::server::ltm namespace armarx::armem::server::ltm
{ {
class DictConverter; class DictConverter : public Converter
using DictConverterPtr = std::shared_ptr<DictConverter>;
class DictConverter
{ {
public: public:
enum class ConverterType using Converter::Converter;
{
Str,
Binary
};
DictConverter(const ConverterType t, const std::string& s):
type(t),
suffix(s)
{}
virtual ~DictConverter() = default; virtual ~DictConverter() = default;
virtual std::vector<unsigned char> convert(const aron::data::DictPtr& data) = 0; std::vector<unsigned char> convert(const aron::data::VariantPtr& data) final;
virtual aron::data::DictPtr convert(const std::vector<unsigned char>& data) = 0; aron::data::VariantPtr convert(const std::vector<unsigned char>& data) final;
const ConverterType type; protected:
const std::string suffix; virtual std::vector<unsigned char> _convert(const aron::data::DictPtr& data) = 0;
virtual aron::data::DictPtr _convert(const std::vector<unsigned char>& data) = 0;
}; };
} }
...@@ -10,7 +10,7 @@ namespace armarx::armem::server::ltm::converter::dict ...@@ -10,7 +10,7 @@ namespace armarx::armem::server::ltm::converter::dict
namespace bsoncxxbuilder = bsoncxx::builder::stream; namespace bsoncxxbuilder = bsoncxx::builder::stream;
namespace bsoncxxdoc = bsoncxx::document; namespace bsoncxxdoc = bsoncxx::document;
std::vector<unsigned char> BsonConverter::convert(const aron::data::DictPtr& data) std::vector<unsigned char> BsonConverter::_convert(const aron::data::DictPtr& data)
{ {
std::vector<unsigned char> jsonVec = jsonConverter.convert(data); std::vector<unsigned char> jsonVec = jsonConverter.convert(data);
std::string json(jsonVec.begin(), jsonVec.end()); std::string json(jsonVec.begin(), jsonVec.end());
...@@ -24,12 +24,13 @@ namespace armarx::armem::server::ltm::converter::dict ...@@ -24,12 +24,13 @@ namespace armarx::armem::server::ltm::converter::dict
return bson; return bson;
} }
aron::data::DictPtr BsonConverter::convert(const std::vector<unsigned char>& data) aron::data::DictPtr BsonConverter::_convert(const std::vector<unsigned char>& data)
{ {
bsoncxx::document::view view(data.data(), data.size()); bsoncxx::document::view view(data.data(), data.size());
nlohmann::json json = bsoncxx::to_json(view); nlohmann::json json = bsoncxx::to_json(view);
std::string str = json.dump(2); std::string str = json.dump(2);
std::vector<unsigned char> jsonVec(str.begin(), str.end()); std::vector<unsigned char> jsonVec(str.begin(), str.end());
return jsonConverter.convert(jsonVec); auto v = jsonConverter.convert(jsonVec);
return aron::data::Dict::DynamicCast(v);
} }
} }
...@@ -18,8 +18,9 @@ namespace armarx::armem::server::ltm::converter::dict ...@@ -18,8 +18,9 @@ namespace armarx::armem::server::ltm::converter::dict
DictConverter(ConverterType::Binary, ".bson") DictConverter(ConverterType::Binary, ".bson")
{} {}
virtual std::vector<unsigned char> convert(const aron::data::DictPtr& data) override; protected:
virtual aron::data::DictPtr convert(const std::vector<unsigned char>& data) override; std::vector<unsigned char> _convert(const aron::data::DictPtr& data) final;
aron::data::DictPtr _convert(const std::vector<unsigned char>& data) final;
private: private:
JsonConverter jsonConverter; JsonConverter jsonConverter;
......
...@@ -4,14 +4,14 @@ ...@@ -4,14 +4,14 @@
namespace armarx::armem::server::ltm::converter::dict namespace armarx::armem::server::ltm::converter::dict
{ {
std::vector<unsigned char> JsonConverter::convert(const aron::data::DictPtr& data) std::vector<unsigned char> JsonConverter::_convert(const aron::data::DictPtr& data)
{ {
nlohmann::json j = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(data); nlohmann::json j = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(data);
auto str = j.dump(2); auto str = j.dump(2);
return std::vector<unsigned char>(str.begin(), str.end()); return std::vector<unsigned char>(str.begin(), str.end());
} }
aron::data::DictPtr JsonConverter::convert(const std::vector<unsigned char>& data) aron::data::DictPtr JsonConverter::_convert(const std::vector<unsigned char>& data)
{ {
std::string str(data.begin(), data.end()); std::string str(data.begin(), data.end());
nlohmann::json j = nlohmann::json::parse(str); nlohmann::json j = nlohmann::json::parse(str);
......
...@@ -8,9 +8,6 @@ ...@@ -8,9 +8,6 @@
namespace armarx::armem::server::ltm::converter::dict namespace armarx::armem::server::ltm::converter::dict
{ {
class JsonConverter;
using JsonConverterPtr = std::shared_ptr<JsonConverter>;
class JsonConverter : public DictConverter class JsonConverter : public DictConverter
{ {
public: public:
...@@ -18,7 +15,8 @@ namespace armarx::armem::server::ltm::converter::dict ...@@ -18,7 +15,8 @@ namespace armarx::armem::server::ltm::converter::dict
DictConverter(ConverterType::Str, ".json") DictConverter(ConverterType::Str, ".json")
{} {}
virtual std::vector<unsigned char> convert(const aron::data::DictPtr& data) override; protected:
virtual aron::data::DictPtr convert(const std::vector<unsigned char>& data) override; std::vector<unsigned char> _convert(const aron::data::DictPtr& data) final;
aron::data::DictPtr _convert(const std::vector<unsigned char>& data) final;
}; };
} }
#include "Converter.h" #include "Converter.h"
namespace armarx::armem::server::ltm
{
std::vector<unsigned char> ImageConverter::convert(const aron::data::VariantPtr& data)
{
auto d = aron::data::NDArray::DynamicCastAndCheck(data);
return _convert(d);
}
aron::data::VariantPtr ImageConverter::convert(const std::vector<unsigned char>& data)
{
auto d = _convert(data);
return d;
}
}
...@@ -3,33 +3,26 @@ ...@@ -3,33 +3,26 @@
// STD/STL // STD/STL
#include <memory> #include <memory>
// BaseClass
#include "../Converter.h"
// ArmarX // ArmarX
#include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h> #include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
namespace armarx::armem::server::ltm namespace armarx::armem::server::ltm
{ {
class ImageConverter; class ImageConverter : public Converter
using ImageConverterPtr = std::shared_ptr<ImageConverter>;
class ImageConverter
{ {
public: public:
enum class ConverterType using Converter::Converter;
{
Str,
Binary
};
ImageConverter(const ConverterType t, const std::string& s):
type(t),
suffix(s)
{}
virtual ~ImageConverter() = default; virtual ~ImageConverter() = default;
virtual std::vector<unsigned char> convert(const aron::data::NDArrayPtr& data) = 0; std::vector<unsigned char> convert(const aron::data::VariantPtr& data) final;
virtual aron::data::NDArrayPtr convert(const std::vector<unsigned char>& data) = 0; aron::data::VariantPtr convert(const std::vector<unsigned char>& data) final;
const ConverterType type; protected:
const std::string suffix; virtual std::vector<unsigned char> _convert(const aron::data::NDArrayPtr& data) = 0;
virtual aron::data::NDArrayPtr _convert(const std::vector<unsigned char>& data) = 0;
}; };
} }
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
namespace armarx::armem::server::ltm::converter::image namespace armarx::armem::server::ltm::converter::image
{ {
std::vector<unsigned char> PngConverter::convert(const aron::data::NDArrayPtr& data) std::vector<unsigned char> PngConverter::_convert(const aron::data::NDArrayPtr& data)
{ {
ARMARX_CHECK_NOT_NULL(data); ARMARX_CHECK_NOT_NULL(data);
...@@ -20,10 +20,9 @@ namespace armarx::armem::server::ltm::converter::image ...@@ -20,10 +20,9 @@ namespace armarx::armem::server::ltm::converter::image
return buffer; return buffer;
} }
aron::data::NDArrayPtr PngConverter::convert(const std::vector<unsigned char>& data) aron::data::NDArrayPtr PngConverter::_convert(const std::vector<unsigned char>& data)
{ {
cv::Mat img = cv::imdecode(data, cv::IMREAD_COLOR); cv::Mat img = cv::imdecode(data, cv::IMREAD_COLOR);
auto aron = aron::converter::AronOpenCVConverter::ConvertFromMat(img); return aron::converter::AronOpenCVConverter::ConvertFromMat(img);
return aron;
} }
} }
...@@ -15,7 +15,8 @@ namespace armarx::armem::server::ltm::converter::image ...@@ -15,7 +15,8 @@ namespace armarx::armem::server::ltm::converter::image
ImageConverter(ConverterType::Str, ".png") ImageConverter(ConverterType::Str, ".png")
{} {}
virtual std::vector<unsigned char> convert(const aron::data::NDArrayPtr& data) override; protected:
virtual aron::data::NDArrayPtr convert(const std::vector<unsigned char>& data) override; std::vector<unsigned char> _convert(const aron::data::NDArrayPtr& data) final;
aron::data::NDArrayPtr _convert(const std::vector<unsigned char>& data) final;
}; };
} }
...@@ -13,49 +13,56 @@ namespace armarx::armem::server::ltm ...@@ -13,49 +13,56 @@ namespace armarx::armem::server::ltm
public: public:
BufferedMemoryBase() : BufferedMemoryBase() :
Base() BufferedMemoryBase({})
{ {
} }
BufferedMemoryBase(const MemoryID& id) : BufferedMemoryBase(const MemoryID& id) :
Base(id), Base(id)
buffer(id)
{ {
buffer = std::make_shared<armem::wm::Memory>(id);
to_store = std::make_shared<armem::wm::Memory>(id);
} }
virtual ~BufferedMemoryBase() = default; virtual ~BufferedMemoryBase() = default;
armem::wm::Memory getBuffer() const armem::wm::Memory getBuffer() const
{ {
return buffer; std::lock_guard l(bufferMutex);
return *buffer;
} }
void directlyStore(const armem::wm::Memory& memory) void directlyStore(const armem::wm::Memory& memory)
{ {
TIMING_START(LTM_Memory_DirectlyStore); TIMING_START(LTM_Memory_DirectlyStore);
if (!this->pipeline.memFreqFilter->accept(memory)) for (auto& f : this->memoryFilters)
{ {
ARMARX_WARNING << deactivateSpam() << "Ignoring to put a Memory into the LTM because it got filtered."; if (!f.accept(memory))
return; {
} ARMARX_WARNING << deactivateSpam() << "Ignoring to put a Memory into the LTM because it got filtered.";
else return;
{ }
_directlyStore(memory);
} }
_directlyStore(memory);
TIMING_END(LTM_Memory_DirectlyStore); TIMING_END(LTM_Memory_DirectlyStore);
} }
void storeBuffer() void storeBuffer()
{ {
std::lock_guard l(bufferMutex); std::lock_guard l(storeMutex);
if (buffer.empty()) {
std::lock_guard l(bufferMutex);
to_store = buffer;
buffer = std::make_shared<armem::wm::Memory>(this->id());
}
if (to_store->empty())
{ {
ARMARX_INFO << deactivateSpam() << "Cannot store an empty buffer. Ignoring."; ARMARX_INFO << deactivateSpam() << "Cannot store an empty buffer. Ignoring.";
return; return;
} }
this->directlyStore(buffer); this->directlyStore(*to_store);
buffer.clear();
} }
virtual void createPropertyDefinitions(PropertyDefinitionsPtr& defs, const std::string& prefix) override virtual void createPropertyDefinitions(PropertyDefinitionsPtr& defs, const std::string& prefix) override
...@@ -71,7 +78,9 @@ namespace armarx::armem::server::ltm ...@@ -71,7 +78,9 @@ namespace armarx::armem::server::ltm
void _store(const armem::wm::Memory& memory) override void _store(const armem::wm::Memory& memory) override
{ {
std::lock_guard l(bufferMutex); std::lock_guard l(bufferMutex);
buffer.append(memory); buffer->append(memory);
// create task if not already exists
if (!task) if (!task)
{ {
int waitingTimeMs = 1000.f / storeFrequency; int waitingTimeMs = 1000.f / storeFrequency;
...@@ -81,12 +90,12 @@ namespace armarx::armem::server::ltm ...@@ -81,12 +90,12 @@ namespace armarx::armem::server::ltm
} }
protected: protected:
/// Internal memory for data consolidated from wm to ltm (double-buffer)
/// Internal memory for data consolidated from wm to ltm (buffer)
/// The to-put-to-ltm buffer (contains data in plain text) /// The to-put-to-ltm buffer (contains data in plain text)
/// This buffer may still be filtered. /// This buffer may still be filtered (e.g. snapshot filters).
/// This means that it is not guaranteed that all data in the buffer will be stored in the ltm /// This means that it is not guaranteed that all data in the buffer will be stored in the ltm
armem::wm::Memory buffer; std::shared_ptr<armem::wm::Memory> buffer;
std::shared_ptr<armem::wm::Memory> to_store;
/// The periodic'task to store the content of the buffer to the ltm /// The periodic'task to store the content of the buffer to the ltm
typename armarx::PeriodicTask<BufferedMemoryBase>::pointer_type task = nullptr; typename armarx::PeriodicTask<BufferedMemoryBase>::pointer_type task = nullptr;
...@@ -95,7 +104,8 @@ namespace armarx::armem::server::ltm ...@@ -95,7 +104,8 @@ namespace armarx::armem::server::ltm
float storeFrequency = 10; float storeFrequency = 10;
/// a mutex to access the buffer object /// a mutex to access the buffer object
std::mutex bufferMutex; mutable std::mutex bufferMutex;
mutable std::mutex storeMutex;
}; };
} // namespace armarx::armem::server::ltm } // namespace armarx::armem::server::ltm
...@@ -9,9 +9,6 @@ ...@@ -9,9 +9,6 @@
namespace armarx::armem::server::ltm namespace armarx::armem::server::ltm
{ {
class Extractor;
typedef std::shared_ptr<Extractor> ExtractorPtr;
class Extractor class Extractor
{ {
public: public:
......
...@@ -7,9 +7,6 @@ ...@@ -7,9 +7,6 @@
namespace armarx::armem::server::ltm::extractor namespace armarx::armem::server::ltm::extractor
{ {
class ImageExtractor;
typedef std::shared_ptr<ImageExtractor> ImageExtractorPtr;
class ImageExtractorVisitor : public aron::data::RecursiveVariantVisitor class ImageExtractorVisitor : public aron::data::RecursiveVariantVisitor
{ {
public: public:
...@@ -26,8 +23,5 @@ namespace armarx::armem::server::ltm::extractor ...@@ -26,8 +23,5 @@ namespace armarx::armem::server::ltm::extractor
virtual Extraction extract(aron::data::DictPtr& data) override; virtual Extraction extract(aron::data::DictPtr& data) override;
virtual aron::data::DictPtr merge(Extraction& encoding) override; virtual aron::data::DictPtr merge(Extraction& encoding) override;
public:
bool enabled;
}; };
} }
#include "NoExtractor.h"
namespace armarx::armem::server::ltm::extractor
{
Extractor::Extraction NoExtractor::extract(aron::data::DictPtr& data)
{
Extraction encoding;
encoding.dataWithoutExtraction = data;
return encoding;
}
aron::data::DictPtr NoExtractor::merge(Extraction& encoding)
{
return encoding.dataWithoutExtraction;
}
}
#pragma once
// Base Class
#include "../Extractor.h"
namespace armarx::armem::server::ltm::extractor
{
class NoExtractor;
typedef std::shared_ptr<NoExtractor> NoExtractorPtr;
class NoExtractor : public Extractor
{
public:
NoExtractor() = default;
virtual Extraction extract(aron::data::DictPtr& data) override;
virtual aron::data::DictPtr merge(Extraction& encoding) override;
};
}
...@@ -9,12 +9,6 @@ ...@@ -9,12 +9,6 @@
namespace armarx::armem::server::ltm namespace armarx::armem::server::ltm
{ {
class SnapshotFilter;
typedef std::shared_ptr<SnapshotFilter> SnapshotFilterPtr;
class MemoryFilter;
typedef std::shared_ptr<MemoryFilter> MemoryFilterPtr;
class MemoryFilter class MemoryFilter
{ {
public: public:
......
...@@ -5,12 +5,6 @@ ...@@ -5,12 +5,6 @@
namespace armarx::armem::server::ltm::filter namespace armarx::armem::server::ltm::filter
{ {
class SnapshotFrequencyFilter;
typedef std::shared_ptr<SnapshotFrequencyFilter> SnapshotFrequencyFilterPtr;
class MemoryFrequencyFilter;
typedef std::shared_ptr<MemoryFrequencyFilter> MemoryFrequencyFilterPtr;
class MemoryFrequencyFilter : class MemoryFrequencyFilter :
public MemoryFilter public MemoryFilter
{ {
...@@ -35,9 +29,9 @@ namespace armarx::armem::server::ltm::filter ...@@ -35,9 +29,9 @@ namespace armarx::armem::server::ltm::filter
virtual bool accept(const armem::wm::EntitySnapshot& e) override; virtual bool accept(const armem::wm::EntitySnapshot& e) override;
public: public:
int waitingTimeInMs = 1000; int waitingTimeInMs = -1;
private: private:
std::unordered_map<MemoryID, long> timestampLastCommitInMs; std::map<MemoryID, long> timestampLastCommitInMs;
}; };
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment