SequenceInsert - 11#


  • name: SequenceInsert (GitHub)

  • domain: main

  • since_version: 11

  • function: False

  • support_level: SupportType.COMMON

  • shape inference: True

This version of the operator has been available since version 11.


Outputs a tensor sequence that inserts ‘tensor’ into ‘input_sequence’ at ‘position’. ‘tensor’ must have the same data type as ‘input_sequence’. Accepted range for ‘position’ is in [-n, n], where n is the number of tensors in ‘input_sequence’. Negative value means counting positions from the back. ‘position’ is optional, by default it inserts ‘tensor’ to the back of ‘input_sequence’.


Between 2 and 3 inputs.

  • input_sequence (heterogeneous) - S: Input sequence.

  • tensor (heterogeneous) - T: Input tensor to be inserted into the input sequence.

  • position (optional, heterogeneous) - I: Position in the sequence where the new tensor is inserted. It is optional and default is to insert to the back of the sequence. Negative value means counting positions from the back. Accepted range in [-n, n], where n is the number of tensors in ‘input_sequence’. It is an error if any of the index values are out of bounds. It must be a scalar(tensor of empty shape).


  • output_sequence (heterogeneous) - S: Output sequence that contains the inserted tensor at given position.

Type Constraints

  • T in ( tensor(bool), tensor(complex128), tensor(complex64), tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(string), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8) ): Constrain to any tensor type.

  • S in ( seq(tensor(bool)), seq(tensor(complex128)), seq(tensor(complex64)), seq(tensor(double)), seq(tensor(float)), seq(tensor(float16)), seq(tensor(int16)), seq(tensor(int32)), seq(tensor(int64)), seq(tensor(int8)), seq(tensor(string)), seq(tensor(uint16)), seq(tensor(uint32)), seq(tensor(uint64)), seq(tensor(uint8)) ): Constrain to any tensor type.

  • I in ( tensor(int32), tensor(int64) ): Constrain position to integral tensor. It must be a scalar(tensor of empty shape).



test_cases = {
    'at_back': [np.array([10, 11, 12]).astype(np.int64)],
    'at_front': [np.array([-2, -1, 0]), np.array([0]).astype(np.int64)]
sequence = [np.array([1, 2, 3, 4]).astype(np.int64), np.array([5, 6, 7]).astype(np.int64), np.array([8, 9]).astype(np.int64)]

for test_name, test_inputs in test_cases.items():
    tensor = test_inputs[0].astype(np.int64)

    if len(test_inputs) > 1:
        node = onnx.helper.make_node(
            inputs=['sequence', 'tensor', 'position'],
        position = test_inputs[1]
        inserted = sequence_insert_reference_implementation(sequence, tensor, position)
        expect(node, inputs=[sequence, tensor, position], outputs=[inserted],
               name='test_sequence_insert_' + test_name)
        node = onnx.helper.make_node(
            inputs=['sequence', 'tensor'],
        inserted = sequence_insert_reference_implementation(sequence, tensor)
        expect(node, inputs=[sequence, tensor], outputs=[inserted],
               name='test_sequence_insert_' + test_name)