|  | #include "caffe2/operators/minmax_ops.h" | 
|  |  | 
|  | namespace caffe2 { | 
|  |  | 
|  | REGISTER_CPU_OPERATOR(Min, MinOp<float, CPUContext>); | 
|  | REGISTER_CPU_OPERATOR(Max, MaxOp<float, CPUContext>); | 
|  |  | 
|  | OPERATOR_SCHEMA(Max) | 
|  | .NumInputs(1, INT_MAX) | 
|  | .NumOutputs(1) | 
|  | .IdenticalTypeAndShapeOfInput(0) | 
|  | .AllowInplace({{0, 0}}) | 
|  | .SetDoc(R"DOC( | 
|  | Element-wise max of an arbitrary number of input tensors. This operation can be | 
|  | performed in-place, by using the first input blob as the output blob. All inputs | 
|  | must have the same shape and data type, and the output will have the same shape | 
|  | as the inputs. | 
|  |  | 
|  | Github Link: | 
|  | - https://github.com/pytorch/pytorch/blob/master/caffe2/operators/minmax_ops.cc | 
|  |  | 
|  | <details> | 
|  |  | 
|  | <summary> <b>Example</b> </summary> | 
|  |  | 
|  | **Code** | 
|  |  | 
|  | ``` | 
|  |  | 
|  | workspace.ResetWorkspace() | 
|  |  | 
|  | op = core.CreateOperator( | 
|  | "Max", | 
|  | ["X", "Y", "Z"], | 
|  | ["X"], | 
|  | ) | 
|  |  | 
|  | workspace.FeedBlob("X", (np.random.rand(3,3)).astype(np.float32)) | 
|  | workspace.FeedBlob("Y", (np.random.rand(3,3)).astype(np.float32)) | 
|  | workspace.FeedBlob("Z", (np.random.rand(3,3)).astype(np.float32)) | 
|  | print("X:", workspace.FetchBlob("X")) | 
|  | print("Y:", workspace.FetchBlob("Y")) | 
|  | print("Z:", workspace.FetchBlob("Z")) | 
|  | workspace.RunOperatorOnce(op) | 
|  | print("Max:", workspace.FetchBlob("X")) | 
|  |  | 
|  | ``` | 
|  |  | 
|  | **Result** | 
|  |  | 
|  | ``` | 
|  |  | 
|  | X: | 
|  | [[0.4496477  0.07061381 0.7139333 ] | 
|  | [0.83203    0.05970785 0.72786295] | 
|  | [0.75988126 0.04601283 0.32820013]] | 
|  | Y: | 
|  | [[0.05683139 0.16872478 0.671098  ] | 
|  | [0.70739156 0.09878621 0.03416285] | 
|  | [0.34087983 0.94986707 0.67263436]] | 
|  | Z: | 
|  | [[0.48051122 0.07141234 0.85264146] | 
|  | [0.77086854 0.22082241 0.13154659] | 
|  | [0.42401117 0.995431   0.4263775 ]] | 
|  | Max: | 
|  | [[0.48051122 0.16872478 0.85264146] | 
|  | [0.83203    0.22082241 0.72786295] | 
|  | [0.75988126 0.995431   0.67263436]] | 
|  |  | 
|  | ``` | 
|  |  | 
|  | </details> | 
|  |  | 
|  | )DOC") | 
|  | .Input( | 
|  | 0, | 
|  | "X, Y, ...", | 
|  | "*(type: Tensor`<Ord>`)* List of input tensors with the same shape.") | 
|  | .Output( | 
|  | 0, | 
|  | "M", | 
|  | "*(type: Tensor`<Ord>`)* Output tensor with same dimensions as input(s)." | 
|  | "Contains the maximum valued element at each location.") | 
|  | .InheritOnnxSchema(); | 
|  |  | 
|  | OPERATOR_SCHEMA(Min) | 
|  | .NumInputs(1, INT_MAX) | 
|  | .NumOutputs(1) | 
|  | .IdenticalTypeAndShapeOfInput(0) | 
|  | .AllowInplace({{0, 0}}) | 
|  | .SetDoc(R"DOC( | 
|  | Element-wise min of an arbitrary number of input tensors. This operation can be performed in-place, by using the first input blob as the output blob. All inputs must have the same shape and data type, and the output will have the same shape as the inputs. | 
|  |  | 
|  | Github Link: | 
|  | - https://github.com/pytorch/pytorch/blob/master/caffe2/operators/minmax_ops.cc | 
|  |  | 
|  | <details> | 
|  |  | 
|  | <summary> <b>Example</b> </summary> | 
|  |  | 
|  | **Code** | 
|  |  | 
|  | ``` | 
|  |  | 
|  | workspace.ResetWorkspace() | 
|  |  | 
|  | op = core.CreateOperator( | 
|  | "Min", | 
|  | ["X", "Y", "Z"], | 
|  | ["X"], | 
|  | ) | 
|  |  | 
|  | workspace.FeedBlob("X", (np.random.rand(2,2)).astype(np.float32)) | 
|  | workspace.FeedBlob("Y", (np.random.rand(2,2)).astype(np.float32)) | 
|  | workspace.FeedBlob("Z", (np.random.rand(2,2)).astype(np.float32)) | 
|  | print("X:", workspace.FetchBlob("X")) | 
|  | print("Y:", workspace.FetchBlob("Y")) | 
|  | print("Z:", workspace.FetchBlob("Z")) | 
|  | workspace.RunOperatorOnce(op) | 
|  | print("Min:", workspace.FetchBlob("X")) | 
|  |  | 
|  | ``` | 
|  |  | 
|  | **Result** | 
|  |  | 
|  | ``` | 
|  |  | 
|  | X: | 
|  | [[0.32731926 0.4939747 ] | 
|  | [0.29242373 0.43460014]] | 
|  | Y: | 
|  | [[0.40928316 0.916115  ] | 
|  | [0.77526504 0.29339448]] | 
|  | Z: | 
|  | [[0.7899794  0.90335774] | 
|  | [0.82599413 0.2843068 ]] | 
|  | Min: | 
|  | [[0.32731926 0.4939747 ] | 
|  | [0.29242373 0.2843068 ]] | 
|  |  | 
|  | ``` | 
|  |  | 
|  | </details> | 
|  |  | 
|  | )DOC") | 
|  | .Input( | 
|  | 0, | 
|  | "X, Y, ...", | 
|  | "*(type: Tensor`<Ord>`)* List of input tensors with the same shape.") | 
|  | .Output( | 
|  | 0, | 
|  | "M", | 
|  | "*(type: Tensor`<Ord>`)* Output tensor with same dimensions as input(s)." | 
|  | "Contains the minimum valued element at each location.") | 
|  | .InheritOnnxSchema(); | 
|  |  | 
|  | } // namespace caffe2 |