diff --git a/src/operator/Producer.cpp b/src/operator/Producer.cpp index 990809b6c7d98e3d518f31fd9630366414e629d0..43e991288c483f07138a2b236a2c4925ea0a3754 100644 --- a/src/operator/Producer.cpp +++ b/src/operator/Producer.cpp @@ -32,9 +32,28 @@ Aidge::Producer_Op::Producer_Op(const std::shared_ptr<Aidge::Tensor> tensor, boo Attributes_(attr<ProdAttr::Constant>(constant)) { mOutputs[0] = tensor; // copy the pointer of the Tensor - mImpl = (tensor->hasImpl()) ? - std::make_shared<OperatorImpl>(*this, tensor->getImpl()->backend()) : - nullptr; +#ifdef PYBIND + if(Py_IsInitialized()) { + auto obj = py::cast(&(*this)); + setImpl((mOutputs[0]->hasImpl()) ? + (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ? + Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) : + std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) : + nullptr); + } else { + setImpl((mOutputs[0]->hasImpl()) ? + (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ? + Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) : + std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) : + nullptr); + } +#else + setImpl((mOutputs[0]->hasImpl()) ? + (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ? + Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) : + std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) : + nullptr); +#endif } /** @@ -46,12 +65,29 @@ Aidge::Producer_Op::Producer_Op(const Aidge::Producer_Op& op) : OperatorTensor(op), Attributes_(op) { - if (op.mImpl){ - SET_IMPL_MACRO(Producer_Op, *this, op.backend()); - } else { - mImpl = nullptr; - } - // mOutputs[0] = std::make_shared<Tensor>(*(op.getOutput(0))); + mOutputs[0] = std::make_shared<Tensor>(*(op.getOutput(0))); +#ifdef PYBIND + if(Py_IsInitialized()) { + auto obj = py::cast(&(*this)); + setImpl((mOutputs[0]->hasImpl()) ? + (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ? + Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) : + std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) : + nullptr); + } else { + setImpl((mOutputs[0]->hasImpl()) ? + (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ? + Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) : + std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) : + nullptr); + } +#else + setImpl((mOutputs[0]->hasImpl()) ? + (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()}) ? + Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this) : + std::make_shared<OperatorImpl>(*this, mOutputs[0]->getImpl()->backend())) : + nullptr); +#endif // if (mOutputs[0]->hasImpl()) { // if (Registrar<Producer_Op>::exists({mOutputs[0]->getImpl()->backend()})){ // setImpl(Registrar<Producer_Op>::create(mOutputs[0]->getImpl()->backend())(*this)); @@ -66,6 +102,21 @@ Aidge::Producer_Op::Producer_Op(const Aidge::Producer_Op& op) } void Aidge::Producer_Op::setBackend(const std::string& name, Aidge::DeviceIdx_t device) { - SET_IMPL_MACRO(Producer_Op, *this, name); +#ifdef PYBIND + if(Py_IsInitialized()) { + auto obj = py::cast(&(*this)); + setImpl((Registrar<Producer_Op>::exists({name})) ? + Registrar<Producer_Op>::create(name)(*this) : + std::make_shared<OperatorImpl>(*this, name)); + } else { + setImpl((Registrar<Producer_Op>::exists({name})) ? + Registrar<Producer_Op>::create(name)(*this) : + std::make_shared<OperatorImpl>(*this, name)); + } +#else + setImpl((Registrar<Producer_Op>::exists({name})) ? + Registrar<Producer_Op>::create(name)(*this) : + std::make_shared<OperatorImpl>(*this, name)); +#endif mOutputs[0]->setBackend(name, device); } \ No newline at end of file