o
    i                     @   s8   d dl Z de jdede jfddZdd Zdd	d
ZdS )    Nxn_rowsreturnc                 C   sF   | j d | d }|  }tj| | j dd ||f ||d f dS )z%return a view of x as a Hankel matrix   N)sizestride)shaper   torch
as_strided)r   r   n_cols	x_strides r   N/home/ubuntu/.local/lib/python3.10/site-packages/fast_bss_eval/torch/linalg.pyhankel_view   s
   "r   c                 C   sH   t j| dddf jdd| fdd}t|| jd d}|jd	d}|S )
z(
    make symmetric toeplitz matrix
    .r   N)r   dimsr   dim)r   )r
   catflipr   r	   )r   two_xHTr   r   r   toeplitz!   s   &r   c           
   	   C   s   | j dd \}}}|du r|d }| | j dd ||||f }t| j d D ]>}t| j d D ]4}tj| d| d d||f | dd|||f fdd}t||jd	d
}	|	|ddd|dd|f< q2q)||j dd || || f }|S )zJ
    Create a block matrix where the blocks have a Toeplitz structure
    N   r   r   .r   r   r   r   )r	   	new_zerosranger
   r   r   r   reshape)
r   ntoprowscolsoutrcvecr   r   r   r   block_toeplitz+   s    8$r+   )N)r
   Tensorintr   r   r+   r   r   r   r   <module>   s   	
