android13/packages/modules/NeuralNetworks/runtime/include/NeuralNetworksExperimentalF...

159 lines
8.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (C) 2021 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.
*/
/**
* @addtogroup NeuralNetworks
* @{
*/
/**
* @file NeuralNetworksExperimentalFeatures.h
*/
#ifndef ANDROID_PACKAGES_MODULES_NEURALNETWORKS_RUNTIME_NEURAL_NETWORKS_EXPERIMENTAL_FEATURES_H
#define ANDROID_PACKAGES_MODULES_NEURALNETWORKS_RUNTIME_NEURAL_NETWORKS_EXPERIMENTAL_FEATURES_H
/******************************************************************
*
* IMPORTANT NOTICE:
*
* This file is part of Android's set of stable system headers
* exposed by the Android NDK (Native Development Kit).
*
* Third-party source AND binary code relies on the definitions
* here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
*
* - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
* - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
* - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
* - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
*/
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/cdefs.h>
__BEGIN_DECLS
/**
* The Android NNAPI experimental feature level.
*/
typedef enum {
ANEURALNETWORKS_FEATURE_LEVEL_EXPERIMENTAL = 0x7FFFFFFF,
} ANeuralNetworksExperimentalFeatureLevelCode;
/**
* Operation types for experimental features.
*
* The type of an operation in a model.
*/
typedef enum {
/**
* Expands a representation of a sparse tensor to a dense tensor.
*
* To encode a conceptual n-dimensional dense tensor with dims [D0, ..., Dn-1], potentially with
* a k-dimensional block (0 <= k <= n) with dims [Dn, ..., Dn+k-1], the format specifies:
* * 1: In what order to traverse these dimensions. For example, to store a 2-D matrix in row
* major order, the traversal order would be [D0, D1], whereas to store it in column major
* order, the traversal order would be [D1, D0]. If the 2-D matrix has a 2-D inner block,
* the traversal order could be [D0, D1, D2, D3].
* * 2: How each block dimension in [Dn, ..., Dn+k-1] maps to the original tensor dimension in
* [D0, ..., Dn-1].
* * 3: In the traversal order defined above, the format (dense vs. sparse) and index metadata
* for each dimension. For a dense dimension, this is just the size of that dimension. For
* a sparse dimension, it's the same as the compressed index defined in the Compressed
* Sparse Row (CSR) format.
* (http://scipy-lectures.org/advanced/scipy_sparse/csr_matrix.html)
*
* The number of inputs to this operation is determined by the number of dimensions (including
* the block dimensions) of the sparsity parameters. Currently, the only formats supported are
* DENSE and SPARSE_CSR, but additional sparsity formats may be added in later versions of this
* operation.
*
* Supported tensor {@link OperandCode}:
* * {@link ANEURALNETWORKS_TENSOR_FLOAT16}
* * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
* * {@link ANEURALNETWORKS_TENSOR_QUANT8_SYMM}
* * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
* * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM_SIGNED}
* * {@link ANEURALNETWORKS_TENSOR_BOOL8}
* * {@link ANEURALNETWORKS_TENSOR_INT32}
* * {@link ANEURALNETWORKS_TENSOR_QUANT16_SYMM}
* * {@link ANEURALNETWORKS_TENSOR_QUANT16_ASYMM}
*
*
* Reference:
* * This implementation is a modification of the TACO format.
* http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf
*
* Inputs:
* * 0: A 1-D tensor representing the compressed sparse tensor data of a conceptual
* n-dimensional tensor.
* * 1: A 1-D {@link ANEURALNETWORKS_TENSOR_INT32} tensor defining the traversal order for
* reading the non-zero blocks. For an n-dimensional tensor with dimensions [D0, D1, …,
* Dn-1]: if block sparse with a k-dimensional block (0 < k <= n), the traversal order has
* n+k elements. The first n elements are still a permutation of [D0, …, Dn-1]. The last k
* elements are a permutation of [Dn, …, Dn+k-1], defining how to traverse a block
* internally. If not block sparse, the traversal order is just a permutation of [D0, …,
* Dn-1].
* * 2: An optional 1-D {@link ANEURALNETWORKS_TENSOR_INT32} tensor defining the block map. For
* a block sparse n-dimensional tensor with a k-dimensional block (0 < k <= n), it stores
* how a block dimension [Dn, …, Dn+k-1] maps to the original tensor dimension in [D0, …,
* Dn-1]. For i, j where 0 <= i < j < k, blockMap[i] < blockMap[j]. If not block sparse,
* this is null.
* * 3: A 1-D {@link ANEURALNETWORKS_TENSOR_INT32} tensor with n+k elements defining the format
* of each dimension in the traversal order (listed above). The format is either DENSE
* (where DENSE = 0) or SPARSE_CSR (where SPARSE_CSR = 1). DENSE means that each coordinate
* in this dimension is stored implicitly. SPARSE_CSR means only the coordinates with
* non-zero elements are stored.
* * 4: A 1-D {@link ANEURALNETWORKS_TENSOR_INT32} tensor with n+k elements defining the size of
* each dimension or block. The product of all these sizes totals the number of elements in
* the dense tensor. First n elements represent the sparse tensors shape, and the last k
* elements represent the blocks shape.
* * 5 ~ (5 + 2 * (n+k)): An optional pair of {@link ANEURALNETWORKS_TENSOR_INT32} tensors which
* together specify the sparse indices along that dimension. The first pair of arguments
* corresponds to D0, the second to D1, and so on until Dn+k-1. If the dimension is DENSE,
* both arguments in the pair are null and the dimension is implicitly specified by the
* corresponding element in Input 4. If the dimension is SPARSE_CSR, then we use the pair
* of array segments and array indices to encode that dimension:
* * * +0: An optional list of n+k input 1-D {@link ANEURALNETWORKS_TENSOR_INT32} tensors,
* defining the array segments. The array segments represent how to segment the indices
* array, each segment corresponds to one element in the previous dimension. Array
* segments are interspersed with array indices (listed below), so this input could be
* input (5, 5 + 2, …, 5 + 2*(n+k-1)). For i, j where 0 =< i < j, arraySegments[i] <=
* arraySegments[j]. Used if the dimension is SPARSE_CSR, omitted if the dimension is
* DENSE.
* * * +1: An optional list of n+k input 1-D {@link ANEURALNETWORKS_TENSOR_INT32} tensors,
* defining the array indices. The array indices represent the index of the non-zero
* elements within this dimension (as those in the CSR matrix format, where the first
* array is row pointers and the second array is column indices). Array indices are
* interspersed with array segments (listed above), so this input could be input (6, 6 +
* 2, …, 6 + 2*(n+k-1)). Used if the dimension is SPARSE_CSR, omitted if the dimension
* is DENSE.
*
* Outputs:
* * 0: An n-D dense tensor. The output tensor has the same {@link OperandCode} as input 0.
*/
ANEURALNETWORKS_DENSIFY = 20000,
} ANeuralNetworksExperimentalOperationCode;
__END_DECLS
#endif // ANDROID_PACKAGES_MODULES_NEURALNETWORKS_RUNTIME_NEURAL_NETWORKS_EXPERIMENTAL_FEATURES_H
/** @} */