
    z	iJC                         S r SSKJr  SSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  Sr " S S\5      rS rg)VOptimize chains of single-qubit u1, u2, u3 gates by combining them into a single gate.    )groupbyN)TranspilerError)	PhaseGate)UGate)U1Gate)U2Gate)U3Gate)ParameterExpression)Gate)TransformationPass)
Quaternioncompose_u3_rustV瞯<c                   Z   ^  \ rS rSrSrSU 4S jjrS r\S 5       r\S	S j5       r	Sr
U =r$ )
Optimize1qGates"   r   c                 p   > [         TU ]  5         U(       a  [        U5      O1 SkU l        X l        X0l        g)a  Optimize1qGates initializer.

Args:
    basis (list[str]): Basis gates to consider, e.g. `['u3', 'cx']`. For the effects
        of this pass, the basis is the set intersection between the `basis` parameter and
        the set `{'u1','u2','u3', 'u', 'p'}`.
    eps (float): EPS to check against
    target (Target): The :class:`~.Target` representing the target backend, if both
        ``basis`` and ``target`` are specified then this argument will take
        precedence and ``basis`` will be ignored.
>   u1u2u3N)super__init__setbasisepstarget)selfr   r   r   	__class__s       q/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/transpiler/passes/optimization/optimize_1q_gates.pyr   Optimize1qGates.__init__%   s*     	#(SZ.@
    c                   ^ SU R                   ;   nSU R                   ;   nTR                  / SQ5      n[        U5      nU GH  nSnU R                  bI  [	        U4S jUS   R
                   5       5      nU R                  R                  SU5      (       a  SnOSnOU(       a  SnOSnSnSn	U GH:  n
U
R                  n[        U
S	S5      c  [        U
R
                  5      S
:w  d  US;  a  [        S5      eUS;   a  SSU
R                  R                  S   4nOUS:X  aE  [        R                  S-  U
R                  R                  S   U
R                  R                  S
   4nO4US;   a   [	        U
R                  R                  5      nOU(       a  SnOSnSnU
R                  R                  bG  U
R                  R                  R                   (       a"  XR                  R                  R                   -  n	 [	        S U 5       5      nX4nUS;   a  SSUS   US   -   4nGO=US;   a$  [        R                  S-  US
   US   -   US   4nGOUS;   a%  Sn[        R                  S-  US
   US   US   -   4nOUS;   a  US   US
   US   -   US   4nOUS;   a!  U(       a  SnOSnUS   US
   US   US   -   4nOUS:X  aZ  U(       a  SnOSn[        R                  US   -
  US
   -
  US
   [        R                  S-  -   US   [        R                  S-  -   4nOFUS
   S:X  a  UnUnO8U(       a  SnOSn[$        R'                  US   US
   US   US   US
   US   5      n[)        US   [*        5      (       dn  [-        [        R.                  " US   S[        R                  -  5      5      U R0                  :  a,  US:w  a&  US:w  a   U(       a  SnOSnSSUS
   US   -   US   -   4nUS;   Ga  [)        US   [*        5      (       Gdx  US   [        R                  S-  -
  n[-        U5      U R0                  :  a  Sn[-        [        R.                  " US[        R                  -  5      5      U R0                  :  a8  Sn[        R                  S-  US
   US   US   [        R                  S-  -
  -   4nUS   [        R                  S-  -   n[-        U5      U R0                  :  a  Sn[-        [        R.                  " US[        R                  -  5      5      U R0                  :  aZ  Sn[        R                  S-  US
   [        R                  -   US   [        R                  -
  US   [        R                  S-  -   -   4n[)        US   [*        5      (       a  GM  US;   d  GM  [-        [        R.                  " US   S[        R                  -  5      5      U R0                  :  d  GM8  SnGM=     U R                  b  US:X  aG  U R                  R                  SU5      (       d&  U R                  R                  SU5      (       a  SnOSnUS;   aF  U R                  R                  Xv5      (       d&  U R                  R                  SU5      (       a  SnOFSnOCUS:X  a  SU R                   ;  a  U(       a  SnOSnUS;   a  XpR                   ;  a  U(       a  SnOSn[3        SS
/ S9nUS:X  a  [5        US   5      nUS:X  a  [7        US   5      nUS:X  a  [9        US
   US   5      nUS:X  a  SU R                   ;   a  [;        U6 nUS:X  a1  SU R                   ;   a	  [=        U6 nO[        SU R                    35      eT=R                   U	-  sl        US:w  a  TR?                  US   USS9  US
S  H  n
TRA                  U
5        M     US:X  d  GM  TRA                  US   5        GM     T$ ! ["         a     GNf = f)zRun the Optimize1qGates pass on `dag`.

Args:
    dag (DAGCircuit): the DAG to be optimized.

Returns:
    DAGCircuit: the optimized DAG.

Raises:
    TranspilerError: if ``YZY`` and ``ZYZ`` angles do not give same rotation matrix.
up)r   r   r   r%   r&   Nc              3   Z   >#    U  H   nTR                  U5      R                  v   M"     g 7fN)find_bitindex).0xdags     r!   	<genexpr>&Optimize1qGates.run.<locals>.<genexpr>I   s     "O,Q3<<?#8#8,s   (+r   r   )r   r   r   	condition   )r&   r   r   r   r%   idzinternal error)r   r&   r      r   r%   c              3   8   #    U  H  n[        U5      v   M     g 7fr(   )float)r+   r,   s     r!   r.   r/   w   s     +NoE!HHos   ))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   nop )name
num_qubitsparamsz%It was not possible to use the basis T)inplace)!r   collect_runs_split_runs_on_parametersr   tupleqargsinstruction_supportedr9   getattrlenr   opr;   nppi
definitionglobal_phase	TypeErrorr   
compose_u3
isinstancer   absmodr   r   r   r   r	   r   r
   substitute_noderemove_op_node)r   r-   use_uuse_prunsrun
run_qubits
right_nameright_parametersright_global_phasecurrent_node	left_nameleft_parameters
name_tupleright_anglenew_ops    `              r!   rS   Optimize1qGates.run6   s    tzz!tzz! <=(.CJ{{&""O#a&,,"OO
;;44S*EE!$J!%J!$J!%J(!" #(--	L+t<H<--.!3 (JJ)*:;;+'(!\__-C-CA-F&GO$&	$..q1$..q1'O
 +-&+LOO,B,B&CO$'	$(	&/O OO..:$22??&//*D*D*Q*QQ&&++No+N&NO (4
!;;()1.>q.AOTUDV.V'W$#>> 	(+oa.@@(+($
  #>>!%J	'*(+oa.@@($
  #WW )+(+oa.@@(+($
  #WW %(
%)
'*'*(+oa.@@($
  </
 %(
%)
 225Ea5HH'*RUUQY6(+beeai7($
  ]e+!*J'6$
 %(
%)
'6'A'A'*'*'*(+(+(+($D ##3A#68KLLBFF#3A#6RUUDEP"d*"c)%(
%)
(+.>q.AADTUVDWW($ ,%&6q&9;NOO&6q&9BEEAI&E{+dhh6*+Krvv{QY?@488K)-J "	 0 3 0 37G7JRUUUVY7V W0, '7q&9BEEAI&E{+dhh6*+Krvvk1ruu9=>I)-J "	 0 3bee ; 0 3bee ;?OPQ?RUWUZUZ]^U^?^ _0, ##3A#68KLL"k1BFF#3A#6BEE	BCdhhN!&Jq !$t {{&%dkk.O.OPTV`.a.a{{88jII%(
%)
,T[[5V5V6 6 {{88jII%(
%)
%$djj*@%(
%)
,::1M%(
%)
ra;FT! 0 34S "#3A#67T! 0 35Ea5HIS $**$"$45FT!4::%#%56F),QRVR\R\Q]*^__ 22U"##CFFD#A !$AB""<0 !(U"""3q6*y | 
Y ! s   7_''
_54_5c                 *    [        XX#XE5      u  pgnXgU4$ )aL  Return a triple theta, phi, lambda for the product.

u3(theta, phi, lambda)
   = u3(theta1, phi1, lambda1).u3(theta2, phi2, lambda2)
   = Rz(phi1).Ry(theta1).Rz(lambda1+phi2).Ry(theta2).Rz(lambda2)
   = Rz(phi1).Rz(phi').Ry(theta').Rz(lambda').Rz(lambda2)
   = u3(theta', phi1 + phi', lambda2 + lambda')

Return theta, phi, lambda.
r   )	theta1phi1lambda1theta2phi2lambda2thetaphilambs	            r!   rJ   Optimize1qGates.compose_u3F  s"     -V7DZTD!!r#   c                 r   [         R                  " XU/S5      nUR                  5       n[         R                  " US5      nUS   US   US   4n[        UR                  R                  UR                  5      5      n[        R                  " USU5      (       d  [        S5      e[        S U 5       5      nU$ )zExpress a Y.Z.Y single qubit gate as a Z.Y.Z gate.

Solve the equation

.. math::

Ry(theta1).Rz(xi).Ry(theta2) = Rz(phi).Ry(theta).Rz(lambda)

for theta, phi, and lambda.

Return a solution theta, phi, and lambda.
yzyzyzr1   r   r3   z4YZY and ZYZ angles do not give same rotation matrix.c              3   f   #    U  H'  n[         R                  " U5      [        :  a  S OUv   M)     g7f)r   N)rE   rL   _CHOP_THRESHOLD)r+   angles     r!   r.   -Optimize1qGates.yzy_to_zyz.<locals>.<genexpr>k  s&     cXbuu ?1UJXbs   /1)
r   
from_eulerto_zyzrL   datadotrE   allcloser   r?   )	xir`   rc   r   quaternion_yzyeulerquaternion_zyz
out_angles	abs_inners	            r!   
yzy_to_zyzOptimize1qGates.yzy_to_zyzU  s     $..F/CUK%%'#..ue<Aha%(3
++//0C0CDE	{{9a--!"XYYcXbcc
r#   )r   r   r   )Nr   N)g&.>)__name__
__module____qualname____firstlineno____doc__r   rS   staticmethodrJ   r|   __static_attributes____classcell__)r    s   @r!   r   r   "   s:    `"N` " "  r#   r   c                     / nU  H>  n[        US 5      nU H(  u  pEU(       a  M  UR                  [        U5      5        M*     M@     U$ )zrFinds runs containing parameterized gates and splits them into sequential
runs excluding the parameterized gates.
c                 v    U R                   R                  5       =(       a    U R                   R                  S;   $ )Nr4   )rD   is_parameterizedr9   )r,   s    r!   <lambda>+_split_runs_on_parameters.<locals>.<lambda>z  s'    (=(=(?(\ADDIIQ\D\(\r#   )r   appendlist)rR   outrS   groupsgroup_is_parameterizedgatess         r!   r>   r>   o  sM    
 C
 \]-3)"))

4;' .4  Jr#   )r   	itertoolsr   numpyrE   qiskit.transpiler.exceptionsr   'qiskit.circuit.library.standard_gates.pr   'qiskit.circuit.library.standard_gates.ur   (qiskit.circuit.library.standard_gates.u1r   (qiskit.circuit.library.standard_gates.u2r	   (qiskit.circuit.library.standard_gates.u3r
   qiskit.circuitr   qiskit.circuit.gater   qiskit.transpiler.basepassesr   qiskit.quantum_info.quaternionr   $qiskit._accelerate.optimize_1q_gatesr   rn   r   r>    r#   r!   <module>r      sL    ]   8 = 9 ; ; ; . $ ; 5 @J( JZ
r#   