| @@ -9,195 +9,194 @@ | |||||
| * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| */ | */ | ||||
| #include <type_traits> | |||||
| //#include <type_traits> | |||||
| #include "megbrain/opr/imgproc.h" | #include "megbrain/opr/imgproc.h" | ||||
| #include "megbrain/serialization/sereg.h" | #include "megbrain/serialization/sereg.h" | ||||
| #include "megdnn/opr_param_defs.h" | #include "megdnn/opr_param_defs.h" | ||||
| namespace mgb { | namespace mgb { | ||||
| namespace serialization { | namespace serialization { | ||||
| //! OprMaker implementation for operators with variadic arguments | |||||
| template<> | |||||
| struct OprMaker<opr::WarpPerspective, 0> { | |||||
| using Opr = opr::WarpPerspective; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| mgb_assert(inputs.size() == 4); | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], inputs[3], | |||||
| param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } | |||||
| //! OprMaker implementation for operators with variadic arguments | |||||
| template <> | |||||
| struct OprMaker<opr::WarpPerspective, 0> { | |||||
| using Opr = opr::WarpPerspective; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| mgb_assert(inputs.size() == 4); | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], inputs[3], param, | |||||
| config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } | } | ||||
| }; | |||||
| template <> | |||||
| struct OprMaker<opr::Remap, 0> { | |||||
| using Opr = opr::Remap; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 2) { | |||||
| return Opr::make(inputs[0], inputs[1], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| return nullptr; | |||||
| } | |||||
| } | |||||
| }; | |||||
| template <> | |||||
| struct OprMaker<opr::Remap, 0> { | |||||
| using Opr = opr::Remap; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 2) { | |||||
| return Opr::make(inputs[0], inputs[1], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| return nullptr; | |||||
| } | } | ||||
| }; | |||||
| template<> | |||||
| struct OprMaker<opr::RemapBackwardMat, 0> { | |||||
| using Opr = opr::RemapBackwardMat; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| return nullptr; | |||||
| } | |||||
| } | |||||
| }; | |||||
| template <> | |||||
| struct OprMaker<opr::RemapBackwardMat, 0> { | |||||
| using Opr = opr::RemapBackwardMat; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| return nullptr; | |||||
| } | } | ||||
| }; | |||||
| template<> | |||||
| struct OprMaker<opr::RemapBackwardData, 0> { | |||||
| using Opr = opr::RemapBackwardData; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| return nullptr; | |||||
| } | |||||
| } | |||||
| }; | |||||
| template <> | |||||
| struct OprMaker<opr::RemapBackwardData, 0> { | |||||
| using Opr = opr::RemapBackwardData; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| return nullptr; | |||||
| } | } | ||||
| }; | |||||
| template <> | |||||
| struct OprMaker<opr::DctChannelSelectForward, 0> { | |||||
| using Opr = opr::DctChannelSelectForward; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| mgb_assert(inputs.size() == 1); | |||||
| return Opr::make(inputs[0], param, config).node()->owner_opr(); | |||||
| } | |||||
| } | |||||
| }; | |||||
| template <> | |||||
| struct OprMaker<opr::DctChannelSelectForward, 0> { | |||||
| using Opr = opr::DctChannelSelectForward; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| mgb_assert(inputs.size() == 1); | |||||
| return Opr::make(inputs[0], param, config).node()->owner_opr(); | |||||
| } | } | ||||
| }; | |||||
| template<> | |||||
| struct OprMaker<opr::WarpPerspectiveBackwardData, 0> { | |||||
| using Opr = opr::WarpPerspectiveBackwardData; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| mgb_assert(inputs.size() == 4); | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], inputs[3], | |||||
| param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } | |||||
| } | |||||
| }; | |||||
| template <> | |||||
| struct OprMaker<opr::WarpPerspectiveBackwardData, 0> { | |||||
| using Opr = opr::WarpPerspectiveBackwardData; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| mgb_assert(inputs.size() == 4); | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], inputs[3], param, | |||||
| config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } | } | ||||
| }; | |||||
| template<> | |||||
| struct OprMaker<opr::WarpPerspectiveBackwardMat, 0> { | |||||
| using Opr = opr::WarpPerspectiveBackwardMat; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| mgb_assert(inputs.size() == 4); | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], inputs[3], | |||||
| param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } | |||||
| } | |||||
| }; | |||||
| template <> | |||||
| struct OprMaker<opr::WarpPerspectiveBackwardMat, 0> { | |||||
| using Opr = opr::WarpPerspectiveBackwardMat; | |||||
| using Param = Opr::Param; | |||||
| static cg::OperatorNodeBase* make(const Param& param, | |||||
| const cg::VarNodeArray& inputs, | |||||
| ComputingGraph& graph, | |||||
| const OperatorNodeConfig& config) { | |||||
| MGB_MARK_USED_VAR(graph); | |||||
| if (inputs.size() == 3) { | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], param, config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } else { | |||||
| mgb_assert(inputs.size() == 4); | |||||
| return Opr::make(inputs[0], inputs[1], inputs[2], inputs[3], param, | |||||
| config) | |||||
| .node() | |||||
| ->owner_opr(); | |||||
| } | } | ||||
| }; | |||||
| } // namespace serialization | |||||
| } | |||||
| }; | |||||
| } // namespace serialization | |||||
| namespace opr { | namespace opr { | ||||
| using WarpPerspectiveV2=WarpPerspective; | |||||
| using WarpPerspectiveBackwardDataV2=WarpPerspectiveBackwardData; | |||||
| using WarpPerspectiveBackwardMatV2=WarpPerspectiveBackwardMat; | |||||
| MGB_SEREG_OPR(WarpPerspectiveV2, 0); | |||||
| MGB_SEREG_OPR(WarpPerspectiveBackwardDataV2, 0); | |||||
| MGB_SEREG_OPR(WarpPerspectiveBackwardMatV2, 0); | |||||
| MGB_SEREG_OPR(Rotate, 1); | |||||
| MGB_SEREG_OPR(CvtColor, 1); | |||||
| MGB_SEREG_OPR(GaussianBlur, 1); | |||||
| MGB_SEREG_OPR(ResizeBackward, 2); | |||||
| using RemapV1=Remap; | |||||
| using RemapBackwardDataV1=RemapBackwardData; | |||||
| using RemapBackwardMatV1=RemapBackwardMat; | |||||
| MGB_SEREG_OPR(RemapV1, 2); | |||||
| MGB_SEREG_OPR(RemapBackwardDataV1, 3); | |||||
| MGB_SEREG_OPR(RemapBackwardMatV1, 3); | |||||
| //! current warp affine version | |||||
| using WarpAffineV2 = opr::WarpAffine; | |||||
| MGB_SEREG_OPR(WarpAffineV2, 3); | |||||
| //! current resize version | |||||
| using ResizeV2 = opr::Resize; | |||||
| MGB_SEREG_OPR(ResizeV2, 2); | |||||
| using DctChannelSelectV1 = opr::DctChannelSelect; | |||||
| MGB_SEREG_OPR(DctChannelSelectV1, 0); | |||||
| } // namespace opr | |||||
| } // namespace mgb | |||||
| using WarpPerspectiveV2 = WarpPerspective; | |||||
| using WarpPerspectiveBackwardDataV2 = WarpPerspectiveBackwardData; | |||||
| using WarpPerspectiveBackwardMatV2 = WarpPerspectiveBackwardMat; | |||||
| MGB_SEREG_OPR(WarpPerspectiveV2, 0); | |||||
| MGB_SEREG_OPR(WarpPerspectiveBackwardDataV2, 0); | |||||
| MGB_SEREG_OPR(WarpPerspectiveBackwardMatV2, 0); | |||||
| MGB_SEREG_OPR(Rotate, 1); | |||||
| MGB_SEREG_OPR(CvtColor, 1); | |||||
| MGB_SEREG_OPR(GaussianBlur, 1); | |||||
| MGB_SEREG_OPR(ResizeBackward, 2); | |||||
| using RemapV1 = Remap; | |||||
| using RemapBackwardDataV1 = RemapBackwardData; | |||||
| using RemapBackwardMatV1 = RemapBackwardMat; | |||||
| MGB_SEREG_OPR(RemapV1, 2); | |||||
| MGB_SEREG_OPR(RemapBackwardDataV1, 3); | |||||
| MGB_SEREG_OPR(RemapBackwardMatV1, 3); | |||||
| //! current warp affine version | |||||
| using WarpAffineV2 = opr::WarpAffine; | |||||
| MGB_SEREG_OPR(WarpAffineV2, 3); | |||||
| //! current resize version | |||||
| using ResizeV2 = opr::Resize; | |||||
| MGB_SEREG_OPR(ResizeV2, 2); | |||||
| using DctChannelSelectV1 = opr::DctChannelSelect; | |||||
| MGB_SEREG_OPR(DctChannelSelectV1, 0); | |||||
| } // namespace opr | |||||
| } // namespace mgb | |||||
| // vim: ft=cpp syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} | // vim: ft=cpp syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}} | ||||