Ë
    täiêA  ã                   ó  — 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mZ dd	lmZ dd
l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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dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5  G d„ de6«      Z7 G d„ de*«      Z8 G d„ de8«      Z9 G d„ de+e8«      Z: G d„ d e,e:«      Z; G d!„ d"e5e3«      Z< G d#„ d$e-«      Z= G d%„ d&e/e=«      Z> G d'„ d(e.e=«      Z?y))*zq
Finite Discrete Random Variables Module

See Also
========
sympy.stats.frv_types
sympy.stats.rv
sympy.stats.crv
é    )Úproduct)ÚSum)ÚBasic)Úcacheit)ÚLambda)ÚMul)ÚIÚnan)ÚEq)ÚS)ÚDummyÚSymbol©Úsympify©Úexp)Ú	Piecewise)ÚAndÚOr)ÚIntersection)ÚDict)ÚLogic)Ú
Relational)Ú_sympify©Ú	FiniteSet)ÚRandomDomainÚProductDomainÚConditionalDomainÚPSpaceÚIndependentProductPSpaceÚSinglePSpaceÚrandom_symbolsÚsumsetsÚrv_subsÚNamedArgsMixinÚDensityÚDistributionc                   ó&   — e Zd ZdZd„ Zed„ «       Zy)ÚFiniteDensityz'
    A domain with Finite Density.
    c                 ó,   — t        |«      }|| v r| |   S y)z–
        Make instance of a class callable.

        If item belongs to current instance of a class, return it.

        Otherwise, return 0.
        r   r   )ÚselfÚitems     ú^/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/sympy/stats/frv.pyÚ__call__zFiniteDensity.__call__(   s!   € ô �t‹}ˆØ�4‰<Ø˜‘:Ðàó    c                 ó   — t        | «      S )z,
        Return item as dictionary.
        )Údict©r,   s    r.   r2   zFiniteDensity.dict6   s   € ô
 �D‹zÐr0   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   Úpropertyr2   © r0   r.   r*   r*   $   s    „ ñòð ñó ñr0   r*   c                   óV   — e Zd ZdZdZed„ «       Zed„ «       Zed„ «       Zd„ Z	d„ Z
d„ Zy	)
ÚFiniteDomainzS
    A domain with discrete finite support

    Represented using a FiniteSet.
    Tc                 ó:   — t        d„ | j                  D «       «      S )Nc              3   ó&   K  — | ]	  \  }}|–— Œ y ­w©Nr9   )Ú.0ÚsymÚvals      r.   Ú	<genexpr>z'FiniteDomain.symbols.<locals>.<genexpr>G   s   è ø€ Ð;©]¡  cœ©]ùs   ‚)r   Úelementsr3   s    r.   ÚsymbolszFiniteDomain.symbolsE   s   € äÑ;¨T¯]ª]Ó;Ó;Ð;r0   c                 ó    — | j                   d   S ©Nr   ©Úargsr3   s    r.   rC   zFiniteDomain.elementsI   ó   € à�y‰y˜‰|Ðr0   c           
      óp   — t        | j                  D �cg c]  }t        t        |«      «      ‘Œ c}Ž S c c}w r>   )r   rC   r   r2   )r,   Úels     r.   r2   zFiniteDomain.dictM   s+   € ä°D·M²MÓB±M¨bœ4¤ R£�>°MÑBÐCÐCùÒBs   ”3c                 ó   — || j                   v S r>   )rC   ©r,   Úothers     r.   Ú__contains__zFiniteDomain.__contains__Q   s   € Ø˜Ÿ™Ð%Ð%r0   c                 ó6   — | j                   j                  «       S r>   )rC   Ú__iter__r3   s    r.   rQ   zFiniteDomain.__iter__T   s   € Ø�}‰}×%Ñ%Ó'Ð'r0   c                 ó–   — t        | D ���cg c]'  }t        |D ��cg c]  \  }}t        ||«      ‘Œ c}}Ž ‘Œ) c}}}Ž S c c}}w c c}}}w r>   )r   r   r   )r,   r-   r@   rA   s       r.   Ú
as_booleanzFiniteDomain.as_booleanW   s@   € ÜÉ$ÕOÉ$À$”C±tÔ<±t©8¨3°œ"˜S #�,°tÒ<Ò=È$ÓOÐPÐPùÓ<ùÔOs   ŒA›>±A¾AN)r4   r5   r6   r7   Ú	is_Finiter8   rD   rC   r2   rO   rQ   rS   r9   r0   r.   r;   r;   =   sZ   „ ñð
 €Iàñ<ó ð<ð ñó ðð ñDó ðDò&ò(óQr0   r;   c                   ób   — e Zd ZdZd„ Zed„ «       Zed„ «       Zed„ «       Zed„ «       Z	d„ Z
d„ Zy	)
ÚSingleFiniteDomainzi
    A FiniteDomain over a single symbol/set

    Example: The possibilities of a *single* die roll.
    c                 ó€   — t        |t        «      st        |t        «      st        |Ž }t        j                  | ||«      S r>   )Ú
isinstancer   r   r   Ú__new__)ÚclsÚsymbolÚsets      r.   rY   zSingleFiniteDomain.__new__b   s2   € Ü˜#œyÔ)Ü˜3¤Ô-Ü˜S�/ˆCÜ�}‰}˜S &¨#Ó.Ð.r0   c                 ó    — | j                   d   S rF   rG   r3   s    r.   r[   zSingleFiniteDomain.symbolh   rI   r0   c                 ó,   — t        | j                  «      S r>   )r   r[   r3   s    r.   rD   zSingleFiniteDomain.symbolsl   s   € ä˜Ÿ™Ó%Ð%r0   c                 ó    — | j                   d   S ©Né   rG   r3   s    r.   r\   zSingleFiniteDomain.setp   rI   r0   c           	      óx   — t        | j                  D �cg c]  }t        | j                  |ff«      ‘Œ c}Ž S c c}w r>   )r   r\   Ú	frozensetr[   ©r,   Úelems     r.   rC   zSingleFiniteDomain.elementst   s4   € äÈ$Ï(Ê(ÓSÉ(À$œ9 t§{¡{°DÐ&9Ð%<Õ=È(ÑSÐTÐTùÒSs   ”7c                 ó.   ‡ — ˆ fd„‰ j                   D «       S )Nc              3   óN   •K  — | ]  }t        ‰j                  |ff«      –— Œ y ­wr>   )rc   r[   ©r?   re   r,   s     €r.   rB   z.SingleFiniteDomain.__iter__.<locals>.<genexpr>y   s#   øè ø€ ÐG¹h°d”	˜DŸK™K¨Ð.Ð0×1¹hùó   ƒ"%©r\   r3   s   `r.   rQ   zSingleFiniteDomain.__iter__x   s   ø€ ÛG¸d¿hºhÓGÐGr0   c                 ób   — t        |«      d   \  }}|| j                  k(  xr || j                  v S rF   )Útupler[   r\   )r,   rN   r@   rA   s       r.   rO   zSingleFiniteDomain.__contains__{   s/   € Ü˜“< ‘?‰ˆˆSØ�d—k‘kÑ!Ò5 c¨T¯X©X oÐ5r0   N)r4   r5   r6   r7   rY   r8   r[   rD   r\   rC   rQ   rO   r9   r0   r.   rV   rV   [   si   „ ñò/ð ñó ðð ñ&ó ð&ð ñó ðð ñUó ðUòHó6r0   rV   c                   ó&   — e Zd ZdZd„ Zed„ «       Zy)ÚProductFiniteDomainzŠ
    A Finite domain consisting of several other FiniteDomains

    Example: The possibilities of the rolls of three independent dice
    c                 ó8   — t        | j                  Ž }d„ |D «       S )Nc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr>   )r$   )r?   Úitemss     r.   rB   z/ProductFiniteDomain.__iter__.<locals>.<genexpr>‰   s   è ø€ Ð5©H 5”˜—©Hùs   ‚)r   Údomains)r,   Úproditers     r.   rQ   zProductFiniteDomain.__iter__‡   s   € Ü˜DŸL™LÐ)ˆÙ5©HÓ5Ð5r0   c                 ó   — t        | Ž S r>   r   r3   s    r.   rC   zProductFiniteDomain.elements‹   s   € ä˜$ÐÐr0   N)r4   r5   r6   r7   rQ   r8   rC   r9   r0   r.   rn   rn   €   s    „ ñò6ð ñ ó ñ r0   rn   c                   ó>   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zed„ «       Z	d„ Z
y)	ÚConditionalFiniteDomainz�
    A FiniteDomain that has been restricted by a condition

    Example: The possibilities of a die roll under the condition that the
    roll is even.
    c                 óR   — |du r|S t        |«      }t        j                  | ||«      S )zH
        Create a new instance of ConditionalFiniteDomain class
        T)r%   r   rY   )rZ   ÚdomainÚ	conditionÚconds       r.   rY   zConditionalFiniteDomain.__new__˜   s.   € ð ˜ÑØˆMÜ�yÓ!ˆÜ�}‰}˜S &¨$Ó/Ð/r0   c                 óÎ   — | j                   j                  t        |«      «      }|dv r|S |j                  r|j                  |j
                  k(  S t        dt        |«      z  «      ‚)zï
        Test the value. If value is boolean, return it. If value is equality
        relational (two objects are equal), return it with left-hand side
        being equal to right-hand side. Otherwise, raise ValueError exception.
        )TFzUndecidable if %s)ry   Úxreplacer2   Úis_EqualityÚlhsÚrhsÚ
ValueErrorÚstr)r,   re   rA   s      r.   Ú_testzConditionalFiniteDomain._test¡   sX   € ð �n‰n×%Ñ%¤d¨4£jÓ1ˆØ�-ÑØˆJØ�_Š_Ø—7‘7˜cŸg™gÑ%Ð%ÜÐ,¬s°3«xÑ7Ó8Ð8r0   c                 óD   — || j                   v xr | j                  |«      S r>   )Ú
fulldomainr‚   rM   s     r.   rO   z$ConditionalFiniteDomain.__contains__®   s   € Ø˜Ÿ™Ð'Ò=¨D¯J©J°uÓ,=Ð=r0   c                 ó.   ‡ — ˆ fd„‰ j                   D «       S )Nc              3   óF   •K  — | ]  }‰j                  |«      sŒ|–— Œ y ­wr>   )r‚   rh   s     €r.   rB   z3ConditionalFiniteDomain.__iter__.<locals>.<genexpr>²   s   øè ø€ ÐE¡˜°D·J±J¸tÕ4D”¡ùs   ƒ!š!)r„   r3   s   `r.   rQ   z ConditionalFiniteDomain.__iter__±   s   ø€ ÛE §¢ÓEÐEr0   c           	      óò   — t        | j                  t        «      rNt        | j                  j                  D �cg c](  }t        | j                  j                  |ff«      | v r|‘Œ* c}Ž S t        d«      ‚c c}w )Nz7Not implemented on multi-dimensional conditional domain)rX   r„   rV   r   r\   rc   r[   ÚNotImplementedErrorrd   s     r.   r\   zConditionalFiniteDomain.set´   s€   € ä�d—o‘oÔ'9Ô:Ü°·±×0CÒ0Có XÑ0C¨Ü"+¨d¯o©o×.DÑ.DÀdÐ-KÐ,MÓ"NÐRVÑ"Vò  $Ð0Cñ Xð Yð Yô &ØIóKð KùòXs   ¸-A4c                 ó,   — t         j                  | «      S r>   )r;   rS   r3   s    r.   rS   z"ConditionalFiniteDomain.as_boolean½   s   € Ü×&Ñ& tÓ,Ð,r0   N)r4   r5   r6   r7   rY   r‚   rO   rQ   r8   r\   rS   r9   r0   r.   rv   rv   �   s7   „ ñò0ò9ò>òFð ñKó ðKó-r0   rv   c                   ó¸   — e Zd Zd„ Zed„ «       Zeed„ «       «       Zd„ Z	ed„ «       Z
 ed„ «      Z ed„ «      Z ed„ «      Z ed	„ «      Z ed
„ «      Zd„ Zd„ Zy)ÚSingleFiniteDistributionc                 ó`   — t        t        t        |«      «      }t        j                  | g|¢­Ž S r>   )ÚlistÚmapr   r   rY   )rZ   rH   s     r.   rY   z SingleFiniteDistribution.__new__Â   s'   € Ü”Cœ Ó&Ó'ˆÜ�}‰}˜SÐ( 4Ò(Ð(r0   c                   ó   — y r>   r9   rG   s    r.   ÚcheckzSingleFiniteDistribution.checkÆ   s   € àr0   c                 óŽ   — | j                   rt        | «      S | j                  D �ci c]  }|| j                  |«      “Œ c}S c c}w r>   )Úis_symbolicr'   r\   Úpmf)r,   Úks     r.   r2   zSingleFiniteDistribution.dictÊ   s?   € ð ×ÒÜ˜4“=Ð Ø(,¯ªÓ1© 1��4—8‘8˜A“;‘¨Ñ1Ð1ùÒ1s   ¦Ac                 ó   — t        «       ‚r>   ©rˆ   ©r,   rH   s     r.   r“   zSingleFiniteDistribution.pmfÑ   s   € Ü!Ó#Ð#r0   c                 ó   — t        «       ‚r>   r–   r3   s    r.   r\   zSingleFiniteDistribution.setÔ   s   € ä!Ó#Ð#r0   c                 ó.   — | j                   j                  S r>   )r2   Úvaluesr3   s    r.   Ú<lambda>z!SingleFiniteDistribution.<lambda>Ø   s   €  4§9¡9×#3Ò#3r0   c                 ó.   — | j                   j                  S r>   )r2   rq   r3   s    r.   r›   z!SingleFiniteDistribution.<lambda>Ù   s   €  $§)¡)§/¢/r0   c                  ó   — y)NFr9   r3   s    r.   r›   z!SingleFiniteDistribution.<lambda>Ú   s   € ¨r0   c                 ó.   — | j                   j                  S r>   )r2   rQ   r3   s    r.   r›   z!SingleFiniteDistribution.<lambda>Û   s   €  T§Y¡Y×%7Ò%7r0   c                 ó.   — | j                   j                  S r>   )r2   Ú__getitem__r3   s    r.   r›   z!SingleFiniteDistribution.<lambda>Ü   s   € ¨¯	©	×(=Ò(=r0   c                 ó    —  | j                   |Ž S r>   )r“   r—   s     r.   r/   z!SingleFiniteDistribution.__call__Þ   s   € Øˆt�x‰x˜ˆÐr0   c                 ó   — || j                   v S r>   rj   rM   s     r.   rO   z%SingleFiniteDistribution.__contains__á   s   € Ø˜Ÿ™Ð Ð r0   N)r4   r5   r6   rY   Ústaticmethodr�   r8   r   r2   r“   r\   rš   rq   r’   rQ   r    r/   rO   r9   r0   r.   r‹   r‹   Á   s“   „ ò)ð ñó ðð Øñ2ó ó ð2ò
$ð ñ$ó ð$ñ Ñ3Ó4€FÙÑ1Ó2€EÙÑ-Ó.€KÙÑ7Ó8€HÙÑ=Ó>€Kòó!r0   r‹   c                   ó�   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Ze	d„ «       Z
e	dd„«       Ze	d	„ «       Ze	d
„ «       Zdd„Zd„ Zd„ Zd„ Zdd„Zy)ÚFinitePSpacezd
    A Finite Probability Space

    Represents the probabilities of a finite number of events.
    Tc                 óÎ   — |j                  «       D ��ci c]  \  }}t        |«      t        |«      “Œ }}}t        |«      }t        j                  | ||«      }||_        |S c c}}w r>   )rq   r   r   r    rY   Ú_density)rZ   rx   ÚdensityÚkeyrA   Úpublic_densityÚobjs          r.   rY   zFinitePSpace.__new__ò   se   € à '§¡¤ô1Ù /‘H�C˜ô ˜3“<¤¨£Ñ-Ø /ð 	ñ 1ä˜g›ˆä�n‰n˜S &¨.Ó9ˆØˆŒØˆ
ùó1s   ”A!c                 ó"  — t        |«      }| j                  }t        t        |j	                  «       «      d   t
        «      r |j                  |t        j                  «      S |j                  t        |«      d   d   t        j                  «      S )Nr   ra   )
r   r§   rX   r�   Úkeysr   Úgetr   ÚZerorl   )r,   re   r¨   s      r.   Úprob_ofzFinitePSpace.prob_ofû   se   € Ü�t‹}ˆØ—-‘-ˆÜ”d˜7Ÿ<™<›>Ó*¨1Ñ-¬yÔ9Ø—;‘;˜t¤Q§V¡VÓ,Ð,Ø�{‰{œ5 ›; q™>¨!Ñ,¬a¯f©fÓ5Ð5r0   c                 ón   ‡ — t        ˆ fd„t        |«      D «       «      sJ ‚t        ‰ j                  |«      S )Nc              3   óN   •K  — | ]  }|j                   ‰j                  v –— Œ y ­wr>   )r[   rD   )r?   Úrr,   s     €r.   rB   z%FinitePSpace.where.<locals>.<genexpr>  s!   øè ø€ ÐOÑ5N°�1—8‘8˜tŸ|™|Ô+Ñ5Nùri   )Úallr#   rv   rx   ©r,   ry   s   ` r.   ÚwherezFinitePSpace.where  s-   ø€ ÜÓO´^ÀIÔ5NÓOÔOÐOÐOÜ& t§{¡{°IÓ>Ð>r0   c                 ó
  — t        || j                  «      }t        «       }| j                  D ]S  }|j	                  t        |«      «      }| j                  |«      }|j                  |t        j                  «      |z   ||<   ŒU |S r>   )
r%   rš   r*   rx   r|   r2   r°   r®   r   r¯   )r,   ÚexprÚdre   rA   Úprobs         r.   Úcompute_densityzFinitePSpace.compute_density  sk   € Ü�t˜TŸ[™[Ó)ˆÜ‹OˆØ—K”KˆDØ—-‘-¤ T£
Ó+ˆCØ—<‘< Ó%ˆDØ—U‘U˜3¤§¡Ó'¨$Ñ.ˆAˆcŠFð  ð ˆr0   c                 ó¸   — | j                  |«      }t        j                  }g }t        |«      D ]  }||   }||z  }|j	                  ||f«       Œ! t        |«      S r>   )r»   r   r¯   ÚsortedÚappendr2   )r,   r¸   r¹   Úcum_probÚcdfr©   rº   s          r.   Úcompute_cdfzFinitePSpace.compute_cdf  s]   € à× Ñ  Ó&ˆÜ—6‘6ˆØˆÜ˜!–9ˆCØ�S‘6ˆDØ˜ÑˆHØ�J‰J˜˜X�Õ'ð ô
 �C‹yÐr0   c                 óÄ   — | j                  |«      }t        |j                  «       «      }t        |d„ ¬«      }|r|D ��cg c]  \  }}|t	        |«      f‘Œ }}}|S c c}}w )Nc                 ó   — | d   S r`   r9   )Úval_cumprobs    r.   r›   z)FinitePSpace.sorted_cdf.<locals>.<lambda>  s   € ¸[Èº^r0   )r©   )rÁ   r�   rq   r½   Úfloat)r,   r¸   Úpython_floatrÀ   rq   Úsorted_itemsÚvr¿   s           r.   Ú
sorted_cdfzFinitePSpace.sorted_cdf  sj   € à×Ñ˜tÓ$ˆÜ�S—Y‘Y“[Ó!ˆÜ˜eÑ)KÔLˆÙá'3ô5Ù'3™˜˜8ð ¤ h£Ò0Ø'3ð ñ 5àÐùó5s   Á Ac                 ó˜   ‡— | j                  |«      }t        dd¬«      Št        ‰t        ˆfd„|j	                  «       D «       «      «      S )NÚtT©Úrealc              3   óT   •K  — | ]  \  }}t        t        |z  ‰z  «      |z  –— Œ! y ­wr>   )r   r	   ©r?   r”   rÈ   rË   s      €r.   rB   z?FinitePSpace.compute_characteristic_function.<locals>.<genexpr>*  s&   øè ø€ Ð?±Y©c¨a°œS¤ 1¡ Q¡›Z¨�\±Yùs   ƒ%(©r»   r   r   Úsumrq   ©r,   r¸   r¹   rË   s      @r.   Úcompute_characteristic_functionz,FinitePSpace.compute_characteristic_function%  s=   ø€ à× Ñ  Ó&ˆÜ�#˜DÔ!ˆä�aœÓ?°Q·W±W´YÓ?Ó?Ó@Ð@r0   c                 ó˜   ‡— | j                  |«      }t        dd¬«      Št        ‰t        ˆfd„|j	                  «       D «       «      «      S )NrË   TrÌ   c              3   óF   •K  — | ]  \  }}t        |‰z  «      |z  –— Œ y ­wr>   r   rÏ   s      €r.   rB   zBFinitePSpace.compute_moment_generating_function.<locals>.<genexpr>1  s"   øè ø€ Ð=±9©C¨A¨aœS  1¡›X a�Z±9ùs   ƒ!rÐ   rÒ   s      @r.   Ú"compute_moment_generating_functionz/FinitePSpace.compute_moment_generating_function,  s=   ø€ à× Ñ  Ó&ˆÜ�#˜DÔ!ˆä�aœÓ=°1·7±7´9Ó=Ó=Ó>Ð>r0   Nc                 ój  — |xs | j                   }t        ||«      }| j                  D �cg c]  }| j                  |«      ‘Œ }}t	        |t
        t        f«      rZ| j                  D �cg c]  }t        |«      d   d   ‘Œ }}| j                  D �cg c]  }|j                  t        |«      «      ‘Œ }}nJ| j                  D �cg c]  }|j                  t        |«      «      ‘Œ }}| j                  D �cg c]  }d‘Œ }}t        d„ t        |||«      D «       «      S c c}w c c}w c c}w c c}w c c}w )Nr   ra   Tc              3   óf   K  — | ])  \  }}}t        ||z  |ft        j                  d f«      –— Œ+ y­w)TN)r   r   r¯   )r?   rº   re   Úblvs       r.   rB   z3FinitePSpace.compute_expectation.<locals>.<genexpr>=  s7   è ø€ ð HÙ'F‘O�D˜$ ô ˜d T™k¨3Ð/´!·&±&¸$°×@Ù'Fùs   ‚/1)rš   r%   rx   r°   rX   r   r   rl   r|   r2   rÑ   Úzip)r,   r¸   ÚrvsÚkwargsre   ÚprobsÚparse_domainÚboolss           r.   Úcompute_expectationz FinitePSpace.compute_expectation3  s  € ØÒ �T—[‘[ˆÜ�t˜SÓ!ˆØ04·²Ó<±¨�—‘˜dÕ#°ˆÐ<Ü�dœU¤JÐ/Ô0Ø:>¿+º+ÓF¹+°$œE $›K¨™N¨1Ó-¸+ˆLÐFØ;?¿;º;ÓG¹;°4�T—]‘]¤4¨£:Õ.¸;ˆEÑGàBFÇ+Â+ÓNÁ+¸$˜DŸM™M¬$¨t«*Õ5À+ˆLÐNØ&*§k¢kÓ2¡k˜d’T kˆEÐ2Üñ HÜ'*¨5°,ÀÔ'FóHó Hð 	Hùò =ùâFùÚGùâNùÚ2s   «DÁ)D!Â!D&Ã!D+Ã4	D0c                 óÌ   — | j                  |«      }t        dd¬«      }t        |dk  |dkD  z  ff}|j                  «       D ]  \  }}||||k  ffz   }Œ t	        |t        |Ž «      S )NÚpTrÌ   r   ra   )rÁ   r   r
   rq   r   r   )r,   r¸   rÀ   râ   r\   r©   Úvalues          r.   Úcompute_quantilezFinitePSpace.compute_quantile@  ss   € Ø×Ñ˜tÓ$ˆÜ�#˜DÔ!ˆÜ�a˜!‘e  A¡Ñ&Ð'Ð)ˆØŸ)™)ž+‰JˆC�Ø˜#˜q E™zÐ*Ð-Ñ-‰Cð &ä�aœ C˜Ó)Ð)r0   c                 óL  ‡ ‡‡— t        d„ t        ‰«      D «       «      }t        ‰«      }|j                  ‰ j                  «      s$t        dt        |‰ j                  z
  «      z  «      ‚t        ‰t        «      r�|j                  j                  ‰ j                  j                  «      sRt        ‰j                  t        «      r‰j                  n‰j                  Št        ˆˆˆ fd„‰ j                  D «       «      S t        t        ˆ fd„‰ j!                  ‰«      D «       «      «      S )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr>   )r[   )r?   Úrss     r.   rB   z+FinitePSpace.probability.<locals>.<genexpr>I  s   è ø€ Ð OÑ5N¨r §¥Ñ5Nùs   ‚z)Cannot compare foreign random symbols, %sc           
   3   ó¶   •K  — | ]P  }t        ‰j                  |«      ‰j                  ‰t        |«      d    d   «      ft        j
                  df«      –— ŒR y­w)r   ra   TN)r   r°   Úsubsr�   r   r¯   )r?   re   ry   Úrvr,   s     €€€r.   rB   z+FinitePSpace.probability.<locals>.<genexpr>Q  sS   øè ø€ ð @á3>¨4ô !ØŸ™ TÓ*¨I¯N©N¸2¼tÀD»zÈ!¹}ÈQÑ?OÓ,PÐQÜŸ™ �~÷'á3>ùs   ƒAAc              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr>   )r°   rh   s     €r.   rB   z+FinitePSpace.probability.<locals>.<genexpr>T  s   øè ø€ ÐPÑ:O°$˜4Ÿ<™<¨×-Ñ:Oùs   ƒ)rc   r#   r%   ÚissubsetrD   r€   r�   rX   r   Úfree_symbolsrx   r   r   r~   rÑ   r   r¶   )r,   ry   Úcond_symbolsrz   rê   s   ``  @r.   ÚprobabilityzFinitePSpace.probabilityH  sä   ú€ Ü Ñ O´^ÀIÔ5NÓ OÓOˆÜ�yÓ!ˆØ×$Ñ$ T§\¡\Ô2ÜÐHÜ" <°$·,±,Ñ#>Ó?ñAó Bð Bä�i¤Ô,Ø×"Ñ"×+Ñ+¨D¯K©K×,DÑ,DÔEÜ",¨Y¯]©]¼FÔ"C�—’ÈÏÉˆBÜõ @à37·;²;ó@ó @ð @ô ”sÓP¸$¿*¹*ÀYÔ:OÓPÓPÓQÐQr0   c                 óì   — | j                  |«      }| j                  |«      }| j                  j                  «       D ��ci c]  \  }}|j	                  |«      r|||z  “Œ }}}t        ||«      S c c}}w r>   )r¶   rï   r§   rq   r‚   r¥   ©r,   ry   rx   rº   r©   rA   r¨   s          r.   Úconditional_spacezFinitePSpace.conditional_spaceV  sy   € Ø—‘˜IÓ&ˆØ×Ñ 	Ó*ˆà $§¡× 3Ñ 3Ô 5ôLÙ 5‘H�C˜¸¿¹ÀcÔ9Jð ˜˜d™
‘?Ø 5ð 	ñ Lä˜F GÓ,Ð,ùóLs   Á !A0c                 óT   — | j                   | j                  j                  |||«      iS )zo
        Internal sample method

        Returns dictionary mapping RandomSymbol to realization value.
        )rã   ÚdistributionÚsample)r,   ÚsizeÚlibraryÚseeds       r.   rõ   zFinitePSpace.sample]  s(   € ð —
‘
˜D×-Ñ-×4Ñ4°T¸7ÀDÓIÐJÐJr0   )Fr>   )r9   ÚscipyN)r4   r5   r6   r7   rT   rY   r°   r¶   r»   r   rÁ   rÉ   rÓ   rÖ   rà   rä   rï   rò   rõ   r9   r0   r.   r¥   r¥   ê   s�   „ ñð
 €Iòò6ò?òð ñ	ó ð	ð òó ðð ñAó ðAð ñ?ó ð?óHò*òRò-ôKr0   r¥   c                   ó¦   — e Zd ZdZed„ «       Zed„ «       Zed„ «       Zd„ Zee	d„ «       «       Z
e	d„ «       Ze	d„ «       Zd	„ Zd
„ Zd„ Zdd„Zd„ Zd„ Zy)ÚSingleFinitePSpacea  
    A single finite probability space

    Represents the probabilities of a set of random events that can be
    attributed to a single variable/symbol.

    This class is implemented by many of the standard FiniteRV types such as
    Die, Bernoulli, Coin, etc....
    c                 óV   — t        | j                  | j                  j                  «      S r>   )rV   r[   rô   r\   r3   s    r.   rx   zSingleFinitePSpace.domainp  s   € ä! $§+¡+¨t×/@Ñ/@×/DÑ/DÓEÐEr0   c                 ó.   — | j                   j                  S )zƒ
        Helper property to check if the distribution
        of the random variable is having symbolic
        dimension.
        )rô   r’   r3   s    r.   Ú_is_symboliczSingleFinitePSpace._is_symbolict  s   € ð × Ñ ×,Ñ,Ð,r0   c                 ó    — | j                   d   S r`   rG   r3   s    r.   rô   zSingleFinitePSpace.distribution}  rI   r0   c                 ó8   — | j                   j                  |«      S r>   )rô   r“   ©r,   r¸   s     r.   r“   zSingleFinitePSpace.pmf�  s   € Ø× Ñ ×$Ñ$ TÓ*Ð*r0   c                 ó¨   — | j                   j                  j                  «       D ��ci c]  \  }}t        | j                  |f«      |“Œ c}}S c c}}w r>   )rô   r2   rq   r   r[   )r,   rA   rº   s      r.   r§   zSingleFinitePSpace._density„  sY   € ð &*×%6Ñ%6×%;Ñ%;×%AÑ%AÔ%CôEÙ%C™	˜˜Tô ˜4Ÿ;™;¨Ð,Ó-¨tÑ3Ø%CòEð 	Eùó Es   ¨"Ac           
      ó¼  — | j                   rŒ| j                  |«      }t        dd¬«      }t        d«      }t        |t	         ||«      t        t        |z  |z  «      z  || j                  d   j                  | j                  d   j                  f«      «      S t        || j                  «      }t        | j                  | j                  «      j                  |«      S ©NrË   TrÌ   Úkira   )rþ   r»   r   r   r   r   r	   rH   ÚlowÚhighr%   rš   r¥   rx   rô   rÓ   ©r,   r¸   r¹   rË   r  s        r.   rÓ   z2SingleFinitePSpace.compute_characteristic_functionŠ  s°   € à×ÒØ×$Ñ$ TÓ*ˆAÜ�c Ô%ˆAÜ�t“ˆBÜ˜!œS¡ 2£¤s¬1¨R©4°©6£{Ñ!2°R¸¿¹À1¹×9IÑ9IÈ4Ï9É9ÐUVÉ<×K\ÑK\Ð4]Ó^Ó_Ð_Ü�t˜TŸ[™[Ó)ˆÜ˜DŸK™K¨×):Ñ):Ó;×[Ñ[Ð\`ÓaÐar0   c           
      ó®  — | j                   r…| j                  |«      }t        dd¬«      }t        d«      }t        |t	         ||«      t        ||z  «      z  || j                  d   j                  | j                  d   j                  f«      «      S t        || j                  «      }t        | j                  | j                  «      j                  |«      S r  )rþ   r»   r   r   r   r   rH   r  r  r%   rš   r¥   rx   rô   rÖ   r  s        r.   rÖ   z5SingleFinitePSpace.compute_moment_generating_function”  s«   € à×ÒØ×$Ñ$ TÓ*ˆAÜ�c Ô%ˆAÜ�t“ˆBÜ˜!œS¡ 2£¤s¨2¨a©4£y¡°2°t·y±yÀ±|×7GÑ7GÈÏÉÐSTÉ×IZÑIZÐ2[Ó\Ó]Ð]Ü�t˜TŸ[™[Ó)ˆÜ˜DŸK™K¨×):Ñ):Ó;×^Ñ^Ð_cÓdÐdr0   c                 óº   — | j                   rt        d«      ‚t        || j                  «      }t	        | j
                  | j                  «      j                  |«      S )NzƒComputing quantile for random variables with symbolic dimension because the bounds of searching the required value is undetermined.)rþ   rˆ   r%   rš   r¥   rx   rô   rä   r  s     r.   rä   z#SingleFinitePSpace.compute_quantilež  sQ   € Ø×ÒÜ%ð '%ó &ð &ô �t˜TŸ[™[Ó)ˆÜ˜DŸK™K¨×):Ñ):Ó;×LÑLÈTÓRÐRr0   c                 ó,  — | j                   rÄt        t        |«      «      d   }t        dd¬«      }t	        |t
        t        f«      sdn|j                  ||«      }t        |t        | j                  |«      t        || j                  d   j                  k\  || j                  d   j                  k  |«      ft        j                   df«      «      S t#        || j$                  «      }t'        | j(                  | j*                  «      j-                  |«      S )Nr   r”   T©Úintegerra   )rþ   r�   r#   r   rX   r   r   ré   r   r   r“   r   rH   r  r  r   r¯   r%   rš   r¥   rx   rô   r»   )r,   r¸   rê   r”   rz   s        r.   r»   z"SingleFinitePSpace.compute_density¦  sè   € Ø×ÒÜ”n TÓ*Ó+¨AÑ.ˆBÜ�c 4Ô(ˆAÜ)¨$´¼UÐ0CÔD‘4ØŸ)™) B¨Ó*ð ä˜!Ü�t—x‘x “{¤C¨¨T¯Y©Y°q©\×-=Ñ-=Ñ(=Ø�—‘˜1‘×"Ñ"Ñ" Dó%*ð +Ü-.¯V©V°T¨Nó<ó=ð =ô �t˜TŸ[™[Ó)ˆÜ˜DŸK™K¨×):Ñ):Ó;×KÑKÈDÓQÐQr0   c           	      ó^  — | j                   r]| j                  |«      }t        d«      }t        d«      }t        |t	         ||«      || j
                  d   j                  |f«      «      S t        || j                  «      }t        | j                  | j                  «      j                  |«      S )Nr”   r  ra   )rþ   r»   r   r   r   rH   r  r%   rš   r¥   rx   rô   rÁ   )r,   r¸   r¹   r”   r  s        r.   rÁ   zSingleFinitePSpace.compute_cdf²  sŒ   € Ø×ÒØ×$Ñ$ TÓ*ˆAÜ�c“
ˆAÜ�t“ˆBÜ˜!œS¡ 2£¨¨T¯Y©Y°q©\×-=Ñ-=¸qÐ(AÓBÓCÐCÜ�t˜TŸ[™[Ó)ˆÜ˜DŸK™K¨×):Ñ):Ó;×GÑGÈÓMÐMr0   Nc                 óV  — | j                   rÕt        |«      d   }t        dd¬«      }|j                  ||«      }t	        |t
        t        f«      sdn|}|dk7  r| j                  |«      |z  n| j                  |«      |z  }t        t        ||ft        j                  df«      || j                  j                  | j                  j                  f«      j                  «       S t!        |«      }t#        ||«      } t%        | j&                  | j                  «      j(                  ||fi |¤ŽS )Nr   r”   Tr  )rþ   r#   r   ré   rX   r   r   r“   r   r   r   r¯   rô   r  r  Údoitr   r%   r¥   rx   rà   )r,   r¸   rÛ   rÜ   rê   r”   rz   Úfuncs           r.   rà   z&SingleFinitePSpace.compute_expectation»  s  € Ø×ÒÜ Ó% aÑ(ˆBÜ�c 4Ô(ˆAØ—9‘9˜R Ó#ˆDÜ)¨$´¼UÐ0CÔD‘4Øð à&*¨d¢l�4—8‘8˜A“; ’?¸¿¹À»ÀdÑ8JˆDÜ”y $¨ ´·±¸¨~Ó>Ø�D×%Ñ%×)Ñ)¨4×+<Ñ+<×+AÑ+AÐBóDßDHÁDÃFðKô ˜‹~ˆÜ�t˜SÓ!ˆØOŒ|˜DŸK™K¨×):Ñ):Ó;×OÑOÐPTÐVYÑdÐ]cÑdÐdr0   c                 ó¤   — | j                   rt        d«      ‚t        |«      }t        | j                  | j
                  «      j                  |«      S )NzhCurrently, probability queries are not supported for random variables with symbolic sized distributions.)rþ   rˆ   r%   r¥   rx   rô   rï   rµ   s     r.   rï   zSingleFinitePSpace.probabilityÊ  sL   € Ø×Òä%ð 'Pó Qð Qä˜IÓ&ˆ	Ü˜DŸK™K¨×):Ñ):Ó;×GÑGÈ	ÓRÐRr0   c                 ó  — | j                   r|  | j                  |«      }| j                  |«      }| j                  j	                  «       D ��ci c]  \  }}|j                  |«      r|||z  “Œ }}}t        ||«      S c c}}w )zÖ
        This method is used for transferring the
        computation to probability method because
        conditional space of random variables with
        symbolic dimensions is currently not possible.
        )rþ   r¶   rï   r§   rq   r‚   r¥   rñ   s          r.   rò   z$SingleFinitePSpace.conditional_spaceÒ  s‡   € ð ×ÒÙØ—‘˜IÓ&ˆØ×Ñ 	Ó*ˆà $§¡× 3Ñ 3Ô 5ôLÙ 5‘H�C˜¸¿¹ÀcÔ9Jð ˜˜d™
‘?Ø 5ð 	ñ Lä˜F GÓ,Ð,ùóLs   Á!A>r>   )r4   r5   r6   r7   r8   rx   rþ   rô   r“   r   r§   rÓ   rÖ   rä   r»   rÁ   rà   rï   rò   r9   r0   r.   rû   rû   f  s·   „ ñð ñFó ðFð ñ-ó ð-ð ñó ðò+ð ØñEó ó ðEð ñbó ðbð ñeó ðeòSò
RòNóeòSó-r0   rû   c                   ó`   — e Zd ZdZed„ «       Zeed„ «       «       Zeed„ «       «       Zd„ Z	d„ Z
y)ÚProductFinitePSpacezG
    A collection of several independent finite probability spaces
    c                 ó`   — t        | j                  D �cg c]  }|j                  ‘Œ c}Ž S c c}w r>   )rn   Úspacesrx   )r,   Úspaces     r.   rx   zProductFinitePSpace.domainæ  s'   € ä"¸t¿{º{Ó$K¹{°e U§\£\¸{Ñ$KÐLÐLùÒ$Ks   ”+c           	      óP  — t        | j                  D �cg c]%  }t        |j                  j	                  «       «      ‘Œ' c}Ž }i }|D ]O  }t        t        |Ž «      \  }}t        |«      }t        |Ž }|j                  |t        j                  «      |z   ||<   ŒQ t        |«      S c c}w r>   )r   r  Úiterr§   rq   r�   rÚ   r$   r   r®   r   r¯   r   )	r,   r  rs   r¹   rq   ÚelemsrÝ   re   rº   s	            r.   r§   zProductFinitePSpace._densityê  sŸ   € ô ØŸšó&Ù$�ô " %§.¡.×"6Ñ"6Ó"8Õ9Ø$ñ&ð 'ˆàˆÛˆEÜ¤ U Ó,‰LˆE�5Ü˜5“>ˆDÜ˜�;ˆDØ—e‘e˜D¤!§&¡&Ó)¨DÑ0ˆAˆdŠGð	 ô
 �A‹wˆùò&s   ”*B#c                 ó,   — t        | j                  «      S r>   )r   r§   r3   s    r.   r¨   zProductFinitePSpace.density÷  s   € ô �D—M‘MÓ"Ð"r0   c                 ó.   — t         j                  | |«      S r>   )r¥   rï   rµ   s     r.   rï   zProductFinitePSpace.probabilityü  s   € Ü×'Ñ'¨¨iÓ8Ð8r0   c                 ó.   — t         j                  | |«      S r>   )r¥   r»   r  s     r.   r»   z#ProductFinitePSpace.compute_densityÿ  s   € Ü×+Ñ+¨D°$Ó7Ð7r0   N)r4   r5   r6   r7   r8   rx   r   r§   r¨   rï   r»   r9   r0   r.   r  r  â  s_   „ ñð ñMó ðMð Øñ	ó ó ð	ð Øñ#ó ó ð#ò9ó8r0   r  N)@r7   Ú	itertoolsr   Úsympy.concrete.summationsr   Úsympy.core.basicr   Úsympy.core.cacher   Úsympy.core.functionr   Úsympy.core.mulr   Úsympy.core.numbersr	   r
   Úsympy.core.relationalr   Úsympy.core.singletonr   Úsympy.core.symbolr   r   Úsympy.core.sympifyr   Ú&sympy.functions.elementary.exponentialr   Ú$sympy.functions.elementary.piecewiser   Úsympy.logic.boolalgr   r   Úsympy.sets.setsr   Úsympy.core.containersr   Úsympy.core.logicr   r   r   r   Úsympy.stats.rvr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r2   r*   r;   rV   rn   rv   r‹   r¥   rû   r  r9   r0   r.   Ú<module>r1     sæ   ðñõ å )Ý "Ý $Ý &Ý ß 'Ý $Ý "ß -Ý &Ý 6Ý :ß )Ý (Ý &Ý "Ý ,Ý 'Ý %÷U÷ U÷ Uó Uô
�Dô ô2Q�<ô Qô<"6˜ô "6ôJ ˜-¨ô  ô .-Ð/Ð1Dô .-ôb!!˜|¨^ô !!ôRyK�6ô yKôxy-˜ |ô y-ôx8Ð2°Lõ 8r0   