

``mx.nd.SequenceReverse``
==================================================

Description
----------------------

Reverses the elements of each sequence.

This function takes an n-dimensional input array of the form [max_sequence_length, batch_size, other_feature_dims]
and returns an array of the same shape.

Parameter `sequence_length` is used to handle variable-length sequences.
`sequence_length` should be an input array of positive ints of dimension [batch_size].
To use this parameter, set `use_sequence_length` to `True`,
otherwise each example in the batch is assumed to have the max sequence length.


**Example**::

	 
	 x = [[[  1.,   2.,   3.],
	 [  4.,   5.,   6.]],
	 
	 [[  7.,   8.,   9.],
	 [ 10.,  11.,  12.]],
	 
	 [[ 13.,  14.,   15.],
	 [ 16.,  17.,   18.]]]
	 
	 // Batch 1
	 B1 = [[  1.,   2.,   3.],
	 [  7.,   8.,   9.],
	 [ 13.,  14.,  15.]]
	 
	 // Batch 2
	 B2 = [[  4.,   5.,   6.],
	 [ 10.,  11.,  12.],
	 [ 16.,  17.,  18.]]
	 
	 // returns reverse sequence when sequence_length parameter is not used
	 SequenceReverse(x) = [[[ 13.,  14.,   15.],
	 [ 16.,  17.,   18.]],
	 
	 [[  7.,   8.,   9.],
	 [ 10.,  11.,  12.]],
	 
	 [[  1.,   2.,   3.],
	 [  4.,   5.,   6.]]]
	 
	 // sequence_length [2,2] means 2 rows of
	 // both batch B1 and B2 will be reversed.
	 SequenceReverse(x, sequence_length=[2,2], use_sequence_length=True) =
	 [[[  7.,   8.,   9.],
	 [ 10.,  11.,  12.]],
	 
	 [[  1.,   2.,   3.],
	 [  4.,   5.,   6.]],
	 
	 [[ 13.,  14.,   15.],
	 [ 16.,  17.,   18.]]]
	 
	 // sequence_length [2,3] means 2 of batch B2 and 3 of batch B3
	 // will be reversed.
	 SequenceReverse(x, sequence_length=[2,3], use_sequence_length=True) =
	 [[[  7.,   8.,   9.],
	 [ 16.,  17.,  18.]],
	 
	 [[  1.,   2.,   3.],
	 [ 10.,  11.,  12.]],
	 
	 [[ 13.,  14,   15.],
	 [  4.,   5.,   6.]]]
	 
	 
	 


Arguments
------------------

+----------------------------------------+------------------------------------------------------------+
| Argument                               | Description                                                |
+========================================+============================================================+
| ``data``                               | NDArray-or-Symbol                                          |
|                                        | n-dimensional input array of the form                      |
|                                        | [max_sequence_length, batch_size, other dims] where        |
|                                        | n>2                                                        |
+----------------------------------------+------------------------------------------------------------+
| ``sequence.length``                    | NDArray-or-Symbol                                          |
|                                        | vector of sequence lengths of the form [batch_size]        |
+----------------------------------------+------------------------------------------------------------+
| ``use.sequence.length``                | boolean, optional, default=0.                              |
|                                        |                                                            |
|                                        | If set to true, this layer takes in an extra input         |
|                                        | parameter `sequence_length` to specify variable length     |
|                                        | sequence                                                   |
+----------------------------------------+------------------------------------------------------------+
| ``axis``                               | int, optional, default='0'.                                |
|                                        |                                                            |
|                                        | The sequence axis. Only 0 is currently supported.          |
+----------------------------------------+------------------------------------------------------------+

Value
----------

``out`` The result mx.ndarray


Link to Source Code: http://github.com/apache/incubator-mxnet/blob/1.6.0/src/operator/sequence_reverse.cc#L122

