a
    kº”hÐ0  ã                   @   sø  d dl mZ d dlmZmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'm(Z( d d	l)m*Z* d d
l+m,Z, d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 dd„ Z:dd„ Z;dd„ Z<dd„ Z=dd„ Z>dd„ Z?dd„ Z@dd„ ZAd d!„ ZBd"d#„ ZCd$d%„ ZDd&d'„ ZEd(d)„ ZFd*d+„ ZGd,d-„ ZHd.d/„ ZId0d1„ ZJd2d3„ ZKd4d5„ ZLd6d7„ ZMd8d9„ ZNd:d;„ ZOd<d=„ ZPd>d?„ ZQd@dA„ ZRdBdC„ ZSdDS )Eé    )ÚMul)ÚIÚIntegerÚRationalÚpi)ÚWildÚsymbols)Úexp)Úsqrt)ÚMatrixÚImmutableMatrix)ÚXGateÚYGateÚZGateÚrandom_circuitÚCNOTÚIdentityGateÚHÚXÚYÚSÚTÚZÚSwapGateÚ	gate_simpÚ	gate_sortÚCNotGateÚTGateÚHadamardGateÚ	PhaseGateÚUGateÚCGate)Ú
Commutator)ÚAntiCommutator)Ú	represent)Úqapply)ÚQubitÚIntQubitÚqubit_to_matrixÚmatrix_to_qubit)Úmatrix_to_zero)Ú	sqrt2_inv)ÚDaggerc            	      C   s¶   t dƒ} | jdksJ ‚| jdks$J ‚tdƒ}tdƒ}t |ƒ}t |ƒ}t |ƒ}||ksXJ ‚||ksdJ ‚||kspJ ‚t||ƒ}t||ƒ}t||ƒ}||ksšJ ‚||ks¦J ‚||ks²J ‚dS )zTest a basic gate.é   é   Úi0Úi1N)r   Z
min_qubitsÚnqubitsr   r   )	Úhr/   r0   Zh0_w1Zh0_w2Zh1_w1Z
cnot_10_w1Z
cnot_10_w2Z
cnot_01_w1© r3   úS/var/www/auris/lib/python3.9/site-packages/sympy/physics/quantum/tests/test_gate.pyÚ	test_gate   s"    


r5   c            	      C   sî   t dƒ\} }}}t| |g||ggƒ}td|ƒ}t|dd|ksBJ ‚t|tdƒ ƒ| tdƒ |tdƒ  ksnJ ‚t|tdƒ ƒ|tdƒ |tdƒ  ksšJ ‚td|ƒ}t|dd}td	ƒD ]0}|tt|dƒƒ tt|t|dƒ ƒƒks¸J ‚q¸d S )
Núa,b,c,d©r   r-   ©r1   Ú0Ú1©r-   r.   é   )	r   r   r    r$   r%   r&   Úranger(   r'   )	ÚaÚbÚcÚdÚuMatÚu1Úu2Úu2RepÚir3   r3   r4   Ú
test_UGate/   s    
,,
ÿrG   c                  C   s²  t g d¢g d¢g d¢g d¢gƒ} ttdtdƒƒdd| ks>J ‚td	tdƒƒ}t|d
dt g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢gƒks”J ‚tdtdƒƒ}t|tdƒ ƒtt|tdƒ ddƒksÎJ ‚t|tdƒ ƒtt|tdƒ ddƒksúJ ‚tdtdƒƒ}t dddddt fddtdffƒ}t| 	¡ dd|ksDJ ‚tdt
dƒƒ}t dƒ}t|tdƒ ƒtdƒ kszJ ‚tt|tdƒ ddƒtdƒ ks¢J ‚t| 	¡ dd|ks¼J ‚tdtdƒƒ}t|tdƒ ƒttdƒ ksìJ ‚tt|tdƒ ddƒttdƒ ksJ ‚t|ƒ|ks(J ‚t|dƒt|ƒks@J ‚t|ƒ| ¡ ksVJ ‚t|ƒ|kshJ ‚t|ƒ| ¡ ks~J ‚t|ƒt|dƒks–J ‚t|dƒ| ¡ ks®J ‚dS )zTest the general CGate.©r-   r   r   r   ©r   r-   r   r   ©r   r   r   r-   ©r   r   r-   r   r-   r   r.   r8   )r-   r.   é   )r-   r   r   r   r   r   r   r   )r   r-   r   r   r   r   r   r   )r   r   r-   r   r   r   r   r   )r   r   r   r-   r   r   r   r   )r   r   r   r   r-   r   r   r   )r   r   r   r   r   r-   r   r   )r   r   r   r   r   r   r   r-   )r   r   r   r   r   r   r-   r   )rL   r   Z1001r<   Z0000)rH   rI   rK   )r   r   r   éÿÿÿÿÚ11rM   N)r   r$   r!   r   r%   r&   r)   r   r   Ú	decomposer   r   r,   ÚpowZinverse)Z
CNOTMatrixZToffoliGateZCYGateZCYGate_matrixZCZGateZCZGate_matrixZ
CPhaseGater3   r3   r4   Ú
test_cgateA   sb    ÿ
ýÿÿÿÿÿÿ ÿ

ÿ

ÿ
rQ   c                  C   s^  t dƒ\} }}}t| |g||ggƒ}tg d¢g d¢dd| |gdd||ggƒ}td|ƒ}td|ƒ}t|dd|kstJ ‚t|td	ƒ ƒ| td	ƒ |td
ƒ  ks J ‚t|td
ƒ ƒ|td	ƒ |td
ƒ  ksÌJ ‚t|tdƒ ƒtdƒksèJ ‚t|tdƒ ƒtdƒksJ ‚td|ƒ}t|dd}	tdƒD ]4}
|	tt	|
dƒƒ tt|t	|
dƒ ƒƒks$J ‚q$d S )Nr6   rH   rI   r   r7   r-   r.   r8   Ú10rN   Ú01Ú00r;   r<   )
r   r   r    r!   r$   r%   r&   r=   r(   r'   )r>   r?   r@   rA   rB   ZcMatrC   Zcu1rD   rE   rF   r3   r3   r4   Útest_UGate_CGate_combov   s     (

,,
ÿrU   c                  C   sj  t dƒ\} }}}t| |g||ggƒ}t| |d ddg|d |ddgdd| |d gdd|d |ggƒ}tdƒtd|ƒ }t|dd|ksŠJ ‚tdtdƒ dtdƒ gttdƒ t tdƒ ggƒ}ttddƒtd  tddƒtd  gtddƒtd  tddƒtd  ggƒ}tddgdtggƒ}	td|ƒ}
tt	dƒ|
 dd|ksHJ ‚t|
t	dƒ dd|	ksfJ ‚d S )Nzv w f gr-   r   r.   r8   )
r   r   r   r   r    r$   r
   r   r   r   )ÚvÚwÚfÚgZuMat1ZcMat1rC   ZuMat2ZcMat2_1ZcMat2_2rD   r3   r3   r4   Útest_UGate_OneQubitGate_combo‹   s    @6$"ÿ
rZ   c                  C   s8   t dƒtdƒ } t| dd}|tttddgƒks4J ‚dS )z-Test the representation of the hadamard gate.r   rT   r.   r8   N)r   r&   r$   r   r+   ©ÚcircuitZanswerr3   r3   r4   Útest_represent_hadamardš   s    r]   c                  C   s4   t dƒtdƒ } t| dd}tg d¢ƒ|ks0J ‚dS )z&Test the representation of the X gate.r   rT   r.   r8   rI   N)r   r&   r$   r   r[   r3   r3   r4   Útest_represent_xgate¢   s    r^   c                  C   sT   t dƒtdƒ } t| dd}|d dkrL|d tkrL|d dkrL|d dksPJ ‚dS )z&Test the representation of the Y gate.r   rT   r.   r8   r-   rL   N)r   r&   r$   r   r[   r3   r3   r4   Útest_represent_ygate©   s    
ÿ
ÿr_   c                  C   s4   t dƒtdƒ } t| dd}tg d¢ƒ|ks0J ‚dS )z&Test the representation of the Z gate.r   rT   r.   r8   rH   N)r   r&   r$   r   r[   r3   r3   r4   Útest_represent_zgate±   s    r`   c                  C   s8   t dƒtdƒ } t| dd}tdtddgƒ|ks4J ‚dS )z&Test the representation of the S gate.r   rS   r.   r8   N)r   r&   r$   r   r   r[   r3   r3   r4   Útest_represent_phasegate¸   s    ra   c                  C   s@   t dƒtdƒ } tdttt d ƒddgƒt| ddks<J ‚dS )z&Test the representation of the T gate.r   rS   r<   r.   r8   N)r   r&   r   r	   r   r   r$   ©r\   r3   r3   r4   Útest_represent_tgate¿   s    rc   c                  C   s`   t dƒtdƒ tdƒ tdƒ tdƒ } t| dd}tttdƒ ttdƒ ddgƒ|ks\J ‚dS )z$Test a compound gate representation.r   rT   r.   r8   N)	r   r   r   r   r&   r$   r   r   r
   r[   r3   r3   r4   Útest_compound_gatesÅ   s    (rd   c                  C   s¤   t ddƒ} t| ddtg d¢g d¢g d¢g d¢gƒks:J ‚| td	ƒ } tt| d
dƒt| ƒksbJ ‚t ddƒ} t| ƒ| ks|J ‚tt| ƒƒ| ksJ ‚| |  dks J ‚dS )zTest the CNOT gate.r-   r   r.   r8   rH   rI   rJ   rK   Z111rL   N)r   r$   r   r&   r)   r%   r,   rb   r3   r3   r4   Útest_cnot_gateÌ   s    

ÿÿ
re   c                  C   sÌ  t tttttfD ]<} t| dƒ| dƒ | dƒ ƒ| dƒ| dƒ | dƒ ksJ ‚qtt dƒtdƒd  tddƒ t dƒ t dƒ ƒ}|tdƒd tddƒ t dƒ t dƒd  ks²J ‚ttdƒt dƒ ƒt dƒ tdƒ ksÜJ ‚ttdƒt dƒd  ƒt dƒd tdƒ ksJ ‚ttdƒtdƒ ƒtdƒ tdƒ ks:J ‚ttdƒt dƒ ƒt dƒ tdƒ ksfJ ‚ttdƒtdƒ ƒtdƒ tdƒ ks’J ‚ttdƒtdƒ ƒtdƒtdƒ ks¼J ‚ttdƒtdƒ ƒtdƒtdƒ ksæJ ‚ttdƒtdƒ ƒtdƒtdƒ ksJ ‚ttdƒtddƒ ƒtddƒtdƒ ks>J ‚ttdƒtddƒ ƒtddƒtdƒ kslJ ‚ttdƒtddƒ ƒtddƒtdƒ ksšJ ‚tt dƒtddƒ ƒtddƒt dƒ ksÈJ ‚dS )zTest gate_sort.r.   r-   r   N)r   r   r   r   r   r   r   r   )rY   Úer3   r3   r4   Útest_gate_sortÛ   s     :22*2,,,***...rg   c                  C   s„  t dƒtdƒ t dƒd  tddƒ tdƒd  tdƒ tdƒd  tdƒd  } t| ƒt dƒtddƒ tdƒ tdƒ tdƒ ksˆJ ‚ttdƒtdƒ ƒdks¤J ‚ttdƒtdƒ ƒdksÀJ ‚ttdƒtdƒ ƒdksÜJ ‚tt dƒt dƒ ƒdksøJ ‚ttdƒtdƒ ƒtdƒksJ ‚ttdƒtdƒ ƒtdƒks<J ‚ttdƒƒtdƒksVJ ‚ttdƒd tdƒd  ƒtdƒks€J ‚dS )zTest gate_simp.r   r-   r.   rL   r<   N)	r   r   r   r   r   r   r   r   r   )rf   r3   r3   r4   Útest_gate_simp÷   s    R6""rh   c                  C   s˜   t dƒ} ttddƒ ¡ dd| ks&J ‚ttddƒtdƒ ƒtdƒksHJ ‚d	}t|ƒD ]>}t|ƒD ]0}tt||ƒ|dtt||ƒ ¡ |dks`J ‚q`qTd
S )zTest the SWAP gate.)rH   rK   rI   rJ   r-   r   r.   r8   rL   Z0010Z1000r<   N)r   r$   r   rO   r%   r&   r=   )Zswap_gate_matrixr1   rF   Újr3   r3   r4   Útest_swap_gate  s    ÿ"ÿrj   c                  C   sœ   t ttttttfD ]„} t ttttttfD ]l}t| dƒ|dƒƒ}tt	|dddƒ}tt	| 
¡ dddƒ}||ksrJ ‚t| dƒ|dƒƒ}| 
¡ dks(J ‚q(qdS )z-Test single qubit gate commutation relations.r   r-   Úsympy©r1   ÚformatN)r   r   r   r   r   r   r   r"   r*   r$   Údoit©Zg1Zg2rf   r>   r?   r3   r3   r4   Útest_one_qubit_commutators  s    rp   c                  C   s¸   t ttttfD ]¤} t ttttfD ]}t| dƒ|dƒƒ}tt|dddƒ}tt| ¡ dddƒ}||ksjJ ‚t| dƒ|dƒƒ}tt|dddƒ}tt| ¡ dddƒ}||ks J ‚q qdS )z1Test single qubit gate anticommutation relations.r   r-   rk   rl   r.   N)	r   r   r   r   r   r#   r*   r$   rn   ro   r3   r3   r4   Útest_one_qubit_anticommutators  s    rq   c                   C   s  t tddƒtdƒƒ ¡ dks J ‚t tddƒtdƒƒ ¡ dks@J ‚t tddƒtdƒƒ ¡ dks`J ‚t tddƒtdƒƒ ¡ dks€J ‚t tddƒtddƒƒ ¡ dks¢J ‚t tddƒtddƒƒ ¡ dksÄJ ‚t tddƒtddƒƒ ¡ dksæJ ‚t tddƒtddƒƒ ¡ dks
J ‚dS )z)Test commutators of involving CNOT gates.r   r-   r.   N)r"   r   r   rn   r   r   r   r3   r3   r3   r4   Útest_cnot_commutators-  s        """rr   c                  C   sD   t ddƒ} t| tƒsJ ‚t| dd}|jdks2J ‚t|tƒs@J ‚d S )Né
   rL   r8   )é   rt   )r   Ú
isinstancer   r$   Úshaper   )r@   Úmr3   r3   r4   Útest_random_circuit9  s
    
rx   c                  C   s"   t ddƒ} t| ƒ}| |ksJ ‚d S ©Nr-   r.   ©r   r,   ©ÚxZx_daggerr3   r3   r4   Útest_hermitian_XGateA  s    
r}   c                  C   s"   t ddƒ} t| ƒ}| |ksJ ‚d S ry   ©r   r,   ©ÚyZy_daggerr3   r3   r4   Útest_hermitian_YGateH  s    
r   c                  C   s"   t ddƒ} t| ƒ}| |ksJ ‚d S ry   ©r   r,   ©ÚzZz_daggerr3   r3   r4   Útest_hermitian_ZGateO  s    
r…   c                  C   s&   t ddƒ} t| ƒ}| | dks"J ‚d S ry   rz   r{   r3   r3   r4   Útest_unitary_XGateV  s    
r†   c                  C   s&   t ddƒ} t| ƒ}| | dks"J ‚d S ry   r~   r   r3   r3   r4   Útest_unitary_YGate]  s    
r‡   c                  C   s&   t ddƒ} t| ƒ}| | dks"J ‚d S ry   r‚   rƒ   r3   r3   r4   Útest_unitary_ZGated  s    
rˆ   N)TZsympy.core.mulr   Zsympy.core.numbersr   r   r   r   Zsympy.core.symbolr   r   Z&sympy.functions.elementary.exponentialr	   Z(sympy.functions.elementary.miscellaneousr
   Zsympy.matricesr   r   Zsympy.physics.quantum.gater   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Z sympy.physics.quantum.commutatorr"   Z$sympy.physics.quantum.anticommutatorr#   Zsympy.physics.quantum.representr$   Zsympy.physics.quantum.qapplyr%   Zsympy.physics.quantum.qubitr&   r'   r(   r)   Z!sympy.physics.quantum.matrixutilsr*   Z!sympy.physics.quantum.matrixcacher+   Zsympy.physics.quantumr,   r5   rG   rQ   rU   rZ   r]   r^   r_   r`   ra   rc   rd   re   rg   rh   rj   rp   rq   rr   rx   r}   r   r…   r†   r‡   rˆ   r3   r3   r3   r4   Ú<module>   sP   \5