Skip to content
Snippets Groups Projects
Commit 6e9f90e0 authored by Olivier BICHLER's avatar Olivier BICHLER
Browse files

Add getAttrs() and attributes() for meta op

parent e8962e85
No related branches found
No related tags found
2 merge requests!212Version 0.3.0,!186Refactor OperatorImpl for backend/export
Pipeline #54082 passed
......@@ -90,6 +90,8 @@ public:
mGraph->setDataType(datatype);
}
std::shared_ptr<Attributes> attributes() const override;
Elts_t getNbRequiredData(const IOIndex_t inputIdx) const override;
Elts_t getNbRequiredProtected(const IOIndex_t inputIdx) const override;
Elts_t getRequiredMemory(const IOIndex_t outputIdx, const std::vector<DimSize_t> &inputsSize) const override;
......
......@@ -14,6 +14,9 @@
#include <string>
#include <set>
#include <map>
#include "aidge/utils/future_std/any.hpp"
#ifdef PYBIND
#include <pybind11/pybind11.h>
......@@ -63,6 +66,8 @@ public:
*/
virtual std::set<std::string> getAttrsName() const = 0;
virtual std::map<std::string, future_std::any> getAttrs() const = 0;
#ifdef PYBIND
virtual bool hasAttrPy(const std::string& name) const = 0;
......@@ -84,6 +89,7 @@ public:
virtual py::dict dict() const = 0;
#endif
virtual ~Attributes() {}
};
}
......
......@@ -39,6 +39,9 @@ namespace Aidge {
///\todo managing complex types or excluding non-trivial, non-aggregate types
class DynamicAttributes : public Attributes {
public:
DynamicAttributes() = default;
DynamicAttributes(const std::map<std::string, future_std::any>& attrs): mAttrs(attrs) {}
/**
* \brief Returning an Attribute identified by its name
* \tparam T expected Attribute type
......@@ -375,6 +378,10 @@ public:
}
}
std::map<std::string, future_std::any> getAttrs() const override {
return mAttrs;
}
virtual ~DynamicAttributes() {}
friend bool operator<(const DynamicAttributes& lhs, const DynamicAttributes& rhs);
......
......@@ -179,6 +179,12 @@ public:
return mAttrs;
}
virtual std::map<std::string, future_std::any> getAttrs() const override {
std::map<std::string, future_std::any> attrs;
appendAttr(mAttrs, attrs);
return attrs;
}
//////////////////////////////////////
/// Generic Attributes API
//////////////////////////////////////
......@@ -323,6 +329,15 @@ private:
return false;
}
template<std::size_t I = 0, typename... Tp>
inline typename std::enable_if<I == sizeof...(Tp), void>::type appendAttr(const std::tuple<Tp...>& /*t*/, std::map<std::string, future_std::any>& /*attrs*/) const {}
template<std::size_t I = 0, typename... Tp>
inline typename std::enable_if<I < sizeof...(Tp), void>::type appendAttr(const std::tuple<Tp...>& t, std::map<std::string, future_std::any>& attrs) const {
attrs.insert(std::make_pair(EnumStrings<ATTRS_ENUM>::data[I], future_std::any(std::get<I>(t))));
appendAttr<I + 1, Tp...>(t, attrs);
}
std::tuple<T...> mAttrs;
};
......
......@@ -18,6 +18,7 @@
#include "aidge/data/Tensor.hpp"
#include "aidge/graph/GraphView.hpp"
#include "aidge/utils/ErrorHandling.hpp"
#include "aidge/utils/DynamicAttributes.hpp"
Aidge::MetaOperator_Op::MetaOperator_Op(const std::string& type, const std::shared_ptr<GraphView>& graph)
: OperatorTensor(type, [graph]() {
......@@ -81,6 +82,19 @@ void Aidge::MetaOperator_Op::setBackend(const std::string &name, Aidge::DeviceId
mGraph->setBackend(name, device);
}
std::shared_ptr<Aidge::Attributes> Aidge::MetaOperator_Op::attributes() const {
std::map<std::string, future_std::any> attrs;
for (const auto& node : mGraph->getNodes()) {
const auto nodeAttrs = node->getOperator()->attributes()->getAttrs();
for (const auto& attr : nodeAttrs) {
attrs.insert(std::make_pair(attr.first, attr.second));
}
}
return std::make_shared<DynamicAttributes>(attrs);
}
Aidge::Elts_t Aidge::MetaOperator_Op::getNbRequiredData(const IOIndex_t inputIdx) const {
if (mImpl) {
return mImpl->prodConso()->getNbRequiredData(inputIdx);
......
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