a
    khQE                     @   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mZmZ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"dd Z#dd Z$dd Z%dd Z&dd Z'dS )     )import_module)Mul)Integer)Dagger)	XYZHCNOTIdentityGateCGate	PhaseGateTGate)generate_gate_rulesgenerate_equivalent_idsGateIdentitybfs_identity_searchis_scalar_sparse_matrixis_scalar_nonsparse_matrixis_degenerateis_reducible)skipc                 C   s    t | t| t| t| f}|S )N)r   r   r   r	   )ZqubitZgates r   ]/var/www/auris/lib/python3.9/site-packages/sympy/physics/quantum/tests/test_identitysearch.pycreate_gate_sequence   s    r   c                  C   s  t  \} }}}td}tdtd}t| f| fdfhks>J | | fdf| f| ffh}t| | f|ksjJ | || fdf|| | fdf| | |fdf|| f| ff| |f| ff|f| | ffh}t| || f|ksJ | ||fdf||| fdf|| |fdfd| ||ffd|| |ffd||| ff| f||ff||f| ff|f| |ff|| f|ff|f|| ff| |f|ffh}t| ||f}||ks|J d|||| ffd| |||ffd|| ||ffd||| |ff|f||| ff| f|||ff|f| ||ff|f|| |ff|| f||ff| |f||ff||f| |ff||f|| ff|| |f|ff| ||f|ff|||f| ff||| f|ff|| ||fdf| |||fdf|||| fdf||| |fdfh}t| |||f}||ksJ d|d |d | ffd|d | |d ffd| |d |d ff|f|d | ff|f| |d ff| f|d |d ff|| f|d ff||f| ff| |f|d ff|| |fdf||| fdf| ||fdfh}t| ||f}||ksJ td|d |d  |  ftd|d |  |d  ftd| |d  |d  f||d |  f|| |d  f| |d |d  f||  |d f|| | f| | |d f||  | tdf|| |  tdf| | | tdfh}t| ||fdd}||ksJ d S )Nr      r   TZreturn_as_muls)r   r   r   r   r   r   )xyzhphcgate_t
gate_rulesactualr   r   r   test_generate_gate_rules_1   s~    

$$$$******
r&   c            	      C   s  t  \} }}}td}tdtd}| tdfh}t| fdd|ksHJ tdtdfh}t| |  dd|ksrJ dh}t| |  dd|ksJ | | |  tdf|tdf||  | f| | | fh}t| | |  dd|ksJ | | | tdf|| |  tdf||  | tdftd| | | ftd||  | ftd|| |  f| || f|| | f|| | f||  |f|||  f| | |fh}t| | | dd}||ksJ td|| | |  ftd| | | | ftd||  | | ftd|| |  | f||| |  f| || | f|| | | f|||  | f||  || f|| ||  f| | || f|| | | f||  | |f| | | |f|| | | f|| |  |f||  | | tdf| | | | tdf|| | |  tdf|| |  | tdfh}t| | | | dd}||ks0J td|d |d  |  ftd|d |  |d  ftd| |d  |d  f||d |  f|| |d  f| |d |d  f||  |d f|| | f| | |d f||  | tdf|| |  tdf| | | tdfh}t| | | dd}||ks.J d|d |d | ffd|d | |d ffd| |d |d ff|f|d | ff|f| |d ff| f|d |d ff|| f|d ff||f| ff| |f|d ff|| |fdf||| fdf| ||fdfh}t| | | }||ksJ d S )	Nr   r   Tr   )r   r   Fr   r   )r   r   r   r   r   r   )	r   r   r    r!   r"   r#   expectedr$   r%   r   r   r   test_generate_gate_rules_2X   s    









r(   c            	      C   sP  t  \} }}}t| f| fhks$J t| | f| | fhks>J t| |f| |f|| fhks^J | ||f}| ||f||| f|| |f||| f|| |f| ||fh}t||ksJ t| ||t||| t|| |t||| t|| |t| ||h}t|dd|ksJ | |||f}| |||f|||| f|| ||f|||| f||| |f|| ||f||| |f| |||fh}t||kstJ | || |f}| || |f|| || fh}t||ksJ td|}||||f}||||f||||fh}t||ksJ tdd}tdtd}||||f}||||f||||f||||f||||fh}t||ksLJ d S )NTr   r   r   r   r   )r   r   r   r   r
   r   )	r   r   r    r!   Zgate_seqgate_idscgate_ycnotcgate_zr   r   r   test_generate_equivalent_ids_1   sD     
 

r/   c            	   	   C   s  t  \} }}}t| fdd| hks&J tdh}t| |  dd|ksHJ | | ||  h}t| | dd|kspJ | |f|| fh}t| | |ksJ t| ||f }| | | || |  ||  | || |  ||  | | | | h}t|dd|ksJ t| |||f }| | | | || | |  ||  | | || | |  || |  | ||  | | || |  | | | | | h}t|dd|ksJ t| || |f }| | |  | ||  | |  h}t|dd|ksJ td|}t||||f }|| | | || | | h}t|dd|ks&J tdd}tdtd}t||||f }|| | | || | | || | | || | | h}t|dd|ksJ d S )NTr   r   r)   r   r*   )r   r   r   r   r   r
   r   )	r   r   r    r!   r+   circuitr,   r-   r.   r   r   r   test_generate_equivalent_ids_2   sD    
( 
 
r1   c                  C   s  d} d}t df}t|| |}|du s*J td}||f}t|| |}|du sRJ td}td}||f}t|| |}|du sJ td}	|||	f}
t|
| |}|du sJ tdd}||f}t|| |}|du sJ td}||f}t|| |}|du sJ td}|||	|f}t|| |}|du s,J d}t|| |}|du sJJ t|
| |}|du sdJ t|| |}|du s~J t|| |}|du sJ d S )N   Fr   Tr   )r   r   r   r   r   r
   r	   )	numqubitsid_onlyid_gater%   x0
xx_circuitx1y1
xy_circuitz1xyz_circuitr-   cnot_circuitr!   
hh_circuith1xhzh_circuitr   r   r   test_is_scalar_nonsparse_matrix  sN    


rA   c                  C   s  t d} | std t dddgid}|s2td d}d	}td
f}t|||du sXJ td}||f}t|||du s|J td
}td
}||f}	t|	||d	u sJ td
}
|||
f}t|||du sJ td
d}||f}t|||du sJ td}||f}t|||du sJ td
}|||
|f}t|||du sDJ d}t|||du s^J t|||d	u stJ t|||du sJ t|||du sJ d S )Nnumpyznumpy not installed.scipyfromlistsparse)Zimport_kwargszscipy not installed.r2   Fr   Tr   )	r   r   r   r   r   r   r   r
   r	   )nprC   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r-   r=   r!   r>   r?   r@   r   r   r   test_is_scalar_sparse_matrix4  sD    


rG   c                  C   s@   t  \} }}}t| ||}|h}||| f}t||du s<J d S )NT)r   r   r   )r   r   r    r!   Zgate_ididsZ
another_idr   r   r   test_is_degeneratef  s
    
rI   c                  C   s   d} t  \}}}}|||f}t|| dddu s2J |||f}t|| dddu sRJ ||||f}t|| dddu stJ ||||f}t|| dddu sJ |||||f}t|| dddu sJ d S )	Nr2   r      TFr         )r   r   )Znqubitsr   r   r    r!   r0   r   r   r   test_is_reduciblep  s    

rM   c                  C   s  t g dt ksJ t \} }}}| g}t| | h}t |ddd|ksJJ | ||g}t| | t||t||t| ||h}t |d|ksJ t| | t||t||t| ||t| || |t| || |t||||h}t |ddd|ksJ t |ddd|ksJ | |||g}t| | t||t||t||t| ||t| || |t| || |t| |||t||||t||||h
}t |d|ksJ t| | t||t||t||h}|t |ddddksJ t| | t||t||t||t| ||t| || |t| || |t| |||t||||t||||t| ||| |t| ||||t|||||h}t |ddd|ksxJ t| | t||t||t||t| |||h}|t |ddddksJ tdd	}| |g}t| | t||t| || |h}t |ddd|ksJ td
| }| |g}t| | t||t| || |h}t |ddd|ksVJ tdtd}|||g}t||t||t||t||||h}t |ddd|ksJ td	}	td	}
|	|
g}t|	|	|	|	h}t |ddd|ksJ d S )Nr   r2   	max_depthrK   rL   rJ   T)rO   Zidentity_onlyr   r)   r*   )	r   setr   r   r
   r   r   r   r   )r   r   r    r!   	gate_listid_setr-   Zcgate_xr.   str   r   r   test_bfs_identity_search  s    










rU   c                  C   sH   t d} td}t| |g}tt| ||h}t|ddd|ksDJ d S )Nr   r   rJ   rN   )r   r   r   r   r   )rS   rT   rQ   rR   r   r   r   test_bfs_identity_search_xfail  s
    rV   N)r   )(Zsympy.externalr   Zsympy.core.mulr   Zsympy.core.numbersr   Zsympy.physics.quantum.daggerr   Zsympy.physics.quantum.gater   r   r   r	   r
   r   r   r   r   Z$sympy.physics.quantum.identitysearchr   r   r   r   r   r   r   r   Zsympy.testing.pytestr   r   r&   r(   r/   r1   rA   rG   rI   rM   rU   rV   r   r   r   r   <module>   s"   ,(
EU),22
c