§
    ¹³Ùg+1  ã                  ó  — 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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mZmZ  ej        e¦  «        Z  e!¦   «         Z" G d„ de¦  «        Z#dd„Z$dd„Z%dS )zFManager for a set of Passes and their scheduling during transpilation.é    )ÚannotationsN)ÚABCÚabstractmethod)ÚCallableÚIterable)Úchain)ÚAny)Úparallel_mapÚshould_run_in_parallelé   )ÚTaskÚPassManagerIR)ÚPassManagerError)ÚFlowControllerLinear)ÚPropertySetÚWorkflowStatusÚPassManagerStatec                  ó¤   — e Zd ZdZ	 	 d*d+d„Zd,d„Zd-d„Zd.d„Zd„ Zd„ Z	d„ Z
d„ Zed/d„¦   «         Zed0d„¦   «         Z	 	 d1edœd2d#„Zd3d%„Zd4d)„ZdS )5ÚBasePassManagerzPass manager base class.© éè  ÚtasksúTask | list[Task]Úmax_iterationÚintc                óz   — g | _         || _        t          ¦   «         | _        |r|                      |¦  «         dS dS )a  Initialize an empty pass manager object.

        Args:
            tasks: A pass set to be added to the pass manager schedule.
            max_iteration: The maximum number of iterations the schedule will be looped if the
                condition is not met.
        N)Ú_tasksr   r   Úproperty_setÚappend)Úselfr   r   s      úT/granary/edev/quantum/lib/python3.11/site-packages/qiskit/passmanager/passmanager.pyÚ__init__zBasePassManager.__init__'   sK   € ð ˆŒØ*ˆÔõ (™MœMˆÔàð 	Ø�KŠK˜ÑÔÐÐÐð	ð 	ó    ÚreturnÚNonec                óº   — t          |t          ¦  «        r|g}t          d„ |D ¦   «         ¦  «        rt          d¦  «        ‚| j                             |¦  «         dS )zðAppend tasks to the schedule of passes.

        Args:
            tasks: A set of pass manager tasks to be added to schedule.

        Raises:
            TypeError: When any element of tasks is not a subclass of passmanager Task.
        c              3  óB   K  — | ]}t          |t          ¦  «         V — Œd S ©N)Ú
isinstancer   )Ú.0Úts     r!   ú	<genexpr>z)BasePassManager.append.<locals>.<genexpr>J   s/   è è € Ð6Ð6¨1•:˜a¥Ñ&Ô&Ð&Ð6Ð6Ð6Ð6Ð6Ð6r#   z6Added tasks are not all valid pass manager task types.N)r)   r   ÚanyÚ	TypeErrorr   r   )r    r   s     r!   r   zBasePassManager.append<   sh   € õ �e�TÑ"Ô"ð 	Ø�GˆEÝÐ6Ð6°Ð6Ñ6Ô6Ñ6Ô6ð 	VÝÐTÑUÔUÐUàŒ×Ò˜5Ñ!Ô!Ð!Ð!Ð!r#   Úindexc                óh   — 	 || j         |<   dS # t          $ r}t          d|› d�¦  «        |‚d}~ww xY w)a~  Replace a particular pass in the scheduler.

        Args:
            index: Task index to replace, based on the position in :meth:`tasks`
            tasks: A set of pass manager tasks to be added to schedule.

        Raises:
            TypeError: When any element of tasks is not a subclass of passmanager Task.
            PassManagerError: If the index is not found.
        úIndex to replace ú does not existsN©r   Ú
IndexErrorr   )r    r/   r   Úexs       r!   ÚreplacezBasePassManager.replaceO   sZ   € ð	XØ!&ˆDŒK˜ÑÐÐøÝð 	Xð 	Xð 	XÝ"Ð#N°uÐ#NÐ#NÐ#NÑOÔOÐUWÐWøøøøð	Xøøøs   ‚
 Ž
1˜,¬1c                ód   — 	 | j         |= dS # t          $ r}t          d|› d�¦  «        |‚d}~ww xY w)zßRemoves a particular pass in the scheduler.

        Args:
            index: Pass index to remove, based on the position in :meth:`passes`.

        Raises:
            PassManagerError: If the index is not found.
        r1   r2   Nr3   )r    r/   r5   s      r!   ÚremovezBasePassManager.removec   sX   € ð	XØ”˜EÐ"Ð"Ð"øÝð 	Xð 	Xð 	XÝ"Ð#N°uÐ#NÐ#NÐ#NÑOÔOÐUWÐWøøøøð	Xøøøs   ‚ Œ
/–*ª/c                ó2   — |                       ||¦  «         d S r(   )r6   )r    r/   Úitems      r!   Ú__setitem__zBasePassManager.__setitem__q   s   € Ø�Š�U˜DÑ!Ô!Ð!Ð!Ð!r#   c                ó*   — t          | j        ¦  «        S r(   )Úlenr   )r    s    r!   Ú__len__zBasePassManager.__len__t   s   € Ý�4”;ÑÔÐr#   c                ó`   — |                       | j        ¬¦  «        }| j        |         |_        |S )N©r   )Ú	__class__r   r   )r    r/   Únew_passmanagers      r!   Ú__getitem__zBasePassManager.__getitem__w   s-   € ØŸ.š.°tÔ7I˜.ÑJÔJˆØ!%¤¨UÔ!3ˆÔØÐr#   c                ó<  — |                       | j        ¬¦  «        }| j        |_        t          || j         ¦  «        r|xj        |j        z  c_        |S 	 |                     |¦  «         |S # t
          $ r%}t          d| j         › d|j         › �¦  «        |‚d }~ww xY w)Nr@   zunsupported operand type + for z and )rA   r   r   r)   r   r   r.   )r    ÚotherrB   r5   s       r!   Ú__add__zBasePassManager.__add__|   s¼   € ØŸ.š.°tÔ7I˜.ÑJÔJˆØ!%¤ˆÔÝ�e˜Tœ^Ñ,Ô,ð 
	ØÐ"Ô" e¤lÑ2Ð"Ô"Ø"Ð"ðØ×&Ò& uÑ-Ô-Ð-Ø&Ð&øÝ#ð ð ð ÝØ\°d´nÐ\Ð\È5Ì?Ð\Ð\ñô àðøøøøðøøøs   ÁA, Á,
BÁ6 BÂBÚinput_programr	   r   c                ó   — dS )z™Convert input program into pass manager IR.

        Args:
            in_program: Input program.

        Returns:
            Pass manager IR.
        Nr   )r    rG   Úkwargss      r!   Ú_passmanager_frontendz%BasePassManager._passmanager_frontend‹   s	   € ð 	ˆr#   Úpassmanager_irÚ
in_programc                ó   — dS )aj  Convert pass manager IR into output program.

        Args:
            passmanager_ir: Pass manager IR after optimization.
            in_program: The input program, this can be used if you need
                any metadata about the original input for the output.
                It should not be mutated.

        Returns:
            Output program.
        Nr   )r    rK   rL   rI   s       r!   Ú_passmanager_backendz$BasePassManager._passmanager_backend›   s	   € ð$ 	ˆr#   N)r   Úin_programsúAny | list[Any]Úcallbackr   Únum_processesr   Úobjectc               ó¬  ‡ ‡‡— |t           ur!t          j        dt          d¬¦  «         |‰d<   ‰ j        s‰s‰€|S d}t          |t          ¦  «        s|g}d}t          |¦  «        dk    st          |¦  «        s/ˆˆˆ fd	„|D ¦   «         }t          |¦  «        dk    r
|s|d
         S |S ‹‹t          t          |dt          j        ‰ ¦  «        i|¬¦  «        S )a‡	  Run all the passes on the specified ``in_programs``.

        Args:
            in_programs: Input programs to transform via all the registered passes.
                A single input object cannot be a Python builtin list object.
                A list object is considered as multiple input objects to optimize.
            callback: A callback function that will be called after each pass execution. The
                function will be called with 4 keyword arguments::

                    task (GenericPass): the pass being run
                    passmanager_ir (Any): depending on pass manager subclass
                    property_set (PropertySet): the property set
                    running_time (float): the time to execute the pass
                    count (int): the index for the pass execution

                The exact arguments pass expose the internals of the pass
                manager and are subject to change as the pass manager internals
                change. If you intend to reuse a callback function over
                multiple releases be sure to check that the arguments being
                passed are the same.

                To use the callback feature you define a function that will
                take in kwargs dict and access the variables. For example::

                    def callback_func(**kwargs):
                        task = kwargs['task']
                        passmanager_ir = kwargs['passmanager_ir']
                        property_set = kwargs['property_set']
                        running_time = kwargs['running_time']
                        count = kwargs['count']
                        ...
            num_processes: The maximum number of parallel processes to launch if parallel
                execution is enabled. This argument overrides ``num_processes`` in the user
                configuration file, and the ``QISKIT_NUM_PROCS`` environment variable. If set
                to ``None`` the system default or local user configuration will be used.
            property_set: Currently a key that will be interpreted as all other arbitrary
                ``kwargs``.  In Qiskit 2.0, this will instead seed the :class:`.PropertySet` of the
                compilation (but does not do so in this version).
            kwargs: Arbitrary arguments passed to the compiler frontend and backend.

        Returns:
            The transformed program(s).
        zóFrom Qiskit 2.0, 'property_set' will be a reserved keyword argument of 'BasePassManager.run', and not passed on to the conversion functions. This subclass of 'BasePassManager' needs to use a different keyword argument for passing on this data.é   )Ú
stacklevelr   NTFr   c           	     ó0   •— g | ]}t          d|‰‰d œ‰¤Ž‘ŒS ))ÚprogramÚpass_managerrQ   r   )Ú_run_workflow)r*   rX   rQ   rI   r    s     €€€r!   ú
<listcomp>z'BasePassManager.run.<locals>.<listcomp>ù   sA   ø€ ð ð ð àõ Ð^ g¸DÈ8Ð^Ð^ÐW]Ð^Ð^ðð ð r#   r   Úpass_manager_bin)ÚvaluesÚtask_kwargsrR   )Ú_MISSINGÚwarningsÚwarnÚFutureWarningr   r)   Úlistr=   r   r
   Ú_run_workflow_in_new_processÚdillÚdumps)r    rO   rQ   rR   r   rI   Úis_listÚouts   ` `  `  r!   ÚrunzBasePassManager.run¯   s;  øøø€ ðh �xÐ'Ð'ÝŒMð-õ Øðñ ô ð ð &2ˆF�>Ñ"àŒ{ð 	 6ð 	¨hÐ.>ØÐàˆÝ˜+¥tÑ,Ô,ð 	Ø&˜-ˆKØˆGõ ˆ{ÑÔ˜qÒ Ð Õ(>¸}Ñ(MÔ(MÐ ðð ð ð ð ð à*ðñ ô ˆCõ �;ÑÔ 1Ò$Ð$¨WÐ$Ø˜1”v�ØˆJàØõ Ý(ØØ+­T¬Z¸Ñ-=Ô-=Ð>Ø'ð	
ñ 
ô 
ð 	
r#   r   c                ón   — t          |                      | j        ¦  «        ¦  «        }t          |¦  «        S )zÄLinearize this manager into a single :class:`.FlowControllerLinear`,
        so that it can be nested inside another pass manager.

        Returns:
            A linearized pass manager.
        )rc   Ú_flatten_tasksr   r   )r    Úflatten_taskss     r!   Úto_flow_controllerz"BasePassManager.to_flow_controller  s/   € õ ˜T×0Ò0°´Ñ=Ô=Ñ>Ô>ˆÝ# MÑ2Ô2Ð2r#   ÚelementsúIterable | Taskr   c                ój   — t          |t          ¦  «        s|gS t          t          | j        |¦  «        Ž S )z;A helper method to recursively flatten a nested task chain.)r)   r   r   Úmaprk   )r    rn   s     r!   rk   zBasePassManager._flatten_tasks  s4   € å˜(¥HÑ-Ô-ð 	Ø�:ÐÝ•c˜$Ô-¨xÑ8Ô8Ð9Ð9r#   )r   r   )r   r   r   r   )r   r   r$   r%   )r/   r   r   r   r$   r%   )r/   r   r$   r%   )rG   r	   r$   r   )rK   r   rL   r	   r$   r	   )NN)
rO   rP   rQ   r   rR   r   r   rS   r$   r	   )r$   r   )rn   ro   r$   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r   r6   r8   r;   r>   rC   rF   r   rJ   rN   r_   ri   rm   rk   r   r#   r!   r   r   $   s[  € € € € € Ø"Ð"ð $&Ø!ðð ð ð ð ð*"ð "ð "ð "ð&Xð Xð Xð Xð(Xð Xð Xð Xð"ð "ð "ð ð  ð  ðð ð ð
ð ð ð ðð ð ñ „^ðð ðð ð ñ „^ðð, "Ø!ð	^
ð  (ð^
ð ^
ð ^
ð ^
ð ^
ð ^
ð@3ð 3ð 3ð 3ð:ð :ð :ð :ð :ð :r#   r   rX   r	   rY   r$   c                ó4  — |                      ¦   «         }t          ¦   «         } |j        dd| i|¤Ž}|                     |t	          |t          ¦   «         ¬¦  «        |                     dd¦  «        ¬¦  «        \  }}|j        |_         |j        d|| dœ|¤Ž}|S )a  Run single program optimization with a pass manager.

    Args:
        program: Arbitrary program to optimize.
        pass_manager: Pass manager with scheduled passes.
        **kwargs: Keyword arguments for IR conversion.

    Returns:
        Optimized program.
    rG   )Úworkflow_statusr   rQ   N)rK   ÚstaterQ   )rK   rL   r   )	rm   r   rJ   Úexecuter   r   Úgetr   rN   )rX   rY   rI   Úflow_controllerÚinitial_statusrK   Úfinal_stateÚout_programs           r!   rZ   rZ      sß   € ð #×5Ò5Ñ7Ô7€OÝ#Ñ%Ô%€Nà7�\Ô7ð ð Øðà
ðð €Nð #2×"9Ò"9Ø%ÝØ*Ý$™œð
ñ 
ô 
ð —’˜J¨Ñ-Ô-ð #:ñ #ô #Ñ€N�Kð !,Ô 8€LÔà3�,Ô3ð Ø%Øðð ð ðð €Kð Ðr#   r\   Úbytesc                óH   — t          | t          j        |¦  «        ¬¦  «        S )zæRun single program optimization in new process.

    Args:
        program: Arbitrary program to optimize.
        pass_manager_bin: Binary of the pass manager with scheduled passes.

    Returns:
          Optimized program.
    )rX   rY   )rZ   re   Úloads)rX   r\   s     r!   rd   rd   O  s,   € õ ØÝ”ZÐ 0Ñ1Ô1ðñ ô ð r#   )rX   r	   rY   r   r$   r	   )rX   r	   r\   r   r$   r	   )&ru   Ú
__future__r   Úloggingr`   Úabcr   r   Úcollections.abcr   r   Ú	itertoolsr   Útypingr	   re   Úqiskit.utils.parallelr
   r   Ú
base_tasksr   r   Ú
exceptionsr   Úflow_controllersr   Úcompilation_statusr   r   r   Ú	getLoggerrr   ÚloggerrS   r_   r   rZ   rd   r   r#   r!   ú<module>r�      s„  ðð MÐ LØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø (Ð (Ð (Ð (Ð (Ð (Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ Mà	ˆÔ	˜8Ñ	$Ô	$€àˆ6‰8Œ8€ðy:ð y:ð y:ð y:ð y:�cñ y:ô y:ð y:ðx,ð ,ð ,ð ,ð^ð ð ð ð ð r#   