Source code for naginterfaces.library.sort

# -*- coding: utf-8 -*-
r"""
Module Summary
--------------
Interfaces for the NAG Mark 30.2 `sort` Chapter.

``sort`` - Sorting and Searching

This module is concerned with sorting and searching numeric or character data.
It handles only the simplest types of data structure and it is concerned only with **internal** sorting and searching -- that is, sorting and searching a set of data which can all be stored within the program.

If you have large files of data or complicated data structures to be sorted or searched you should use a comprehensive sorting or searching program or package.

Functionality Index
-------------------

**Ranking**

  arbitrary data: :meth:`arbitrary_rank`

  columns of a matrix

    integer numbers: :meth:`intmat_rank_columns`

    real numbers: :meth:`realmat_rank_columns`

  rows of a matrix

    integer numbers: :meth:`intmat_rank_rows`

    real numbers: :meth:`realmat_rank_rows`

  vector

    character data: :meth:`charvec_rank`

    integer numbers: :meth:`intvec_rank`

    real numbers: :meth:`realvec_rank`

**Rearranging (according to pre-determined ranks)**

  vector

    character data: :meth:`charvec_rank_rearrange`

    complex numbers: :meth:`cmplxvec_rank_rearrange`

    integer numbers: :meth:`intvec_rank_rearrange`

    real numbers: :meth:`realvec_rank_rearrange`

**Searching (i.e., exact match or the nearest lower value)**

  binary search

    vector

      integer numbers: :meth:`intvec_search`

      real numbers: :meth:`realvec_search`

      strings: :meth:`charvec_search`

  direct search

    vector

      real numbers: :meth:`realvec_vec_search`

**Service functions**

  check validity of a permutation: :meth:`permute_check`

  decompose a permutation into cycles: :meth:`permute_decompose`

  invert a permutation (ranks to indices or vice versa): :meth:`permute_invert`

**Sorting (i.e., rearranging into sorted order)**

  quick sort

    vector

      character data: :meth:`charvec_sort`

      integer numbers: :meth:`intvec_sort`

      real numbers: :meth:`realvec_sort`

For full information please refer to the NAG Library document

https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01intro.html
"""

# NAG Copyright 2017-2024.

[docs]def realvec_sort(rv, m1, order): r""" ``realvec_sort`` rearranges a vector of `float` numbers into ascending or descending order. .. _m01ca-py2-py-doc: For full information please refer to the NAG Library document for m01ca https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01caf.html .. _m01ca-py2-py-parameters: **Parameters** **rv** : float, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{rv}` must contain `float` values to be sorted. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first element of :math:`\mathrm{rv}` to be sorted. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the values will be sorted into ascending (i.e., nondecreasing) order. If :math:`\mathrm{order} = \texttt{'D'}`, into descending order. **Returns** **rv** : float, ndarray, shape :math:`\left(\textit{m2}\right)` These values are rearranged into sorted order. .. _m01ca-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _m01ca-py2-py-notes: **Notes** `In the NAG Library the traditional C interface for this routine uses a different algorithmic base. Please contact NAG if you have any questions about compatibility.` ``realvec_sort`` is based on Singleton's implementation of the 'median-of-three' Quicksort algorithm (see Singleton (1969)), but with two additional modifications. First, small subfiles are sorted by an insertion sort on a separate final pass (see Sedgewick (1978)). Second, if a subfile is partitioned into two very unbalanced subfiles, the larger of them is flagged for special treatment: before it is partitioned, its end points are swapped with two random points within it; this makes the worst case behaviour extremely unlikely. .. _m01ca-py2-py-references: **References** Sedgewick, R, 1978, `Implementing Quicksort programs`, Comm. ACM (21), 847--857 Singleton, R C, 1969, `An efficient algorithm for sorting with minimal storage: Algorithm 347`, Comm. ACM (12), 185--187 """ raise NotImplementedError
[docs]def intvec_sort(iv, m1, order): r""" ``intvec_sort`` rearranges a vector of integer numbers into ascending or descending order. .. _m01cb-py2-py-doc: For full information please refer to the NAG Library document for m01cb https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01cbf.html .. _m01cb-py2-py-parameters: **Parameters** **iv** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{iv}` must contain integer values to be sorted. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first element of :math:`\mathrm{iv}` to be sorted. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the values will be sorted into ascending (i.e., nondecreasing) order. If :math:`\mathrm{order} = \texttt{'D'}`, into descending order. **Returns** **iv** : int, ndarray, shape :math:`\left(\textit{m2}\right)` These values are rearranged into sorted order. .. _m01cb-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _m01cb-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``intvec_sort`` is based on Singleton's implementation of the 'median-of-three' Quicksort algorithm (see Singleton (1969)), but with two additional modifications. First, small subfiles are sorted by an insertion sort on a separate final pass (see Sedgewick (1978)) Second, if a subfile is partitioned into two very unbalanced subfiles, the larger of them is flagged for special treatment: before it is partitioned, its end points are swapped with two random points within it; this makes the worst case behaviour extremely unlikely. .. _m01cb-py2-py-references: **References** Sedgewick, R, 1978, `Implementing Quicksort programs`, Comm. ACM (21), 847--857 Singleton, R C, 1969, `An efficient algorithm for sorting with minimal storage: Algorithm 347`, Comm. ACM (12), 185--187 """ raise NotImplementedError
[docs]def charvec_sort(ch, m1, l1, l2, order): r""" ``charvec_sort`` rearranges a vector of character data so that a specified substring is in ASCII or reverse ASCII order. .. _m01cc-py2-py-doc: For full information please refer to the NAG Library document for m01cc https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01ccf.html .. _m01cc-py2-py-parameters: **Parameters** **ch** : str, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{ch}` must contain character data to be sorted. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first element of :math:`\mathrm{ch}` to be sorted. **l1** : int Only the substring (:math:`\mathrm{l1}`::math:`\mathrm{l2}`) of each element of :math:`\mathrm{ch}` is to be used in determining the sorted order. **l2** : int Only the substring (:math:`\mathrm{l1}`::math:`\mathrm{l2}`) of each element of :math:`\mathrm{ch}` is to be used in determining the sorted order. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the values will be sorted into ASCII order. If :math:`\mathrm{order} = \texttt{'R'}`, into reverse ASCII order. **Returns** **ch** : str, ndarray, shape :math:`\left(\textit{m2}\right)` These values are rearranged into sorted order. .. _m01cc-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{l2} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{len}\left(\mathrm{ch}[0]\right) = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{l2}\leq \mathrm{len}\left(\mathrm{ch}[0]\right)`. (`errno` :math:`1`) On entry, :math:`\mathrm{l1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{l2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{l1}\leq \mathrm{l2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{l1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{l1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{l2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{l2}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`3`) On entry, :math:`\mathrm{len}\left(\mathrm{ch}[0]\right) = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{len}\left(\mathrm{ch}[0]\right)\leq 255`. .. _m01cc-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``charvec_sort`` is based on Singleton's implementation of the 'median-of-three' Quicksort algorithm (see Singleton (1969)), but with two additional modifications. First, small subfiles are sorted by an insertion sort on a separate final pass (see Sedgewick (1978)) Second, if a subfile is partitioned into two very unbalanced subfiles, the larger of them is flagged for special treatment: before it is partitioned, its end points are swapped with two random points within it; this makes the worst case behaviour extremely unlikely. Only the substring (:math:`\mathrm{l1}`::math:`\mathrm{l2}`) of each element of the array :math:`\mathrm{ch}` is used to determine the sorted order, but the entire elements are rearranged into sorted order. .. _m01cc-py2-py-references: **References** Sedgewick, R, 1978, `Implementing Quicksort programs`, Comm. ACM (21), 847--857 Singleton, R C, 1969, `An efficient algorithm for sorting with minimal storage: Algorithm 347`, Comm. ACM (12), 185--187 """ raise NotImplementedError
[docs]def realvec_rank(rv, m1, order): r""" ``realvec_rank`` ranks a vector of `float` numbers in ascending or descending order. .. _m01da-py2-py-doc: For full information please refer to the NAG Library document for m01da https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01daf.html .. _m01da-py2-py-parameters: **Parameters** **rv** : float, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{rv}` must contain `float` values to be ranked. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first element of :math:`\mathrm{rv}` to be ranked. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the values will be ranked in ascending (i.e., nondecreasing) order. If :math:`\mathrm{order} = \texttt{'D'}`, into descending order. **Returns** **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` contain the ranks of the corresponding elements of :math:`\mathrm{rv}`. Note that the ranks are in the range :math:`\mathrm{m1}` to :math:`\textit{m2}`: thus, if :math:`\mathrm{rv}[i-1]` is the first element in the rank order, :math:`\mathrm{irank}[i-1]` is set to :math:`\mathrm{m1}`. .. _m01da-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _m01da-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``realvec_rank`` uses a variant of list-merging, as described on pages 165--166 in Knuth (1973). The function takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least :math:`10`. The ranking is stable: equal elements preserve their ordering in the input data. .. _m01da-py2-py-references: **References** Knuth, D E, 1973, `The Art of Computer Programming (Volume 3)`, (2nd Edition), Addison--Wesley """ raise NotImplementedError
[docs]def intvec_rank(iv, m1, order): r""" ``intvec_rank`` ranks a vector of integer numbers in ascending or descending order. .. _m01db-py2-py-doc: For full information please refer to the NAG Library document for m01db https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01dbf.html .. _m01db-py2-py-parameters: **Parameters** **iv** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{iv}` must contain integer values to be ranked. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first element of :math:`\mathrm{iv}` to be ranked. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the values will be ranked in ascending (i.e., nondecreasing) order. If :math:`\mathrm{order} = \texttt{'D'}`, into descending order. **Returns** **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` contain the ranks of the corresponding elements of :math:`\mathrm{iv}`. Note that the ranks are in the range :math:`\mathrm{m1}` to :math:`\textit{m2}`: thus, if :math:`\mathrm{iv}[i-1]` is the first element in the rank order, :math:`\mathrm{irank}[i-1]` is set to :math:`\mathrm{m1}`. .. _m01db-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _m01db-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``intvec_rank`` uses a variant of list-merging, as described on pages 165--166 in Knuth (1973). The function takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least :math:`10`. The ranking is stable: equal elements preserve their ordering in the input data. .. _m01db-py2-py-references: **References** Knuth, D E, 1973, `The Art of Computer Programming (Volume 3)`, (2nd Edition), Addison--Wesley """ raise NotImplementedError
[docs]def charvec_rank(ch, m1, l1, l2, order): r""" ``charvec_rank`` ranks a vector of character data in ASCII or reverse ASCII order of a specified substring. .. _m01dc-py2-py-doc: For full information please refer to the NAG Library document for m01dc https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01dcf.html .. _m01dc-py2-py-parameters: **Parameters** **ch** : str, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{ch}` must contain character data to be ranked. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first element of :math:`\mathrm{ch}` to be ranked. **l1** : int Only the substring (:math:`\mathrm{l1}`::math:`\mathrm{l2}`) of each element of :math:`\mathrm{ch}` is to be used in determining the rank order. **l2** : int Only the substring (:math:`\mathrm{l1}`::math:`\mathrm{l2}`) of each element of :math:`\mathrm{ch}` is to be used in determining the rank order. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the values will be ranked in ASCII order. If :math:`\mathrm{order} = \texttt{'R'}`, in reverse ASCII order. **Returns** **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` contain the ranks of the corresponding elements of :math:`\mathrm{ch}`. Note that the ranks are in the range :math:`\mathrm{m1}` to :math:`\textit{m2}`: thus, if :math:`\mathrm{ch}[i-1]` is the first element in the rank order, :math:`\mathrm{irank}[i-1]` is set to :math:`\mathrm{m1}`. .. _m01dc-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{l2} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{len}\left(\mathrm{ch}[0]\right) = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{l2}\leq \mathrm{len}\left(\mathrm{ch}[0]\right)`. (`errno` :math:`1`) On entry, :math:`\mathrm{l1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{l2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{l1}\leq \mathrm{l2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{l1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{l1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{l2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{l2}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`3`) On entry, :math:`\mathrm{len}\left(\mathrm{ch}[0]\right) = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{len}\left(\mathrm{ch}[0]\right)\leq 255`. .. _m01dc-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``charvec_rank`` uses a variant of list-merging, as described on pages 165--166 in Knuth (1973). The function takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least :math:`10`. The ranking is stable: equal elements preserve their ordering in the input data. Only the substring (:math:`\mathrm{l1}`::math:`\mathrm{l2}`) of each element of the array :math:`\mathrm{ch}` is used to determine the rank order. .. _m01dc-py2-py-references: **References** Knuth, D E, 1973, `The Art of Computer Programming (Volume 3)`, (2nd Edition), Addison--Wesley """ raise NotImplementedError
[docs]def realmat_rank_rows(rm, m1, n1, order): r""" ``realmat_rank_rows`` ranks the rows of a matrix of `float` numbers in ascending or descending order. .. _m01de-py2-py-doc: For full information please refer to the NAG Library document for m01de https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01def.html .. _m01de-py2-py-parameters: **Parameters** **rm** : float, array-like, shape :math:`\left(\textit{m2}, \textit{n2}\right)` Columns :math:`\mathrm{n1}` to :math:`\textit{n2}` of rows :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{rm}` must contain `float` data to be ranked. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first row of :math:`\mathrm{rm}` to be ranked. **n1** : int The index of the first column of :math:`\mathrm{rm}` to be used. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the rows will be ranked in ascending (i.e., nondecreasing) order. If :math:`\mathrm{order} = \texttt{'D'}`, into descending order. **Returns** **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` contain the ranks of the corresponding rows of :math:`\mathrm{rm}`. Note that the ranks are in the range :math:`\mathrm{m1}` to :math:`\textit{m2}`: thus, if the :math:`i`\ th row of :math:`\mathrm{rm}` is the first in the rank order, :math:`\mathrm{irank}[i-1]` is set to :math:`\mathrm{m1}`. .. _m01de-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{ldm} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\leq \textit{ldm}`. (`errno` :math:`1`) On entry, :math:`\mathrm{n1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{n2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n1}\leq \textit{n2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{n1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{n2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{n2}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constratint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _m01de-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``realmat_rank_rows`` ranks rows :math:`\mathrm{m1}` to :math:`\textit{m2}` of a matrix, using the data in columns :math:`\mathrm{n1}` to :math:`\textit{n2}` of those rows. The ordering is determined by first ranking the data in column :math:`\mathrm{n1}`, then ranking any tied rows according to the data in column :math:`\mathrm{n1}+1`, and so on up to column :math:`\textit{n2}`. ``realmat_rank_rows`` uses a variant of list-merging, as described on pages 165--166 in Knuth (1973). The function takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least :math:`10`. The ranking is stable: equal rows preserve their ordering in the input data. .. _m01de-py2-py-references: **References** Knuth, D E, 1973, `The Art of Computer Programming (Volume 3)`, (2nd Edition), Addison--Wesley """ raise NotImplementedError
[docs]def intmat_rank_rows(im, m1, n1, order): r""" ``intmat_rank_rows`` ranks the rows of a matrix of integer numbers in ascending or descending order. .. _m01df-py2-py-doc: For full information please refer to the NAG Library document for m01df https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01dff.html .. _m01df-py2-py-parameters: **Parameters** **im** : int, array-like, shape :math:`\left(\textit{m2}, \textit{n2}\right)` Columns :math:`\mathrm{n1}` to :math:`\textit{n2}` of rows :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{im}` must contain `int` data to be ranked. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first row of :math:`\mathrm{im}` to be ranked. **n1** : int The index of the first column of :math:`\mathrm{im}` to be used. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the rows will be ranked in ascending (i.e., nondecreasing) order. If :math:`\mathrm{order} = \texttt{'D'}`, into descending order. **Returns** **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` contain the ranks of the corresponding rows of :math:`\mathrm{im}`. Note that the ranks are in the range :math:`\mathrm{m1}` to :math:`\textit{m2}`: thus, if the :math:`i`\ th row of :math:`\mathrm{im}` is the first in the rank order, :math:`\mathrm{irank}[i-1]` is set to :math:`\mathrm{m1}`. .. _m01df-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{ldm} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\leq \textit{ldm}`. (`errno` :math:`1`) On entry, :math:`\mathrm{n1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{n2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n1}\leq \textit{n2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{n1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{n2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{n2}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _m01df-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``intmat_rank_rows`` ranks rows :math:`\mathrm{m1}` to :math:`\textit{m2}` of a matrix, using the data in columns :math:`\mathrm{n1}` to :math:`\textit{n2}` of those rows. The ordering is determined by first ranking the data in column :math:`\mathrm{n1}`, then ranking any tied rows according to the data in column :math:`\mathrm{n1}+1`, and so on up to column :math:`\textit{n2}`. ``intmat_rank_rows`` uses a variant of list-merging, as described on pages 165--166 in Knuth (1973). The function takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least :math:`10`. The ranking is stable: equal rows preserve their ordering in the input data. .. _m01df-py2-py-references: **References** Knuth, D E, 1973, `The Art of Computer Programming (Volume 3)`, (2nd Edition), Addison--Wesley """ raise NotImplementedError
[docs]def realmat_rank_columns(rm, m1, n1, order): r""" ``realmat_rank_columns`` ranks the columns of a matrix of `float` numbers in ascending or descending order. .. _m01dj-py2-py-doc: For full information please refer to the NAG Library document for m01dj https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01djf.html .. _m01dj-py2-py-parameters: **Parameters** **rm** : float, array-like, shape :math:`\left(\textit{m2}, \textit{n2}\right)` Rows :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of columns :math:`\mathrm{n1}` to :math:`\textit{n2}` of :math:`\mathrm{rm}` must contain `float` data to be ranked. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first row of :math:`\mathrm{rm}` to be used. **n1** : int The index of the first column of :math:`\mathrm{rm}` to be ranked. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the columns will be ranked in ascending (i.e., nondecreasing) order. If :math:`\mathrm{order} = \texttt{'D'}`, into descending order. **Returns** **irank** : int, ndarray, shape :math:`\left(\textit{n2}\right)` Elements :math:`\mathrm{n1}` to :math:`\textit{n2}` of :math:`\mathrm{irank}` contain the ranks of the corresponding columns of :math:`\mathrm{rm}`. Note that the ranks are in the range :math:`\mathrm{n1}` to :math:`\textit{n2}`: thus, if the :math:`i`\ th column of :math:`\mathrm{rm}` is the first in the rank order, :math:`\mathrm{irank}[i-1]` is set to :math:`\mathrm{n1}`. .. _m01dj-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{ldm} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\leq \textit{ldm}`. (`errno` :math:`1`) On entry, :math:`\mathrm{n1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{n2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n1}\leq \textit{n2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{n1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{n2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{n2}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _m01dj-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``realmat_rank_columns`` ranks columns :math:`\mathrm{n1}` to :math:`\textit{n2}` of a matrix, using the data in rows :math:`\mathrm{m1}` to :math:`\textit{m2}` of those columns. The ordering is determined by first ranking the data in row :math:`\mathrm{m1}`, then ranking any tied columns according to the data in row :math:`\mathrm{m1}+1`, and so on up to row :math:`\textit{m2}`. ``realmat_rank_columns`` uses a variant of list-merging, as described on pages 165--166 in Knuth (1973). The function takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least :math:`10`. The ranking is stable: equal columns preserve their ordering in the input data. .. _m01dj-py2-py-references: **References** Knuth, D E, 1973, `The Art of Computer Programming (Volume 3)`, (2nd Edition), Addison--Wesley """ raise NotImplementedError
[docs]def intmat_rank_columns(im, m1, n1, order): r""" ``intmat_rank_columns`` ranks the columns of a matrix of integer numbers in ascending or descending order. .. _m01dk-py2-py-doc: For full information please refer to the NAG Library document for m01dk https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01dkf.html .. _m01dk-py2-py-parameters: **Parameters** **im** : int, array-like, shape :math:`\left(\textit{m2}, \textit{n2}\right)` Rows :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of columns :math:`\mathrm{n1}` to :math:`\textit{n2}` of :math:`\mathrm{im}` must contain integer data to be ranked. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The index of the first row of :math:`\mathrm{im}` to be used. **n1** : int The index of the first column of :math:`\mathrm{im}` to be ranked. **order** : str, length 1 If :math:`\mathrm{order} = \texttt{'A'}`, the columns will be ranked in ascending (i.e., nondecreasing) order. If :math:`\mathrm{order} = \texttt{'D'}`, into descending order. **Returns** **irank** : int, ndarray, shape :math:`\left(\textit{n2}\right)` Elements :math:`\mathrm{n1}` to :math:`\textit{n2}` of :math:`\mathrm{irank}` contain the ranks of the corresponding columns of :math:`\mathrm{im}`. Note that the ranks are in the range :math:`\mathrm{n1}` to :math:`\textit{n2}`: thus, if the :math:`i`\ th column of :math:`\mathrm{im}` is the first in the rank order, :math:`\mathrm{irank}[i-1]` is set to :math:`\mathrm{n1}`. .. _m01dk-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{ldm} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\leq \textit{ldm}`. (`errno` :math:`1`) On entry, :math:`\mathrm{n1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{n2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n1}\leq \textit{n2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{n1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{n1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{n2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{n2}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{order}` has an illegal value: :math:`\mathrm{order} = \langle\mathit{\boldsymbol{value}}\rangle`. .. _m01dk-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``intmat_rank_columns`` ranks columns :math:`\mathrm{n1}` to :math:`\textit{n2}` of a matrix, using the data in rows :math:`\mathrm{m1}` to :math:`\textit{m2}` of those columns. The ordering is determined by first ranking the data in row :math:`\mathrm{m1}`, then ranking any tied columns according to the data in row :math:`\mathrm{m1}+1`, and so on up to row :math:`\textit{m2}`. ``intmat_rank_columns`` uses a variant of list-merging, as described on pages 165--166 in Knuth (1973). The function takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least :math:`10`. The ranking is stable: equal columns preserve their ordering in the input data. .. _m01dk-py2-py-references: **References** Knuth, D E, 1973, `The Art of Computer Programming (Volume 3)`, (2nd Edition), Addison--Wesley """ raise NotImplementedError
[docs]def arbitrary_rank(compar, m1, m2, data=None): r""" ``arbitrary_rank`` ranks arbitrary data according to a user-supplied comparison function. .. _m01dz-py2-py-doc: For full information please refer to the NAG Library document for m01dz https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01dzf.html .. _m01dz-py2-py-parameters: **Parameters** **compar** : callable retval = compar(i, j, data=None) :math:`\mathrm{compar}` must specify the relative ordering of any two data items; it must return :math:`\mathbf{True}` if item :math:`\mathrm{i}` must come strictly **after** item :math:`\mathrm{j}` in the rank ordering. **Parameters** **i** : int :math:`\mathrm{i}` and :math:`\mathrm{j}` identify the data items to be compared. **j** : int :math:`\mathrm{i}` and :math:`\mathrm{j}` identify the data items to be compared. **data** : arbitrary, optional, modifiable in place User-communication data for callback functions. **Returns** **retval** : bool Must be :math:`\mathbf{True}` if item :math:`\mathrm{i}` must come strictly **after** item :math:`\mathrm{j}` in the rank ordering. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. :math:`\mathrm{m1}` must specify the lower bound of the range of data items to be ranked, and the range of ranks to be assigned. Specifically, ``arbitrary_rank`` ranks the data items identified by integers in the range :math:`\mathrm{m1}` to :math:`\mathrm{m2}`, and assigns ranks in the range :math:`\mathrm{m1}` to :math:`\mathrm{m2}` which are stored in elements :math:`\mathrm{m1}-1` to :math:`\mathrm{m2}-1` of :math:`\mathrm{irank}`. **m2** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. :math:`\mathrm{m2}` must specify the upper bound of the range of data items to be ranked, and the range of ranks to be assigned. Specifically, ``arbitrary_rank`` ranks the data items identified by integers in the range :math:`\mathrm{m1}` to :math:`\mathrm{m2}`, and assigns ranks in the range :math:`\mathrm{m1}` to :math:`\mathrm{m2}` which are stored in elements :math:`\mathrm{m1}-1` to :math:`\mathrm{m2}-1` of :math:`\mathrm{irank}`. **data** : arbitrary, optional User-communication data for callback functions. **Returns** **irank** : int, ndarray, shape :math:`\left(\mathrm{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\mathrm{m2}-1` of :math:`\mathrm{irank}` contain the ranks of the data items :math:`\mathrm{m1}` to :math:`\mathrm{m2}`. Note that the ranks are in the range :math:`\mathrm{m1}` to :math:`\mathrm{m2}`: thus, if item :math:`i` is first in the rank ordering, :math:`\mathrm{irank}[i-1]` contains :math:`\mathrm{m1}`. .. _m01dz-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\mathrm{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \mathrm{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\mathrm{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m2}\geq 1`. .. _m01dz-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``arbitrary_rank`` is a general purpose function for ranking arbitrary data. ``arbitrary_rank`` does not access the data directly; instead it calls :math:`\mathrm{compar}` to determine the relative ordering of any two data items. The data items are identified simply by an integer in the range :math:`\mathrm{m1}` to :math:`\mathrm{m2}`. ``arbitrary_rank`` uses a variant of list-merging, as described on pages 165--166 in Knuth (1973). The function takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least :math:`10`. .. _m01dz-py2-py-references: **References** Knuth, D E, 1973, `The Art of Computer Programming (Volume 3)`, (2nd Edition), Addison--Wesley """ raise NotImplementedError
[docs]def realvec_rank_rearrange(rv, m1, irank): r""" ``realvec_rank_rearrange`` rearranges a vector of real numbers into the order specified by a vector of ranks. .. _m01ea-py2-py-doc: For full information please refer to the NAG Library document for m01ea https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01eaf.html .. _m01ea-py2-py-parameters: **Parameters** **rv** : float, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{rv}` must contain real values to be rearranged. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. :math:`\mathrm{m1}` and :math:`\textit{m2}` must specify the range of the ranks supplied in :math:`\mathrm{irank}` and the elements of :math:`\mathrm{rv}` to be rearranged. **irank** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` must contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`, which are interpreted as a vector of ranks. **Returns** **rv** : float, ndarray, shape :math:`\left(\textit{m2}\right)` These values are rearranged into rank order. For example, if :math:`\mathrm{irank}[i-1] = \mathrm{m1}`, then the initial value of :math:`\mathrm{rv}[i-1]` is moved to :math:`\mathrm{rv}[\mathrm{m1}-1]`. **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Used as internal workspace prior to being restored and hence is unchanged. .. _m01ea-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) :math:`\mathrm{irank}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{irank}[I-1]` contains an out-of-range value: :math:`I = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\mathrm{irank}[I-1] = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`3`) :math:`\mathrm{irank}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{irank}` contains a repeated value: :math:`\langle\mathit{\boldsymbol{value}}\rangle`. .. _m01ea-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``realvec_rank_rearrange`` is designed to be used typically in conjunction with the ranking functions :meth:`realvec_rank`, :meth:`intvec_rank`, :meth:`charvec_rank`, :meth:`realmat_rank_rows`, :meth:`intmat_rank_rows`, :meth:`realmat_rank_columns`, :meth:`intmat_rank_columns` and :meth:`arbitrary_rank`. After one of those functions has been called to determine a vector of ranks, ``realvec_rank_rearrange`` can be called to rearrange a vector of real numbers into the rank order. If the vector of ranks has been generated in some other way, then :meth:`permute_check` should be called to check its validity before ``realvec_rank_rearrange`` is called. """ raise NotImplementedError
[docs]def intvec_rank_rearrange(iv, m1, irank): r""" ``intvec_rank_rearrange`` rearranges a vector of integer numbers into the order specified by a vector of ranks. .. _m01eb-py2-py-doc: For full information please refer to the NAG Library document for m01eb https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01ebf.html .. _m01eb-py2-py-parameters: **Parameters** **iv** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{iv}` must contain integer values to be rearranged. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. :math:`\mathrm{m1}` and :math:`\textit{m2}` specify the range of the ranks supplied in :math:`\mathrm{irank}` and the elements of :math:`\mathrm{iv}` to be rearranged. **irank** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` must contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`, which are interpreted as a vector of ranks. **Returns** **iv** : int, ndarray, shape :math:`\left(\textit{m2}\right)` These values are rearranged into rank order. For example, if :math:`\mathrm{irank}[i-1] = \mathrm{m1}`, then the initial value of :math:`\mathrm{iv}[i-1]` is moved to :math:`\mathrm{iv}[\mathrm{m1}-1]`. **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Used as internal workspace prior to being restored and hence is unchanged. .. _m01eb-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) :math:`\mathrm{irank}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{irank}[I-1]` contains an out-of-range value: :math:`I = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\mathrm{irank}[I-1] = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`3`) :math:`\mathrm{irank}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{irank}` contains a repeated value: :math:`\langle\mathit{\boldsymbol{value}}\rangle`. .. _m01eb-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``intvec_rank_rearrange`` is designed to be used typically in conjunction with the ranking functions :meth:`realvec_rank`, :meth:`intvec_rank`, :meth:`charvec_rank`, :meth:`realmat_rank_rows`, :meth:`intmat_rank_rows`, :meth:`realmat_rank_columns`, :meth:`intmat_rank_columns` and :meth:`arbitrary_rank`. After one of those functions has been called to determine a vector of ranks, ``intvec_rank_rearrange`` can be called to rearrange a vector of integer numbers into the rank order. If the vector of ranks has been generated in some other way, then :meth:`permute_check` should be called to check its validity before ``intvec_rank_rearrange`` is called. """ raise NotImplementedError
[docs]def charvec_rank_rearrange(ch, m1, irank): r""" ``charvec_rank_rearrange`` rearranges a vector of character data into the order specified by a vector of ranks. .. _m01ec-py2-py-doc: For full information please refer to the NAG Library document for m01ec https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01ecf.html .. _m01ec-py2-py-parameters: **Parameters** **ch** : str, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{ch}` must contain character data to be rearranged. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The range of the ranks supplied in :math:`\mathrm{irank}` and the elements of :math:`\mathrm{ch}` to be rearranged. **irank** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` must contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`, which are interpreted as a vector of ranks. **Returns** **ch** : str, ndarray, shape :math:`\left(\textit{m2}\right)` These values are rearranged into rank order. For example, if :math:`\mathrm{irank}[i-1] = \mathrm{m1}`, then the initial value of :math:`\mathrm{ch}[i-1]` is moved to :math:`\mathrm{ch}[\mathrm{m1}-1]`. **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Used as internal workspace prior to being restored and hence is unchanged. .. _m01ec-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) On entry, :math:`\mathrm{len}\left(\mathrm{ch}[0]\right) = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{len}\left(\mathrm{ch}[0]\right)\leq 255`. (`errno` :math:`3`) :math:`\mathrm{irank}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{irank}[I-1]` contains an out-of-range value: :math:`I = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\mathrm{irank}[I-1] = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`4`) :math:`\mathrm{irank}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{irank}` contains a repeated value: :math:`\langle\mathit{\boldsymbol{value}}\rangle`. .. _m01ec-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``charvec_rank_rearrange`` is designed to be used typically in conjunction with the ranking functions :meth:`realvec_rank`, :meth:`intvec_rank`, :meth:`charvec_rank`, :meth:`realmat_rank_rows`, :meth:`intmat_rank_rows`, :meth:`realmat_rank_columns`, :meth:`intmat_rank_columns` and :meth:`arbitrary_rank`. After one of those functions has been called to determine a vector of ranks, ``charvec_rank_rearrange`` can be called to rearrange a vector of character data into the rank order. If the vector of ranks has been generated in some other way, then :meth:`permute_check` should be called to check its validity before ``charvec_rank_rearrange`` is called. """ raise NotImplementedError
[docs]def cmplxvec_rank_rearrange(cv, m1, irank): r""" ``cmplxvec_rank_rearrange`` rearranges a vector of complex numbers into the order specified by a vector of ranks. .. _m01ed-py2-py-doc: For full information please refer to the NAG Library document for m01ed https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01edf.html .. _m01ed-py2-py-parameters: **Parameters** **cv** : complex, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{cv}` must contain complex values to be rearranged. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. :math:`\mathrm{m1}` and :math:`\textit{m2}` must specify the range of the ranks supplied in :math:`\mathrm{irank}` and the elements of :math:`\mathrm{cv}` to be rearranged. **irank** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{irank}` must contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`, which are interpreted as a vector of ranks. **Returns** **cv** : complex, ndarray, shape :math:`\left(\textit{m2}\right)` These values are rearranged into rank order. For example, if :math:`\mathrm{irank}[i-1] = \mathrm{m1}`, then the initial value of :math:`\mathrm{cv}[i-1]` is moved to :math:`\mathrm{cv}[\mathrm{m1}-1]`. **irank** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Used as internal workspace prior to being restored and hence is unchanged. .. _m01ed-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) :math:`\mathrm{irank}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{irank}[I-1]` contains an out-of-range value: :math:`I = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\mathrm{irank}[I-1] = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`3`) :math:`\mathrm{irank}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{irank}` contains a repeated value: :math:`\langle\mathit{\boldsymbol{value}}\rangle`. .. _m01ed-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``cmplxvec_rank_rearrange`` is designed to be used typically in conjunction with the ranking functions :meth:`realvec_rank`, :meth:`intvec_rank`, :meth:`charvec_rank`, :meth:`realmat_rank_rows`, :meth:`intmat_rank_rows`, :meth:`realmat_rank_columns`, :meth:`intmat_rank_columns` and :meth:`arbitrary_rank`. After one of those functions has been called to determine a vector of ranks, ``cmplxvec_rank_rearrange`` can be called to rearrange a vector of complex numbers into the rank order. If the vector of ranks has been generated in some other way, then :meth:`permute_check` should be called to check its validity before ``cmplxvec_rank_rearrange`` is called. """ raise NotImplementedError
[docs]def permute_invert(iperm, m1): r""" ``permute_invert`` inverts a permutation, and hence converts a rank vector to an index vector, or vice versa. .. _m01za-py2-py-doc: For full information please refer to the NAG Library document for m01za https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01zaf.html .. _m01za-py2-py-parameters: **Parameters** **iperm** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{iperm}` must contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. :math:`\mathrm{m1}` and :math:`\textit{m2}` must specify the range of elements used in the array :math:`\mathrm{iperm}` and the range of values in the permutation, as specified under :math:`\mathrm{iperm}`. **Returns** **iperm** : int, ndarray, shape :math:`\left(\textit{m2}\right)` These elements contain the inverse permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. .. _m01za-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) :math:`\mathrm{iperm}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{iperm}[I-1]` contains an out-of-range value: :math:`I = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\mathrm{iperm}[I-1] = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`3`) :math:`\mathrm{iperm}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{iperm}` contains a repeated value: :math:`\langle\mathit{\boldsymbol{value}}\rangle`. .. _m01za-py2-py-notes: **Notes** `In the NAG Library the traditional C interface for this routine uses a different algorithmic base. Please contact NAG if you have any questions about compatibility.` There are two common ways of describing a permutation using an integer vector :math:`\mathrm{iperm}`. The first uses ranks: :math:`\mathrm{iperm}[i-1]` holds the position to which the :math:`i`\ th data element should be moved in order to sort the data; in other words its rank in the sorted order. The second uses indices: :math:`\mathrm{iperm}[i-1]` holds the current position of the data element which would occur in :math:`i`\ th position in sorted order. For example, given the values .. math:: 3.5\quad \text{ }\quad 5.9\quad \text{ }\quad 2.9\quad \text{ }\quad 0.5 to be sorted in ascending order, the ranks would be .. math:: 3\quad \text{ }\quad 4\quad \text{ }\quad 2\quad \text{ }\quad 1 .. math:: 2\quad \text{ }\quad 3\quad \text{ }\quad 1\quad \text{ }\quad 0 and the indices would be .. math:: 4\quad \text{ }\quad 3\quad \text{ }\quad 1\quad \text{ }\quad 2 .. math:: 3\quad \text{ }\quad 2\quad \text{ }\quad 0\quad \text{ }\quad 1 The functions :meth:`realvec_rank`, :meth:`intvec_rank`, :meth:`charvec_rank`, :meth:`realmat_rank_rows`, :meth:`intmat_rank_rows`, :meth:`realmat_rank_columns`, :meth:`intmat_rank_columns` and :meth:`arbitrary_rank` generate ranks, and the functions :meth:`realvec_rank_rearrange`, :meth:`intvec_rank_rearrange`, :meth:`charvec_rank_rearrange` and :meth:`cmplxvec_rank_rearrange` require ranks to be supplied to specify the reordering. However if it is desired simply to refer to the data in sorted order without actually reordering them, indices are more convenient than ranks. ``permute_invert`` can be used to convert ranks to indices, or indices to ranks, as the two permutations are inverses of each another. """ raise NotImplementedError
[docs]def permute_check(iperm, m1): r""" ``permute_check`` checks the validity of a permutation. .. _m01zb-py2-py-doc: For full information please refer to the NAG Library document for m01zb https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01zbf.html .. _m01zb-py2-py-parameters: **Parameters** **iperm** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{iperm}` must be set to values which are supposed to be a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. If they are a valid permutation, the function exits with no exception or warning is raised. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. The range of elements used in the array :math:`\mathrm{iperm}` and the range of values in the permutation, as specified under :math:`\mathrm{iperm}`. **Returns** **iperm** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Used as internal workpsace prior to being restored and hence is unchanged. .. _m01zb-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) :math:`\mathrm{iperm}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{iperm}[I-1]` contains an out-of-range value: :math:`I = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\mathrm{iperm}[I-1] = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`3`) :math:`\mathrm{iperm}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{iperm}` contains a repeated value: :math:`\langle\mathit{\boldsymbol{value}}\rangle`. .. _m01zb-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``permute_check`` can be used to check the validity of user-supplied ranks or indices, without the ranks or indices being corrupted. """ raise NotImplementedError
[docs]def permute_decompose(iperm, m1): r""" ``permute_decompose`` decomposes a permutation into cycles, as an aid to reordering ranked data. .. _m01zc-py2-py-doc: For full information please refer to the NAG Library document for m01zc https://support.nag.com/numeric/nl/nagdoc_30.2/flhtml/m01/m01zcf.html .. _m01zc-py2-py-parameters: **Parameters** **iperm** : int, array-like, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{iperm}` must contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. **m1** : int Note: this argument represents an array index; the value you supply must be base-1 for compatibility with the NAG Engine. :math:`\mathrm{m1}` and :math:`\textit{m2}` must specify the range of elements used in the array :math:`\mathrm{iperm}` and the range of values in the permutation, as specified under :math:`\mathrm{iperm}`. **Returns** **iperm** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Is used as internal workpsace prior to being restored and hence is unchanged. **icycl** : int, ndarray, shape :math:`\left(\textit{m2}\right)` Elements :math:`\mathrm{m1}-1` to :math:`\textit{m2}-1` of :math:`\mathrm{icycl}` contain a representation of the permutation as a list of cycles, with the first integer in each cycle negated. (See :ref:`Notes <m01zc-py2-py-notes>`.) .. _m01zc-py2-py-errors: **Raises** **NagValueError** (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle` and :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\leq \textit{m2}`. (`errno` :math:`1`) On entry, :math:`\mathrm{m1} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\mathrm{m1}\geq 1`. (`errno` :math:`1`) On entry, :math:`\textit{m2} = \langle\mathit{\boldsymbol{value}}\rangle`. Constraint: :math:`\textit{m2}\geq 1`. (`errno` :math:`2`) :math:`\mathrm{iperm}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{iperm}[I-1]` contains an out-of-range value: :math:`I = \langle\mathit{\boldsymbol{value}}\rangle`, :math:`\mathrm{iperm}[I-1] = \langle\mathit{\boldsymbol{value}}\rangle`. (`errno` :math:`3`) :math:`\mathrm{iperm}[\mathrm{m1}:\textit{m2}-1]` does not contain a permutation of the integers :math:`\mathrm{m1}` to :math:`\textit{m2}`. :math:`\mathrm{iperm}` contains a repeated value: :math:`\langle\mathit{\boldsymbol{value}}\rangle`. .. _m01zc-py2-py-notes: **Notes** `No equivalent traditional C interface for this routine exists in the NAG Library.` ``permute_decompose`` is provided as an aid to reordering arbitrary data structures without using additional storage. However, you should consider carefully whether it is necessary to rearrange yourr data, or whether it would be simpler and more efficient to refer to the data in sorted order using an index vector, or to create a copy of the data in sorted order. To rearrange data into a different order without using additional storage, the simplest method is to decompose the permutation which specifies the new order into cycles and then to do a cyclic permutation of the data items in each cycle. (This is the method used by the reordering functions :meth:`realvec_rank_rearrange`, :meth:`intvec_rank_rearrange`, :meth:`charvec_rank_rearrange` and :meth:`cmplxvec_rank_rearrange`.) Given a vector IRANK which specifies the ranks of the data (as generated by the functions :meth:`realvec_rank`, :meth:`intvec_rank`, :meth:`charvec_rank`, :meth:`realmat_rank_rows`, :meth:`intmat_rank_rows`, :meth:`realmat_rank_columns`, :meth:`intmat_rank_columns` and :meth:`arbitrary_rank`), ``permute_decompose`` generates a new vector :math:`\mathrm{icycl}`, in which the permutation is represented in its component cycles, with the first element of each cycle negated. For example, the permutation .. math:: \begin{array}{ccc} \begin{array}{cc}5&7\end{array} & \begin{array}{cccc}4&2&1&6\end{array} & \begin{array}{c}3\end{array} \end{array} is composed of the cycles .. math:: \begin{array}{ccc} \begin{pmatrix}1&5\end{pmatrix} & \begin{pmatrix}2&7&3&4\end{pmatrix} & \begin{pmatrix}6\end{pmatrix} \end{array} and the vector :math:`\mathrm{icycl}` generated by ``permute_decompose`` contains .. math:: \begin{array}{ccccccc}-1&5&-2&7&3&4&-6\end{array} In order to rearrange the data according to the specified ranks: item :math:`6` must be left in place; items :math:`1` and :math:`5` must be interchanged; items :math:`4`, :math:`2`, :math:`7` and :math:`3` must be moved right one place round the cycle. The complete rearrangement can be achieved by the following logic: loop for :math:`k = \mathrm{m1}` to :math:`\textit{m2}` set :math:`i = \mathrm{icycl}[k-1]` if :math:`i < 0` then set :math:`j = -i` else swap items :math:`i` and :math:`j` """ raise NotImplementedError