§
    º³Ùg×6  ã                  óB  — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ  e¦   «         Z	  G d„ de¦  «        Z G d„ de¬¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z dS )z.Internal format of calibration data in target.é    )ÚannotationsN)ÚABCMetaÚabstractmethod)ÚSequenceÚCallable)ÚIntEnum)ÚAny)Ú
PulseError)ÚScheduleÚScheduleBlock)ÚQobjToInstructionConverter)ÚPulseQobjInstruction)ÚQiskitErrorc                  ó   — e Zd ZdZdZdZdZdS )ÚCalibrationPublisherz#Defines who defined schedule entry.r   é   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚBACKEND_PROVIDERÚQISKITÚEXPERIMENT_SERVICE© ó    úV/granary/edev/quantum/lib/python3.11/site-packages/qiskit/pulse/calibration_entries.pyr   r   !   s'   € € € € € Ø-Ð-àÐØ€FØÐÐÐr   r   c                  ó‚   — e Zd ZdZedd„¦   «         Zedd	„¦   «         Zedd„¦   «         Zeedd„¦   «         ¦   «         Z	dS )ÚCalibrationEntryaê  A metaclass of a calibration entry.

    This class defines a standard model of Qiskit pulse program that is
    agnostic to the underlying in-memory representation.

    This entry distinguishes whether this is provided by end-users or a backend
    by :attr:`.user_provided` attribute which may be provided when
    the actual calibration data is provided to the entry with by :meth:`define`.

    Note that a custom entry provided by an end-user may appear in the wire-format
    as an inline calibration, e.g. :code:`defcal` of the QASM3,
    that may update the backend instruction set architecture for execution.

    .. note::

        This and built-in subclasses are expected to be private without stable user-facing API.
        The purpose of this class is to wrap different
        in-memory pulse program representations in Qiskit, so that it can provide
        the standard data model and API which are primarily used by the transpiler ecosystem.
        It is assumed that end-users will never directly instantiate this class,
        but :class:`.Target` or :class:`.InstructionScheduleMap` internally use this data model
        to avoid implementing a complicated branching logic to
        manage different calibration data formats.

    Ú
definitionr	   Úuser_providedÚboolc                ó   — dS )ae  Attach definition to the calibration entry.

        Args:
            definition: Definition of this entry.
            user_provided: If this entry is defined by user.
                If the flag is set, this calibration may appear in the wire format
                as an inline calibration, to override the backend instruction set architecture.
        Nr   ©Úselfr    r!   s      r   ÚdefinezCalibrationEntry.defineD   s	   € ð 	ˆr   Úreturnúinspect.Signaturec                ó   — dS )zrReturn signature object associated with entry definition.

        Returns:
            Signature object.
        Nr   ©r%   s    r   Úget_signaturezCalibrationEntry.get_signatureP   s	   € ð 	ˆr   úSchedule | ScheduleBlockc                ó   — dS )aµ  Generate schedule from entry definition.

        If the pulse program is templated with :class:`.Parameter` objects,
        you can provide corresponding parameter values for this method
        to get a particular pulse program with assigned parameters.

        Args:
            args: Command parameters.
            kwargs: Command keyword parameters.

        Returns:
            Pulse schedule with assigned parameters.
        Nr   )r%   ÚargsÚkwargss      r   Úget_schedulezCalibrationEntry.get_scheduleY   s	   € ð 	ˆr   c                ó   — dS )z%Return if this entry is user defined.Nr   r*   s    r   r!   zCalibrationEntry.user_providedj   s	   € ð 	ˆr   N)r    r	   r!   r"   ©r'   r(   ©r'   r,   ©r'   r"   )
r   r   r   r   r   r&   r+   r0   Úpropertyr!   r   r   r   r   r   )   s¨   € € € € € ðð ð4 ð	ð 	ð 	ñ „^ð	ð ðð ð ñ „^ðð ðð ð ñ „^ðð  Øðð ð ñ „^ñ „Xðð ð r   r   )Ú	metaclassc                  ób   — e Zd ZdZddd„Zedd„¦   «         Zd	„ Z	 ddd„Zdd„Z	dd„Z
d„ Zd„ ZdS )ÚScheduleDefaY  In-memory Qiskit Pulse representation.

    A pulse schedule must provide signature with the .parameters attribute.
    This entry can be parameterized by a Qiskit Parameter object.
    The .get_schedule method returns a parameter-assigned pulse program.

    .. see_also::
        :class:`.CalibrationEntry` for the purpose of this class.

    NÚ	argumentsúSequence[str] | Nonec                ó¼   — |r,t          d„ |D ¦   «         ¦  «        st          d|› d�¦  «        ‚|rt          |¦  «        }|| _        d| _        d| _        d| _        dS )zÛDefine an empty entry.

        Args:
            arguments: User provided argument names for this entry, if parameterized.

        Raises:
            PulseError: When `arguments` is not a sequence of string.
        c              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S ©N)Ú
isinstanceÚstr)Ú.0Úargs     r   ú	<genexpr>z'ScheduleDef.__init__.<locals>.<genexpr>†   s,   è è € Ð KÐ K¸#¥¨CµÑ!5Ô!5Ð KÐ KÐ KÐ KÐ KÐ Kr   z*Arguments must be name of parameters. Not ú.N)Úallr
   ÚlistÚ_user_argumentsÚ_definitionÚ
_signatureÚ_user_provided)r%   r9   s     r   Ú__init__zScheduleDef.__init__}   s~   € ð ð 	X�SÐ KÐ KÀÐ KÑ KÔ KÑKÔKð 	XÝÐVÈ)ÐVÐVÐVÑWÔWÐWØð 	(Ý˜Y™œˆIØ(ˆÔà7;ˆÔØ48ˆŒØ+/ˆÔÐÐr   r'   r"   c                ó   — | j         S r=   ©rI   r*   s    r   r!   zScheduleDef.user_provided�   ó   € àÔ"Ð"r   c                óâ  — d„ | j         j        D ¦   «         }| j        rRt          | j        ¦  «        |k    r%t	          d| j        › d| j         j        › d�¦  «        ‚t          | j        ¦  «        }nt          |¦  «        }g }|D ]<}t          j        |t          j        j	        ¬¦  «        }| 
                    |¦  «         Œ=t          j        |t          | j         ¦  «        ¬¦  «        }|| _        dS )zAGenerate signature from program and user provided argument names.c                ó   — h | ]	}|j         ’Œ
S r   ©Úname)r@   Úxs     r   ú	<setcomp>z.ScheduleDef._parse_argument.<locals>.<setcomp>˜   s   € ÐDÐDÐD 1˜œÐDÐDÐDr   z:Specified arguments don't match with schedule parameters. z != rC   )Úkind)Ú
parametersÚreturn_annotationN)rG   rU   rF   Úsetr
   rE   ÚsortedÚinspectÚ	ParameterÚPOSITIONAL_OR_KEYWORDÚappendÚ	SignatureÚtyperH   )r%   Úall_argnamesÚargnamesÚparamsÚargnameÚparamÚ	signatures          r   Ú_parse_argumentzScheduleDef._parse_argument”   s(  € ð EÐD¨Ô(8Ô(CÐDÑDÔDˆàÔð 	,Ý�4Ô'Ñ(Ô(¨LÒ8Ð8Ý ðPØÔ+ðPð PØ15Ô1AÔ1LðPð Pð Pñô ð õ ˜DÔ0Ñ1Ô1ˆHˆHå˜lÑ+Ô+ˆHàˆØð 	!ð 	!ˆGÝÔ%ØÝÔ&Ô<ðñ ô ˆEð �MŠM˜%Ñ Ô Ð Ð ÝÔ%ØÝ" 4Ô#3Ñ4Ô4ð
ñ 
ô 
ˆ	ð $ˆŒˆˆr   Tr    r,   r!   c                óJ   — || _         |                      ¦   «          || _        d S r=   )rG   re   rI   r$   s      r   r&   zScheduleDef.define±   s,   € ð
 &ˆÔØ×ÒÑÔÐØ+ˆÔÐÐr   r(   c                ó   — | j         S r=   ©rH   r*   s    r   r+   zScheduleDef.get_signatureº   ó
   € ØŒÐr   c                ó¼  — |s
|s| j         }n–	  |                      ¦   «         j        |i |¤Ž}n"# t          $ r}t	          d¦  «        |‚d }~ww xY wi }| j         j        D ](}	 |j        |j                 ||<   Œ# t          $ r Y Œ%w xY w| j          	                    |d¬¦  «        }d|j
        vr0| j        rt          j        |j
        d<   nt          j        |j
        d<   |S )Nz:Assigned parameter doesn't match with schedule parameters.F©ÚinplaceÚ	publisher)rG   r+   Úbind_partialÚ	TypeErrorr
   rU   r9   rQ   ÚKeyErrorÚassign_parametersÚmetadatar!   r   r   r   )r%   r.   r/   ÚoutÚto_bindÚexÚ
value_dictrc   s           r   r0   zScheduleDef.get_schedule½   s0  € Øð 	P˜Fð 	PØÔ"ˆCˆCðØ;˜$×,Ò,Ñ.Ô.Ô;¸TÐLÀVÐLÐL��øÝð ð ð Ý ØPñô àðøøøøðøøøð ˆJØÔ)Ô4ð ð �ðØ(/Ô(9¸%¼*Ô(E�J˜uÑ%Ð%øÝð ð ð Ø�DðøøøàÔ"×4Ò4°ZÈÐ4ÑOÔOˆCØ˜cœlÐ*Ð*ØÔ!ð RÝ,@Ô,G�”˜[Ñ)Ð)å,@Ô,Q�”˜[Ñ)Øˆ
s&   Ž. ®
A¸AÁAÁ!A7Á7
BÂBc                óF   — t          |d¦  «        r| j        |j        k    S dS ©NrG   F©ÚhasattrrG   ©r%   Úothers     r   Ú__eq__zScheduleDef.__eq__Ö   s*   € å�5˜-Ñ(Ô(ð 	9ØÔ# uÔ'8Ò8Ð8Øˆur   c                ó¶   — d| j         j        › �}d                     |                      ¦   «         j                             ¦   «         ¦  «        }|r	|d|› d�z  }|S )Nz	Schedule ú, ú(ú))rG   rQ   Újoinr+   rU   Úkeys)r%   rs   Ú
params_strs      r   Ú__str__zScheduleDef.__str__Ü   sd   € Ø1˜$Ô*Ô/Ð1Ð1ˆØ—Y’Y˜t×1Ò1Ñ3Ô3Ô>×CÒCÑEÔEÑFÔFˆ
Øð 	%ØÐ$�zÐ$Ð$Ð$Ñ$ˆCØˆ
r   r=   )r9   r:   r4   ©T)r    r,   r!   r"   r2   r3   )r   r   r   r   rJ   r5   r!   re   r&   r+   r0   r}   r…   r   r   r   r8   r8   q   sË   € € € € € ð	ð 	ð0ð 0ð 0ð 0ð 0ð& ð#ð #ð #ñ „Xð#ð$ð $ð $ð@ #ð,ð ,ð ,ð ,ð ,ðð ð ð ðð ð ð ð2ð ð ðð ð ð ð r   r8   c                  óX   — e Zd ZdZd„ Zedd„¦   «         Z	 ddd
„Zdd„Zdd„Z	d„ Z
d„ ZdS )ÚCallableDefa¹  Python callback function that generates Qiskit Pulse program.

    A callable is inspected by the python built-in inspection module and
    provide the signature. This entry is parameterized by the function signature
    and .get_schedule method returns a non-parameterized pulse program
    by consuming the provided arguments and keyword arguments.

    .. see_also::
        :class:`.CalibrationEntry` for the purpose of this class.

    c                ó0   — d| _         d| _        d| _        dS )zDefine an empty entry.N)rG   rH   rI   r*   s    r   rJ   zCallableDef.__init__ñ   s   € àˆÔØˆŒØ"ˆÔÐÐr   r'   r"   c                ó   — | j         S r=   rL   r*   s    r   r!   zCallableDef.user_provided÷   rM   r   Tr    r   r!   c                óT   — || _         t          j        |¦  «        | _        || _        d S r=   )rG   rY   rd   rH   rI   r$   s      r   r&   zCallableDef.defineû   s,   € ð
 &ˆÔÝ!Ô+¨JÑ7Ô7ˆŒØ+ˆÔÐÐr   r(   c                ó   — | j         S r=   rh   r*   s    r   r+   zCallableDef.get_signature  ri   r   r,   c                ó0  — 	  | j         j        |i |¤Ž}|                     ¦   «          n"# t          $ r}t	          d¦  «        |‚d }~ww xY w | j        di |j        ¤Ž}d|j        vr0| j        rt          j
        |j        d<   nt          j        |j        d<   |S )Nz9Assigned parameter doesn't match with function signature.rm   r   )rH   ÚbindÚapply_defaultsro   r
   rG   r9   rr   r!   r   r   r   )r%   r.   r/   rt   ru   rs   s         r   r0   zCallableDef.get_schedule  sÅ   € ð	bà*�d”oÔ*¨DÐ;°FÐ;Ð;ˆGØ×"Ò"Ñ$Ô$Ð$Ð$øÝð 	bð 	bð 	bÝÐXÑYÔYÐ_aÐaøøøøð	bøøøàˆdÔÐ3Ð3 Ô!2Ð3Ð3ˆØ˜cœlÐ*Ð*ØÔ!ð RÝ,@Ô,G�”˜[Ñ)Ð)å,@Ô,Q�”˜[Ñ)Øˆ
s   ‚&) ©
A³AÁAc                óF   — t          |d¦  «        r| j        |j        k    S dS rx   ry   r{   s     r   r}   zCallableDef.__eq__  s,   € õ �5˜-Ñ(Ô(ð 	9ØÔ# uÔ'8Ò8Ð8Øˆur   c                ó¤   — d                      |                      ¦   «         j                             ¦   «         ¦  «        }d| j        j        › d|› d�S )Nr   z	Callable r€   r�   )r‚   r+   rU   rƒ   rG   r   )r%   r„   s     r   r…   zCallableDef.__str__  sM   € Ø—Y’Y˜t×1Ò1Ñ3Ô3Ô>×CÒCÑEÔEÑFÔFˆ
ØD˜4Ô+Ô4ÐDÐD°zÐDÐDÐDÐDr   Nr4   r†   )r    r   r!   r"   r2   r3   )r   r   r   r   rJ   r5   r!   r&   r+   r0   r}   r…   r   r   r   rˆ   rˆ   ä   s¶   € € € € € ð
ð 
ð#ð #ð #ð ð#ð #ð #ñ „Xð#ð #ð,ð ,ð ,ð ,ð ,ðð ð ð ðð ð ð ðð ð ðEð Eð Eð Eð Er   rˆ   c                  óf   ‡ — e Zd ZdZ	 	 	 ddˆ fd	„Zd
„ Z	 ddd„Zdˆ fd„Zdˆ fd„Zd„ Z	ˆ fd„Z
ˆ xZS )ÚPulseQobjDefa½  Qobj JSON serialized format instruction sequence.

    A JSON serialized program can be converted into Qiskit Pulse program with
    the provided qobj converter. Because the Qobj JSON doesn't provide signature,
    conversion process occurs when the signature is requested for the first time
    and the generated pulse program is cached for performance.

    .. see_also::
        :class:`.CalibrationEntry` for the purpose of this class.

    Nr9   r:   Ú	converterú!QobjToInstructionConverter | NonerQ   ú
str | Nonec                ó–   •— t          ¦   «                              |¬¦  «         |pt          g ¬¦  «        | _        || _        d| _        dS )zãDefine an empty entry.

        Args:
            arguments: User provided argument names for this entry, if parameterized.
            converter: Optional. Qobj to Qiskit converter.
            name: Name of schedule.
        )r9   )Úpulse_libraryN)ÚsuperrJ   r   Ú
_converterÚ_nameÚ_source)r%   r9   r”   rQ   Ú	__class__s       €r   rJ   zPulseQobjDef.__init__/  sK   ø€ õ 	‰Œ×Ò 9ÐÑ-Ô-Ð-à#ÐSÕ'AÐPRÐ'SÑ'SÔ'SˆŒØˆŒ
Ø:>ˆŒˆˆr   c                ó
  — t          j        ¦   «         5  t          j        dt          ¬¦  «         t	          | j        ¬¦  «        }ddd¦  «         n# 1 swxY w Y   	 | j        D ]<}| j                             |¦  «        D ]}| 	                    |j
        |d¬¦  «         Œ Œ=|| _        |                      ¦   «          dS # t          $ r:}t          j        d|j        › d�t           ¦  «         t"          | _        Y d}~dS d}~ww xY w)	z+Build pulse schedule from cmd-def sequence.Úignore)ÚactionÚcategoryrP   NTrk   z<Pulse calibration cannot be built and the entry is ignored: rC   )ÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningr   r›   rœ   rš   Ú_get_sequencesÚinsertÚt0rG   re   r   ÚwarnÚmessageÚUserWarningÚIncompletePulseQobj)r%   ÚscheduleÚ	qobj_instÚqiskit_instru   s        r   Ú_build_schedulezPulseQobjDef._build_scheduleB  so  € åÔ$Ñ&Ô&ð 	1ð 	1ÝÔ!¨Õ<NÐOÑOÔOÐOå T¤ZÐ0Ñ0Ô0ˆHð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð	3Ø!œ\ð Mð M�	Ø#'¤?×#AÒ#AÀ)Ñ#LÔ#Lð Mð M�KØ—O’O I¤L°+Àt�OÑLÔLÐLÐLðMà'ˆDÔØ× Ò Ñ"Ô"Ð"Ð"Ð"øÝð 	3ð 	3ð 	3õ ŒMØ\ÈrÌzÐ\Ð\Ð\Ýñô ð õ  3ˆDÔÐÐÐÐÐÐøøøøð	3øøøs*   ”1AÁAÁAÁAB> Â>
DÃ/C=Ã=DFr    úlist[PulseQobjInstruction]r!   r"   c                ó"   — || _         || _        d S r=   )rœ   rI   r$   s      r   r&   zPulseQobjDef.defineW  s   € ð "ˆŒØ+ˆÔÐÐr   r'   r(   c                óz   •— | j         €|                      ¦   «          t          ¦   «                              ¦   «         S r=   )rG   r°   r™   r+   ©r%   r�   s    €r   r+   zPulseQobjDef.get_signature`  s4   ø€ ØÔÐ#Ø× Ò Ñ"Ô"Ð"Ý‰wŒw×$Ò$Ñ&Ô&Ð&r   úSchedule | ScheduleBlock | Nonec                óŒ   •— | j         €|                      ¦   «          | j         t          u rd S  t          ¦   «         j        |i |¤ŽS r=   )rG   r°   r¬   r™   r0   )r%   r.   r/   r�   s      €r   r0   zPulseQobjDef.get_schedulee  sN   ø€ ØÔÐ#Ø× Ò Ñ"Ô"Ð"ØÔÕ2Ð2Ð2Ø�4Ø#�u‰wŒwÔ# TÐ4¨VÐ4Ð4Ð4r   c                óð   — t          |t          ¦  «        r| j        |j        k    S t          |t          ¦  «        r| j        €|                      ¦   «          t          |d¦  «        r| j        |j        k    S dS rx   )r>   r“   rœ   r8   rG   r°   rz   r{   s     r   r}   zPulseQobjDef.__eq__l  sw   € Ý�e�\Ñ*Ô*ð 	1à”< 5¤=Ò0Ð0Ý�e�[Ñ)Ô)ð 	#¨dÔ.>Ð.Fà× Ò Ñ"Ô"Ð"Ý�5˜-Ñ(Ô(ð 	9ØÔ# uÔ'8Ò8Ð8Øˆur   c                óv   •— | j         €dS | j         t          u rdS t          ¦   «                              ¦   «         S )NÚ	PulseQobjÚNone)rG   r¬   r™   r…   r´   s    €r   r…   zPulseQobjDef.__str__w  s9   ø€ ØÔÐ#à�;ØÔÕ2Ð2Ð2Ø�6Ý‰wŒw�ŠÑ Ô Ð r   )NNN)r9   r:   r”   r•   rQ   r–   )F)r    r±   r!   r"   r2   )r'   rµ   )r   r   r   r   rJ   r°   r&   r+   r0   r}   r…   Ú__classcell__)r�   s   @r   r“   r“   "  sè   ø€ € € € € ð
ð 
ð +/Ø7;Øð	?ð ?ð ?ð ?ð ?ð ?ð ?ð&3ð 3ð 3ð0 $ð,ð ,ð ,ð ,ð ,ð'ð 'ð 'ð 'ð 'ð 'ð
5ð 5ð 5ð 5ð 5ð 5ð	ð 	ð 	ð!ð !ð !ð !ð !ð !ð !ð !ð !r   r“   )!r   Ú
__future__r   rY   r¢   Úabcr   r   Úcollections.abcr   r   Úenumr   Útypingr	   Úqiskit.pulse.exceptionsr
   Úqiskit.pulse.scheduler   r   Úqiskit.qobj.convertersr   Úqiskit.qobj.pulse_qobjr   Úqiskit.exceptionsr   Úobjectr¬   r   r   r8   rˆ   r“   r   r   r   ú<module>rÇ      sÿ  ðð 5Ð 4Ø "Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à .Ð .Ð .Ð .Ð .Ð .Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø =Ð =Ð =Ð =Ð =Ð =Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø )Ð )Ð )Ð )Ð )Ð )ð �f‘h”hÐ Ø Gðð ð ð ð ˜7ñ ô ð ðEð Eð Eð Eð E ð Eñ Eô Eð EðPpð pð pð pð pÐ"ñ pô pð pðf;Eð ;Eð ;Eð ;Eð ;EÐ"ñ ;Eô ;Eð ;Eð|[!ð [!ð [!ð [!ð [!�;ñ [!ô [!ð [!ð [!ð [!r   