§
    ¹³Ùg€  ã                   óv   — d 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  G d	„ d
e¦  «        ZdS )zXA quantum oracle constructed from a logical expression or a string in the DIMACS format.é    )ÚbasenameÚisfile)ÚCallableÚOptional)Údeprecate_func)ÚQuantumCircuit)ÚHAS_TWEEDLEDUMé   )ÚClassicalElementc                   óâ   ‡ — e Zd ZdZej         eddd¬¦  «        ddeded	ed
dfˆ fd„¦   «         ¦   «         Z	ded
e
fd„Z	 	 dde
deed gef                  fd„Zd„ Zedefˆ fd„¦   «         Zˆ xZS )ÚBooleanExpressionzThe Boolean Expression gate.z1.4zin Qiskit 2.0zÌUse `PhaseOracle` instead, which can be turned into a bit-flip oracle by applying Hadamard gates on the target qubit before and after the instruction, and conditioning.the instruction on the target qubit.)ÚsinceÚremoval_timelineÚadditional_msgNÚ
expressionÚnameÚ	var_orderÚreturnc                 óB  •— ddl m} |                     ||¬¦  «        | _        t	          |¦  «        dk    r|dd…         dz   n|}| j                             ¦   «         | j                             ¦   «         z   }t          ¦   «                              |p||g ¬¦  «         dS )	aQ  
        Args:
            expression (str): The logical expression string.
            name (str): Optional. Instruction gate name. Otherwise part of the expression is
               going to be used.
            var_order(list): A list with the order in which variables will be created.
               (default: by appearance)
        r   ©ÚBoolFunction)r   é   Né
   z...)Ú
num_qubitsÚparams)	Ú
tweedledumr   Úfrom_expressionÚ_tweedledum_bool_expressionÚlenÚnum_outputsÚ
num_inputsÚsuperÚ__init__)Úselfr   r   r   r   Úshort_expr_for_namer   Ú	__class__s          €úi/granary/edev/quantum/lib/python3.11/site-packages/qiskit/circuit/classicalfunction/boolean_expression.pyr#   zBooleanExpression.__init__   sÁ   ø€ ð& 	,Ð+Ð+Ð+Ð+Ð+à+7×+GÒ+GØ )ð ,Hñ ,
ô ,
ˆÔ(õ <?¸z¹?¼?ÈRÒ;OÐ;O˜z¨#¨2¨#œ°Ñ6Ð6ÐU_ÐàÔ,×8Ò8Ñ:Ô:ØÔ.×9Ò9Ñ;Ô;ñ<ð 	õ 	‰Œ×Ò˜Ð4Ð!4ÀÐTVÐÑWÔWÐWÐWÐWó    Ú	bitstringc                 ó’   — ddl m} g }|D ]!}|                      |d|¦  «        ¦  «         Œ"t           | j        j        |Ž ¦  «        S )zçEvaluate the expression on a bitstring.

        This evaluation is done classically.

        Args:
            bitstring: The bitstring for which to evaluate.

        Returns:
            bool: result of the evaluation.
        r   )ÚBitVecr
   )r   r+   ÚappendÚboolr   Úsimulate)r$   r)   r+   ÚbitsÚbits        r'   r.   zBooleanExpression.simulate;   se   € ð 	&Ð%Ð%Ð%Ð%Ð%àˆØð 	(ð 	(ˆCØ�KŠK˜˜˜q #™œÑ'Ô'Ð'Ð'ÝÐ=�DÔ4Ô=¸tÐDÑEÔEÐEr(   TÚregisterlessÚsynthesizerc                 ó°   — |rd}nd}|€Cddl m} ddlm} | j                             d¬¦  «        } | ||¦  «        | j        |¬¦  «        S  || ¦  «        S )aó  Synthesis the logic network into a :class:`~qiskit.circuit.QuantumCircuit`.

        Args:
            registerless: Default ``True``. If ``False`` uses the parameter names
                to create registers with those names. Otherwise, creates a circuit with a flat
                quantum register.
            synthesizer: A callable that takes self and returns a Tweedledum
                circuit.
        Returns:
            QuantumCircuit: A circuit implementing the logic network.
        Nr
   )Útweedledum2qiskitr   )Ú
pkrm_synth)Ú
output_bit)r   Úqregs)Úutilsr4   Útweedledum.synthesisr5   r   Útruth_tabler   )r$   r1   r2   r7   r4   r5   r:   s          r'   ÚsynthzBooleanExpression.synthM   s‘   € ð  ð 	ØˆEˆEàˆEàÐØ0Ð0Ð0Ð0Ð0Ð0Ø7Ð7Ð7Ð7Ð7Ð7àÔ:×FÒFÐRSÐFÑTÔTˆKØ$Ð$ Z Z°Ñ%<Ô%<À4Ä9ÐTYÐZÑZÔZÐZØˆ{˜4Ñ Ô Ð r(   c                 ó8   — |                       ¦   «         | _        dS )z9The definition of the boolean expression is its synthesisN)r;   Ú
definition)r$   s    r'   Ú_definezBooleanExpression._definej   s   € àŸ*š*™,œ,ˆŒˆˆr(   Úfilenamec                 ó´  •— t          j        d¦  «         ddlm} |                      | ¦  «        }t          |¦  «        st          d|› d�¦  «        ‚|                     |¦  «        |_        |j         	                    ¦   «         |j         
                    ¦   «         z   }t          t          |¦  «                             t          |¦  «        |g ¬¦  «         |S )a  Create a BooleanExpression from the string in the DIMACS format.
        Args:
            filename: A file in DIMACS format.

        Returns:
            BooleanExpression: A gate for the input string

        Raises:
            FileNotFoundError: If filename is not found.
        r   r   r   z	The file z does not exists.)r   r   r   )r	   Úrequire_nowr   r   Ú__new__r   ÚFileNotFoundErrorÚfrom_dimacs_filer   r!   r    r"   r   r#   r   )Úclsr?   r   Úexpr_objr   r&   s        €r'   rD   z"BooleanExpression.from_dimacs_filen   sì   ø€ õ 	Ô"Ð#6Ñ7Ô7Ð7à+Ð+Ð+Ð+Ð+Ð+à—;’;˜sÑ#Ô#ˆÝ�hÑÔð 	MÝ#Ð$K°Ð$KÐ$KÐ$KÑLÔLÐLØ/;×/LÒ/LÈXÑ/VÔ/VˆÔ,ð Ô0×;Ò;Ñ=Ô=ØÔ2×>Ò>Ñ@Ô@ñAð 	õ 	Õ Ñ*Ô*×3Ò3Ý˜(Ñ#Ô#°
À2ð 	4ñ 	
ô 	
ð 	
ð ˆr(   )NN)TN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   Úrequire_in_instancer   ÚstrÚlistr#   r-   r.   r   r   r   r;   r>   ÚclassmethodrD   Ú__classcell__)r&   s   @r'   r   r      sU  ø€ € € € € Ø&Ð&àÔ'Ø€^ØØ(ð/ðñ ô ðXð X 3ð X¨cð XÀTð XÐUYð Xð Xð Xð Xð Xñô ñ (Ô'ðXð.F #ð F¨$ð Fð Fð Fð Fð( "ØQUð!ð !àð!ð ˜hÐ(;Ð'<¸nÐ'LÔMÔNð!ð !ð !ð !ð:'ð 'ð 'ð ð¨ð ð ð ð ð ñ „[ðð ð ð ð r(   r   N)rJ   Úos.pathr   r   Útypingr   r   Úqiskit.utils.deprecationr   Úqiskit.circuitr   Úqiskit.utils.optionalsr	   Úclassical_elementr   r   © r(   r'   ú<module>rW      sÅ   ðð _Ð ^à $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø )Ð )Ð )Ð )Ð )Ð )Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø /Ð /Ð /Ð /Ð /Ð /ðrð rð rð rð rÐ(ñ rô rð rð rð rr(   