| @@ -9,195 +9,194 @@ | |||
| * "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/serialization/sereg.h" | |||
| #include "megdnn/opr_param_defs.h" | |||
| namespace mgb { | |||
| 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 { | |||
| 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}}} | |||