o
    8Va*E                     @   s   d dl mZ d dl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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   Q/usr/lib/python3/dist-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s5J | || fdf|| | fdf| | |fdf|| f| ff| |f| ff|f| | ffh}t| || f|ksfJ | ||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sJ 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sZJ 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sHJ 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s$J tdtdfh}t| |  dd|ks9J dh}t| |  dd|ksHJ | | |  tdf|tdf||  | f| | | fh}t| | |  dd|kspJ | | | 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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| | | 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sJ d S )	Nr   r   Tr   )r   r   Fr   r   )r   r   r   r   r   r   )	r   r   r    r!   r"   r#   Zexpectedr$   r%   r   r   r   test_generate_gate_rules_2W   s   









r'   c            	      C   sH  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sVJ t| ||t||| t|| |t||| t|| |t| ||h}t|dd|ksJ | |||f}| |||f|||| f|| ||f|||| f||| |f|| ||f||| |f| |||fh}t||ksJ | || |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s"J 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s$J | | ||  h}t| | dd|ks8J | |f|| fh}t| | |ksJJ t| ||f }| | | || |  ||  | || |  ||  | | | | h}t|dd|ks{J 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sNJ 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   
( 
 
r0   c                  C   s  d} d}t df}t|| |}|du sJ td}||f}t|| |}|du s)J td}td}||f}t|| |}|du sAJ td}	|||	f}
t|
| |}|du sVJ tdd}||f}t|| |}|du skJ td}||f}t|| |}|du sJ td}|||	|f}t|| |}|du sJ d}t|| |}|du sJ t|
| |}|du sJ t|| |}|du sJ 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   


r@   c                  C   s  t d} | s
td t dddgid}|std d}d	}td
f}t|||du s,J td}||f}t|||du s>J td
}td
}||f}	t|	||d	u sTJ td
}
|||
f}t|||du sgJ td
d}||f}t|||du szJ td}||f}t|||du sJ td
}|||
|f}t|||du sJ d}t|||du sJ t|||d	u sJ t|||du sJ t|||du sJ d S )NZnumpyznumpy not installed.scipyfromlistZsparse)Zimport_kwargszscipy not installed.r1   Fr   Tr   )	r   r   r   r   r   r   r   r
   r	   )ZnprA   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r,   r<   r!   r=   r>   r?   r   r   r   test_is_scalar_sparse_matrix3  sD   


rC   c                  C   s@   t  \} }}}t| ||}|h}||| f}t||du sJ d S )NT)r   r   r   )r   r   r    r!   Zgate_idZidsZ
another_idr   r   r   test_is_degeneratee  s
   
rD   c                  C   s   d} t  \}}}}|||f}t|| dddu sJ |||f}t|| dddu s)J ||||f}t|| dddu s:J ||||f}t|| dddu sKJ |||||f}t|| dddu s]J d S )	Nr1   r      TFr         )r   r   )Znqubitsr   r   r    r!   r/   r   r   r   test_is_reducibleo  s   

rH   c                  C   s  t g dt ks
J t \} }}}| g}t| | h}t |ddd|ks%J | ||g}t| | t||t||t| ||h}t |d|ksFJ t| | t||t||t| ||t| || |t| || |t||||h}t |ddd|ksvJ t |ddd|ksJ | |||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s9J t| | t||t||t||t| |||h}|t |ddddks^J tdd	}| |g}t| | t||t| || |h}t |ddd|ksJ td
| }| |g}t| | t||t| || |h}t |ddd|ksJ 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   r1   	max_depthrF   rG   rE   T)rJ   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   










rP   c                  C   sH   t d} td}t| |g}tt| ||h}t|ddd|ks"J d S )Nr   r   rE   rI   )r   r   r   r   r   )rN   rO   rL   rM   r   r   r   test_bfs_identity_search_xfail  s
   rQ   Nr)   )'Zsympy.externalr   Zsympyr   r   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.   r0   r@   rC   rD   rH   rP   rQ   r   r   r   r   <module>   s"    ,(
EU),22
c