§
    ¹³Ùgõ  ã                  óÜ   — d Z ddlmZ ddlZddlZddlmZ ddlZ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 dd
lmZ ddlmZ ddlmZ ddlmZ ej        rddlmZ  G d„ de¦  «        ZdS )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                  ó^   ‡ — e Zd ZdZ	 ddˆ fd„Zd„ Zdd„Zddd„Zd„ Zd„ Z	d„ Z
d„ Zd„ Zˆ xZS )ÚHamiltonianGatea   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.
    NÚdataú np.ndarray | Gate | BaseOperatorÚtimeúfloat | ParameterExpressionÚlabelú
str | NoneÚreturnÚNonec                ón  •— t          |d¦  «        r|                     ¦   «         }n)t          |d¦  «        r|                     ¦   «         j        }t	          j        |t          ¬¦  «        }t          |¦  «        st          d¦  «        ‚t          |t          ¦  «        r'|t	          j        |¦  «        k    rt          d¦  «        ‚|j        \  }}t          t          j        |¦  «        ¦  «        }||k    s	d|z  |k    rt          d¦  «        ‚t!          ¦   «                              d|||g|¬	¦  «         d
S )a  
        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)r   N)Úhasattrr   r   r   ÚnpÚasarrayÚcomplexr   Ú
ValueErrorÚ
isinstancer   ÚrealÚshapeÚintÚmathÚlog2ÚsuperÚ__init__)Úselfr   r   r   Ú	input_dimÚ
output_dimÚ
num_qubitsÚ	__class__s          €ú]/granary/edev/quantum/lib/python3.11/site-packages/qiskit/circuit/library/hamiltonian_gate.pyr,   zHamiltonianGate.__init__/   s0  ø€ õ �4˜Ñ%Ô%ð 	+ð —>’>Ñ#Ô#ˆDˆDÝ�T˜=Ñ)Ô)ð 	+ð ×#Ò#Ñ%Ô%Ô*ˆDåŒz˜$¥gÐ.Ñ.Ô.ˆå" 4Ñ(Ô(ð 	?ÝÐ=Ñ>Ô>Ð>Ý�d�FÑ#Ô#ð 	<¨µ´¸±´Ò(=Ð(=ÝÐ:Ñ;Ô;Ð;à $¤
Ñˆ	�:Ý�œ 9Ñ-Ô-Ñ.Ô.ˆ
Ø˜
Ò"Ð" a¨¡m°yÒ&@Ð&@ÝÐGÑHÔHÐHõ 	‰Œ×Ò˜¨
°T¸4°LÈÐÑNÔNÐNÐNÐNó    c                óä   — t          |t          ¦  «        sdS | j        |j        k    rdS t          | j        d         |j        d         d¬¦  «        }| j        d         |j        d         k    }|o|S )NFr   )Úignore_phaser   )r%   r   r   r   Úparams)r-   ÚotherÚoperators_eqÚtimes_eqs       r2   Ú__eq__zHamiltonianGate.__eq__W   so   € Ý˜%¥Ñ1Ô1ð 	Ø�5ØŒ:˜œÒ$Ð$Ø�5Ý# D¤K°¤N°E´LÀ´OÐRWÐXÑXÔXˆØ”;˜q”> U¤\°!¤_Ò4ˆØÐ( Ð(r3   c                óv  — ddl }|du rt          d¦  «        ‚	 t          | j        d         ¦  «        }n0# t          $ r#}t	          d| j        d         › �¦  «        |‚d}~ww xY w|j                             d| j        d         z  |z  ¦  «        }|€t          n|}t          j	        ||t          j        ¬¦  «        S )	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$   Úfloatr6   Ú	TypeErrorÚlinalgÚexpmr#   r!   Úarrayr   ÚCOPY_ONLY_IF_NEEDED)r-   r   r<   Úscipyr   ÚexÚarrs          r2   Ú	__array__zHamiltonianGate.__array__`   sÔ   € àÐÐÐà�5ˆ=ˆ=ÝÐXÑYÔYÐYð	Ý˜œ QœÑ(Ô(ˆDˆDøÝð 	ð 	ð 	ÝØ]ÈTÌ[ÐYZÌ^Ð]Ð]ñô àðøøøøð	øøøð Œl×Ò  d¤k°!¤nÑ 4°tÑ ;Ñ<Ô<ˆØ ˜=•�¨eˆÝŒx˜ 5­}Ô/PÐQÑQÔQÐQs   ™4 ´
A!¾AÁA!FÚ	annotatedÚboolc                ó*   — |                       ¦   «         S )ú"Return the adjoint of the unitary.)Úadjoint)r-   rH   s     r2   ÚinversezHamiltonianGate.inversep   s   € à�|Š|‰~Œ~Ðr3   c                ót   — t          t          j        | j        d         ¦  «        | j        d          ¦  «        S )z(Return the conjugate of the Hamiltonian.r   r   )r   r!   Úconjr6   ©r-   s    r2   Ú	conjugatezHamiltonianGate.conjugatet   s*   € å�rœw t¤{°1¤~Ñ6Ô6¸¼ÀQ¼¸ÑHÔHÐHr3   c                óP   — t          | j        d         | j        d          ¦  «        S )rK   r   r   )r   r6   rP   s    r2   rL   zHamiltonianGate.adjointx   s    € å˜tœ{¨1œ~°´¸A´¨Ñ?Ô?Ð?r3   c                ór   — t          t          j        | j        d         ¦  «        | j        d         ¦  «        S )z(Return the transpose of the Hamiltonian.r   r   )r   r!   Ú	transposer6   rP   s    r2   rT   zHamiltonianGate.transpose|   s(   € å�rœ|¨D¬K¸¬NÑ;Ô;¸T¼[È¼^ÑLÔLÐLr3   c                óæ   — t          | j        d¦  «        }t          || j        ¬¦  «        }|                     t          |                      ¦   «         ¦  «        |dd…         g ¦  «         || _        dS )z4Calculate a subcircuit that implements this unitary.Úq)ÚnameN)r   r0   r   rW   Ú_appendr   r   Ú
definition)r-   rV   Úqcs      r2   Ú_definezHamiltonianGate._define€   sb   € å˜DœO¨SÑ1Ô1ˆÝ˜A D¤IÐ.Ñ.Ô.ˆØ
�
Š
•;˜tŸ~š~Ñ/Ô/Ñ0Ô0°!°A°A°A´$¸Ñ;Ô;Ð;ØˆŒˆˆr3   c                ó  — t          |t          t          t          j        f¦  «        r|S t          |t
          ¦  «        r't          |j        ¦  «        dk    rt          |¦  «        S t          dt          |¦  «        › d| j
        › �¦  «        ‚)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
   ÚtyperW   )r-   Ú	parameters     r2   Úvalidate_parameterz"HamiltonianGate.validate_parameter‡   s…   € å�i¥%­­b¬jÐ!9Ñ:Ô:ð 	]ØÐÝ˜	Õ#6Ñ7Ô7ð 	]½CÀ	Ô@TÑ<UÔ<UÐYZÒ<ZÐ<ZÝ˜Ñ#Ô#Ð#åÐ[µT¸)±_´_Ð[Ð[ÐPTÔPYÐ[Ð[Ñ\Ô\Ð\r3   )N)r   r   r   r   r   r   r   r   )NN)F)rH   rI   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r:   rG   rM   rQ   rL   rT   r[   rb   Ú__classcell__)r1   s   @r2   r   r   '   sô   ø€ € € € € ðð ð !ð	&Oð &Oð &Oð &Oð &Oð &Oð &OðP)ð )ð )ðRð Rð Rð Rð ð ð ð ð ðIð Ið Ið@ð @ð @ðMð Mð Mðð ð ð]ð ]ð ]ð ]ð ]ð ]ð ]r3   r   )rf   Ú
__future__r   r)   ÚtypingÚnumbersr   Únumpyr!   Úqiskitr   Úqiskit.circuit.gater   Úqiskit.circuit.quantumcircuitr   Úqiskit.circuit.quantumregisterr   Ú"qiskit.circuit.parameterexpressionr	   Úqiskit.circuit.exceptionsr
   Ú(qiskit.quantum_info.operators.predicatesr   r   Úgeneralized_gates.unitaryr   ÚTYPE_CHECKINGÚ+qiskit.quantum_info.operators.base_operatorr   r   © r3   r2   ú<module>rw      s[  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð à  Ð  Ð  Ð  Ð  Ð  Ø $Ð $Ð $Ð $Ð $Ð $Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø :Ð :Ð :Ð :Ð :Ð :Ø BÐ BÐ BÐ BÐ BÐ BØ 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø AÐ AÐ AÐ AÐ AÐ AØ HÐ HÐ HÐ HÐ HÐ Hà 2Ð 2Ð 2Ð 2Ð 2Ð 2à	Ôð IØHÐHÐHÐHÐHÐHðg]ð g]ð g]ð g]ð g]�dñ g]ô g]ð g]ð g]ð g]r3   