
    gw                         d Z ddlmZ ddlmZ ddlmZ ddlmZmZm	Z	 ddl
mZ g dZ G d d	e          Z G d
 de          Z G d de	          ZdS )zFermionic quantum operators.    )IntegerS)Operator)HilbertSpaceKetBra)KroneckerDelta)	FermionOpFermionFockKetFermionFockBrac                       e Zd ZdZed             Zed             Zed             Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd ZdS )r   a"  A fermionic operator that satisfies {c, Dagger(c)} == 1.

    Parameters
    ==========

    name : str
        A string that labels the fermionic mode.

    annihilation : bool
        A bool that indicates if the fermionic operator is an annihilation
        (True, default value) or creation operator (False)

    Examples
    ========

    >>> from sympy.physics.quantum import Dagger, AntiCommutator
    >>> from sympy.physics.quantum.fermion import FermionOp
    >>> c = FermionOp("c")
    >>> AntiCommutator(c, Dagger(c)).doit()
    1
    c                     | j         d         S Nr   )argsselfs    Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/physics/quantum/fermion.pynamezFermionOp.name'   s    y|    c                 6    t          | j        d                   S )N   )boolr   r   s    r   is_annihilationzFermionOp.is_annihilation+   s    DIaL!!!r   c                     dS )N)cT r   s    r   default_argszFermionOp.default_args/   s    {r   c                    t          |          dvrt          d|z            t          |          dk    r|d         t          j        f}t          |          dk    r|d         t	          |d                   f}t          j        | g|R  S )N)r      z"1 or 2 parameters expected, got %sr   r   r    )len
ValueErrorr   Oner   r   __new__)clsr   hintss      r   r$   zFermionOp.__new__3   s    4yyF""ADHIIIt99>>GQU#Dt99>>GWT!W--.D+d++++r   c                 6    d|v r|d         rt           j        S d S )Nindependentr   Zeror   otherr&   s      r   _eval_commutator_FermionOpz$FermionOp._eval_commutator_FermionOp?   s#    E!!eM&:!6Mtr   c                     | j         |j         k    r| j        s|j        rt          j        S nd|v r|d         rd| z  |z  S d S )Nr(   r    )r   r   r   r#   r+   s      r   _eval_anticommutator_FermionOpz(FermionOp._eval_anticommutator_FermionOpF   sW    9
""' E,A ue##m(<#t8e##tr   c                     d| z  |z  S )Nr    r   r+   s      r   _eval_anticommutator_BosonOpz&FermionOp._eval_anticommutator_BosonOpR   s    4x%r   c                     t           j        S Nr)   r+   s      r   _eval_commutator_BosonOpz"FermionOp._eval_commutator_BosonOpV   s	    vr   c                 R    t          t          | j                  | j                   S r3   )r   strr   r   r   s    r   _eval_adjointzFermionOp._eval_adjointY   s     TYT-A)ABBBr   c                 l    | j         rdt          | j                  z  S dt          | j                  z  S )Nz{%s}z{{%s}^\dagger}r   r6   r   r   printerr   s      r   _print_contents_latexzFermionOp._print_contents_latex\   s3     	6S^^++$s49~~55r   c                 l    | j         rdt          | j                  z  S dt          | j                  z  S )Nz%sz
Dagger(%s)r9   r:   s      r   _print_contentszFermionOp._print_contentsb   s3     	23ty>>)) 3ty>>11r   c                 n    ddl m}  |j        | j        d         g|R  }| j        r|S | |d          z  S )Nr   )
prettyFormu   †) sympy.printing.pretty.stringpictr@   _printr   r   )r   r;   r   r@   pforms        r   _print_contents_prettyz FermionOp._print_contents_prettyh   sX    ??????ty|3d333 	3L**\2222r   c                     ddl m} |dk    r|j        S |dk    r| S |dk    dk    r|j        dk    r|j        S |dk     dk    s|j        dk    rt          d          t          j        | |          S )Nr   r   r   TFzBFermionic operators can only be raised to a positive integer power)sympy.core.singletonr   r#   
is_integerr*   r"   r   _eval_power)r   expr   s      r   rH   zFermionOp._eval_powerp   s    ******!885LAXXKAg$3>T#9#96MAg$#.E"9"9 * + + +#D#...r   N)__name__
__module____qualname____doc__propertyr   r   classmethodr   r$   r-   r/   r1   r4   r7   r<   r>   rD   rH   r   r   r   r   r      s        *   X " " X"   [
, 
, 
,  
 
 
       C C C6 6 62 2 23 3 3/ / / / /r   r   c                   f    e Zd ZdZd Zed             Zed             Zed             Z	d Z
d ZdS )	r   zxFock state ket for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 R    |dvrt          d          t          j        | |          S N)r   r   zn must be 0 or 1)r"   r   r$   r%   ns     r   r$   zFermionFockKet.__new__   ,    F??/000{3"""r   c                     | j         d         S r   labelr   s    r   rT   zFermionFockKet.n       z!}r   c                     t           S r3   )r   r   s    r   
dual_classzFermionFockKet.dual_class       r   c                     t                      S r3   )r   )r%   rX   s     r   _eval_hilbert_spacez"FermionFockKet._eval_hilbert_space   s    ~~r   c                 6    t          | j        |j                  S r3   )r
   rT   )r   brar&   s      r   !_eval_innerproduct_FermionFockBraz0FermionFockKet._eval_innerproduct_FermionFockBra   s    dfce,,,r   c                     |j         r&| j        dk    rt          d          S t          j        S | j        dk    rt          d          S t          j        S )Nr   r   )r   rT   r   r   r*   )r   opoptionss      r   _apply_from_right_to_FermionOpz-FermionFockKet._apply_from_right_to_FermionOp   sM     		v{{%a(((vv{{%a(((vr   N)rJ   rK   rL   rM   r$   rN   rT   rO   r[   r^   ra   re   r   r   r   r   r   }   s         # # #
   X   [   [- - -
 
 
 
 
r   r   c                   D    e Zd ZdZd Zed             Zed             ZdS )r   zxFock state bra for a fermionic mode.

    Parameters
    ==========

    n : Number
        The Fock state number.

    c                 R    |dvrt          d          t          j        | |          S rR   )r"   r	   r$   rS   s     r   r$   zFermionFockBra.__new__   rU   r   c                     | j         d         S r   rW   r   s    r   rT   zFermionFockBra.n   rY   r   c                     t           S r3   )r   r   s    r   r[   zFermionFockBra.dual_class   r\   r   N)	rJ   rK   rL   rM   r$   rN   rT   rO   r[   r   r   r   r   r      sc         # # #
   X   [  r   r   N)rM   sympy.core.numbersr   rF   r   sympy.physics.quantumr   r   r   r	   (sympy.functions.special.tensor_functionsr
   __all__r   r   r   r   r   r   <module>rn      s   " " & & & & & & " " " " " " * * * * * * 8 8 8 8 8 8 8 8 8 8 C C C C C C  j/ j/ j/ j/ j/ j/ j/ j/X) ) ) ) )S ) ) )X    S     r   