// // This confidential and proprietary software may be used only as // authorised by a licensing agreement from ARM Limited // (C) COPYRIGHT 2020 ARM Limited // ALL RIGHTS RESERVED // The entire notice above must be reproduced on all authorised // copies and copies may only be made to the extent permitted // by a licensing agreement from ARM Limited. === Reduction Operators ==== REDUCE_ALL Reduce a tensor along the given axis with a logical AND operation *Arguments:* |=== |Argument|Type|Name|Shape|Description |Input|in_t*|input|in_shape|Input tensor with rank from 1 to 4 |Attribute|int|axis|-|Axis to reduce |Output|out_t*|output|out_shape|Output tensor. Same rank as the input tensor. |=== *Operation Function:* [source,c] ---- assert(0<=axis && axis(output, out_shape, index, true) } for_each (index in in_shape) { tmp_index = index; tmp_index[axis]=0; value = tensor_read(input, in_shape, index) acc = tensor_read(output, out_shape, tmp_index) acc = acc && value tensor_write(output, out_shape, tmp_index, acc) } ---- *Supported Data Types:* |=== |Profile|Mode|in_t|out_t |Any|Boolean|bool|bool |=== ==== REDUCE_ANY Reduce a tensor along the given axis with a logical OR operation *Arguments:* |=== |Argument|Type|Name|Shape|Description |Input|in_t*|input|in_shape|Input tensor with rank from 1 to 4 |Attribute|int|axis|-|Axis to reduce |Output|out_t*|output|out_shape|Output tensor. Same rank as the input tensor. |=== *Operation Function:* [source,c] ---- assert(0<=axis && axis(output, out_shape, index, false) } for_each (index in in_shape) { tmp_index = index; tmp_index[axis]=0; value = tensor_read(input, in_shape, index) acc = tensor_read(output, out_shape, tmp_index) acc = acc || value tensor_write(output, out_shape, tmp_index, acc) } ---- *Supported Data Types:* |=== |Profile|Mode|in_t|out_t |Any|Boolean|bool|bool |=== ==== REDUCE_MAX Reduce a tensor along the given axis with a maximum operation *Arguments:* |=== |Argument|Type|Name|Shape|Description |Input|in_t*|input|in_shape|Input tensor with rank from 1 to 4 |Attribute|int|axis|-|Axis to reduce |Output|out_t*|output|out_shape|Output tensor. Same rank as the input tensor. |=== *Operation Function:* [source,c] ---- assert(0<=axis && axis(output, out_shape, index, minimum) } for_each (index in in_shape) { tmp_index = index; tmp_index[axis]=0; value = tensor_read(input, in_shape, index) acc = tensor_read(output, out_shape, tmp_index) acc = apply_max(acc, value) tensor_write(output, out_shape, tmp_index, acc) } ---- *Supported Data Types:* |=== |Profile|Mode|in_t|out_t |Any|signed 8|aint8|aint8 |Any|signed 16|int16|int16 |Any|signed 32|int32|int32 |MI, MT|float|float|float |=== ==== REDUCE_MIN Reduce a tensor along the given axis with a minimum operation *Arguments:* |=== |Argument|Type|Name|Shape|Description |Input|in_t*|input|in_shape|Input tensor with rank from 1 to 4 |Attribute|int|axis|-|Axis to reduce |Output|out_t*|output|out_shape|Output tensor. Same rank as the input tensor. |=== *Quantization Parameters:* Quantization is ignored when doing the REDUCE_MIN operation. The input and output must maintain the same parameters. *Operation Function:* [source,c] ---- assert(0<=axis && axis(output, out_shape, index, maximum) } for_each (index in in_shape) { tmp_index = index; tmp_index[axis]=0; value = tensor_read(input, in_shape, index) acc = tensor_read(output, out_shape, tmp_index) acc = apply_min(acc, value) tensor_write(output, out_shape, tmp_index, acc) } ---- *Supported Data Types:* |=== |Profile|Mode|in_t|out_t |Any|signed 8|aint8|aint8 |Any|signed 16|int16|int16 |Any|signed 32|int32|int32 |MI, MT|float|float|float |=== ==== REDUCE_PRODUCT Reduce a tensor along the given axis by computing the product of the axis. *Arguments:* |=== |Argument|Type|Name|Shape|Description |Input|in_t*|input|in_shape|Input tensor with rank from 1 to 4 |Attribute|int|axis|-|Axis to reduce |Output|out_t*|output|out_shape|Output tensor. Same rank as the input tensor. |=== *Operation Function:* [source,c] ---- assert(0<=axis && axis(output, out_shape, index, 1.0) } for_each (index in in_shape) { tmp_index = index; tmp_index[axis]=0; value = tensor_read(input, in_shape, index) acc = tensor_read(output, out_shape, tmp_index) acc = acc * value tensor_write(output, out_shape, tmp_index, acc) } ---- *Supported Data Types:* |=== |Profile|Mode|in_t|out_t |MI, MT|float|float|float |=== ==== REDUCE_SUM Reduce a tensor along the given axis by computing the sum of the axis. *Arguments:* |=== |Argument|Type|Name|Shape|Description |Input|in_t*|input|in_shape|Input tensor with rank from 1 to 4 |Attribute|int|axis|-|Axis to reduce |Output|out_t*|output|out_shape|Output tensor. Same rank as the input tensor. |=== *Operation Function:* [source,c] ---- assert(0<=axis && axis(output, out_shape, index, 0) } for_each (index in in_shape) { tmp_index = index; tmp_index[axis]=0; value = tensor_read(input, in_shape, index) acc = tensor_read(output, out_shape, tmp_index) acc = apply_add(acc, value) tensor_write(output, out_shape, tmp_index, acc) } ---- *Supported Data Types:* |=== |Profile|Mode|in_t|out_t |Any|signed 32|int32|int32 |MI, MT|float|float|float |===