[SPEC] Inverse operation (#22786)

### Details:
 - Add Inverse operation specification

### Tickets:
 - 131139
This commit is contained in:
Piotr Krzemiński 2024-02-14 13:27:58 +01:00 committed by GitHub
parent a0be9ca772
commit f2ca6c95e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 347 additions and 0 deletions

View File

@ -12,6 +12,7 @@ Available Operation Sets
:maxdepth: 1
:hidden:
openvino_docs_ops_opset14
openvino_docs_ops_opset13
openvino_docs_ops_opset12
openvino_docs_ops_opset11
@ -36,6 +37,8 @@ This topic provides a complete list of available sets of operations supported in
* - OpenVINO™ Version
- Actual Operations Set
* - 2024.0
- :doc:`opset14 <openvino_docs_ops_opset14>`
* - 2023.2
- :doc:`opset13 <openvino_docs_ops_opset13>`
* - 2023.1

View File

@ -0,0 +1,208 @@
.. {#openvino_docs_ops_opset14}
opset14
=======
.. meta::
:description: Explore the examples of operation instances expressed as IR
XML snippets in the opset14 operation set, supported in OpenVINO™
toolkit.
This specification document describes the ``opset14`` operation set supported in OpenVINO™.
Support for each particular operation from the list below depends on the capabilities of an inference plugin
and may vary among different hardware platforms and devices. Examples of operation instances are provided as IR xml
snippets. Such IR is generated by the Model Optimizer. The semantics match corresponding OpenVINO operation classes
declared in ``namespace opset14``.
Table of Contents
##################
* :doc:`Abs <openvino_docs_ops_arithmetic_Abs_1>`
* :doc:`Acos <openvino_docs_ops_arithmetic_Acos_1>`
* :doc:`Acosh <openvino_docs_ops_arithmetic_Acosh_3>`
* :doc:`AdaptiveAvgPool <openvino_docs_ops_pooling_AdaptiveAvgPool_8>`
* :doc:`AdaptiveMaxPool <openvino_docs_ops_pooling_AdaptiveMaxPool_8>`
* :doc:`Add <openvino_docs_ops_arithmetic_Add_1>`
* :doc:`Asin <openvino_docs_ops_arithmetic_Asin_1>`
* :doc:`Asinh <openvino_docs_ops_arithmetic_Asinh_3>`
* :doc:`Assign <openvino_docs_ops_infrastructure_Assign_3>`
* :doc:`Atan <openvino_docs_ops_arithmetic_Atan_1>`
* :doc:`Atanh <openvino_docs_ops_arithmetic_Atanh_3>`
* :doc:`AvgPool <openvino_docs_ops_pooling_AvgPool_1>`
* :doc:`BatchNormInference <openvino_docs_ops_normalization_BatchNormInference_5>`
* :doc:`BatchToSpace <openvino_docs_ops_movement_BatchToSpace_2>`
* :doc:`BinaryConvolution <openvino_docs_ops_convolution_BinaryConvolution_1>`
* :doc:`BitwiseAnd <openvino_docs_ops_bitwise_BitwiseAnd_13>`
* :doc:`BitwiseOr <openvino_docs_ops_bitwise_BitwiseOr_13>`
* :doc:`BitwiseXor <openvino_docs_ops_bitwise_BitwiseXor_13>`
* :doc:`BitwiseNot <openvino_docs_ops_bitwise_BitwiseNot_13>`
* :doc:`Broadcast <openvino_docs_ops_movement_Broadcast_3>`
* :doc:`Bucketize <openvino_docs_ops_condition_Bucketize_3>`
* :doc:`CTCGreedyDecoder <openvino_docs_ops_sequence_CTCGreedyDecoder_1>`
* :doc:`CTCGreedyDecoderSeqLen <openvino_docs_ops_sequence_CTCGreedyDecoderSeqLen_6>`
* :doc:`CTCLoss <openvino_docs_ops_sequence_CTCLoss_4>`
* :doc:`Ceiling <openvino_docs_ops_arithmetic_Ceiling_1>`
* :doc:`Clamp <openvino_docs_ops_activation_Clamp_1>`
* :doc:`Concat <openvino_docs_ops_movement_Concat_1>`
* :doc:`Constant <openvino_docs_ops_infrastructure_Constant_1>`
* :doc:`Convert <openvino_docs_ops_type_Convert_1>`
* :doc:`ConvertLike <openvino_docs_ops_type_ConvertLike_1>`
* :doc:`Convolution <openvino_docs_ops_convolution_Convolution_1>`
* :doc:`ConvolutionBackpropData <openvino_docs_ops_convolution_ConvolutionBackpropData_1>`
* :doc:`Cos <openvino_docs_ops_arithmetic_Cos_1>`
* :doc:`Cosh <openvino_docs_ops_arithmetic_Cosh_1>`
* :doc:`CumSum <openvino_docs_ops_arithmetic_CumSum_3>`
* :doc:`DeformableConvolution <openvino_docs_ops_convolution_DeformableConvolution_8>`
* :doc:`DeformablePSROIPooling <openvino_docs_ops_detection_DeformablePSROIPooling_1>`
* :doc:`DepthToSpace <openvino_docs_ops_movement_DepthToSpace_1>`
* :doc:`DetectionOutput <openvino_docs_ops_detection_DetectionOutput_8>`
* :doc:`DFT <openvino_docs_ops_signals_DFT_7>`
* :doc:`Divide <openvino_docs_ops_arithmetic_Divide_1>`
* :doc:`Einsum <openvino_docs_ops_matrix_Einsum_7>`
* :doc:`Elu <openvino_docs_ops_activation_Elu_1>`
* :doc:`EmbeddingBagOffsetsSum <openvino_docs_ops_sparse_EmbeddingBagOffsetsSum_3>`
* :doc:`EmbeddingBagPackedSum <openvino_docs_ops_sparse_EmbeddingBagPackedSum_3>`
* :doc:`EmbeddingSegmentsSum <openvino_docs_ops_sparse_EmbeddingSegmentsSum_3>`
* :doc:`Equal <openvino_docs_ops_comparison_Equal_1>`
* :doc:`Erf <openvino_docs_ops_arithmetic_Erf_1>`
* :doc:`Exp <openvino_docs_ops_activation_Exp_1>`
* :doc:`ExperimentalDetectronDetectionOutput_6 <openvino_docs_ops_detection_ExperimentalDetectronDetectionOutput_6>`
* :doc:`ExperimentalDetectronGenerateProposalsSingleImage_6 <openvino_docs_ops_detection_ExperimentalDetectronGenerateProposalsSingleImage_6>`
* :doc:`ExperimentalDetectronPriorGridGenerator_6 <openvino_docs_ops_detection_ExperimentalDetectronPriorGridGenerator_6>`
* :doc:`ExperimentalDetectronROIFeatureExtractor_6 <openvino_docs_ops_detection_ExperimentalDetectronROIFeatureExtractor_6>`
* :doc:`ExperimentalDetectronTopKROIs_6 <openvino_docs_ops_sort_ExperimentalDetectronTopKROIs_6>`
* :doc:`ExtractImagePatches <openvino_docs_ops_movement_ExtractImagePatches_3>`
* :doc:`Eye <openvino_docs_ops_generation_Eye_9>`
* :doc:`FakeConvert <openvino_docs_ops_quantization_FakeConvert_13>`
* :doc:`FakeQuantize <openvino_docs_ops_quantization_FakeQuantize_1>`
* :doc:`Floor <openvino_docs_ops_arithmetic_Floor_1>`
* :doc:`FloorMod <openvino_docs_ops_arithmetic_FloorMod_1>`
* :doc:`Gather <openvino_docs_ops_movement_Gather_8>`
* :doc:`GatherElements <openvino_docs_ops_movement_GatherElements_6>`
* :doc:`GatherND <openvino_docs_ops_movement_GatherND_8>`
* :doc:`GatherTree <openvino_docs_ops_movement_GatherTree_1>`
* :doc:`Gelu <openvino_docs_ops_activation_GELU_7>`
* :doc:`GenerateProposals <openvino_docs_ops_detection_GenerateProposals_9>`
* :doc:`Greater <openvino_docs_ops_comparison_Greater_1>`
* :doc:`GreaterEqual <openvino_docs_ops_comparison_GreaterEqual_1>`
* :doc:`GridSample <openvino_docs_ops_image_GridSample_9>`
* :doc:`GRN <openvino_docs_ops_normalization_GRN_1>`
* :doc:`GroupConvolution <openvino_docs_ops_convolution_GroupConvolution_1>`
* :doc:`GroupConvolutionBackpropData <openvino_docs_ops_convolution_GroupConvolutionBackpropData_1>`
* :doc:`GroupNormalization <openvino_docs_ops_normalization_GroupNormalization_12>`
* :doc:`GRUCell <openvino_docs_ops_sequence_GRUCell_3>`
* :doc:`GRUSequence <openvino_docs_ops_sequence_GRUSequence_5>`
* :doc:`HardSigmoid <openvino_docs_ops_activation_HardSigmoid_1>`
* :doc:`HSigmoid <openvino_docs_ops_activation_HSigmoid_5>`
* :doc:`HSwish <openvino_docs_ops_activation_HSwish_4>`
* :doc:`IDFT <openvino_docs_ops_signals_IDFT_7>`
* :doc:`I420toBGR <openvino_docs_ops_image_I420toBGR_8>`
* :doc:`I420toRGB <openvino_docs_ops_image_I420toRGB_8>`
* :doc:`If <openvino_docs_ops_infrastructure_If_8>`
* :doc:`Interpolate <openvino_docs_ops_image_Interpolate_11>`
* :doc:`Inverse <openvino_docs_ops_matrix_Inverse_14>`
* :doc:`IRDFT <openvino_docs_ops_signals_IRDFT_9>`
* :doc:`IsInf <openvino_docs_ops_comparison_IsInf_10>`
* :doc:`IsNaN <openvino_docs_ops_comparison_IsNaN_10>`
* :doc:`Less <openvino_docs_ops_comparison_Less_1>`
* :doc:`LessEqual <openvino_docs_ops_comparison_LessEqual_1>`
* :doc:`Log <openvino_docs_ops_arithmetic_Log_1>`
* :doc:`LogicalAnd <openvino_docs_ops_logical_LogicalAnd_1>`
* :doc:`LogicalNot <openvino_docs_ops_logical_LogicalNot_1>`
* :doc:`LogicalOr <openvino_docs_ops_logical_LogicalOr_1>`
* :doc:`LogicalXor <openvino_docs_ops_logical_LogicalXor_1>`
* :doc:`LogSoftmax <openvino_docs_ops_activation_LogSoftmax_5>`
* :doc:`Loop <openvino_docs_ops_infrastructure_Loop_5>`
* :doc:`LRN <openvino_docs_ops_normalization_LRN_1>`
* :doc:`LSTMCell <openvino_docs_ops_sequence_LSTMCell_1>`
* :doc:`LSTMSequence <openvino_docs_ops_sequence_LSTMSequence_1>`
* :doc:`MatMul <openvino_docs_ops_matrix_MatMul_1>`
* :doc:`MatrixNMS <openvino_docs_ops_sort_MatrixNms_8>`
* :doc:`MaxPool <openvino_docs_ops_pooling_MaxPool_8>`
* :doc:`Maximum <openvino_docs_ops_arithmetic_Maximum_1>`
* :doc:`Minimum <openvino_docs_ops_arithmetic_Minimum_1>`
* :doc:`Mish <openvino_docs_ops_activation_Mish_4>`
* :doc:`Mod <openvino_docs_ops_arithmetic_Mod_1>`
* :doc:`MVN <openvino_docs_ops_normalization_MVN_6>`
* :doc:`MulticlassNMS <openvino_docs_ops_sort_MulticlassNonMaxSuppression_9>`
* :doc:`Multinomial <openvino_docs_ops_generation_Multinomial_13>`
* :doc:`Multiply <openvino_docs_ops_arithmetic_Multiply_1>`
* :doc:`Negative <openvino_docs_ops_arithmetic_Negative_1>`
* :doc:`NMSRotated <openvino_docs_ops_sort_NMSRotated_13>`
* :doc:`NonMaxSuppression <openvino_docs_ops_sort_NonMaxSuppression_9>`
* :doc:`NonZero <openvino_docs_ops_condition_NonZero_3>`
* :doc:`NormalizeL2 <openvino_docs_ops_normalization_NormalizeL2_1>`
* :doc:`NotEqual <openvino_docs_ops_comparison_NotEqual_1>`
* :doc:`NV12toBGR <openvino_docs_ops_image_NV12toBGR_8>`
* :doc:`NV12toRGB <openvino_docs_ops_image_NV12toRGB_8>`
* :doc:`OneHot <openvino_docs_ops_sequence_OneHot_1>`
* :doc:`Pad <openvino_docs_ops_movement_Pad_12>`
* :doc:`Parameter <openvino_docs_ops_infrastructure_Parameter_1>`
* :doc:`Power <openvino_docs_ops_arithmetic_Power_1>`
* :doc:`PReLU <openvino_docs_ops_activation_PReLU_1>`
* :doc:`PriorBoxClustered <openvino_docs_ops_detection_PriorBoxClustered_1>`
* :doc:`PriorBox <openvino_docs_ops_detection_PriorBox_8>`
* :doc:`Proposal <openvino_docs_ops_detection_Proposal_4>`
* :doc:`PSROIPooling <openvino_docs_ops_detection_PSROIPooling_1>`
* :doc:`RandomUniform <openvino_docs_ops_generation_RandomUniform_8>`
* :doc:`Range <openvino_docs_ops_generation_Range_4>`
* :doc:`RDFT <openvino_docs_ops_signals_RDFT_9>`
* :doc:`ReLU <openvino_docs_ops_activation_ReLU_1>`
* :doc:`ReadValue <openvino_docs_ops_infrastructure_ReadValue_3>`
* :doc:`ReduceL1 <openvino_docs_ops_reduction_ReduceL1_4>`
* :doc:`ReduceL2 <openvino_docs_ops_reduction_ReduceL2_4>`
* :doc:`ReduceLogicalAnd <openvino_docs_ops_reduction_ReduceLogicalAnd_1>`
* :doc:`ReduceLogicalOr <openvino_docs_ops_reduction_ReduceLogicalOr_1>`
* :doc:`ReduceMax <openvino_docs_ops_reduction_ReduceMax_1>`
* :doc:`ReduceMean <openvino_docs_ops_reduction_ReduceMean_1>`
* :doc:`ReduceMin <openvino_docs_ops_reduction_ReduceMin_1>`
* :doc:`ReduceProd <openvino_docs_ops_reduction_ReduceProd_1>`
* :doc:`ReduceSum <openvino_docs_ops_reduction_ReduceSum_1>`
* :doc:`RegionYolo <openvino_docs_ops_detection_RegionYolo_1>`
* :doc:`ReorgYolo <openvino_docs_ops_detection_ReorgYolo_1>`
* :doc:`Reshape <openvino_docs_ops_shape_Reshape_1>`
* :doc:`Result <openvino_docs_ops_infrastructure_Result_1>`
* :doc:`ReverseSequence <openvino_docs_ops_movement_ReverseSequence_1>`
* :doc:`RNNCell <openvino_docs_ops_sequence_RNNCell_3>`
* :doc:`RNNSequence <openvino_docs_ops_sequence_RNNSequence_5>`
* :doc:`ROIAlign <openvino_docs_ops_detection_ROIAlign_9>`
* :doc:`ROIPooling <openvino_docs_ops_detection_ROIPooling_1>`
* :doc:`Roll <openvino_docs_ops_movement_Roll_7>`
* :doc:`Round <openvino_docs_ops_arithmetic_Round_5>`
* :doc:`ScaledDotProductAttention <openvino_docs_ops_sequence_ScaledDotProductAttention_13>`
* :doc:`ScatterElementsUpdate <openvino_docs_ops_movement_ScatterElementsUpdate_12>`
* :doc:`ScatterNDUpdate <openvino_docs_ops_movement_ScatterNDUpdate_3>`
* :doc:`ScatterUpdate <openvino_docs_ops_movement_ScatterUpdate_3>`
* :doc:`Select <openvino_docs_ops_condition_Select_1>`
* :doc:`Selu <openvino_docs_ops_activation_Selu_1>`
* :doc:`ShapeOf <openvino_docs_ops_shape_ShapeOf_3>`
* :doc:`ShuffleChannels <openvino_docs_ops_movement_ShuffleChannels_1>`
* :doc:`Sigmoid <openvino_docs_ops_activation_Sigmoid_1>`
* :doc:`Sign <openvino_docs_ops_arithmetic_Sign_1>`
* :doc:`Sin <openvino_docs_ops_arithmetic_Sin_1>`
* :doc:`Sinh <openvino_docs_ops_arithmetic_Sinh_1>`
* :doc:`Slice <openvino_docs_ops_movement_Slice_8>`
* :doc:`SoftMax <openvino_docs_ops_activation_SoftMax_8>`
* :doc:`SoftPlus <openvino_docs_ops_activation_SoftPlus_4>`
* :doc:`SoftSign <openvino_docs_ops_activation_SoftSign_9>`
* :doc:`SpaceToBatch <openvino_docs_ops_movement_SpaceToBatch_2>`
* :doc:`SpaceToDepth <openvino_docs_ops_movement_SpaceToDepth_1>`
* :doc:`Split <openvino_docs_ops_movement_Split_1>`
* :doc:`Sqrt <openvino_docs_ops_arithmetic_Sqrt_1>`
* :doc:`SquaredDifference <openvino_docs_ops_arithmetic_SquaredDifference_1>`
* :doc:`Squeeze <openvino_docs_ops_shape_Squeeze_1>`
* :doc:`StridedSlice <openvino_docs_ops_movement_StridedSlice_1>`
* :doc:`Subtract <openvino_docs_ops_arithmetic_Subtract_1>`
* :doc:`Swish <openvino_docs_ops_activation_Swish_4>`
* :doc:`Tan <openvino_docs_ops_arithmetic_Tan_1>`
* :doc:`Tanh <openvino_docs_ops_arithmetic_Tanh_1>`
* :doc:`TensorIterator <openvino_docs_ops_infrastructure_TensorIterator_1>`
* :doc:`Tile <openvino_docs_ops_movement_Tile_1>`
* :doc:`TopK <openvino_docs_ops_sort_TopK_11>`
* :doc:`Transpose <openvino_docs_ops_movement_Transpose_1>`
* :doc:`Unique <openvino_docs_ops_movement_Unique_10>`
* :doc:`Unsqueeze <openvino_docs_ops_shape_Unsqueeze_1>`
* :doc:`VariadicSplit <openvino_docs_ops_movement_VariadicSplit_1>`

View File

@ -105,6 +105,7 @@ Operation Specifications
Interpolate-1 <openvino_docs_ops_image_Interpolate_1>
Interpolate-4 <openvino_docs_ops_image_Interpolate_4>
Interpolate-11 <openvino_docs_ops_image_Interpolate_11>
Inverse-14 <openvino_docs_ops_matrix_Inverse_14>
IsFinite-10 <openvino_docs_ops_comparison_IsFinite_10>
IsInf-10 <openvino_docs_ops_comparison_IsInf_10>
IsNaN-10 <openvino_docs_ops_comparison_IsNaN_10>

View File

@ -0,0 +1,135 @@
.. {#openvino_docs_ops_matrix_Inverse_14}
Inverse
=======
.. meta::
:description: Learn about Inverse-14 - a matrix operation that computes the inverse or adjoint for one matrix or a batch of input matrice.
**Versioned name**: *Inverse-14*
**Category**: *Matrix*
**Short description**: *Inverse* operation computes either the inverse or adjoint (conjugate transposes) of one or a batch of square invertible matrices.
**Detailed description**: *Inverse* operation computes the inverse of a square matrix. The operation uses LU decomposition with partial pivoting to compute the inverses. (`LU decomposotion with partial pivoting algorithm <https://arxiv.org/abs/2304.03068>`__)
The inverse matrix A^(-1) of a square matrix A is defined as:
.. math::
A \cdot A^{-1} = A^{-1} \cdot A = I
where **I** is the n-dimensional identity matrix.
The inverse matrix exists if and only if the input matrix is invertible. In that case, the inverse is unique. If the matrix is not invertible however, the operation may raise an exception or return an undefined result.
This operation can be used to compute the adjugate matrix instead of the inverse.
The adjugate matrix adj(A) of a square matrix A is defined as:
.. math::
adj(A) = det(A) \cdot A^{-1}
where **A^{-1}** is the matrix inverse of A, and **det(A)** is the determinant of A.
The adjugate matrix exists if and only if the inverse matrix exists.
**Attribute**:
* *adjoint*
* **Description**: Modifies the return value of the operation. If true, the operation returns the adjoint (conjugate transpose) of the input matrices instead of finding the inverse.
* **Range of values**: `true`, `false`
* ``true`` - output adjugate matrix.
* ``false`` - output inverse matrix.
* **Type**: `bool`
* **Default value**: `false`
* **Required**: *No*
**Input**:
* **1**: `input` - A tensor of shape [B1, B2, ..., Bn, ROW, COL] and type `T` representing the input square matrices. **The inner-most 2 dimensions form square matrices and must be of the same size.** B1, B2, ..., Bn represent any amount of batch dimensions (can be 0 for a single matrix input). **Required.**
**Output**:
* **1**: `output` - A tensor with the same type `T` as the input and same shape [B1, B2, ..., Bn, ROW, COL] as the input, representing the inverse matrices (or adjugate matrices) of the input matrices.
**Types**
* **T**: any supported floating-point type.
*Example 1: 2D input matrix.*
.. code-block:: xml
:force:
<layer ... name="Inverse" type="Inverse">
<data/>
<input>
<port id="0" precision="FP32">
<dim>3</dim> <!-- 3 rows of square matrix -->
<dim>3</dim> <!-- 3 columns of square matrix -->
</port>
</input>
<output>
<port id="1" precision="FP32" names="Inverse:0">
<dim>3</dim> <!-- 3 rows of square matrix -->
<dim>3</dim> <!-- 3 columns of square matrix -->
</port>
</output>
</layer>
*Example 2: 3D input tensor with one batch dimension and adjoint=true.*
.. code-block:: xml
:force:
<layer ... name="Inverse" type="Inverse">
<data adjoint="true"/>
<input>
<port id="0" precision="FP32">
<dim>2</dim> <!-- batch size of 2 -->
<dim>4</dim> <!-- 4 rows of square matrix -->
<dim>4</dim> <!-- 4 columns of square matrix -->
</port>
</input>
<output>
<port id="1" precision="FP32" names="Inverse:0">
<dim>2</dim> <!-- batch size of 2 -->
<dim>4</dim> <!-- 4 rows of square matrix -->
<dim>4</dim> <!-- 4 columns of square matrix -->
</port>
</output>
</layer>
*Example 3: 5D input tensor with three batch dimensions.*
.. code-block:: xml
:force:
<layer ... name="Inverse" type="Inverse">
<data/>
<input>
<port id="0" precision="FP32">
<dim>5</dim> <!-- batch size of 5 -->
<dim>4</dim> <!-- batch size of 4 -->
<dim>3</dim> <!-- batch size of 3 -->
<dim>2</dim> <!-- 2 rows of square matrix -->
<dim>2</dim> <!-- 2 columns of square matrix -->
</port>
</input>
<output>
<port id="1" precision="FP32" names="Inverse:0">
<dim>5</dim> <!-- batch size of 5 -->
<dim>4</dim> <!-- batch size of 4 -->
<dim>3</dim> <!-- batch size of 3 -->
<dim>2</dim> <!-- 2 rows of square matrix -->
<dim>2</dim> <!-- 2 columns of square matrix -->
</port>
</output>
</layer>