§
    º³ÙgD'  ã                  ó–   — d Z ddlmZ ddlZddlZddl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  G d„ d	ej        ¦  «        Zddd„ZdS )z@Parser for mathematical string expressions returned by backends.é    )ÚannotationsN)ÚCallable)ÚAny)Ú
PulseError)ÚParameterExpressionc            
      ór  — e Zd ZU dZi dej        “dej        “dej        “dej        “dej	        “dej
        “dej        “d	ej        “d
ej        “dej        “dej        “dej        “dej        “dej        “dej        “dej        “dej        “dej        i¥Zded<   	 ej        ej        ej        ej        ej        ej         ej!        ej"        ej#        ej$        iZ%	 ej&        ej'        ej(        ej)        iZ*	 d:d;d„Z+e,d<d„¦   «         Z-d=d „Z.e/d>d&„¦   «         Z0d?d)„Z1d@d+„Z2dAd.„Z3dBd1„Z4dCd4„Z5dDd7„Z6d8„ Z7d9S )EÚPulseExpressionz/Expression parser to evaluate parameter values.ÚacosÚacoshÚasinÚasinhÚatanÚatanhÚcosÚcoshÚexpÚlogÚlog10ÚsinÚsinhÚsqrtÚtanÚtanhÚpiÚezdict[str, Callable | float]Ú	_math_opsFÚsourceústr | ast.ExpressionÚpartial_bindingÚboolc                óD  — || _         i | _        t          ¦   «         | _        t	          |t
          j        ¦  «        r|| _        nB	 t          j        |d¬¦  «        | _        n%# t          $ r}t          |› d�¦  «        |‚d}~ww xY w|                      | j        ¦  «         dS )zïCreate new evaluator.

        Args:
            source: Expression of equation to evaluate.
            partial_binding: Allow partial bind of parameters.

        Raises:
            PulseError: When invalid string is specified.
        Úeval)Úmodez is invalid expression.N)Ú_partial_bindingÚ_locals_dictÚsetÚ_paramsÚ
isinstanceÚastÚ
ExpressionÚ_treeÚparseÚSyntaxErrorr   Úvisit)Úselfr   r   Úexs       úI/granary/edev/quantum/lib/python3.11/site-packages/qiskit/pulse/parser.pyÚ__init__zPulseExpression.__init__B   s³   € ð !0ˆÔØ,.ˆÔÝ!$¡¤ˆŒå�f�cœnÑ-Ô-ð 	MØˆDŒJˆJðMÝ œY v°FÐ;Ñ;Ô;�”
�
øÝð Mð Mð MÝ  FÐ!CÐ!CÐ!CÑDÔDÈ"ÐLøøøøðMøøøð 	�
Š
�4”:ÑÔÐÐÐs   ÁA! Á!
BÁ+A>Á>BÚreturnú	list[str]c                óN   — t          | j                             ¦   «         ¦  «        S )z\Get parameters.

        Returns:
            A list of parameters in sorted order.
        )Úsortedr'   Úcopy)r/   s    r1   ÚparamszPulseExpression.params[   s    € õ �d”l×'Ò'Ñ)Ô)Ñ*Ô*Ð*ó    ú*complex | ast.Expression | PulseExpressionc                óÊ  — t          | j        j        t          j        ¦  «        r| j        j        j        S | j                             ¦   «          |r%t          | j	        |¦  «        D ]\  }}|| j        |<   Œ|rt| 
                    ¦   «         D ]_\  }}|| j	        v r3|| j        vr|| j        |<   Œ"t          | j        j        › d|› d�¦  «        ‚t          | j        j        › d|› d�¦  «        ‚|                      | j        ¦  «        }t          |j        t          j        ¦  «        s4| j        rt!          || j        ¦  «        S t          d| j	        › d�¦  «        ‚|j        j        S )a;  Evaluate the expression with the given values of the expression's parameters.

        Args:
            *args: Variable length parameter list.
            **kwargs: Arbitrary parameters.

        Returns:
            Evaluated value.

        Raises:
            PulseError: When parameters are not bound.
        z# got multiple values for argument 'ú'z% got an unexpected keyword argument 'zParameters z are not all bound.)r(   r+   Úbodyr)   ÚConstantÚvaluer%   ÚclearÚzipr8   Úitemsr   Ú	__class__Ú__name__r.   r$   r	   )r/   ÚargsÚkwargsÚkeyÚvalÚexprs         r1   Ú__call__zPulseExpression.__call__d   sŽ  € õ �d”j”o¥s¤|Ñ4Ô4ð 	)Ø”:”?Ô(Ð(àÔ×ÒÑ!Ô!Ð!Øð 	-Ý ¤¨TÑ2Ô2ð -ð -‘��SØ),�Ô! #Ñ&Ð&Øð 	Ø"ŸLšL™NœNð ð ‘��SØ˜$œ+Ð%Ð%Ø $Ô"3Ð3Ð3Ø14˜Ô)¨#Ñ.Ð.å(Ø#œ~Ô6ÐaÐaÐ[^ÐaÐaÐañô ð õ %Øœ>Ô2Ð_Ð_ÐY\Ð_Ð_Ð_ñô ð ð �zŠz˜$œ*Ñ%Ô%ˆå˜$œ)¥S¤\Ñ2Ô2ð 	QØÔ$ð QÝ& t¨TÔ-BÑCÔCÐCå Ð!O¨t¬{Ð!OÐ!OÐ!OÑPÔPÐPØŒyŒÐr9   Úoprúast.ASTÚopr_dictÚdictÚcomplexc                óž   — |                      ¦   «         D ]\  }}t          | |¦  «        r ||Ž c S Œt          d| j        j        › d�¦  «        ‚)aC  Helper method to apply operators.

        Args:
            opr: Operator of node.
            opr_dict: Mapper from ast to operator.
            *args: Arguments supplied to operator.

        Returns:
            Evaluated value.

        Raises:
            PulseError: When unsupported operation is specified.
        z	Operator ú is not supported.)rB   r(   r   rC   rD   )rK   rM   rE   Úop_typeÚop_funcs        r1   Ú
_match_opszPulseExpression._match_ops�   sj   € ð !)§¢Ñ 0Ô 0ð 	&ð 	&ÑˆG�WÝ˜#˜wÑ'Ô'ð &Ø�w �~Ð%Ð%Ð%ð&åÐO S¤]Ô%;ÐOÐOÐOÑPÔPÐPr9   Únodeúast.Expressionc                ól   — t          j         |¦  «        }|                      |j        ¦  «        |_        |S )z—Evaluate children nodes of expression.

        Args:
            node: Expression to evaluate.

        Returns:
            Evaluated value.
        )r7   r.   r=   )r/   rU   Útmp_nodes      r1   Úvisit_Expressionz PulseExpression.visit_Expression£   s+   € õ ”9˜T‘?”?ˆØŸ
š
 8¤=Ñ1Ô1ˆŒàˆr9   úast.Constantc                ó   — |S )z}Return constant value as it is.

        Args:
            node: Constant.

        Returns:
            Input node.
        © ©r/   rU   s     r1   Úvisit_ConstantzPulseExpression.visit_Constant±   s	   € ð ˆr9   úast.Nameúast.Name | ast.Constantc                óH  — |j         | j        v r9t          j        | j        |j                  ¦  «        }t          j        ||¦  «        S |j         | j        v r­| j        |j                  }t          |t          ¦  «        s]	 t          |¦  «        }|j	        s|j
        }n># t          $ r1}t          d|j         › d| j        |j                  › d�¦  «        |‚d}~ww xY wt          j        |¦  «        }t          j        ||¦  «        S | j                             |j         ¦  «         |S )zïEvaluate name and return ast.Constant if it is bound.

        Args:
            node: Name to evaluate.

        Returns:
            Evaluated value.

        Raises:
            PulseError: When parameter value is not a number.
        zInvalid parameter value z = z is specified.N)Úidr   r)   r>   Úcopy_locationr%   r(   r   rO   ÚimagÚrealÚ
ValueErrorr   r'   Úadd)r/   rU   rH   Ú_valr0   s        r1   Ú
visit_NamezPulseExpression.visit_Name¼   s9  € ð Œ7�d”nÐ$Ð$Ý”,˜tœ~¨d¬gÔ6Ñ7Ô7ˆCÝÔ$ S¨$Ñ/Ô/Ð/ØŒW˜Ô)Ð)Ð)ØÔ$ T¤WÔ-ˆDÝ˜dÕ$7Ñ8Ô8ð 
ðÝ" 4™=œ=�DØœ9ð )Ø#œy˜øøÝ!ð ð ð Ý$ð%°4´7ð %ð %¸tÔ?PÐQUÔQXÔ?Yð %ð %ð %ñô ð ðøøøøðøøøõ
 ”,˜tÑ$Ô$ˆCÝÔ$ S¨$Ñ/Ô/Ð/ØŒ×Ò˜œÑ!Ô!Ð!Øˆs   Á>B Â
CÂ&,CÃCúast.UnaryOpúast.UnaryOp | ast.Constantc                óN  — t          j         |¦  «        }|                      |j        ¦  «        |_        t          |j        t          j        ¦  «        rRt	          j        |                      |j        | j        |j        j	        ¦  «        ¦  «        }t	          j
        ||¦  «        S |S )z»Evaluate unary operation and return ast.Constant if operand is bound.

        Args:
            node: Unary operation to evaluate.

        Returns:
            Evaluated value.
        )r7   r.   Úoperandr(   r)   r>   rT   ÚopÚ
_unary_opsr?   rc   ©r/   rU   rH   s      r1   Úvisit_UnaryOpzPulseExpression.visit_UnaryOpÝ   s|   € õ Œy˜‰ŒˆØ—z’z $¤,Ñ/Ô/ˆŒÝ�d”l¥C¤LÑ1Ô1ð 	0Ý”,˜tŸš¨t¬w¸¼ÈÌÔI[Ñ\Ô\Ñ]Ô]ˆCÝÔ$ S¨$Ñ/Ô/Ð/Øˆr9   ú	ast.BinOpúast.BinOp | ast.Constantc                óà  — t          j         |¦  «        }|                      |j        ¦  «        |_        |                      |j        ¦  «        |_        t	          |j        t
          j        ¦  «        r|t	          |j        t
          j        ¦  «        r]t          j        |                      |j        | j	        |j        j
        |j        j
        ¦  «        ¦  «        }t          j        ||¦  «        S |S )z¿Evaluate binary operation and return ast.Constant if operands are bound.

        Args:
            node: Binary operation to evaluate.

        Returns:
            Evaluated value.
        )r7   r.   ÚleftÚrightr(   r)   r>   rT   rn   Ú_binary_opsr?   rc   rp   s      r1   Úvisit_BinOpzPulseExpression.visit_BinOpí   s´   € õ Œy˜‰ŒˆØ—J’J˜tœyÑ)Ô)ˆŒ	Ø—Z’Z ¤
Ñ+Ô+ˆŒ
Ý�d”i¥¤Ñ.Ô.ð 	0µ:¸d¼jÍ#Ì,Ñ3WÔ3Wð 	0Ý”,Ø—’ ¤¨Ô)9¸4¼9¼?ÈDÌJÔL\Ñ]Ô]ñô ˆCõ Ô$ S¨$Ñ/Ô/Ð/Øˆr9   úast.Callúast.Call | ast.Constantc                ó  ‡ — t          |j        t          j        ¦  «        st	          d¦  «        ‚t          j        |¦  «        }ˆ fd„|j        D ¦   «         |_        t          d„ |j        D ¦   «         ¦  «        r’|j        j        ‰ j	        vrt	          d|j        j        › d�¦  «        ‚d„ |j        D ¦   «         } ‰ j	        |j        j                 |Ž }|j
        s|j        }t          j        |¦  «        }t          j        ||¦  «        S |S )a  Evaluate function and return ast.Constant if all arguments are bound.

        Args:
            node: Function to evaluate.

        Returns:
            Evaluated value.

        Raises:
            PulseError: When unsupported or unsafe function is specified.
        zUnsafe expression is detected.c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r\   )r.   )Ú.0Úargr/   s     €r1   ú
<listcomp>z.PulseExpression.visit_Call.<locals>.<listcomp>  s#   ø€ Ð:Ð:Ð:¨�T—Z’Z ‘_”_Ð:Ð:Ð:r9   c              3  óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S )N)r(   r)   r>   ©r}   r~   s     r1   ú	<genexpr>z-PulseExpression.visit_Call.<locals>.<genexpr>  s.   è è € ÐBÐB°�z˜#�sœ|Ñ,Ô,ÐBÐBÐBÐBÐBÐBr9   z	Function rQ   c                ó   — g | ]	}|j         ‘Œ
S r\   )r?   r�   s     r1   r   z.PulseExpression.visit_Call.<locals>.<listcomp>  s   € Ð4Ð4Ð4 3�S”YÐ4Ð4Ð4r9   )r(   Úfuncr)   ÚNamer   r7   rE   Úallrb   r   rd   re   r>   rc   )r/   rU   Ú_argsrh   rH   s   `    r1   Ú
visit_CallzPulseExpression.visit_Call   s  ø€ õ ˜$œ)¥S¤XÑ.Ô.ð 	?ÝÐ=Ñ>Ô>Ð>ÝŒy˜‰ŒˆØ:Ð:Ð:Ð:°´	Ð:Ñ:Ô:ˆŒ	ÝÐBÐB¸¼	ÐBÑBÔBÑBÔBð 	0ØŒyŒ| 4¤>Ð1Ð1Ý Ð!M¨T¬Y¬\Ð!MÐ!MÐ!MÑNÔNÐNØ4Ð4¨$¬)Ð4Ñ4Ô4ˆEØ/�4”> $¤)¤,Ô/°Ð7ˆDØ”9ð !Ø”y�Ý”,˜tÑ$Ô$ˆCÝÔ$ S¨$Ñ/Ô/Ð/Øˆr9   c                ó:   — t          d|j        j        › �¦  «        ‚)NzUnsupported node: )r   rC   rD   r]   s     r1   Úgeneric_visitzPulseExpression.generic_visit  s   € ÝÐG¨d¬nÔ.EÐGÐGÑHÔHÐHr9   N©F)r   r   r   r    )r3   r4   )r3   r:   )rK   rL   rM   rN   r3   rO   )rU   rV   r3   rV   )rU   rZ   r3   rZ   )rU   r_   r3   r`   )rU   rj   r3   rk   )rU   rr   r3   rs   )rU   ry   r3   rz   )8rD   Ú
__module__Ú__qualname__Ú__doc__Úcmathr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__annotations__r)   ÚAddÚoperatorrg   ÚSubÚsubÚMultÚmulÚDivÚtruedivÚPowÚpowrw   ÚUAddÚposÚUSubÚnegro   r2   Úpropertyr8   rJ   ÚstaticmethodrT   rY   r^   ri   rq   rx   rˆ   rŠ   r\   r9   r1   r	   r	      s�  € € € € € € Ø9Ð9ð.Ø�”
ð.à�”ð.ð 	�”
ð.ð 	�”ð	.ð
 	�”
ð.ð 	�”ð.ð 	ˆuŒyð.ð 	�”
ð.ð 	ˆuŒyð.ð 	ˆuŒyð.ð 	�”ð.ð 	ˆuŒyð.ð 	�”
ð.ð 	�”
ð.ð 	ˆuŒyð.ð  	�”
ð!.ð" 	ˆeŒhð#.ð$ 	ˆUŒWð%.ð .€Ið ð ð ñ ð(  ð 	Œ�”ØŒ�”ØŒ�(”,ØŒ�Ô!ØŒ�”ð€Kð #à”(˜HœL¨#¬(°H´LÐA€JØ!ðð ð ð ð ð2 ð+ð +ð +ñ „Xð+ð)ð )ð )ð )ðV ðQð Qð Qñ „\ðQð&ð ð ð ð	ð 	ð 	ð 	ðð ð ð ðBð ð ð ð ð ð ð ð&ð ð ð ð6Ið Ið Ið Ið Ir9   r	   Fr   Ústrr   r    r3   c                óf   — g d¢}|D ]\  }}|                       ||¦  «        } Œt          | |¦  «        S )a"  Safe parsing of string expression.

    Args:
        source: String expression to parse.
        partial_binding: Allow partial bind of parameters.

    Returns:
        PulseExpression: Returns a expression object.

    Example:

        expr = 'P1 + P2 + P3'
        parsed_expr = parse_string_expr(expr, partial_binding=True)

        # create new PulseExpression
        bound_two = parsed_expr(P1=1, P2=2)
        # evaluate expression
        value1 = bound_two(P3=3)
        value2 = bound_two(P3=4)
        value3 = bound_two(P3=5)

    ))znumpy.Ú )znp.r£   )zmath.r£   )zcmath.r£   )Úreplacer	   )r   r   ÚsubsÚmatchr”   s        r1   Úparse_string_exprr§     sH   € ð. HÐGÐG€DØð ,ð ,‰
ˆˆsØ—’  sÑ+Ô+ˆˆå˜6 ?Ñ3Ô3Ð3r9   r‹   )r   r¡   r   r    r3   r	   )rŽ   Ú
__future__r   r)   r7   r’   r�   Úcollections.abcr   Útypingr   Úqiskit.pulse.exceptionsr   Úqiskit.circuitr   ÚNodeTransformerr	   r§   r\   r9   r1   ú<module>r®      sí   ðð GÐ FØ "Ð "Ð "Ð "Ð "Ð "Ø 
€
€
€
Ø €€€Ø €€€à €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à .Ð .Ð .Ð .Ð .Ð .Ø .Ð .Ð .Ð .Ð .Ð .ðIð Ið Ið Ið I�cÔ)ñ Iô Ið IðD4ð 4ð 4ð 4ð 4ð 4ð 4r9   