blob: c8cdd594dc4759c9b9a023a38d23bc67f8775150 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.neuralnetworks@1.1;
import @1.0::Operand;
import @1.0::OperationType;
import @1.0::PerformanceInfo;
/**
* Operation types.
*
* The type of an operation in a model.
*/
enum OperationType : @1.0::OperationType {
/**
* BatchToSpace for N-dimensional tensors.
*
* This operation reshapes the batch dimension (dimension 0) into M + 1
* dimensions of shape block_shape + [batch], interleaves these blocks back
* into the grid defined by the spatial dimensions [1, ..., M], to obtain a
* result with the same rank as the input.
*
* This is the reverse of SpaceToBatch.
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
* * {@link OperandType::TENSOR_QUANT8_ASYMM}
*
* Supported tensor rank: 4, with "NHWC" (i.e., Num_samples, Height, Width,
* and Channels) data layout.
*
* Inputs:
* * 0: An n-D tensor, specifying the tensor to be reshaped
* * 1: A 1-D Tensor of {@link OperandType::TENSOR_INT32}, the block
* sizes for each spatial dimension of the input tensor. All values
* must be >= 1.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0.
* For a {@link OperandType::TENSOR_QUANT8_ASYMM} tensor,
* the scale and zeroPoint must be the same as input0.
*/
BATCH_TO_SPACE_ND = 29,
/**
* Element-wise division of two tensors.
*
* Takes two input tensors of identical {@link OperandType} and compatible
* dimensions. The output is the result of dividing the first input tensor
* by the second, optionally modified by an activation function.
*
* Two dimensions are compatible when:
* 1. they are equal, or
* 2. one of them is 1
*
* The size of the output is the maximum size along each dimension of the
* input operands. It starts with the trailing dimensions, and works its way
* forward.
*
* Example:
* input1.dimension = {4, 1, 2}
* input2.dimension = {5, 4, 3, 1}
* output.dimension = {5, 4, 3, 2}
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
*
* Supported tensor rank: up to 4
*
* Inputs:
* * 0: An n-D tensor, specifying the first input.
* * 1: A tensor of the same {@link OperandType}, and compatible dimensions
* as input0.
* * 2: An {@link OperandType::INT32} scalar, and has to be one of the
* {@link FusedActivationFunc} values. Specifies the activation to
* invoke on the result.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0.
*/
DIV = 30,
/**
* Computes the mean of elements across dimensions of a tensor.
*
* Reduces the input tensor along the given dimensions to reduce. Unless
* keep_dims is true, the rank of the tensor is reduced by 1 for each entry
* in axis. If keep_dims is true, the reduced dimensions are retained with
* length 1.
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
* * {@link OperandType::TENSOR_QUANT8_ASYMM}
*
* Supported tensor rank: up to 4
*
* Inputs:
* * 0: A tensor, specifying the input.
* * 1: A 1-D Tensor of {@link OperandType::TENSOR_INT32}. The dimensions
* to reduce. Must be in the range
* [-rank(input_tensor), rank(input_tensor)).
*
* NOTE: When the operation was introduced, the documentation
* incorrectly stated that if dimensions were empty, the operation
* would reduce across all dimensions. This behavior was never
* implemented.
*
* * 2: An {@link OperandType::INT32} scalar, keep_dims. If positive,
* retains reduced dimensions with length 1.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0.
* For a {@link OperandType::TENSOR_QUANT8_ASYMM} tensor,
* the scale and zeroPoint must be the same as input0.
* If all dimensions are reduced and keep_dims is false, the output
* shape is [1].
*/
MEAN = 31,
/**
* Pads a tensor.
*
* This operation pads a tensor according to the specified paddings.
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
* * {@link OperandType::TENSOR_QUANT8_ASYMM}
* (the pad value is undefined)
*
* Supported tensor rank: up to 4
*
* Inputs:
* * 0: An n-D tensor, specifying the tensor to be padded.
* * 1: A 2-D Tensor of {@link OperandType::TENSOR_INT32}, the paddings
* for each spatial dimension of the input tensor. The shape of the
* tensor must be {rank(input0), 2}.
* padding[i, 0] specifies the number of elements to be padded in the
* front of dimension i.
* padding[i, 1] specifies the number of elements to be padded after the
* end of dimension i.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0. The
* output tensor has the same rank as input0, and each
* dimension of the output tensor has the same size as the
* corresponding dimension of the input tensor plus the size
* of the padding:
* output0.dimension[i] =
* padding[i, 0] + input0.dimension[i] + padding[i, 1]
* For a {@link OperandType::TENSOR_QUANT8_ASYMM} tensor,
* the scale and zeroPoint must be the same as input0.
*/
PAD = 32,
/**
* SpaceToBatch for N-Dimensional tensors.
*
* This operation divides "spatial" dimensions [1, ..., M] of the input into
* a grid of blocks of shape block_shape, and interleaves these blocks with
* the "batch" dimension (0) such that in the output, the spatial dimensions
* [1, ..., M] correspond to the position within the grid, and the batch
* dimension combines both the position within a spatial block and the
* original batch position. Prior to division into blocks, the spatial
* dimensions of the input are optionally zero padded according to paddings.
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
* * {@link OperandType::TENSOR_QUANT8_ASYMM}
* (the pad value is undefined)
*
* Supported tensor rank: 4, with "NHWC" (i.e., Num_samples, Height, Width,
* and Channels) data layout.
*
* Inputs:
* * 0: An n-D tensor, specifying the input.
* * 1: A 1-D Tensor of {@link OperandType::TENSOR_INT32}, the block
* sizes for each spatial dimension of the input tensor. All values
* must be >= 1.
* * 2: A 2-D Tensor of {@link OperandType::TENSOR_INT32}, the paddings
* for each spatial dimension of the input tensor. All values must be
* >= 0. The shape of the tensor must be {M, 2}, where M is the number
* of spatial dimensions.
* padding[i, 0] specifies the number of element to be padded in the
* front of dimension i.
* padding[i, 1] specifies the number of element to be padded after the
* end of dimension i.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0.
* For a {@link OperandType::TENSOR_QUANT8_ASYMM} tensor,
* the scale and zeroPoint must be the same as input0.
*/
SPACE_TO_BATCH_ND = 33,
/**
* Removes dimensions of size 1 from the shape of a tensor.
*
* Given a tensor input, this operation returns a tensor of the same
* {@link OperandType} with all dimensions of size 1 removed. If you don't
* want to remove all size 1 dimensions, you can remove specific size 1
* dimensions by specifying the axes (input1).
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
* * {@link OperandType::TENSOR_QUANT8_ASYMM}
*
* Supported tensor rank: up to 4
*
* Inputs:
* * 0: An n-D tensor, the tensor to be squeezed.
* * 1: An optional 1-D tensor of {@link OperandType::TENSOR_INT32}. The
* dimensions to squeeze. If specified only squeezes the dimensions
* listed. Otherwise, squeezes all dimensions. The dimension index
* starts at 0. An error must be reported if squeezing a dimension that
* is not 1.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0. Contains the
* same data as input, but has one or more dimensions of size 1
* removed.
* For a {@link OperandType::TENSOR_QUANT8_ASYMM} tensor,
* the scale and zeroPoint must be the same as input0.
* If all input dimensions are equal to 1 and are to be squeezed, the
* output shape is [1].
*/
SQUEEZE = 34,
/**
* Extracts a strided slice of a tensor.
*
* Roughly speaking, this op extracts a slice of size (end - begin) / stride
* from the given input tensor. Starting at the location specified by begin
* the slice continues by adding stride to the index until all dimensions
* are not less than end. Note that a stride can be negative, which causes a
* reverse slice.
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
* * {@link OperandType::TENSOR_QUANT8_ASYMM}
*
* Supported tensor rank: up to 4
*
* Inputs:
* * 0: An n-D tensor, specifying the tensor to be sliced.
* * 1: begin, a 1-D tensor of {@link OperandType::TENSOR_INT32}. The
* starts of the dimensions of the input tensor to be sliced. The
* length must be of rank(input0).
* * 2: end, a 1-D tensor of {@link OperandType::TENSOR_INT32}. The
* ends of the dimensions of the input tensor to be sliced. The length
* must be of rank(input0).
* * 3: strides, a 1-D tensor of {@link OperandType::TENSOR_INT32}. The
* strides of the dimensions of the input tensor to be sliced. The
* length must be of rank(input0). The entries must be non-zero.
* * 4: begin_mask, an {@link OperandType::INT32} scalar. If the ith bit
* of begin_mask is set, begin[i] is ignored and the fullest possible
* range in that dimension is used instead.
* * 5: end_mask, an {@link OperandType::INT32} scalar. If the ith bit of
* end_mask is set, end[i] is ignored and the fullest possible range in
* that dimension is used instead.
* * 6: shrink_axis_mask, an {@link OperandType::INT32} scalar. If the
* ith bit of shrink_axis_mask is set, the ith dimension specification
* shrinks the dimensionality by 1, taking on the value at index
* begin[i]. In this case, the ith specification must define a
* slice of size 1, e.g. begin[i] = x, end[i] = x + 1.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0 and rank (n - k),
* where k is the number of bits set in shrink_axis_mask.
* For a {@link OperandType::TENSOR_QUANT8_ASYMM} tensor,
* the scale and zeroPoint must be the same as input0.
* If shrink_axis_mask is true for all input dimensions, the output
* shape is [1].
*/
STRIDED_SLICE = 35,
/**
* Element-wise subtraction of two tensors.
*
* Takes two input tensors of identical {@link OperandType} and compatible
* dimensions. The output is the result of subtracting the second input
* tensor from the first one, optionally modified by an activation function.
*
* Two dimensions are compatible when:
* 1. they are equal, or
* 2. one of them is 1
*
* The size of the output is the maximum size along each dimension of the
* input operands. It starts with the trailing dimensions, and works its way
* forward.
*
* Example:
* input1.dimension = {4, 1, 2}
* input2.dimension = {5, 4, 3, 1}
* output.dimension = {5, 4, 3, 2}
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
*
* Supported tensor rank: up to 4
*
* Inputs:
* * 0: An n-D tensor, specifying the first input.
* * 1: A tensor of the same {@link OperandType}, and compatible dimensions
* as input0.
* * 2: An {@link OperandType::INT32} scalar, and has to be one of the
* {@link FusedActivationFunc} values. Specifies the activation to
* invoke on the result.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0.
*/
SUB = 36,
/**
* Transposes the input tensor, permuting the dimensions according to the
* perm tensor.
*
* The returned tensor's dimension i corresponds to the input dimension
* perm[i]. If perm is not given, it is set to (n-1...0), where n is the
* rank of the input tensor. Hence by default, this operation performs a
* regular matrix transpose on 2-D input Tensors.
*
* Supported tensor {@link OperandType}:
* * {@link OperandType::TENSOR_FLOAT32}
* * {@link OperandType::TENSOR_QUANT8_ASYMM}
*
* Supported tensor rank: up to 4
*
* Inputs:
* * 0: An n-D tensor, specifying the tensor to be transposed.
* * 1: An optional 1-D Tensor of {@link OperandType::TENSOR_INT32},
* the permutation of the dimensions of the input tensor.
*
* Outputs:
* * 0: A tensor of the same {@link OperandType} as input0.
* For a {@link OperandType::TENSOR_QUANT8_ASYMM} tensor,
* the scale and zeroPoint must be the same as input0.
*/
TRANSPOSE = 37,
};
/**
* The capabilities of a driver.
*/
struct Capabilities {
/**
* Driver performance when operating on float32 data.
*/
PerformanceInfo float32Performance;
/**
* Driver performance when operating on asymmetric 8-bit quantized data.
*/
PerformanceInfo quantized8Performance;
/**
* Driver performance when operating on float32 data but performing
* calculations with range and/or precision as low as that of the IEEE
* 754 16-bit floating-point format.
*/
PerformanceInfo relaxedFloat32toFloat16Performance;
};
/**
* Describes one operation of the model's graph.
*/
struct Operation {
/**
* The operation type.
*/
OperationType type;
/**
* Describes the table that contains the indexes of the inputs of the
* operation. The offset is the index in the operandIndexes table.
*/
vec<uint32_t> inputs;
/**
* Describes the table that contains the indexes of the outputs of the
* operation. The offset is the index in the operandIndexes table.
*/
vec<uint32_t> outputs;
};
/**
* A Neural Network Model.
*
* This includes not only the execution graph, but also constant data such as
* weights or scalars added at construction time. The only information that
* may not be known is the shape of the input tensors.
*/
struct Model {
/**
* All operands included in the model.
*/
vec<Operand> operands;
/**
* All operations included in the model.
*
* The operations are sorted into execution order. Every operand
* with lifetime MODEL_OUTPUT or TEMPORARY_VARIABLE must be
* written before it is read.
*/
vec<Operation> operations;
/**
* Input indexes of the model. There must be at least one.
*
* Each value corresponds to the index of the operand in "operands".
*/
vec<uint32_t> inputIndexes;
/**
* Output indexes of the model. There must be at least one.
*
* Each value corresponds to the index of the operand in "operands".
*/
vec<uint32_t> outputIndexes;
/**
* A byte buffer containing operand data that were copied into the model.
*
* An operand's value must be located here if and only if Operand::lifetime
* equals OperandLifeTime::CONSTANT_COPY.
*/
vec<uint8_t> operandValues;
/**
* A collection of shared memory pools containing operand values.
*
* An operand's value must be located here if and only if Operand::lifetime
* equals OperandLifeTime::CONSTANT_REFERENCE.
*/
vec<memory> pools;
/**
* 'true' indicates TENSOR_FLOAT32 may be calculated with range and/or
* precision as low as that of the IEEE 754 16-bit floating-point format.
* 'false' indicates TENSOR_FLOAT32 must be calculated using at least the
* range and precision of the IEEE 754 32-bit floating-point format.
*/
bool relaxComputationFloat32toFloat16;
};
/**
* Execution preferences.
*/
enum ExecutionPreference : int32_t {
/**
* Prefer executing in a way that minimizes battery drain.
* This is desirable for compilations that will be executed often.
*/
LOW_POWER = 0,
/**
* Prefer returning a single answer as fast as possible, even if this causes
* more power consumption.
*/
FAST_SINGLE_ANSWER = 1,
/**
* Prefer maximizing the throughput of successive frames, for example when
* processing successive frames coming from the camera.
*/
SUSTAINED_SPEED = 2,
};