o
    …º¥gƒ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	   )ÚqubitÚgates© r   úd/var/www/visachat/venv/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	   )ÚwordÚexpected_tableÚxÚyÚzÚhr   r   r   Útest_kmp_table   s    r3   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)r5   r,   é   é   )r   r   r   r	   r   r   r   )r/   r0   r1   r2   Úx1Úy1r4   Úx_i0Úy_i0Úz_i0Úh_i0ÚcircuitÚ
subcircuitÚresultr   r   r   Útest_find_subcircuit+   sN   
 ÿ

rB   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)rE   rD   )r   r   r   r	   r
   r   r   r   )
r/   r0   r1   r2   ÚcnotÚcgate_zr?   ÚremoverE   Úactualr   r   r   Útest_replace_subcircuit[   sV   



ÿÿÿrJ   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 )Nr4   r   r    Úi1Úi2r!   Úi)Úprefixr5   )Ú	qubit_mapr5   ÚgenÚi3)r,   r!   r    r,   )r   r   r   r   r   r   r   r	   r   r
   r   r   )r/   r0   r1   r2   r4   Úexp_maprI   Úact_mapÚsndxrP   Úexpectedr9   r:   Úz1Úh1rK   Úcnot_10Úcnot_01Ú
cgate_z_10Ú
cgate_z_01ÚargsrL   Úccgate_zÚccgate_xÚndx_mapÚ	index_genrQ   Úcgate_x0_c321r   r   r   Ú test_convert_to_symbolic_indices   sæ   4
ÿÿ4ÿ
ÿ

$þÿÿ$þ$$(ýÿrb   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 )Nr4   rK   r   r    rL   r!   )	r   r   r   r   r   r   r
   r   r   )r4   rK   r/   r0   r1   r2   r;   r<   r=   rO   r\   rU   rI   rX   rY   rZ   r[   Ú
cnot_i1_i0Ú
cnot_i0_i1Úcgate_z_i1_i0rL   r]   r^   r   r   r   Útest_convert_to_real_indices  sb   










((
rf   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    rC   r7   ©Ú	max_depth)r!   r8   é	   r,   é   ©Úseed)é   é   r   r!   é   )
r   r   r   r	   r
   r   Úlistr   r   r   )r/   r0   r1   r2   rF   rG   Ú	gate_listÚidsr?   ÚseqrU   r   r   r   Útest_random_reduceK  s4   

rt   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    rC   )r   r   rk   )r    r    r!   r7   rg   )r    é   )r   r   r   r	   r
   r   r   rp   r   r   r   )r/   r0   r1   r2   rF   rG   Úchoicesr?   ÚlocÚchoicerI   rU   rq   rr   Úeq_idsr   r   r   Útest_random_insertp  s8   

rz   NrC   )$Úsympy.core.mulr   Úsympy.core.numbersr   Úsympy.core.symbolr   Úsympy.utilitiesr   Úsympy.physics.quantum.gater   r   r   r	   r
   r   Ú$sympy.physics.quantum.identitysearchr   Ú"sympy.physics.quantum.circuitutilsr   r   r   r   r   r   r   r   Úsympy.testing.pytestr   r   r3   rB   rJ   rb   rf   rt   rz   r   r   r   r   Ú<module>   s$     (
02~@
$