Fix Generic and Meta op copy constructor issues
2 unresolved threads
2 unresolved threads
-
Fixed incorrect MetaOperator copy constructor and clone() method; -
Fixed attributes not properly cloned in GenericOperator copy constructor; -
Removed mandatory type attribute for Meta op, which is redundant with Meta op impl registry.
Edited by Olivier BICHLER
Merge request reports
Activity
Filter activity
changed milestone to %aidge v0.5.1
added Fix 🔥🔥 label
assigned to @olivierbichler
added 7 commits
-
8c0cefcd...6acdc4aa - 4 commits from branch
dev
- c50a7d1f - Fixed attributes not properly cloned in GenericOperator copy constructor
- 62de1a25 - Coding style
- 2463ebc9 - Fixed incorrect MetaOperator copy constructor and clone() method
Toggle commit list-
8c0cefcd...6acdc4aa - 4 commits from branch
requested review from @wboussella
added 1 commit
- 6c6b9199 - Removed mandatory type attribute for Meta op, which is redundant with Meta op impl registry
enabled an automatic merge when all merge checks for 6c6b9199 pass
mentioned in commit 7142cbf9
54 54 } 55 55 } 56 56 57 Aidge::MetaOperator_Op::MetaOperator_Op(const MetaOperator_Op& op) 58 : OperatorTensor(op), 59 mGraph(op.mGraph->clone()), // Clone the micro-graph for isolation 60 mAttributes(std::make_shared<DynamicAttributes>(*op.mAttributes)) // Clone attributes 61 { 62 // Associate outputs to micro-graph outputs for custom implementation 63 for (size_t outputIdx = 0; outputIdx < mOutputs.size(); ++outputIdx) { 64 const auto& outputOp = mGraph->getOrderedOutputs()[outputIdx]; 54 54 } 55 55 } 56 56 57 Aidge::MetaOperator_Op::MetaOperator_Op(const MetaOperator_Op& op) 58 : OperatorTensor(op), 59 mGraph(op.mGraph->clone()), // Clone the micro-graph for isolation 60 mAttributes(std::make_shared<DynamicAttributes>(*op.mAttributes)) // Clone attributes 61 { 62 // Associate outputs to micro-graph outputs for custom implementation 63 for (size_t outputIdx = 0; outputIdx < mOutputs.size(); ++outputIdx) { 64 const auto& outputOp = mGraph->getOrderedOutputs()[outputIdx]; 65 if (outputOp.first) { 66 mOutputs[outputIdx] = std::dynamic_pointer_cast<Tensor>(outputOp.first->getOperator()->getRawOutput(outputOp.second)); Actually here you are using the copy operator which performs a shallow copy. This will probably cause a bug and I am not sure the user intends to copy the value of the output when copying the Operator.
This is why
OperatorTensor
copy constructor only copies some keys features for Output Tensor copymOutputs[i] = std::make_shared<Tensor>(); mOutputs[i]->setDataType(other.getOutput(i)->dataType()); mOutputs[i]->setDataFormat(other.getOutput(i)->dataFormat()); if (!other.getOutput(i)->backend().empty()) { mOutputs[i]->setBackend(other.getOutput(i)->backend()); }
Please register or sign in to reply