Skip to content
Snippets Groups Projects
Commit 6df070bd authored by Benjamin Halimi's avatar Benjamin Halimi Committed by Benjamin Halimi
Browse files

add attributes

parent 4086ce28
No related branches found
No related tags found
3 merge requests!248Draft: [Add] MulPTQ and ScalingMeta MetaOperators,!209[Add] Clip Operator,!190Add clipping node
......@@ -19,28 +19,38 @@
#include "aidge/graph/Node.hpp"
#include "aidge/operator/OperatorTensor.hpp"
#include "aidge/utils/Registrar.hpp"
#include "aidge/utils/StaticAttributes.hpp"
#include "aidge/utils/Types.h"
namespace Aidge {
enum class ClipAttr { Min, Max };
class Clip_Op : public OperatorTensor,
public Registrable<Clip_Op, std::string, std::shared_ptr<OperatorImpl>(const Clip_Op&)> {
public:
// FIXME: change accessibility
std::shared_ptr<Tensor> mInput = std::make_shared<Tensor>();
const std::shared_ptr<Tensor> mOutput = std::make_shared<Tensor>();
public:
static const std::string Type;
Clip_Op() : OperatorTensor(Type, {InputCategory::Data}, 1) {}
private:
using Attributes_ = StaticAttributes<ClipAttr, float, float>;
template <ClipAttr e> using attr = typename Attributes_::template attr<e>;
const std::shared_ptr<Attributes_> mAttributes;
public:
Clip_Op(float min, float max) :
OperatorTensor(Type, {InputCategory::Data}, 1),
mAttributes(std::make_shared<Attributes_>(attr<ClipAttr::Min>(min), attr<ClipAttr::Max>(max)))
{}
/**
* @brief Copy-constructor. Copy the operator attributes and its output tensor(s), but not its input tensors (the new operator has no input associated).
* @param op Operator to copy.
*/
Clip_Op(const Clip_Op& op)
: OperatorTensor(op)
: OperatorTensor(op),
mAttributes(op.mAttributes)
{
if (op.mImpl){
SET_IMPL_MACRO(Clip_Op, *this, op.backend());
......@@ -59,6 +69,10 @@ public:
void setBackend(const std::string& name, DeviceIdx_t device = 0) override final;
inline std::shared_ptr<Attributes> attributes() const override { return mAttributes; }
inline float& min() const noexcept { return mAttributes->getAttr<ClipAttr::Min>(); }
inline float& max() const noexcept { return mAttributes->getAttr<ClipAttr::Max>(); }
static const std::vector<std::string> getInputsName(){
return {"data_input"};
}
......@@ -67,9 +81,19 @@ public:
}
};
inline std::shared_ptr<Node> Clip(const std::string& name = "") {
return std::make_shared<Node>(std::make_shared<Clip_Op>(), name);
inline std::shared_ptr<Node> Clip(float min = 0.0f,
float max = 1.0f,
const std::string& name = "")
{
return std::make_shared<Node>(std::make_shared<Clip_Op>(min, max), name);
}
}
namespace {
template <>
const char* const EnumStrings<Aidge::ClipAttr>::data[]
= {"Min", "Max"};
}
#endif /* AIDGE_CORE_OPERATOR_CLIP_H_ */
......@@ -20,10 +20,10 @@ namespace Aidge {
void init_Clip(py::module& m) {
py::class_<Clip_Op, std::shared_ptr<Clip_Op>, OperatorTensor>(m, "ClipOp", py::multiple_inheritance())
.def(py::init<>())
.def(py::init<float, float>(), py::arg("min"), py::arg("max"))
.def_static("get_inputs_name", &Clip_Op::getInputsName)
.def_static("get_outputs_name", &Clip_Op::getOutputsName);
declare_registrable<Clip_Op>(m, "ClipOp");
m.def("Clip", &Clip, py::arg("name") = "");
m.def("Clip", &Clip, py::arg("min") = 0.0f, py::arg("max") = 1.0f, py::arg("name") = "");
}
} // namespace Aidge
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