Ë
    täi©  ã                   ó¨   — d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZmZmZmZmZmZ ddlmZmZ dd	gZ G d
„ de«      Z G d„ d	e«      Zy)z
General binary relations.
é    )ÚOptional)ÚS)ÚAppliedPredicateÚaskÚ	PredicateÚQ)ÚBooleanKind)ÚEqÚNeÚGtÚLtÚGeÚLe)Ú	conjunctsÚNotÚBinaryRelationÚAppliedBinaryRelationc                   ón   — e Zd ZU dZdZee   ed<   dZee   ed<   d„ Z	e
d„ «       Ze
d„ «       Zd„ Zd
d	„Zy)r   a^  
    Base class for all binary relational predicates.

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

    Binary relation takes two arguments and returns ``AppliedBinaryRelation``
    instance. To evaluate it to boolean value, use :obj:`~.ask()` or
    :obj:`~.refine()` function.

    You can add support for new types by registering the handler to dispatcher.
    See :obj:`~.Predicate()` for more information about predicate dispatching.

    Examples
    ========

    Applying and evaluating to boolean value:

    >>> from sympy import Q, ask, sin, cos
    >>> from sympy.abc import x
    >>> Q.eq(sin(x)**2+cos(x)**2, 1)
    Q.eq(sin(x)**2 + cos(x)**2, 1)
    >>> ask(_)
    True

    You can define a new binary relation by subclassing and dispatching.
    Here, we define a relation $R$ such that $x R y$ returns true if
    $x = y + 1$.

    >>> from sympy import ask, Number, Q
    >>> from sympy.assumptions import BinaryRelation
    >>> class MyRel(BinaryRelation):
    ...     name = "R"
    ...     is_reflexive = False
    >>> Q.R = MyRel()
    >>> @Q.R.register(Number, Number)
    ... def _(n1, n2, assumptions):
    ...     return ask(Q.zero(n1 - n2 - 1), assumptions)
    >>> Q.R(2, 1)
    Q.R(2, 1)

    Now, we can use ``ask()`` to evaluate it to boolean value.

    >>> ask(Q.R(2, 1))
    True
    >>> ask(Q.R(1, 2))
    False

    ``Q.R`` returns ``False`` with minimum cost if two arguments have same
    structure because it is antireflexive relation [1] by
    ``is_reflexive = False``.

    >>> ask(Q.R(x, x))
    False

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Reflexive_relation
    NÚis_reflexiveÚis_symmetricc                 ód   — t        |«      dk(  st        dt        |«      z  «      ‚t        | g|¢­Ž S )Né   z0Binary relation takes two arguments, but got %s.)ÚlenÚ
ValueErrorr   )ÚselfÚargss     úp/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/sympy/assumptions/relation/binrel.pyÚ__call__zBinaryRelation.__call__P   s5   € Ü�4‹y˜AŠ~ÜÐOÔRUÐVZÓR[Ñ[Ó\Ð\Ü$ TÐ1¨DÒ1Ð1ó    c                 ó    — | j                   r| S y ©N)r   ©r   s    r   ÚreversedzBinaryRelation.reversedU   s   € à×ÒØˆKØr   c                  ó   — y r!   © r"   s    r   ÚnegatedzBinaryRelation.negated[   s   € àr   c                 óŽ   — |t         j                  u s|t         j                  u ry | j                  }|€	 y |r||k(  ry|s||k(  ryy )NTF)r   ÚNaNr   )r   ÚlhsÚrhsÚ	reflexives       r   Ú_compare_reflexivez!BinaryRelation._compare_reflexive_   sR   € ð ”!—%‘%‰<˜3¤!§%¡%™<Øà×%Ñ%ˆ	ØÐØð
 ñ	 ˜C 3šJØÙ  s¢
ØØr   c                 óH  —  | j                   |Ž }|�|S |\  }}| j                  |||¬«      }|�|S | j                  ret        |«      t        |«      f} | j                  j                  |Ž  | j                  j                  t        |«      Ž ur| j                  |||¬«      }|S )N)Úassumptions)r,   Úhandlerr   ÚtypeÚdispatchr#   )r   r   r.   Úretr)   r*   Útypess          r   ÚevalzBinaryRelation.evalq   s­   € à%ˆd×%Ñ% tÐ,ˆØˆ?ØˆJð ‰ˆˆSØ�l‰l˜3 °ˆlÓ=ˆØˆ?ØˆJð ×ÒÜ˜#“Y¤ S£	Ð*ˆEØ$ˆt�|‰|×$Ñ$ eÐ,Ð4I°D·L±L×4IÑ4IÌ8ÐTYË?Ð4[Ñ[Ø—l‘l 3¨¸�lÓE�àˆ
r   )T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚboolÚ__annotations__r   r   Úpropertyr#   r&   r,   r4   r%   r   r   r   r      s]   … ñ;ðz $(€L�(˜4‘.Ó'Ø#'€L�(˜4‘.Ó'ò2ð
 ñó ðð
 ñó ðòô$r   c                   ól   — e Zd ZdZed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Z	d„ Z
d„ Zy	)
r   zd
    The class of expressions resulting from applying ``BinaryRelation``
    to the arguments.

    c                 ó    — | j                   d   S )z#The left-hand side of the relation.r   ©Ú	argumentsr"   s    r   r)   zAppliedBinaryRelation.lhsŽ   ó   € ð �~‰~˜aÑ Ð r   c                 ó    — | j                   d   S )z$The right-hand side of the relation.é   r>   r"   s    r   r*   zAppliedBinaryRelation.rhs“   r@   r   c                 óp   — | j                   j                  }|€| S  || j                  | j                  «      S )zE
        Try to return the relationship with sides reversed.
        )Úfunctionr#   r*   r)   ©r   Úrevfuncs     r   r#   zAppliedBinaryRelation.reversed˜   s2   € ð
 —-‘-×(Ñ(ˆØˆ?ØˆKÙ�t—x‘x §¡Ó*Ð*r   c                 ó°   — | j                   j                  }|€| S t        d„ | j                  D «       «      s || j                   | j
                   «      S | S )zE
        Try to return the relationship with signs reversed.
        c              3   ó@   K  — | ]  }|j                   t        u –— Œ y ­wr!   )Úkindr	   )Ú.0Úsides     r   Ú	<genexpr>z5AppliedBinaryRelation.reversedsign.<locals>.<genexpr>ª   s   è ø€ ÐG¹°�4—9‘9¤Ô+¹ùs   ‚)rD   r#   Úanyr?   r)   r*   rE   s     r   Úreversedsignz"AppliedBinaryRelation.reversedsign¢   sM   € ð
 —-‘-×(Ñ(ˆØˆ?ØˆKÜÑG¸¿ºÓGÔGÙ˜DŸH™H˜9 t§x¡x iÓ0Ð0Øˆr   c                 ój   — | j                   j                  }|€t        | d¬«      S  || j                  Ž S )NF©Úevaluate)rD   r&   r   r?   )r   Úneg_rels     r   r&   zAppliedBinaryRelation.negated®   s2   € à—-‘-×'Ñ'ˆØˆ?Ü�t eÔ,Ð,Ù˜Ÿ™Ð'Ð'r   c                 óx  ‡— t        «       Št        t        j                  t        t        j
                  t        t        j                  t        t        j                  t        t        j                  t        t        j                  i}t        |«      D ]L  }|j                  |v r+‰j!                   |t#        |«         |j$                  Ž «       Œ<‰j!                  |«       ŒN t'        ˆfd„| | j(                  fD «       «      ry| j*                  | j(                  j*                  t-        | d¬«      t-        | j(                  d¬«      f}t'        ˆfd„|D «       «      ry| j.                  j1                  | j2                  |«      }|�|S t5        d„ | j2                  D «       «      }| j.                  j1                  ||«      S )Nc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr!   r%   ©rJ   ÚrelÚconj_assumpss     €r   rL   z2AppliedBinaryRelation._eval_ask.<locals>.<genexpr>À   s   øè ø€ ÐDÑ.C sˆs�lÔ"Ñ.Cùó   ƒTFrP   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr!   r%   rU   s     €r   rL   z2AppliedBinaryRelation._eval_ask.<locals>.<genexpr>Ä   s   øè ø€ Ð7©h sˆs�lÔ"©hùrX   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr!   )Úsimplify)rJ   Úas     r   rL   z2AppliedBinaryRelation._eval_ask.<locals>.<genexpr>Í   s   è ø€ Ð:©> a�Q—Z‘Z—\©>ùs   ‚)Úsetr
   r   Úeqr   Úner   Úgtr   Últr   Úger   Úler   ÚfuncÚaddr0   r   rM   r#   r&   r   rD   r4   r?   Útuple)r   r.   Úbinrelpredsr\   Úneg_relsr2   r   rW   s          @r   Ú	_eval_askzAppliedBinaryRelation._eval_askµ   s=  ø€ Ü“uˆÜœ1Ÿ4™4¤¤Q§T¡T¬2¬q¯t©t´R¼¿¹¼rÄ1Ç4Á4ÌÌQÏTÉTÐRˆÜ˜;Ö'ˆAØ�v‰v˜Ñ$Ø× Ñ Ð!5 ¬T°!«WÑ!5°q·v±vÐ!>Õ?à× Ñ  Õ#ð	 (ô ÓD¨t°T·]±]Ñ.CÓDÔDØØ—L‘L $§-¡-×"7Ñ"7¼¸TÈEÔ9RÜ�—‘¨Ô.ð0ˆäÓ7©hÓ7Ô7Øð �m‰m× Ñ  §¡°Ó=ˆØˆ?ØˆJô Ñ:¨4¯>ª>Ó:Ó:ˆØ�}‰}×!Ñ! $¨Ó4Ð4r   c                 ó<   — t        | «      }|€t        d| z  «      ‚|S )Nz"Cannot determine truth value of %s)r   Ú	TypeError)r   r2   s     r   Ú__bool__zAppliedBinaryRelation.__bool__Ð   s&   € Ü�$‹iˆØˆ;ÜÐ@À4ÑGÓHÐHØˆ
r   N)r5   r6   r7   r8   r;   r)   r*   r#   rN   r&   ri   rl   r%   r   r   r   r   ‡   su   „ ñð ñ!ó ð!ð ñ!ó ð!ð ñ+ó ð+ð ñ	ó ð	ð ñ(ó ð(ò5ó6r   N)r8   Útypingr   Úsympy.core.singletonr   Úsympy.assumptionsr   r   r   r   Úsympy.core.kindr	   Úsympy.core.relationalr
   r   r   r   r   r   Úsympy.logic.boolalgr   r   Ú__all__r   r   r%   r   r   Ú<module>rt      sM   ðñõ å "ß AÓ AÝ 'ß 8× 8ß .àÐ4Ð
5€ôu�Yô uôpMÐ,õ Mr   