o
    GZŽhƒ3  ã                   @   sÞ   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
mZmZmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ dd	d
„Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!edd„ ƒZ"edd„ ƒZ#dS )é    )ÚMul)ÚInteger)ÚSymbol)Únumbered_symbols)ÚXÚYÚZÚHÚCNOTÚCGate)Úbfs_identity_search)Ú	kmp_tableÚfind_subcircuitÚreplace_subcircuitÚconvert_to_symbolic_indicesÚconvert_to_real_indicesÚrandom_reduceÚrandom_insertÚflatten_ids)Úslowc                 C   s    t | ƒt| ƒt| ƒt| ƒf}|S )N)r   r   r   r	   )ZqubitZgates© r   ú\/var/www/auris/lib/python3.10/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyÚcreate_gate_sequence   s   r   c                  C   s¨   d} g d¢}|t | ƒksJ ‚d} g d¢}|t | ƒksJ ‚tdƒ}tdƒ}tdƒ}tdƒ}|||||f} g d¢}|t | ƒks?J ‚|||||f} g d¢}|t | ƒksRJ ‚d S )N)ÚaÚbÚcÚdr   r   r   )éÿÿÿÿr   r   r   r   é   é   )ÚPÚAÚRÚTÚIÚCr$   r    r!   r#   ÚEú r$   ÚNr'   r    r!   r"   r!   r%   r	   ÚUr#   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	   )ÚwordZexpected_tableÚxÚyÚzÚhr   r   r   Útest_kmp_table   s    r0   c                  C   s®  t dƒ} tdƒ}tdƒ}tdƒ}t dƒ}tdƒ}tdƒ}t |ƒ}t|ƒ}t|ƒ}	t|ƒ}
| ||f}t|| fƒdks;J ‚t||fƒdksEJ ‚t||fƒdksOJ ‚t||fƒdksYJ ‚t|t| |ƒƒdkseJ ‚t|t| ||ƒƒdksrJ ‚t|t||ƒƒdks~J ‚tt|Ž | |||fƒdksJ ‚tt|Ž ||| fƒdks›J ‚t|| fddddks¨J ‚| || ||f}tt|Ž t| ||ƒƒdks¾J ‚t|| fdddksÊJ ‚t|| |fddddksØJ ‚tt|Ž | |fddddksèJ ‚t|| |fdd	ddksöJ ‚t|| |fdd	ddksJ ‚| |||| |||| ||| |||||f}t|| ||||fƒd
ks'J ‚| ||||	|f}t||||	fƒdks<J ‚|||	|||
f}|||	f}t||ƒ}|dksUJ ‚d S )Nr   r   Úi0r   r   )ÚstartÚend)r2   r*   é   é   )r   r   r   r	   r   r   r   )r,   r-   r.   r/   Úx1Úy1r1   Úx_i0Úy_i0Úz_i0Zh_i0ÚcircuitZ
subcircuitÚresultr   r   r   Útest_find_subcircuit+   sN   
 ÿ

r=   c            
      C   s\  t dƒ} tdƒ}tdƒ}tdƒ}tddƒ}tdtdƒƒ}||| | f}||| f}t|t|Ž ƒ| fks3J ‚t||| f ƒdks?J ‚t||dd|ksJJ ‚t||dd| fksVJ ‚t|| | fdd||fkseJ ‚t||fƒ|ksoJ ‚| || ||f}| ||f}tt|Ž t|Ž ƒ| |fksŠJ ‚| || |f}t||ƒ|fksšJ ‚| ||||f}| ||f}t|t|Ž dd||fksµJ ‚t||dd|ksÀJ ‚||f}t||ƒ|ksÍJ ‚||||f}t||ƒ| fksÝJ ‚|| f}t|||d}	|	| || fksñJ ‚| ||| ||f}| |f}||f}t||t|Ž d}	|	|||| ||fksJ ‚t|||dd	}	|	| |||||fks,J ‚d S )
Nr   r   ©r   r   )Úposr   r   )Úreplace)r@   r?   )r   r   r   r	   r
   r   r   r   )
r,   r-   r.   r/   ÚcnotÚcgate_zr;   Úremover@   Úactualr   r   r   Útest_replace_subcircuit[   sV   



ÿÿÿrE   c                  C   s  t ƒ \} }}}tdƒ}|tdƒi}t| fƒ\}}}}	|t|ƒfks#J ‚||ks)J ‚t|ƒt|ƒt|ƒt|ƒf}
|tdƒi}t| |||fƒ\}}}}	||
ksOJ ‚||ksUJ ‚t dƒ\}}}}tdƒ}t|ƒt|ƒt|ƒt|ƒf}
|tdƒi}t||||fƒ\}}}}	||
ks‡J ‚||ksJ ‚t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒf}
|tdƒ|tdƒi}t| |||||||fƒ\}}}}	||
ksÇJ ‚||ksÍJ ‚|tdƒ|tdƒi}tt||||| |||ƒƒ\}}}}	||
ksîJ ‚||ksôJ ‚t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒf}
|tdƒ|tdƒi}tt| |||||||ƒƒ\}}}}	||
ks0J ‚||ks7J ‚|tdƒ|tdƒi}t|| ||||||fƒ\}}}}	||
ksXJ ‚||ks_J ‚t	ddƒ}t	ddƒ}t
dtdƒƒ}t
dtdƒƒ}t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt	||ƒt	||ƒt
|t|ƒƒt
|t|ƒƒf}
|tdƒ|tdƒi}| |||||||||||f}t|ƒ\}}}}	||
ksÌJ ‚||ksÓJ ‚|| ||||||||||f}t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt	||ƒt	||ƒt
|t|ƒƒt
|t|ƒƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ks(J ‚||ks/J ‚||||f}t	||ƒt|ƒt
|t|ƒƒt|ƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ks`J ‚||ksgJ ‚||||f}|tdƒ|tdƒi}t|ƒ\}}}}	||
ks†J ‚||ksJ ‚||||f}t	||ƒt|ƒt
|t|ƒƒt|ƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ks¾J ‚||ksÅJ ‚tdƒ}t
dt
dtdƒƒƒ}t
dt
dtdƒƒƒ}||f}t
|t
|t|ƒƒƒt
|t
|t|ƒƒƒf}
|tdƒ|tdƒ|tdƒi}t|ƒ\}}}}	||
ksJ ‚||ksJ ‚|tdƒi}tddd}t||||d	\}}}}	||
ks8J ‚||ks?J ‚td
ƒ}t
dtdƒƒ}|tdƒ|tdƒ|tdƒ|tdƒi}t
|||ft|ƒƒf}
|f}t|ƒ\}}}}	||
ksyJ ‚||ks€J ‚d S )Nr1   r   r   Úi1Úi2r   Úi)Úprefixr2   )Ú	qubit_mapr2   ÚgenÚi3)r*   r   r   r*   )r   r   r   r   r   r   r   r	   r   r
   r   r   )r,   r-   r.   r/   r1   Zexp_maprD   Zact_mapZsndxrK   Úexpectedr6   r7   Zz1Zh1rF   Úcnot_10Úcnot_01Ú
cgate_z_10Ú
cgate_z_01ÚargsrG   Úccgate_zÚccgate_xZndx_mapZ	index_genrL   Zcgate_x0_c321r   r   r   Ú test_convert_to_symbolic_indices   sæ   4
ÿÿ4ÿ
ÿ

$þÿÿ$þ$$(ýÿrU   c                  C   s@  t dƒ} t dƒ}tƒ \}}}}t| ƒ}t| ƒ}t| ƒ}| di}	|||f}
|||f}t|
|	ƒ}||ks4J ‚tddƒ}tddƒ}tdtdƒƒ}tdtdƒƒ}t|| ƒ}t| |ƒ}t|t| ƒƒ}| d|di}	|f}
|f}t|
|	ƒ}||kstJ ‚|f}
|f}t|
|	ƒ}||ks…J ‚|f}
|f}t|
|	ƒ}||ks–J ‚| d|di}	|f}
|f}t|
|	ƒ}||ks­J ‚t dƒ}t| t|t|ƒƒƒ}t|t|t| ƒƒƒ}| d|d|di}	||f}
tdtdtdƒƒƒtdtdtdƒƒƒf}tt|
Ž |	ƒ}||ksòJ ‚| d|d|di}	||f}
tdtdtdƒƒƒtdtdtdƒƒƒf}t|
|	ƒ}||ksJ ‚d S )Nr1   rF   r   r   rG   r   )	r   r   r   r   r   r   r
   r   r   )r1   rF   r,   r-   r.   r/   r8   r9   r:   rJ   rR   rM   rD   rN   rO   rP   rQ   Z
cnot_i1_i0Z
cnot_i0_i1Zcgate_z_i1_i0rG   rS   rT   r   r   r   Útest_convert_to_real_indices  sb   










((
rV   c               
   C   s–  t dƒ} tdƒ}tdƒ}tdƒ}tddƒ}tdtdƒƒ}| ||g}tt|dddƒ}| ||||f}t|g ƒ|ks:J ‚t||ƒ|ksCJ ‚g d¢}	| ||| ||f}t|||	d| ||fks]J ‚| | ||||f}t|||	d| | ||fkstJ ‚g d¢}	t|||	d||||fks‡J ‚| |||||g}tt|d	ddƒ}d
g}	| |||||||||f
}| |||||f}
t|||	d|
ksºJ ‚t	|Ž }t|||	d|
ksÉJ ‚d S )Nr   r   r>   r4   ©Ú	max_depth)r   r5   é	   r*   é   ©Úseed)é   é   r   r   é   )
r   r   r   r	   r
   r   Úlistr   r   r   )r,   r-   r.   r/   rA   rB   Ú	gate_listÚidsr;   ÚseqrM   r   r   r   Útest_random_reduceK  s4   

rd   c               	   C   sl  t dƒ} tdƒ}tdƒ}tdƒ}tddƒ}tdtdƒƒ}| | fg}||f}d\}}	t||||	gd}
|
| | ||fks<J ‚| |||f}||f| ||fg}| | |||||f}d\}}	t||||	gd}
|
|ksgJ ‚| |||||g}tt|ddd	ƒ}t	|ƒ}| ||||f}| || || ||||f	}d
\}}	t||||	gd}
|
|ks¡J ‚t
|Ž }t||||	gd}
|
|ks´J ‚d S )Nr   r   r>   )r   r   r[   )r   r   r   r4   rW   )r   é   )r   r   r   r	   r
   r   r   r`   r   r   r   )r,   r-   r.   r/   rA   rB   Úchoicesr;   ÚlocÚchoicerD   rM   ra   rb   Zeq_idsr   r   r   Útest_random_insertp  s8   

ri   Nr>   )$Zsympy.core.mulr   Zsympy.core.numbersr   Zsympy.core.symbolr   Zsympy.utilitiesr   Zsympy.physics.quantum.gater   r   r   r	   r
   r   Z$sympy.physics.quantum.identitysearchr   Z"sympy.physics.quantum.circuitutilsr   r   r   r   r   r   r   r   Zsympy.testing.pytestr   r   r0   r=   rE   rU   rV   rd   ri   r   r   r   r   Ú<module>   s$     (
02~@
$