U
    9%e^                     @   sr   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ d	gZG d
d	 d	eZdS )z+The anti-commutator: ``{A,B} = A*B + B*A``.    )Expr)Mul)Integer)S)
prettyForm)Operator)DaggerAntiCommutatorc                   @   sX   e Zd ZdZdZdd Zedd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd ZdS )r	   a  The standard anticommutator, in an unevaluated state.

    Explanation
    ===========

    Evaluating an anticommutator is defined [1]_ as: ``{A, B} = A*B + B*A``.
    This class returns the anticommutator in an unevaluated form.  To evaluate
    the anticommutator, use the ``.doit()`` method.

    Canonical ordering of an anticommutator is ``{A, B}`` for ``A < B``. The
    arguments of the anticommutator are put into canonical order using
    ``__cmp__``. If ``B < A``, then ``{A, B}`` is returned as ``{B, A}``.

    Parameters
    ==========

    A : Expr
        The first argument of the anticommutator {A,B}.
    B : Expr
        The second argument of the anticommutator {A,B}.

    Examples
    ========

    >>> from sympy import symbols
    >>> from sympy.physics.quantum import AntiCommutator
    >>> from sympy.physics.quantum import Operator, Dagger
    >>> x, y = symbols('x,y')
    >>> A = Operator('A')
    >>> B = Operator('B')

    Create an anticommutator and use ``doit()`` to multiply them out.

    >>> ac = AntiCommutator(A,B); ac
    {A,B}
    >>> ac.doit()
    A*B + B*A

    The commutator orders it arguments in canonical order:

    >>> ac = AntiCommutator(B,A); ac
    {A,B}

    Commutative constants are factored out:

    >>> AntiCommutator(3*x*A,x*y*B)
    3*x**2*y*{A,B}

    Adjoint operations applied to the anticommutator are properly applied to
    the arguments:

    >>> Dagger(AntiCommutator(A,B))
    {Dagger(A),Dagger(B)}

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Commutator
    Fc                 C   s*   |  ||}|d k	r|S t| ||}|S )N)evalr   __new__)clsABrobj r   c/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/physics/quantum/anticommutator.pyr   S   s
    zAntiCommutator.__new__c                 C   s   |r|st jS ||kr&td|d  S |js2|jrBtd| | S | \}}| \}}|| }|rtt| | t|t|S ||dkr| ||S d S )N      )r   ZZeror   is_commutativeZargs_cncr   Z
_from_argscompare)r   abcaZncacbncbZc_partr   r   r   r
   Z   s     zAntiCommutator.evalc                 K   s   | j d }| j d }t|trt|trz|j|f|}W n@ tk
rz   z|j|f|}W n tk
rt   d}Y nX Y nX |dk	r|jf |S || ||  jf |S )z Evaluate anticommutator r   r   N)args
isinstancer   Z_eval_anticommutatorNotImplementedErrordoit)selfhintsr   r   Zcommr   r   r   r   o   s    

zAntiCommutator.doitc                 C   s   t t| jd t| jd S )Nr   r   )r	   r   r   )r    r   r   r   _eval_adjoint   s    zAntiCommutator._eval_adjointc                 G   s*   d| j j|| jd || jd f S )Nz	%s(%s,%s)r   r   )	__class____name___printr   r    printerr   r   r   r   
_sympyrepr   s     zAntiCommutator._sympyreprc                 G   s$   d| | jd | | jd f S )Nz{%s,%s}r   r   )r%   r   r&   r   r   r   	_sympystr   s     zAntiCommutator._sympystrc                 G   s^   |j | jd f| }t|td }t||j | jd f|  }t|jddd }|S )Nr   ,r   {})leftright)r%   r   r   r.   parens)r    r'   r   Zpformr   r   r   _pretty   s
     zAntiCommutator._prettyc                    s   dt  fdd| jD  S )Nz\left\{%s,%s\right\}c                    s   g | ]}j |f  qS r   )r%   ).0argr   r'   r   r   
<listcomp>   s    z)AntiCommutator._latex.<locals>.<listcomp>)tupler   r&   r   r3   r   _latex   s    zAntiCommutator._latexN)r$   
__module____qualname____doc__r   r   classmethodr
   r   r"   r(   r)   r0   r6   r   r   r   r   r	      s   ;
N)r9   Zsympy.core.exprr   Zsympy.core.mulr   Zsympy.core.numbersr   Zsympy.core.singletonr   Z sympy.printing.pretty.stringpictr   Zsympy.physics.quantum.operatorr   Zsympy.physics.quantum.daggerr   __all__r	   r   r   r   r   <module>   s   	