§
    ¹³Ùg­<  ã                   óþ  — d Z ddlZddlmZ ddlmZmZmZ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mZmZmZmZ dd	lmZmZ dd
lmZ ddlmZ edee	ej        ej         ee!ej         f         f                  de!dej"        dedej#        f
d„¦   «         Z$dee	ej         ee!ej         f         f                  dej%        dedeeej&                 ee'ef         f         fd„Z(de	ej)        ej        f         dej*        dedee'ee+         f         deeej,                 e!f         f
d„Z-deee!ej.        f         eej.                 f         deee!                  ddfd„Z/dej%        dee'ef         dedej0        fd„Z1dS )z@Assemble function for converting a list of circuits into a qobj.é    N)Údefaultdict)ÚAnyÚDictÚListÚTupleÚUnion)ÚqobjÚpulse)Ú	RunConfig)ÚQiskitError)ÚinstructionsÚ
transformsÚlibraryÚscheduleÚchannels)ÚutilsÚ
converters)ÚParametricPulseShapes)Údeprecate_pulse_dependencyÚ	schedulesÚqobj_idÚqobj_headerÚ
run_configÚreturnc                 óT  — t          |d¦  «        st          d¦  «        ‚t          |d¦  «        st          d¦  «        ‚t          j        t          j        fi |                     ¦   «         ¤Ž}t          | ||¦  «        \  }}t          |||¦  «        }t	          j	        ||||¬¦  «        S )a	  Assembles a list of schedules into a qobj that can be run on the backend.

    Args:
        schedules: Schedules to assemble.
        qobj_id: Identifier for the generated qobj.
        qobj_header: Header to pass to the results.
        run_config: Configuration of the runtime environment.

    Returns:
        The Qobj to be run on the backends.

    Raises:
        QiskitError: when frequency settings are not supplied.

    Examples:

        .. code-block:: python

            from qiskit import pulse
            from qiskit.assembler import assemble_schedules
            from qiskit.assembler.run_config import RunConfig
            # Construct a Qobj header for the output Qobj
            header = {"backend_name": "FakeOpenPulse2Q", "backend_version": "0.0.0"}
            # Build a configuration object for the output Qobj
            config = RunConfig(shots=1024,
                               memory=False,
                               meas_level=1,
                               meas_return='avg',
                               memory_slot_size=100,
                               parametric_pulses=[],
                               init_qubits=True,
                               qubit_lo_freq=[4900000000.0, 5000000000.0],
                               meas_lo_freq=[6500000000.0, 6600000000.0],
                               schedule_los=[])
            # Build a Pulse schedule to assemble into a Qobj
            schedule = pulse.Schedule()
            schedule += pulse.Play(pulse.Waveform([0.1] * 16, name="test0"),
                                   pulse.DriveChannel(0),
                                   name="test1")
            schedule += pulse.Play(pulse.Waveform([0.1] * 16, name="test1"),
                                   pulse.DriveChannel(0),
                                   name="test2")
            schedule += pulse.Play(pulse.Waveform([0.5] * 16, name="test0"),
                                   pulse.DriveChannel(0),
                                   name="test1")
            # Assemble a Qobj from the schedule.
            pulseQobj = assemble_schedules(schedules=[schedule],
                                           qobj_id="custom-id",
                                           qobj_header=header,
                                           run_config=config)
    Úqubit_lo_freqzqubit_lo_freq must be supplied.Úmeas_lo_freqzmeas_lo_freq must be supplied.)Úexperimentsr   ÚheaderÚconfig)
Úhasattrr   r   ÚLoConfigConverterr	   ÚPulseQobjExperimentConfigÚto_dictÚ_assemble_experimentsÚ_assemble_configÚ	PulseQobj)r   r   r   r   Úlo_converterr   Úexperiment_configÚqobj_configs           úY/granary/edev/quantum/lib/python3.11/site-packages/qiskit/assembler/assemble_schedules.pyÚassemble_schedulesr,      sÆ   € õ@ �:˜Ñ/Ô/ð =ÝÐ;Ñ<Ô<Ð<Ý�:˜~Ñ.Ô.ð <ÝÐ:Ñ;Ô;Ð;åÔ/ÝÔ&ðð Ø*4×*<Ò*<Ñ*>Ô*>ðð €Lõ &;¸9ÀlÐT^Ñ%_Ô%_Ñ"€KÐ"Ý" <Ð1BÀJÑOÔO€KåŒ>Ø¨¸È[ðñ ô ð ó    r(   c                 ó  ‡— ˆfd„t          |dg ¦  «        D ¦   «         }t          | ¦  «        dk    r0t          |¦  «        ddt          | ¦  «        fvrt          d¦  «        ‚t          |dt          j        ¦  «        } |t
          j        fi |                     ¦   «         ¤Ž}d„ | D ¦   «         }t          j	        |¦  «        }i }g }t          |¦  «        D ]š\  }	}
t          |
|||¦  «        \  }}|
j        }|€i }t          j        |dz   |
j        pd	|	› �|¬
¦  «        }t          j        ||¬¦  «        }|r$t          |¦  «        dk    r|	nd}||         |_        |                     |¦  «         Œ›|rVt          |¦  «        dk    rC|d         }g }|D ]6}|                     t          j        |j        |j        |¬¦  «        ¦  «         Œ7d„ |                     ¦   «         D ¦   «         t+          d„ |D ¦   «         ¦  «        dœ}||fS )a  Assembles a list of schedules into PulseQobjExperiments, and returns related metadata that
    will be assembled into the Qobj configuration.

    Args:
        schedules: Schedules to assemble.
        lo_converter: The configured frequency converter and validator.
        run_config: Configuration of the runtime environment.

    Returns:
        The list of assembled experiments, and the dictionary of related experiment config.

    Raises:
        QiskitError: when frequency settings are not compatible with the experiments.
    c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS © r0   )Ú.0Úlo_dictr(   s     €r+   ú
<listcomp>z)_assemble_experiments.<locals>.<listcomp>   s#   ø€ ÐaÐaÐa¨g�L�L Ñ)Ô)ÐaÐaÐar-   Úschedule_losé   r   z¸Invalid 'schedule_los' setting specified. If specified, it should be either have a single entry to apply the same LOs for each schedule or have length equal to the number of schedules.Úinstruction_converterc                 ó6   — g | ]}t          j        |¦  «        ‘ŒS r0   )r   Útarget_qobj_transform)r1   Úscheds     r+   r3   z)_assemble_experiments.<locals>.<listcomp>�   s#   € ÐZÐZÐZÀu�:Ô;¸EÑBÔBÐZÐZÐZr-   NzExperiment-)Úmemory_slotsÚnameÚmetadata)r   r   )r   r   r    c                 ó@   — g | ]\  }}t          j        ||¬ ¦  «        ‘ŒS )©r;   Úsamples)r	   ÚPulseLibraryItem)r1   r;   r?   s      r+   r3   z)_assemble_experiments.<locals>.<listcomp>»   s<   € ð 
ð 
ð 
á��gõ Ô! t°WÐ=Ñ=Ô=ð
ð 
ð 
r-   c              3   ó.   K  — | ]}|j         j        V — Œd S )N)r   r:   )r1   Úexps     r+   ú	<genexpr>z(_assemble_experiments.<locals>.<genexpr>¿   s'   è è € ÐKÐK¸˜CœJÔ3ÐKÐKÐKÐKÐKÐKr-   )Úpulse_libraryr:   )ÚgetattrÚlenr   r   ÚInstructionToQobjConverterr	   ÚPulseQobjInstructionr$   r   Úcompress_pulsesÚ	enumerateÚ_assemble_instructionsr<   ÚQobjExperimentHeaderr;   ÚPulseQobjExperimentr    Úappendr   r   ÚitemsÚmax)r   r(   r   Úfreq_configsr6   Úformatted_schedulesÚcompressed_schedulesÚuser_pulselibr   Úidxr9   Úqobj_instructionsÚmax_memory_slotr<   Úqobj_experiment_headerÚ
experimentÚfreq_idxÚfreq_configr)   s    `                 r+   r%   r%   l   s³  ø€ ð& bÐaÐaÐa½ÀÈ^Ð]_Ñ9`Ô9`ÐaÑaÔa€Lå
ˆ9�~„~˜ÒÐ�c ,Ñ/Ô/¸¸1½cÀ)¹n¼nÐ7MÐMÐMÝð<ñ
ô 
ð 	
õ $ØÐ+­ZÔ-Rñô Ðð 2Ð1µ$Ô2KÐdÐdÈz×OaÒOaÑOcÔOcÐdÐdÐàZÐZÐPYÐZÑZÔZÐÝ%Ô5Ð6IÑJÔJÐà€MØ€KÝÐ 4Ñ5Ô5ð 'ð '‰
ˆˆUÝ-CØÐ(¨*°mñ.
ô .
Ñ*Ð˜?ð ”>ˆØÐØˆHå!%Ô!:Ø(¨1Ñ,Ø”Ð2Ð2¨SÐ2Ð2Øð"
ñ "
ô "
Ðõ Ô-Ø)Ð8Ið
ñ 
ô 
ˆ
ð ð 	7õ " ,Ñ/Ô/°1Ò4Ð4�s�s¸!ˆHØ ,¨XÔ 6ˆJÔà×Ò˜:Ñ&Ô&Ð&Ð&ð ð 
�˜KÑ(Ô(¨AÒ-Ð-Ø  ”^ˆ
ØˆØ'ð 	ð 	ˆKØ×ÒÝÔ(Ø%Ô,Ø!+Ô!8Ø&ðñ ô ñô ð ð ð
ð 
à!.×!4Ò!4Ñ!6Ô!6ð
ñ 
ô 
õ ÐKÐK¸{ÐKÑKÔKÑKÔKðð Ðð Ð)Ð)Ð)r-   r9   r6   rT   c                 óN  — t          j        | ¦  «        } d}g }t          t          ¦  «        }| j        D �]
\  }}t          |t          j        ¦  «        �r0t          |j        t          j	        ¦  «        ryd}		 t          j        |j        ¦  «        j        }
|
|j        vrd}	n# t          $ r d}	Y nw xY w|	s8t	          j        |j                             ¦   «         |j        |j        ¬¦  «        }t          |j        t          j        ¦  «        ryt%          j        |j        j        ¦  «                             ¦   «         }t	          j        t          j        ||j        j        ¬¦  «        |j        |¬¦  «        }|j        j        ||<   t          |t          j        ¦  «        r!t          |j        t.          j        ¦  «        r�ŒŒt          |t          j        ¦  «        rE|j        rt7          ||j        j        ¦  «        }|||j        f                              |¦  «         �Œë|                      |||¦  «        ¦  «         �Œ|rat?          |d¦  «        rtA          ||j!        ¦  «         | "                    ¦   «         D ]'\  \  }}}|                      |||¦  «        ¦  «         Œ(||fS )aÀ  Assembles the instructions in a schedule into a list of PulseQobjInstructions and returns
    related metadata that will be assembled into the Qobj configuration. Lookup table for
    pulses defined in all experiments are registered in ``user_pulselib``. This object should be
    mutable python dictionary so that items are properly updated after each instruction assemble.
    The dictionary is not returned to avoid redundancy.

    Args:
        sched: Schedule to assemble.
        instruction_converter: A converter instance which can convert PulseInstructions to
                               PulseQobjInstructions.
        run_config: Configuration of the runtime environment.
        user_pulselib: User pulse library from previous schedule.

    Returns:
        A list of converted instructions, the user pulse library dictionary (from pulse name to
        pulse samples), and the maximum number of readout memory slots used by this Schedule.
    r   TF)r;   r>   )Úchannelr;   Úmeas_map)#r   r8   r   Úlistr   Ú
isinstanceÚPlayr
   r   ÚSymbolicPulser   Úfrom_instancer;   Úparametric_pulsesÚ
ValueErrorÚget_waveformr]   ÚWaveformÚhashlibÚsha256r?   Ú	hexdigestÚDelayr   ÚAcquireChannelÚAcquireÚmem_slotrP   ÚindexÚdurationrN   r!   Ú_validate_meas_mapr^   rO   )r9   r6   r   rT   rW   rV   Úacquire_instruction_mapÚtimeÚinstructionÚis_backend_supportedÚpulse_shaper;   Ú_Úinstruction_bundles                 r+   rK   rK   Å   sÞ  € õ. Ô,¨UÑ3Ô3€Eà€OØÐå)­$Ñ/Ô/ÐØ"Ô/ð *Kñ *KÑˆˆkå�k¥<Ô#4Ñ5Ô5ñ 	@Ý˜+Ô+­WÔ-BÑCÔCð Ø'+Ð$ð1Ý"7Ô"EÀkÔFWÑ"XÔ"XÔ"]�KØ"¨*Ô*FÐFÐFØ/4Ð,øøÝ!ð 1ð 1ð 1à+0Ð(Ð(Ð(ð1øøøð ,ð Ý".Ô"3Ø#Ô)×6Ò6Ñ8Ô8¸+Ô:MÐT_ÔTdð#ñ #ô #�Kõ ˜+Ô+­WÔ-=Ñ>Ô>ð @Ý”~ kÔ&7Ô&?Ñ@Ô@×JÒJÑLÔL�Ý*Ô/ÝÔ$¨$¸Ô8IÔ8QÐRÑRÔRØ'Ô/Øðñ ô �ð
 '2Ô&7Ô&?�˜dÑ#õ �k¥<Ô#5Ñ6Ô6ð 	½:ØÔ¥Ô!8ñ<
ô <
ð 	ñ å�k¥<Ô#7Ñ8Ô8ð 	ØÔ#ð SÝ"% o°{Ô7KÔ7QÑ"RÔ"R�ð $ T¨;Ô+?Ð$@ÔA×HÒHÈÑUÔUÐUÙà× Ò Ð!6Ð!6°t¸[Ñ!IÔ!IÑJÔJÐJÑJàð Ý�:˜zÑ*Ô*ð 	MÝÐ6¸
Ô8KÑLÔLÐLØ-D×-JÒ-JÑ-LÔ-Lð 	ð 	Ñ)‰IˆT�1Ð)Ø×$Ò$Ø%Ð% dÐ,>Ñ?Ô?ñô ð ð ð ˜oÐ-Ð-s   Á7)B!Â!B0Â/B0Úinstruction_mapr^   c                 óD  — t          |                      ¦   «         d„ ¬¦  «        }d„ |D ¦   «         }t          |dd…         ¦  «        D ]×\  }}|d         d         |d         d         z   }||dz            }|d         d         }||k     r–d„ |d         D ¦   «         }	d	„ |d         D ¦   «         }
|D ]o}|	                     |¦  «        }|
                     |¦  «        }|rA|r?t	          d
|› d|› d|› d|d         d         › d|› d|› d||d         d         z   › �¦  «        ‚ŒpŒØdS )az  Validate all qubits tied in ``meas_map`` are to be acquired.

    Args:
        instruction_map: A dictionary grouping Acquire instructions according to their start time
                         and duration.
        meas_map: List of groups of qubits that must be acquired together.

    Raises:
        QiskitError: If the instructions do not satisfy the measurement map.
    c                 ó   — | d         S )Nr   r0   )Úitems    r+   ú<lambda>z$_validate_meas_map.<locals>.<lambda>'  s
   € ÀtÈAÄw€ r-   )Úkeyc                 ó,   — g | ]}t          |¦  «        ‘ŒS r0   )Úset)r1   Úms     r+   r3   z&_validate_meas_map.<locals>.<listcomp>(  s   € Ð.Ð.Ð. •S˜‘V”VÐ.Ð.Ð.r-   Néÿÿÿÿr   r5   c                 ó&   — h | ]}|j         j        ’ŒS r0   ©r]   ro   ©r1   Úinsts     r+   ú	<setcomp>z%_validate_meas_map.<locals>.<setcomp>0  s   € ÐBÐBÐB°$˜4œ<Ô-ÐBÐBÐBr-   c                 ó&   — h | ]}|j         j        ’ŒS r0   r„   r…   s     r+   r‡   z%_validate_meas_map.<locals>.<setcomp>1  s   € ÐLÐLÐL°t ¤Ô 2ÐLÐLÐLr-   zQubits z and z' are in the same measurement grouping: zf. They must either be acquired at the same time, or disjointly. Instead, they were acquired at times: ú-)ÚsortedrO   rJ   Úintersectionr   )ry   r^   Úsorted_inst_mapÚmeas_map_setsrU   r†   Úinst_end_timeÚ	next_instÚnext_inst_timeÚinst_qubitsÚnext_inst_qubitsÚmeas_setÚcommon_instr_qubitsÚcommon_nexts                 r+   rq   rq     sÀ  € õ ˜_×2Ò2Ñ4Ô4Ð:NÐ:NÐOÑOÔO€OØ.Ð. XÐ.Ñ.Ô.€Mõ ˜¨s°¨sÔ3Ñ4Ô4ð ð ‰	ˆˆTØ˜Qœ œ
 T¨!¤W¨Q¤ZÑ/ˆØ# C¨!¡GÔ,ˆ	Ø" 1œ aœˆØ˜MÒ)Ð)ØBÐB¸$¸q¼'ÐBÑBÔBˆKØLÐL¸yÈ¼|ÐLÑLÔLÐØ)ð 
ð 
�Ø&1×&>Ò&>¸xÑ&HÔ&HÐ#Ø.×;Ò;¸HÑEÔE�Ø&ð ¨;ð Ý%ðOÐ"5ð Oð O¸Kð Oð OØ%-ðOð Oð DHÈÄ7È1Ä:ðOð Oð Q^ðOð Oð *ð	Oð Oð -;¸YÀq¼\È!¼_Ñ,Lð	Oð Oñô ð øøðð r-   r)   c                 ó0  — |                      ¦   «         }|                     |¦  «         |                     dd¦  «         |                     dd¦  «         |                     dd¦  «         |                     dd¦  «        }t	          |t
          j        ¦  «        r
|j        |d<   |                     dd¦  «        }t	          |t
          j        ¦  «        r
|j        |d<   d	„ |d
         D ¦   «         |d
<   d„ |d         D ¦   «         |d<   |                     dg ¦  «        }t          |¦  «        dk    rT|d         }|  
                    |¦  «        }|rd„ |D ¦   «         |d
<   |                      |¦  «        }	|	rd„ |	D ¦   «         |d<   t          j        di |¤ŽS )aI  Assembles the QobjConfiguration from experimental config and runtime config.

    Args:
        lo_converter: The configured frequency converter and validator.
        experiment_config: Schedules to assemble.
        run_config: Configuration of the runtime environment.

    Returns:
        The assembled PulseQobjConfig.
    r^   NÚqubit_lo_rangeÚmeas_lo_rangeÚmeas_returnÚavgÚ
meas_levelé   c                 ó   — g | ]}|d z  ‘ŒS ©g    eÍÍAr0   ©r1   Úfreqs     r+   r3   z$_assemble_config.<locals>.<listcomp>`  s   € Ð#XÐ#XÐ#X°4 D¨3¡JÐ#XÐ#XÐ#Xr-   r   c                 ó   — g | ]}|d z  ‘ŒS rž   r0   rŸ   s     r+   r3   z$_assemble_config.<locals>.<listcomp>a  s   € Ð"VÐ"VÐ"V°$ 4¨#¡:Ð"VÐ"VÐ"Vr-   r   r4   r5   r   c                 ó   — g | ]}|d z  ‘ŒS rž   r0   rŸ   s     r+   r3   z$_assemble_config.<locals>.<listcomp>j  s   € Ð+IÐ+IÐ+I¸4¨D°3©JÐ+IÐ+IÐ+Ir-   c                 ó   — g | ]}|d z  ‘ŒS rž   r0   rŸ   s     r+   r3   z$_assemble_config.<locals>.<listcomp>m  s   € Ð*HÐ*HÐ*H¸$¨4°#©:Ð*HÐ*HÐ*Hr-   r0   )r$   ÚupdateÚpopÚgetr`   Ú
qobj_utilsÚMeasReturnTypeÚvalueÚ	MeasLevelrF   Úget_qubit_losÚget_meas_losr	   ÚPulseQobjConfig)
r(   r)   r   r*   r™   r›   r4   r2   Úq_losÚm_loss
             r+   r&   r&   ?  sÂ  € ð ×$Ò$Ñ&Ô&€KØ×ÒÐ(Ñ)Ô)Ð)ð ‡O‚O�J Ñ%Ô%Ð%Ø‡O‚OÐ$ dÑ+Ô+Ð+Ø‡O‚O�O TÑ*Ô*Ð*ð —/’/ -°Ñ7Ô7€KÝ�+�zÔ8Ñ9Ô9ð 7Ø%0Ô%6ˆ�MÑ"à—’ ¨qÑ1Ô1€JÝ�*�jÔ2Ñ3Ô3ð 5Ø$.Ô$4ˆ�LÑ!ð $YÐ#X¸;ÀÔ;WÐ#XÑ#XÔ#X€K�Ñ Ø"VÐ"V¸+ÀnÔ:UÐ"VÑ"VÔ"V€K�Ñð —?’? >°2Ñ6Ô6€LÝ
ˆ<ÑÔ˜AÒÐØ˜q”/ˆØ×*Ò*¨7Ñ3Ô3ˆàð 	JØ+IÐ+IÀ5Ð+IÑ+IÔ+IˆK˜Ñ(Ø×)Ò)¨'Ñ2Ô2ˆØð 	IØ*HÐ*HÀ%Ð*HÑ*HÔ*HˆK˜Ñ'åÔÐ.Ð. +Ð.Ð.Ð.r-   )2Ú__doc__rh   Úcollectionsr   Útypingr   r   r   r   r   Úqiskitr	   r
   Úqiskit.assembler.run_configr   Úqiskit.exceptionsr   Úqiskit.pulser   r   r   r   r   Úqiskit.qobjr   r§   r   Ú(qiskit.qobj.converters.pulse_instructionr   Úqiskit.utils.deprecate_pulser   ÚScheduleBlockÚScheduleComponentÚintÚ
QobjHeaderr'   r,   r"   rM   Ústrr%   ÚSchedulerG   ÚcomplexrH   rK   rm   rq   r­   r&   r0   r-   r+   ú<module>rÁ      s#  ðð GÐ FØ €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à Ð Ð Ð Ð Ð Ð Ð Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø )Ð )Ð )Ð )Ð )Ð )Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø JÐ JÐ JÐ JÐ JÐ JØ CÐ CÐ CÐ CÐ CÐ Cð ðLØØØÔ"ØÔ&Ø�#�xÔ1Ð1Ô2ð4ô	
ôðLð ðLð ”ðLð ðLð 
„^ðLð Lð Lñ ÔðLð^V*Ø�E˜(Ô4°e¸CÀÔA[Ð<[Ô6\Ð\Ô]Ô^ðV*àÔ.ðV*ð ðV*ð ˆ4�Ô(Ô)¨4°°S°¬>Ð9Ô:ð	V*ð V*ð V*ð V*ðrQ.Ø�” Ô!4Ð4Ô5ðQ.à%Ô@ðQ.ð ðQ.ð ˜˜T 'œ]Ð*Ô+ð	Q.ð
 ˆ4�Ô)Ô*¨CÐ/Ô0ðQ.ð Q.ð Q.ð Q.ðh#Ø˜%  \Ô%9Ð 9Ô:¸DÀÔAUÔ<VÐVÔWð#à�4˜”9Œoð#ð 
ð#ð #ð #ð #ðL0/ØÔ.ð0/à˜C ˜H”~ð0/ð ð0/ð 
Ôð	0/ð 0/ð 0/ð 0/ð 0/ð 0/r-   