B
    [u(                 @   s  d Z ddlmZmZ ddlmZmZmZ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sG dd deZnejZedddgidZesG dd deZdZn,ejZeedrejjZneedrej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= Z0dS )>z<Utilities to deal with sympy.Matrix, numpy and scipy.sparse.    )print_functiondivision)
MatrixBaseIExprInteger)range)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   @lib/python3.7/site-packages/sympy/physics/quantum/matrixutils.pyr      s   scipyfromlistsparse)Z__import__kwargsc               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r   &   s   Nbasec             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   matrixtolistr   	is_Numberis_NumberSymbolr   r$   	TypeError)moptionsr#   r   r   r   r   4   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 )zBConvert a sympy Matrix/complex number to a numpy matrix or scalar.r#   r$   )r#   z.Expected MatrixBase or complex scalar, got: %rN)r%   r!   r&   r'   r(   r   
csr_matrixr)   r*   r   r+   r,   r   r$   r-   )r.   r/   r#   r   r   r   r   A   s    

c             K   s   t |  S )z0Convert a scipy.sparse matrix to a sympy matrix.)r   todense)r.   r/   r   r   r   r   N   s    c             K   s   t | S )z)Convert a numpy matrix to a sympy matrix.)r   )r.   r/   r   r   r   r   S   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.z1Expected sympy/numpy/scipy.sparse matrix, got: %rN)r(   r   r   r   r   r   r   r-   )r.   r/   r   r   r   r   X   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#   z1Expected sympy/numpy/scipy.sparse matrix, got: %rN)	r'   r(   r   r   r   r   r   r1   r-   )r.   r/   r#   r   r   r   r   e   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#   z1Expected sympy/numpy/scipy.sparse matrix, got: %rN)r'   r(   r   r   r   r   r!   r&   r0   r   r-   )r.   r/   r#   r   r   r   r   q   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.)   r2   r   )r   r   )r(   r   shaper   r   r$   )er   r   r   r      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.z1Expected sympy/numpy/scipy.sparse matrix, got: %rN)r(   r   Hr   r   	conjugateZ	transposer-   )r4   r   r   r   r      s
    
c        	   	   G   s   t dd | D s"tdt|  | d }xt| dd D ]}|j}|j}xlt|D ]`}||||   }x2t|d D ]"}||||| | d   }qxW |dkr|}qV||}qVW |}q<W |S )a~  Compute the tensor product of a sequence of sympy Matrices.

    This is the standard Kronecker product of matrices [1].

    Parameters
    ==========

    matrices : tuple of MatrixBase instances
        The matrices to take the tensor product of.

    Returns
    =======

    matrix : MatrixBase
        The tensor product matrix.

    Examples
    ========

    >>> from sympy import I, Matrix, symbols
    >>> from sympy.physics.quantum.matrixutils import _sympy_tensor_product

    >>> m1 = Matrix([[1,2],[3,4]])
    >>> m2 = Matrix([[1,0],[0,1]])
    >>> _sympy_tensor_product(m1, m2)
    Matrix([
    [1, 0, 2, 0],
    [0, 1, 0, 2],
    [3, 0, 4, 0],
    [0, 3, 0, 4]])
    >>> _sympy_tensor_product(m2, m1)
    Matrix([
    [1, 2, 0, 0],
    [3, 4, 0, 0],
    [0, 0, 1, 2],
    [0, 0, 3, 4]])

    References
    ==========

    [1] http://en.wikipedia.org/wiki/Kronecker_product
    c             s   s   | ]}t |tV  qd S )N)r(   r   ).0r.   r   r   r   	<genexpr>   s    z(_sympy_tensor_product.<locals>.<genexpr>z&Sequence of Matrices expected, got: %sNr2   r   )	allr-   reprreversedrowscolsr   Zrow_joinZcol_join)	ZmatricesZmatrix_expansionZmatr=   r>   istartjnextr   r   r   _sympy_tensor_product   s"    ,rC   c              G   s6   t st| d }x | dd D ]}t ||}qW |S )z6numpy version of tensor product of multiple arguments.r   r2   N)r%   r&   kron)productansweritemr   r   r   _numpy_tensor_product   s    rH   c              G   s<   t st| d }x | dd D ]}t ||}qW t |S )z=scipy.sparse version of tensor product of multiple arguments.r   r2   N)r!   r&   rD   r0   )rE   rF   rG   r   r   r   _scipy_sparse_tensor_product   s    rI   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   rC   r   rH   r   rI   )rE   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    rK   c             C   s   t stt j| | ddS )z$scipy.sparse version of complex eye.r$   )r#   )r!   r&   r	   )rJ   r   r   r   _scipy_sparse_eye  s    rL   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   zscipy.sparsezInvalid format: %rN)r'   r	   rK   rL   NotImplementedError)rJ   r/   rM   r   r   r   
matrix_eye  s    rP   c             K   s&   | dd}tsttj| |f|dS )znumpy version of zeros.r#   float64)r#   )r'   r%   r&   r
   )r.   rJ   r/   r#   r   r   r   _numpy_zeros  s    rR   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.spmatrixcsrr#   rQ   Zlil)r#   N)r'   r!   r&   Z
lil_matrixr0   )r.   rJ   r/   rS   r#   r   r   r   _scipy_sparse_zeros   s    rU   c             K   sr   | dd}| dd}| dd}|dkr6t| |S |dkrLt| |f|S |dkrbt| |f|S td	| d
S )z'"Get a zeros matrix for a given format.rM   rN   r#   rQ   rS   rT   r   zscipy.sparsezInvaild format: %rN)r'   r
   rR   rU   rO   )r.   rJ   r/   rM   r#   rS   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.g        N)r%   r&   
zeros_likeallclose)r4   testr   r   r   _numpy_matrix_to_zero:  s    
rY   c             C   s2   t st|  }t |}t ||r*dS | S dS )z6Convert a scipy.sparse zero matrix to the zero scalar.g        N)r%   r&   r1   rV   rW   )r4   ZedenserX   r   r   r   _scipy_sparse_matrix_to_zeroE  s    
rZ   c             C   sL   t | tr"t| j | krHtd} n&t | tr6t| } nt | trHt| } | S )z)Convert a zero matrix to the scalar zero.r   )	r(   r   r
   r3   r   r   rY   r   rZ   )r4   r   r   r   matrix_to_zeroQ  s    




r[   )1__doc__Z
__future__r   r   rN   r   r   r   r   Zsympy.core.compatibilityr   Zsympy.matricesr	   r
   Zsympy.externalr   __all__r%   objectr   Zndarrayr   r   r!   hasattrr"   rS   r   r   r   r   r   r   r   r   r   rC   rH   rI   r   rK   rL   rP   rR   rU   r   rY   rZ   r[   r   r   r   r   <module>   sj   



J

