U
    ZÊ¹j   ã                   @   sz  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZ dd	d
ddddddddddgZedƒZesŠG dd„ dƒZnejZedddgid�ZesºG dd	„ d	ƒZdZnejZejZdd
„ Zdd„ Zdd„ Zd d„ Zd!d„ Zd"d„ Zd#d„ Zd$d„ Zd%d„ Zd&d'„ Zd(d)„ Z d*d+„ Z!d,d„ Z"d-d.„ Z#d/d0„ Z$d1d2„ Z%d3d4„ Z&d5d6„ Z'd7d„ Z(d8d9„ Z)d:d;„ Z*d<d=„ Z+dS )>z<Utilities to deal with sympy.Matrix, numpy and scipy.sparse.é    )ÚExpr)ÚI)ÚS©Ú
MatrixBase)ÚeyeÚzeros)Úimport_moduleÚnumpy_ndarrayÚscipy_sparse_matrixÚsympy_to_numpyÚsympy_to_scipy_sparseÚnumpy_to_sympyÚscipy_sparse_to_sympyÚflatten_scalarÚmatrix_daggerÚto_sympyÚto_numpyÚto_scipy_sparseÚmatrix_tensor_productÚmatrix_zerosÚnumpyc                   @   s   e Zd ZdS )r
   N©Ú__name__Ú
__module__Ú__qualname__© r   r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/physics/quantum/matrixutils.pyr
      s   ÚscipyÚfromlistÚsparse)Zimport_kwargsc                   @   s   e Zd ZdS )r   Nr   r   r   r   r   r   &   s   Nc                 K   sf   t st‚| dd¡}t| tƒr0t j|  ¡ |d�S t| tƒrV| jsN| j	sN| t
krVt| ƒS td|  ƒ‚dS ©zBConvert a SymPy Matrix/complex number to a numpy matrix or scalar.ÚdtypeÚcomplex©r"   z.Expected MatrixBase or complex scalar, got: %rN)ÚnpÚImportErrorÚgetÚ
isinstancer   ÚarrayÚtolistr   Ú	is_NumberÚis_NumberSymbolr   r#   Ú	TypeError©ÚmÚoptionsr"   r   r   r   r   .   s    

c                 K   sp   t rtst‚| dd¡}t| tƒr:t t j|  ¡ |d�¡S t| t	ƒr`| j
sX| jsX| tkr`t| ƒS td|  ƒ‚dS r!   )r%   r    r&   r'   r(   r   Ú
csr_matrixr)   r*   r   r+   r,   r   r#   r-   r.   r   r   r   r   ;   s    

c                 K   s   t |  ¡ ƒS )z0Convert a scipy.sparse matrix to a SymPy matrix.)r   Útodense©r/   r0   r   r   r   r   H   s    c                 K   s   t | ƒS )z)Convert a numpy matrix to a SymPy matrix.r   r3   r   r   r   r   M   s    c                 K   sP   t | tƒr| S t | tƒr t| ƒS t | tƒr2t| ƒS t | tƒr@| S td|  ƒ‚dS )z6Convert a numpy/scipy.sparse matrix to a SymPy matrix.ú1Expected sympy/numpy/scipy.sparse matrix, got: %rN)r(   r   r
   r   r   r   r   r-   r3   r   r   r   r   R   s    



c                 K   sV   |  dd¡}t| ttfƒr&t| |d�S t| tƒr4| S t| tƒrF|  ¡ S td|  ƒ‚dS )z6Convert a sympy/scipy.sparse matrix to a numpy matrix.r"   r#   r$   r4   N)	r'   r(   r   r   r   r
   r   r2   r-   r.   r   r   r   r   _   s    

c                 K   s`   |  dd¡}t| ttfƒr&t| |d�S t| tƒrBts8t‚t | ¡S t| t	ƒrP| S t
d|  ƒ‚dS )z6Convert a sympy/numpy matrix to a scipy.sparse matrix.r"   r#   r$   r4   N)r'   r(   r   r   r   r
   r    r&   r1   r   r-   r.   r   r   r   r   k   s    


c                 C   sD   t | tƒr| jdkr| d } t | ttfƒr@| jdkr@t| d ƒ} | S )zCFlatten a 1x1 matrix to a scalar, return larger matrices unchanged.)é   r5   r   )r   r   )r(   r   Úshaper
   r   r#   ©Úer   r   r   r   y   s    


c                 C   s:   t | tƒr| jS t | ttfƒr*|  ¡  ¡ S td|  ƒ‚dS )z7Return the dagger of a sympy/numpy/scipy.sparse matrix.r4   N)r(   r   ÚHr
   r   Ú	conjugateZ	transposer-   r7   r   r   r   r   „   s
    
c                  G   s   ddl m} || Ž S )zCCompute the kronecker product of a sequence of SymPy Matrices.
    r   )Úmatrix_kronecker_product)Z$sympy.matrices.expressions.kroneckerr;   )Zmatricesr;   r   r   r   Ú_sympy_tensor_productŽ   s    r<   c                  G   s2   t st‚| d }| dd… D ]}t  ||¡}q|S )z6numpy version of tensor product of multiple arguments.r   r5   N)r%   r&   Úkron©ÚproductZanswerÚitemr   r   r   Ú_numpy_tensor_product–   s    rA   c                  G   s8   t st‚| d }| dd… D ]}t  ||¡}qt  |¡S )z=scipy.sparse version of tensor product of multiple arguments.r   r5   N)r    r&   r=   r1   r>   r   r   r   Ú_scipy_sparse_tensor_product    s    rB   c                  G   sF   t | d tƒrt| Ž S t | d tƒr,t| Ž S t | d tƒrBt| Ž S dS )zGCompute the matrix tensor product of sympy/numpy/scipy.sparse matrices.r   N)r(   r   r<   r
   rA   r   rB   )r?   r   r   r   r   ¬   s    c                 C   s   t st‚t  t j| dd�¡S )znumpy version of complex eye.r#   r$   )r%   r&   r)   r   ©Únr   r   r   Ú
_numpy_eye¶   s    rE   c                 C   s   t st‚t j| | dd�S )z$scipy.sparse version of complex eye.r#   r$   )r    r&   r   rC   r   r   r   Ú_scipy_sparse_eye½   s    rF   c                 K   sL   |  dd¡}|dkrt| ƒS |dkr,t| ƒS |dkr<t| ƒS td| ƒ‚dS )z=Get the version of eye and tensor_product for a given format.ÚformatÚsympyr   úscipy.sparsezInvalid format: %rN)r'   r   rE   rF   ÚNotImplementedError)rD   r0   rG   r   r   r   Ú
matrix_eyeÄ   s    rK   c                 K   s&   |  dd¡}tst‚tj| |f|d�S )znumpy version of zeros.r"   Úfloat64r$   )r'   r%   r&   r   )r/   rD   r0   r"   r   r   r   Ú_numpy_zerosÐ   s    rM   c                 K   sX   |  dd¡}|  dd¡}ts t‚|dkr:tj| |f|d�S |dkrTtj| |f|d�S dS )zscipy.sparse version of zeros.ÚspmatrixZcsrr"   rL   Zlilr$   N)r'   r    r&   Z
lil_matrixr1   )r/   rD   r0   rN   r"   r   r   r   Ú_scipy_sparse_zerosØ   s    rO   c                 K   sZ   |  dd¡}|dkrt| |ƒS |dkr4t| |f|ŽS |dkrJt| |f|ŽS td| ƒ‚dS )z'"Get a zeros matrix for a given format.rG   rH   r   rI   zInvaild format: %rN)r'   r   rM   rO   rJ   )r/   rD   r0   rG   r   r   r   r   ä   s    
c                 C   s*   t st‚t  | ¡}t  | |¡r"dS | S dS )z/Convert a numpy zero matrix to the zero scalar.ç        N)r%   r&   Ú
zeros_likeÚallclose)r8   Útestr   r   r   Ú_numpy_matrix_to_zeroð   s    
rT   c                 C   s2   t st‚|  ¡ }t  |¡}t  ||¡r*dS | S dS )z6Convert a scipy.sparse zero matrix to the zero scalar.rP   N)r%   r&   r2   rQ   rR   )r8   ZedenserS   r   r   r   Ú_scipy_sparse_matrix_to_zeroû   s    
rU   c                 C   sJ   t | tƒr t| jŽ | krFtj} n&t | tƒr4t| ƒ} nt | tƒrFt	| ƒ} | S )z)Convert a zero matrix to the scalar zero.)
r(   r   r   r6   r   ZZeror
   rT   r   rU   r7   r   r   r   Úmatrix_to_zero  s    



rV   ),Ú__doc__Zsympy.core.exprr   Zsympy.core.numbersr   Zsympy.core.singletonr   Zsympy.matrices.matrixbaser   Zsympy.matricesr   r   Zsympy.externalr	   Ú__all__r%   r
   Zndarrayr   r   r    rN   r   r   r   r   r   r   r   r   r   r<   rA   rB   r   rE   rF   rK   rM   rO   r   rT   rU   rV   r   r   r   r   Ú<module>   sh   ó


