| #include "caffe2/operators/rowmul_op.h" | 
 |  | 
 | namespace caffe2 { | 
 | namespace { | 
 |  | 
 | REGISTER_CPU_OPERATOR(ReduceTailSum, ReduceTailSumOp<float, CPUContext>); | 
 | REGISTER_CPU_OPERATOR(RowMul, RowMulOp<float, CPUContext>); | 
 |  | 
 | 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<OperatorDef> GetGradientDefs() override { | 
 |     return vector<OperatorDef>{ | 
 |         CreateOperatorDef( | 
 |             "RowMul", "", vector<string>{GO(0), I(1)}, vector<string>{GI(0)}), | 
 |         CreateOperatorDef( | 
 |             "Mul", | 
 |             "", | 
 |             vector<string>{GO(0), I(0)}, | 
 |             vector<string>{GI(1) + "before_aggregate"}), | 
 |         CreateOperatorDef( | 
 |             "ReduceTailSum", | 
 |             "", | 
 |             vector<string>{GI(1) + "before_aggregate"}, | 
 |             vector<string>{GI(1)})}; | 
 |   } | 
 | }; | 
 | REGISTER_GRADIENT(RowMul, GetRowMulGradient); | 
 |  | 
 | } // namespace | 
 |  | 
 | } // namespace caffe2 |