| #include "caffe2/operators/utility_ops.h" | |
| namespace caffe2 { | |
| REGISTER_CPU_OPERATOR(Sum, SumOp<CPUContext>); | |
| OPERATOR_SCHEMA(Sum) | |
| .NumInputs(1, INT_MAX) | |
| .NumOutputs(1) | |
| .AllowInplace({{0, 0}}) | |
| .CostInferenceFunction(CostInferenceForSum) | |
| .InputsCanCrossDevices() | |
| .IdenticalTypeAndShapeOfInput(0) | |
| .SetDoc(R"DOC( | |
| Element-wise sum of each of the input tensors. The first input tensor can be used | |
| in-place as the output tensor, in which case the sum will be done in place and | |
| results will be accumulated the first input tensor. All inputs and outputs must | |
| have the same shape and data type. | |
| Github Links: | |
| - https://github.com/pytorch/pytorch/blob/master/caffe2/operators/elementwise_sum_op.cc | |
| <details> | |
| <summary> <b>Example</b> </summary> | |
| **Code** | |
| ``` | |
| workspace.ResetWorkspace() | |
| op = core.CreateOperator( | |
| "Sum", | |
| ["A", "B"], | |
| ["C"], | |
| ) | |
| workspace.FeedBlob("A", np.array([[1,2],[3,4]]).astype(np.float32)) | |
| workspace.FeedBlob("B", np.array([[5,6],[7,8]]).astype(np.float32)) | |
| print("A:", workspace.FetchBlob("A")) | |
| print("B:", workspace.FetchBlob("B")) | |
| workspace.RunOperatorOnce(op) | |
| print("C:", workspace.FetchBlob("A")) | |
| ``` | |
| **Result** | |
| ``` | |
| A: [[1. 2.] | |
| [3. 4.]] | |
| B: [[5. 6.] | |
| [7. 8.]] | |
| C: [[1. 2.] | |
| [3. 4.]] | |
| ``` | |
| </details> | |
| <details> | |
| <summary> <b>Example 2</b> </summary> | |
| **Code** | |
| ``` | |
| workspace.ResetWorkspace() | |
| op = core.CreateOperator( | |
| "Sum", | |
| ["A", "B"], | |
| ["A"], // inplace | |
| ) | |
| workspace.FeedBlob("A", np.array([[1,2,5],[8,3,4]]).astype(np.float32)) | |
| workspace.FeedBlob("B", np.array([[9,5,6],[6,7,8]]).astype(np.float32)) | |
| print("A:", workspace.FetchBlob("A")) | |
| print("B:", workspace.FetchBlob("B")) | |
| workspace.RunOperatorOnce(op) | |
| print("A after Sum:", workspace.FetchBlob("A")) | |
| ``` | |
| **Result** | |
| ``` | |
| A: [[1. 2. 5.] | |
| [8. 3. 4.]] | |
| B: [[9. 5. 6.] | |
| [6. 7. 8.]] | |
| A after Sum: [[10. 7. 11.] | |
| [14. 10. 12.]] | |
| ``` | |
| </details> | |
| )DOC") | |
| .Input( | |
| 0, | |
| "A", | |
| "*(type: Tensor`<float>`)* First tensor to be added element-wise.") | |
| .Input( | |
| 1, | |
| "B", | |
| "*(type: Tensor`<float>`)* Second tensor to be added element-wise.") | |
| .Output(0, "C", "*(type: Tensor`<float>`)* Sum of A and B.") | |
| .InheritOnnxSchema(); | |
| } |