o
    iB                     @   s$   d dl Z dde jde jfddZdS )    Ncrc              
   C   s  t | } |du r| }nt |}t| jt|jks#J | j|jf|jdd | jdd ks9J |j| jft t |dddf d| fd}t| }t t |j	g |jdd |jd | jd R g |dd |d |d R ddddS )	a  
    This function is similar to scipy.linalg.toeplitz, except for that not
    flatten is permormed on `c` and `r`. Instead these dimensions are handled
    as independent dimensions. Furthermore, this function cannot handle complex
    tensors at the moment.

    In the following is the docstring from scipy.linalg.toeplitz:

    Construct a Toeplitz matrix.
    The Toeplitz matrix has constant diagonals, with c as its first column
    and r as its first row.  If r is not given, ``r == conjugate(c)`` is
    assumed.
    Parameters
    ----------
    c : array_like
        First column of the matrix.  Whatever the actual shape of `c`, it
        will be converted to a 1-D array.
    r : array_like
        First row of the matrix. If None, ``r = conjugate(c)`` is assumed;
        in this case, if c[0] is real, the result is a Hermitian matrix.
        r[0] is ignored; the first row of the returned matrix is
        ``[c[0], r[1:]]``.  Whatever the actual shape of `r`, it will be
        converted to a 1-D array.
    Returns
    -------
    A : (len(c), len(r)) ndarray
        The Toeplitz matrix. Dtype is the same as ``(c[0] + r[0]).dtype``.
    See also
    --------
    circulant : circulant matrix
    hankel : Hankel matrix
    Notes
    -----
    The behavior when `c` or `r` is a scalar, or when `c` is complex and
    `r` is None, was changed in version 0.8.0.  The behavior in previous
    versions was undocumented and is no longer supported.

    Examples
    --------
    >>> toeplitz([1,2,3], [1,4,5,6])
    tensor([[1, 4, 5, 6],
            [2, 1, 4, 5],
            [3, 2, 1, 4]])
    >>> c = [1,2,3]
    >>> toeplitz(c)
    tensor([[1, 2, 3],
            [2, 1, 2],
            [3, 2, 1]])
    >>> toeplitz([c, c])
    tensor([[[1, 2, 3],
             [2, 1, 2],
             [3, 2, 1]],
    <BLANKLINE>
            [[1, 2, 3],
             [2, 1, 2],
             [3, 2, 1]]])

    # Check reference implementation

    >>> from scipy.linalg import toeplitz as np_toeplitz
    >>> np_toeplitz([1,2,3], [1,4,5,6])
    array([[1, 4, 5, 6],
           [2, 1, 4, 5],
           [3, 2, 1, 4]])
    >>> np_toeplitz([1.0, 2+3j, 4-1j])
    array([[1.+0.j, 2.-3.j, 4.+1.j],
           [2.+3.j, 1.+0.j, 2.-3.j],
           [4.-1.j, 2.+3.j, 1.+0.j]])
    N.   )r   )sizestride)r   )
torch	as_tensorlenshapecatfliplistr   	transpose
as_strided)r   r   valsr    r   F/home/ubuntu/.local/lib/python3.10/site-packages/ci_sdr/pt/toeplitz.pytoeplitz   s    
F
$,$& r   )N)r	   tensorr   r   r   r   r   <module>   s    