#include "caffe2/operators/rowmul_op.h" namespace caffe2 { namespace { REGISTER_CPU_OPERATOR(ReduceTailSum, ReduceTailSumOp); REGISTER_CPU_OPERATOR(RowMul, RowMulOp); OPERATOR_SCHEMA(ReduceTailSum) .NumInputs(1, 1) .NumOutputs(1) .SetDoc(R"DOC( Reduce the tailing dimensions )DOC") .Input(0, "mat", "The matrix") .Output(0, "output", "Output"); OPERATOR_SCHEMA(RowMul) .NumInputs(2, 2) .NumOutputs(1) .SetDoc(R"DOC( Given a matrix A and column vector w, the output is the multiplication of row i of A and element i of w, e.g. C[i][j] = A[i][j] * w[i]. This operator should be deprecated when the gradient operator of Mul with broadcast is implemented. )DOC") .Input(0, "mat", "The matrix") .Input(1, "w", "The column vector") .Output(0, "output", "Output"); class GetRowMulGradient : public GradientMakerBase { using GradientMakerBase::GradientMakerBase; vector GetGradientDefs() override { return vector{ CreateOperatorDef( "RowMul", "", vector{GO(0), I(1)}, vector{GI(0)}), CreateOperatorDef( "Mul", "", vector{GO(0), I(0)}, vector{GI(1) + "before_aggregate"}), CreateOperatorDef( "ReduceTailSum", "", vector{GI(1) + "before_aggregate"}, vector{GI(1)})}; } }; REGISTER_GRADIENT(RowMul, GetRowMulGradient); } // namespace } // namespace caffe2