
    z	ie3                        S r SSKJr  SSK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JrJrJrJr   " S	 S
\\5      r " S S\5      rg)zi
A definition of the approximate circuit compilation optimization problem based on CNOT unit
definition.
    )annotationsN)ABC)linalg   )ApproximatingObjective)	ry_matrix	rz_matrixplace_unitary
place_cnot	rx_matrixc                  P   ^  \ rS rSrSrSU 4S jjr\S 5       r\S 5       rSr	U =r
$ )CNOTUnitObjective   z
A base class for a problem definition based on CNOT unit. This class may have different
subclasses for objective and gradient computations.
c                b   > [         TU ]  5         Xl        X l        UR                  S   U l        g)o
Args:
    num_qubits: number of qubits.
    cnots: a CNOT structure to be used in the optimization procedure.
r   N)super__init___num_qubits_cnotsshape
_num_cnotsself
num_qubitscnots	__class__s      j/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/synthesis/unitary/aqc/cnot_unit_objective.pyr   CNOTUnitObjective.__init__!   s*     	%++a.    c                    U R                   $ )zL
Returns:
    A number of CNOT units to be used by the approximate circuit.
)r   r   s    r   	num_cnotsCNOTUnitObjective.num_cnots,   s     r   c                @    SU R                   -  SU R                  -  -   $ )zO
Returns:
    Number of parameters (angles) of rotation gates in this circuit.
      )r   r   r!   s    r   
num_thetasCNOTUnitObjective.num_thetas4   s#     4###a$//&999r   )r   r   r   r   intr   
np.ndarrayreturnNone)__name__
__module____qualname____firstlineno____doc__r   propertyr"   r'   __static_attributes____classcell__r   s   @r   r   r      s5    
	)   : :r   r   c                  D   ^  \ rS rSrSrSU 4S jjrSS jrS	S jrSrU =r	$ )
DefaultCNOTUnitObjective=   zEA naive implementation of the objective function based on CNOT units.c                j   > [         TU ]  X5        SU l        SU l        SU l        SU l        SU l        g)r   N)r   r   _last_thetas_cnot_right_collection_cnot_left_collection_rotation_matrix_cnot_matrixr   s      r   r   !DefaultCNOTUnitObjective.__init__@   s<     	+ 049=#8<"9=/3r   c           
     V   UnU R                   n[        SU-  5      nU R                  nU R                  n[        R
                  " XDU-  4[        S9n[        R
                  " XDU-  4[        S9n[        R
                  " XDU-  4[        S9n	[        U5       H  n
SU
-  n[        USU
4   5      n[        USU
4   5      n[        USU-      5      n[        USU-      5      n[        USU-      5      n[        USU-      5      n[        R                  " X5      n[        R                  " UU5      n[        UX<5      n[        UX=5      n[        X<U5      n[        R                  " UUU/5      US S 2XJ-  XJS-   -  24'   M     [        R                   " U5      n[        US-
  SS5       H<  n
[        R                  " UUS S 2XJ-  XJS-   -  24   5      nUUS S 2XJ-  XJS-   -  24'   M>     [        R                   " U5      n[        U5       H<  n
[        R                  " US S 2XJ-  XJS-   -  24   U5      nUU	S S 2XJ-  XJS-   -  24'   M>     Sn[        U5       Ho  nSU-  SU-  -   n[        USU-      5      n[        USU-      5      n[        USU-      5      n[        R"                  " U[        R                  " UUU/5      5      nMq     [        R                  " UU5      nS[        R$                  " UU R&                  -
  S	5      S-  -  nX l        Xl        Xl        UU l        UU l        U$ )
N   )dtyper&   r   r   r%   g      ?fro)r   r*   r   r"   npzeroscomplexranger   r	   r   dotr
   r   la	multi_doteyekronnorm_target_matrixr;   r=   r<   r>   r?   )r   param_valuesthetasndr   r"   cnot_unit_collectioncnot_right_collectioncnot_left_collection
cnot_indextheta_indexq1q2ry1rz1ry2rx2	single_q1	single_q2full_q1full_q2	cnot_q1q2cnot_matrixrotation_matrixqrz0rz2circuit_matrixerrors                                 r   	objective"DefaultCNOTUnitObjective.objectiveO   sP   1INN	
  "xx	M(:'J !#!]);7 K  "xx	M(:'J	*Jj.K U1j=)*BU1j=)*B F1{?34CF1{?34C F1{?34CF1{?34C s(IsC(I $Iq5G#Iq5G #1"-I NP\\'9-N ANQq.5I$I!IJ7 +D ffQi	Ar26J&&1!Q^aXY>FZ5Z2Z[K OZ!!Q^a>6J%J"JK	 7 ffQi	*J&&$Q1n9M(M%MNP[K NY ANQq.5I$I!IJ	 + -.qAi-!a%/KF1{?34CF1{?34CF1{?34C ggor||S#sO7TUO  _= rww~0C0CCUKqPQ #%9"&;# /'r   c                Z   Un[         R                  " [         R                  " X R                  5      5      (       d  U R	                  U5        [         R
                  " S[         R                  " SS/SS//5      5      n[         R
                  " S[         R                  " SS/SS//5      5      n[         R
                  " S[         R                  " SS/SS//5      5      nU R                  n[        SU-  5      nU R                  nU R                  n	[         R                  " SU	-  S	U-  -   5      n
[        U	5       GH  nSU-  n[        USU4   5      n[        USU4   5      n[        USU-      5      n[        USU-      5      n[        USU-      5      n[        US	U-      5      n[        S5       GH`  nUS:X  a0  [         R"                  " UXO/5      n[         R$                  " UU5      nOUS:X  a1  [         R"                  " UUU/5      n[         R$                  " UU5      nOgUS:X  a1  [         R$                  " UU5      n[         R"                  " UUU/5      nO0[         R$                  " UU5      n[         R"                  " UUU/5      n['        UXm5      n['        UXn5      n[)        XmU5      n[         R"                  " UUU/5      nUS:X  a.  [         R$                  " U R*                  S S 2USU-  24   U5      nOU	S-
  U:X  a5  [         R$                  " UU R,                  S S 2XyS-
  -  XyS-
  -  24   5      nOP[         R"                  " U R*                  S S 2X{S-   -  X{S-   -  24   UU R,                  S S 2X{S-
  -  X{-  24   /5      n[         R$                  " UU R.                  5      n[         R0                  " [         R2                  " [         R$                  " UR5                  5       R6                  U R8                  5      5      5      * U
UU-   '   GMc     GM     [        S	U-  5       GHz  nSn[        U5       H  nSU	-  S	U-  -   n[        USU-      5      n[        USU-      5      n[        USU-      5      nUS	U-  -
  S:X  a  [         R$                  " UU5      nOFUS	U-  -
  S:X  a  [         R$                  " XO5      nO#US	U-  -
  S:X  a  [         R$                  " UU5      n[         R:                  " U[         R"                  " UUU/5      5      nM     [         R$                  " U R<                  U5      n[         R0                  " [         R2                  " [         R$                  " UR5                  5       R6                  U R8                  5      5      5      * U
SU	-  U-   '   GM}     U
$ )
Ny             r   r   y             y              ?rD   rB   r&   r%   )rF   alliscloser;   rl   multiplyasarrayr   r*   r   r"   rG   rI   r   r	   r   rK   rL   rJ   r
   r   r<   r=   r>   realtraceconjTrP   rN   r?   ) r   rQ   rR   pauli_xpauli_ypauli_zrS   rT   r   r"   derrX   rY   rZ   r[   r\   r]   r^   r_   ir`   ra   rb   rc   rd   der_cnot_unitder_cnot_matrixder_circuit_matrixder_rotation_matrixrg   rh   ri   s                                    r   gradient!DefaultCNOTUnitObjective.gradient   s    vvbjj):):;<<NN6"
 ++grzzAq6Aq62B'CD++grzzAs8b!W2E'FG++grzzAq6Ar72C'DE1INN	
 hhq9}q1u,-	*Jj.K U1j=)*BU1j=)*B F1{?34CF1{?34C F1{?34CF1{?34C
 1X6 "c7-@ AI "sC 0I!V "gsC-@ AI "sC 0I!V "sC 0I "c7C-@ AI "sC 0I "gsC-@ AI (	19'	19 'qb1	 !#gw	-J K ?&(ff33Aq1q5yLA%'O ]j0&(ff%221aq=6IA]^Q^L_6_3_`'O
 ')ll 77 !1Q#7!A~:N#N N * 66q!A~:NQRQ_:_7_`'O &(VVOT=R=R%S"(*HHRVV$6$;$;$=$?$?ATATUV) (AO$i % +X q1uA451X)ma!e3q; 78q; 78q; 78 q1u9>&&#.CQY!^&&.CQY!^&&#.C&(gg.A2<<QTVY[^P_C`&a# & "$(9(9;N!O&(gg 2 7 7 9 ; ;T=P=PQR' &CI!"/ 6 
r   )r=   r?   r<   r;   r>   r)   )rQ   r+   r,   ztyping.SupportsFloat)rQ   r+   r,   r+   )
r.   r/   r0   r1   r2   r   rl   r   r4   r5   r6   s   @r   r8   r8   =   s    O4[z r   r8   )r2   
__future__r   typingabcr   numpyrF   r   rK   approximater   elementary_operationsr   r	   r
   r   r   r   r8    r   r   <module>r      sC    #     / ] ]:. :Dn0 nr   