
    [Th                         S SK r S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJrJr  S S	KJr  S
S/r " S S
\5      r " S S\	5      rg)    N)Tensor)constraints)Categorical)Distribution)TransformedDistribution)ExpTransform)broadcast_allclamp_probs)_sizeExpRelaxedCategoricalRelaxedOneHotCategoricalc                   ,  ^  \ rS rSrSr\R                  \R                  S.r\R                  r	Sr
SU 4S jjrSU 4S jjrS r\S\R                   4S	 j5       r\S\4S
 j5       r\S\4S j5       r\R                   " 5       4S\S\4S jjrS rSrU =r$ )r      a  
Creates a ExpRelaxedCategorical parameterized by
:attr:`temperature`, and either :attr:`probs` or :attr:`logits` (but not both).
Returns the log of a point in the simplex. Based on the interface to
:class:`OneHotCategorical`.

Implementation based on [1].

See also: :func:`torch.distributions.OneHotCategorical`

Args:
    temperature (Tensor): relaxation temperature
    probs (Tensor): event probabilities
    logits (Tensor): unnormalized log probability for each event

[1] The Concrete Distribution: A Continuous Relaxation of Discrete Random Variables
(Maddison et al., 2017)

[2] Categorical Reparametrization with Gumbel-Softmax
(Jang et al., 2017)
probslogitsTc                    > [        X#5      U l        Xl        U R                  R                  nU R                  R                  SS  n[
        TU ]  XVUS9  g )Nvalidate_args)r   _categoricaltemperaturebatch_shapeparam_shapesuper__init__)selfr   r   r   r   r   event_shape	__class__s          _/var/www/auris/envauris/lib/python3.13/site-packages/torch/distributions/relaxed_categorical.pyr   ExpRelaxedCategorical.__init__-   sQ    '6&''33''33BC8O    c                   > U R                  [        U5      n[        R                  " U5      nU R                  Ul        U R
                  R                  U5      Ul        [        [        U]#  XR                  SS9  U R                  Ul
        U$ )NFr   )_get_checked_instancer   torchSizer   r   expandr   r   r   _validate_argsr   r   	_instancenewr   s       r    r'   ExpRelaxedCategorical.expand4   s    (()>	Jjj-**,,33K@#S2)) 	3 	
 "00
r"   c                 :    U R                   R                  " U0 UD6$ N)r   _new)r   argskwargss      r    r/   ExpRelaxedCategorical._new?   s      %%t6v66r"   returnc                 .    U R                   R                  $ r.   )r   r   r   s    r    r   !ExpRelaxedCategorical.param_shapeB   s      ,,,r"   c                 .    U R                   R                  $ r.   )r   r   r5   s    r    r   ExpRelaxedCategorical.logitsF   s      '''r"   c                 .    U R                   R                  $ r.   )r   r   r5   s    r    r   ExpRelaxedCategorical.probsJ   s      &&&r"   sample_shapec                 L   U R                  U5      n[        [        R                  " X R                  R
                  U R                  R                  S95      nUR                  5       * R                  5       * nU R                  U-   U R                  -  nXUR                  SSS9-
  $ )N)dtypedevicer   Tdimkeepdim)
_extended_shaper
   r%   randr   r=   r>   logr   	logsumexp)r   r;   shapeuniformsgumbelsscoress         r    rsampleExpRelaxedCategorical.rsampleN   s    $$\2JJuKK$5$5dkk>P>PQ
  ||~&++-.++'4+;+;;((R(>>>r"   c                    U R                   R                  nU R                  (       a  U R                  U5        [	        U R
                  U5      u  p1[        R                  " U R                  [        U5      5      R                  5       U R                  R                  5       R                  US-
  * 5      -
  nX1R                  U R                  5      -
  nXUR                  SSS9-
  R                  S5      nXT-   $ )N   r   Tr?   )r   _num_eventsr(   _validate_sampler	   r   r%   	full_liker   floatlgammarD   mulrE   sum)r   valueKr   	log_scalescores         r    log_probExpRelaxedCategorical.log_probW   s    ))!!%(%dkk59OOeAh

&(T%%))+//!a%9:	 4#3#344R>>CCBG  r"   )r   r   NNNr.   )__name__
__module____qualname____firstlineno____doc__r   simplexreal_vectorarg_constraintssupporthas_rsampler   r'   r/   propertyr%   r&   r   r   r   r   r   rJ   rY   __static_attributes____classcell__r   s   @r    r   r      s    , !, 3 3{?V?VWO  KP	7 -UZZ - - ( ( ( 'v ' ' -2JJL ?E ?V ?
! 
!r"   c                      ^  \ rS rSrSr\R                  \R                  S.r\R                  r	Sr
SU 4S jjrSU 4S jjr\S\4S j5       r\S\4S	 j5       r\S\4S
 j5       rSrU =r$ )r   d   a  
Creates a RelaxedOneHotCategorical distribution parametrized by
:attr:`temperature`, and either :attr:`probs` or :attr:`logits`.
This is a relaxed version of the :class:`OneHotCategorical` distribution, so
its samples are on simplex, and are reparametrizable.

Example::

    >>> # xdoctest: +IGNORE_WANT("non-deterministic")
    >>> m = RelaxedOneHotCategorical(torch.tensor([2.2]),
    ...                              torch.tensor([0.1, 0.2, 0.3, 0.4]))
    >>> m.sample()
    tensor([ 0.1294,  0.2324,  0.3859,  0.2523])

Args:
    temperature (Tensor): relaxation temperature
    probs (Tensor): event probabilities
    logits (Tensor): unnormalized log probability for each event
r   Tc                 H   > [        XX4S9n[        TU ]	  U[        5       US9  g )Nr   )r   r   r   r   )r   r   r   r   r   	base_distr   s         r    r   !RelaxedOneHotCategorical.__init__}   s*    )
	 	LN-Pr"   c                 J   > U R                  [        U5      n[        TU ]  XS9$ )N)r*   )r$   r   r   r'   r)   s       r    r'   RelaxedOneHotCategorical.expand   s'    (()A9Mw~k~99r"   r3   c                 .    U R                   R                  $ r.   )rm   r   r5   s    r    r   $RelaxedOneHotCategorical.temperature   s    ~~)))r"   c                 .    U R                   R                  $ r.   )rm   r   r5   s    r    r   RelaxedOneHotCategorical.logits   s    ~~$$$r"   c                 .    U R                   R                  $ r.   )rm   r   r5   s    r    r   RelaxedOneHotCategorical.probs   s    ~~###r"    r[   r.   )r\   r]   r^   r_   r`   r   ra   rb   rc   rd   re   r   r'   rf   r   r   r   r   rg   rh   ri   s   @r    r   r   d   s    ( !, 3 3{?V?VWO!!GKQ: *V * * % % % $v $ $r"   )r%   r   torch.distributionsr   torch.distributions.categoricalr    torch.distributions.distributionr   ,torch.distributions.transformed_distributionr   torch.distributions.transformsr   torch.distributions.utilsr	   r
   torch.typesr   __all__r   r   rw   r"   r    <module>r      sI      + 7 9 P 7 @  #$>
?Q!L Q!h-$6 -$r"   