
    z	i                        S r SSKJr  SSK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  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  \R4                  (       a  SSKJr   " S S\5      rg)zK
Gate described by the time evolution of a Hermitian Hamiltonian operator.
    )annotationsN)Number)_numpy_compat)Gate)QuantumCircuit)QuantumRegister)ParameterExpression)CircuitError)matrix_equal)is_hermitian_matrix   )UnitaryGate)BaseOperatorc                     ^  \ rS rSrSr S       SU 4S jjjrS rSS jrSSS jjrS r	S r
S	 rS
 rS rSrU =r$ )HamiltonianGate'   a  Class for representing evolution by a Hamiltonian operator as a gate.

This gate resolves to a :class:`~.library.UnitaryGate` as :math:`U(t) = \exp(-i t H)`,
which can be decomposed into basis gates if it is 2 qubits or less, or
simulated directly in Aer for more qubits.
c                *  > [        US5      (       a  UR                  5       nO+[        US5      (       a  UR                  5       R                  n[        R
                  " U[        S9n[        U5      (       d  [        S5      e[        U[        5      (       a%  U[        R                  " U5      :w  a  [        S5      eUR                  u  pE[        [        R                  " U5      5      nXE:w  d	  SU-  U:w  a  [        S5      e[         TU ]E  SXaU/US	9  g
)z
Args:
    data: A hermitian operator.
    time: Time evolution parameter.
    label: Unitary name for backend [Default: ``None``].

Raises:
    ValueError: if input data is not an N-qubit unitary operator.
	to_matrixto_operator)dtypezInput matrix is not Hermitian.zEvolution time is not real.   z(Input matrix is not an N-qubit operator.hamiltonian)labelN)hasattrr   r   datanpasarraycomplexr   
ValueError
isinstancer   realshapeintmathlog2super__init__)selfr   timer   	input_dim
output_dim
num_qubits	__class__s          a/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/circuit/library/hamiltonian_gate.pyr'   HamiltonianGate.__init__/   s     4%% >>#DT=)) ##%**Dzz$g."4((=>>dF##(=:;; $

	9-.
"amy&@GHH 	
4LN    c                   [        U[        5      (       d  gU R                  UR                  :w  a  g[        U R                  S   UR                  S   SS9nU R                  S   UR                  S   :H  nU=(       a    U$ )NFr   )ignore_phaser   )r    r   r   r   params)r(   otheroperators_eqtimes_eqs       r.   __eq__HamiltonianGate.__eq__W   si    %11::$#DKKNELLORWX;;q>U\\!_4((r0   c                p   SSK nUSL a  [        S5      e [        U R                  S   5      nUR
                  R                  SU R                  S   -  U-  5      nUc  [        OUn[        R                  " Xa[        R                  S9$ ! [         a!  n[	        SU R                  S    35      UeSnAff = f)	zReturn matrix for the unitary.r   NFz9unable to avoid copy while creating an array as requestedr   z:Unable to generate Unitary matrix for unbound t parameter y             )r   copy)scipy.linalgr   floatr3   	TypeErrorlinalgexpmr   r   arrayr   COPY_ONLY_IF_NEEDED)r(   r   r:   scipyr)   exarrs          r.   	__array__HamiltonianGate.__array__`   s    5=XYY	Q(D
 lldkk!n 4t ;< =exx}/P/PQQ  	LT[[YZ^L\]	s   B
 

B5B00B5c                "    U R                  5       $ )"Return the adjoint of the unitary.)adjoint)r(   	annotateds     r.   inverseHamiltonianGate.inversep   s    ||~r0   c                x    [        [        R                  " U R                  S   5      U R                  S   * 5      $ )z(Return the conjugate of the Hamiltonian.r   r   )r   r   conjr3   r(   s    r.   	conjugateHamiltonianGate.conjugatet   s*    rwwt{{1~6QHHr0   c                P    [        U R                  S   U R                  S   * 5      $ )rH   r   r   )r   r3   rO   s    r.   rI   HamiltonianGate.adjointx   s!    t{{1~A??r0   c                v    [        [        R                  " U R                  S   5      U R                  S   5      $ )z(Return the transpose of the Hamiltonian.r   r   )r   r   	transposer3   rO   s    r.   rU   HamiltonianGate.transpose|   s(    r||DKKN;T[[^LLr0   c                    [        U R                  S5      n[        XR                  S9nUR	                  [        U R                  5       5      USS / 5        X l        g)z4Calculate a subcircuit that implements this unitary.q)nameN)r   r,   r   rY   _appendr   r   
definition)r(   rX   qcs      r.   _defineHamiltonianGate._define   sE    DOOS1AII.


;t~~/0!A$;r0   c                   [        U[        [        [        R                  45      (       a  U$ [        U[
        5      (       a$  [        UR                  5      S:X  a  [        U5      $ [        S[        U5       SU R                   35      e)z>Hamiltonian parameter has to be an ndarray, operator or float.r   zinvalid param type z
 for gate )r    r<   r#   r   ndarrayr	   len
parametersr
   typerY   )r(   	parameters     r.   validate_parameter"HamiltonianGate.validate_parameter   sq    i%bjj!9::	#677C	@T@T<UYZ<Z##!4T)_4EZPTPYPY{[\\r0   )r[   )N)r   z np.ndarray | Gate | BaseOperatorr)   zfloat | ParameterExpressionr   z
str | NonereturnNone)NN)F)rJ   bool)__name__
__module____qualname____firstlineno____doc__r'   r7   rE   rK   rP   rI   rU   r]   re   __static_attributes____classcell__)r-   s   @r.   r   r   '   sw     !	&O.&O *&O 	&O
 
&O &OP)R I@M] ]r0   r   )rn   
__future__r   r$   typingnumbersr   numpyr   qiskitr   qiskit.circuit.gater   qiskit.circuit.quantumcircuitr   qiskit.circuitr   "qiskit.circuit.parameterexpressionr	   qiskit.circuit.exceptionsr
   (qiskit.quantum_info.operators.predicatesr   r   generalized_gates.unitaryr   TYPE_CHECKING+qiskit.quantum_info.operators.base_operatorr   r    r0   r.   <module>r      sR    #       $ 8 * B 2 A H 2	Hg]d g]r0   