
    VhҢ                     b   d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmc m	Z
 d dlmZ d dlmZmZmZmZmZ d dlmZmZ d dlmZ g dZ G d d	      Z G d
 de      Z G d de      Z eg       Z G d de      Z G d de      Z G d de      Z G d de      Zd Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$ G d d e      Z% G d! d"e      Z& G d# d$e      Z' G d% d&e      Z( G d' d(e      Z) G d) d*e      Z* G d+ d,e      Z+ G d- d.e      Z, G d/ d0e      Z-y)1    N)Optional)constraints)_sum_rightmostbroadcast_alllazy_propertytril_matrix_to_vecvec_to_tril_matrix)padsoftplus)_Number)AbsTransformAffineTransformCatTransformComposeTransformCorrCholeskyTransformCumulativeDistributionTransformExpTransformIndependentTransformLowerCholeskyTransformPositiveDefiniteTransformPowerTransformReshapeTransformSigmoidTransformSoftplusTransformTanhTransformSoftmaxTransformStackTransformStickBreakingTransform	Transformidentity_transformc                        e Zd ZU dZdZej                  ed<   ej                  ed<   d fd	Zd Z	e
defd       Ze
dd	       Ze
defd
       ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )r   a  
    Abstract class for invertable transformations with computable log
    det jacobians. They are primarily used in
    :class:`torch.distributions.TransformedDistribution`.

    Caching is useful for transforms whose inverses are either expensive or
    numerically unstable. Note that care must be taken with memoized values
    since the autograd graph may be reversed. For example while the following
    works with or without caching::

        y = t(x)
        t.log_abs_det_jacobian(x, y).backward()  # x will receive gradients.

    However the following will error when caching due to dependency reversal::

        y = t(x)
        z = t.inv(y)
        grad(z.sum(), [y])  # error because z is x

    Derived classes should implement one or both of :meth:`_call` or
    :meth:`_inverse`. Derived classes that set `bijective=True` should also
    implement :meth:`log_abs_det_jacobian`.

    Args:
        cache_size (int): Size of cache. If zero, no caching is done. If one,
            the latest single value is cached. Only 0 and 1 are supported.

    Attributes:
        domain (:class:`~torch.distributions.constraints.Constraint`):
            The constraint representing valid inputs to this transform.
        codomain (:class:`~torch.distributions.constraints.Constraint`):
            The constraint representing valid outputs to this transform
            which are inputs to the inverse transform.
        bijective (bool): Whether this transform is bijective. A transform
            ``t`` is bijective iff ``t.inv(t(x)) == x`` and
            ``t(t.inv(y)) == y`` for every ``x`` in the domain and ``y`` in
            the codomain. Transforms that are not bijective should at least
            maintain the weaker pseudoinverse properties
            ``t(t.inv(t(x)) == t(x)`` and ``t.inv(t(t.inv(y))) == t.inv(y)``.
        sign (int or Tensor): For bijective univariate transforms, this
            should be +1 or -1 depending on whether transform is monotone
            increasing or decreasing.
    Fdomaincodomainc                 z    || _         d | _        |dk(  rn|dk(  rd| _        nt        d      t        |           y )Nr      )NNzcache_size must be 0 or 1)_cache_size_inv_cached_x_y
ValueErrorsuper__init__)self
cache_size	__class__s     N/home/dcms/DCMS/lib/python3.12/site-packages/torch/distributions/transforms.pyr+   zTransform.__init___   sB    %@D	?1_)D899    c                 D    | j                   j                         }d |d<   |S )Nr'   )__dict__copy)r,   states     r/   __getstate__zTransform.__getstate__j   s"    ""$fr0   returnc                     | j                   j                  | j                  j                  k(  r| j                   j                  S t        d      )Nz:Please use either .domain.event_dim or .codomain.event_dim)r"   	event_dimr#   r)   r,   s    r/   r8   zTransform.event_dimo   s:    ;;  DMM$;$;;;;(((UVVr0   c                     d}| j                   | j                         }|%t        |       }t        j                  |      | _         |S )z{
        Returns the inverse :class:`Transform` of this transform.
        This should satisfy ``t.inv.inv is t``.
        N)r'   _InverseTransformweakrefref)r,   invs     r/   r>   zTransform.invu   sB     99 ))+C;#D)CC(DI
r0   c                     t         )z
        Returns the sign of the determinant of the Jacobian, if applicable.
        In general this only makes sense for bijective transforms.
        NotImplementedErrorr9   s    r/   signzTransform.sign   s
     "!r0   c                     | j                   |k(  r| S t        |       j                  t        j                  u r t        |       |      S t	        t        |        d      )Nr-   z.with_cache is not implemented)r&   typer+   r   rA   r,   r-   s     r/   
with_cachezTransform.with_cache   sU    z)K:)"4"444:44!T$ZL0N"OPPr0   c                 
    | |u S N r,   others     r/   __eq__zTransform.__eq__   s    u}r0   c                 &    | j                  |       S rI   )rM   rK   s     r/   __ne__zTransform.__ne__   s    ;;u%%%r0   c                     | j                   dk(  r| j                  |      S | j                  \  }}||u r|S | j                  |      }||f| _        |S )z2
        Computes the transform `x => y`.
        r   )r&   _callr(   )r,   xx_oldy_oldys        r/   __call__zTransform.__call__   sY     q ::a= ''u:LJJqMa4r0   c                     | j                   dk(  r| j                  |      S | j                  \  }}||u r|S | j                  |      }||f| _        |S )z1
        Inverts the transform `y => x`.
        r   )r&   _inverser(   )r,   rU   rS   rT   rR   s        r/   	_inv_callzTransform._inv_call   s[     q ==##''u:LMM!a4r0   c                     t         )zD
        Abstract method to compute forward transformation.
        r@   r,   rR   s     r/   rQ   zTransform._call   
     "!r0   c                     t         )zD
        Abstract method to compute inverse transformation.
        r@   r,   rU   s     r/   rX   zTransform._inverse   r\   r0   c                     t         )zU
        Computes the log det jacobian `log |dy/dx|` given input and output.
        r@   r,   rR   rU   s      r/   log_abs_det_jacobianzTransform.log_abs_det_jacobian   r\   r0   c                 4    | j                   j                  dz   S )Nz())r.   __name__r9   s    r/   __repr__zTransform.__repr__   s    ~~&&--r0   c                     |S )z{
        Infers the shape of the forward computation, given the input shape.
        Defaults to preserving shape.
        rJ   r,   shapes     r/   forward_shapezTransform.forward_shape   	    
 r0   c                     |S )z}
        Infers the shapes of the inverse computation, given the output shape.
        Defaults to preserving shape.
        rJ   rf   s     r/   inverse_shapezTransform.inverse_shape   ri   r0   r   )r6   r   r%   )rc   
__module____qualname____doc__	bijectiver   
Constraint__annotations__r+   r5   propertyintr8   r>   rB   rG   rM   rO   rV   rY   rQ   rX   ra   rd   rh   rk   __classcell__r.   s   @r/   r   r   .   s    *X I"""$$$	
 W3 W W
   "c " "Q&""".r0   r   c                        e Zd ZdZdef fdZ ej                  d      d        Z ej                  d      d        Z	e
defd	       Ze
defd
       Ze
defd       ZddZd Zd Zd Zd Zd Zd Z xZS )r;   z|
    Inverts a single :class:`Transform`.
    This class is private; please instead use the ``Transform.inv`` property.
    	transformc                 H    t         |   |j                         || _        y NrD   )r*   r+   r&   r'   )r,   ry   r.   s     r/   r+   z_InverseTransform.__init__   s     I$9$9:(	r0   Fis_discretec                 J    | j                   J | j                   j                  S rI   )r'   r#   r9   s    r/   r"   z_InverseTransform.domain   s"    yy$$$yy!!!r0   c                 J    | j                   J | j                   j                  S rI   )r'   r"   r9   s    r/   r#   z_InverseTransform.codomain   s"    yy$$$yyr0   r6   c                 J    | j                   J | j                   j                  S rI   )r'   rq   r9   s    r/   rq   z_InverseTransform.bijective   s"    yy$$$yy"""r0   c                 J    | j                   J | j                   j                  S rI   )r'   rB   r9   s    r/   rB   z_InverseTransform.sign   s     yy$$$yy~~r0   c                     | j                   S rI   )r'   r9   s    r/   r>   z_InverseTransform.inv   s    yyr0   c                 h    | j                   J | j                  j                  |      j                  S rI   )r'   r>   rG   rF   s     r/   rG   z_InverseTransform.with_cache   s-    yy$$$xx"":.222r0   c                 r    t        |t              sy| j                  J | j                  |j                  k(  S NF)
isinstancer;   r'   rK   s     r/   rM   z_InverseTransform.__eq__   s3    %!23yy$$$yyEJJ&&r0   c                 `    | j                   j                   dt        | j                         dS )N())r.   rc   reprr'   r9   s    r/   rd   z_InverseTransform.__repr__  s)    ..))*!DO+<A>>r0   c                 T    | j                   J | j                   j                  |      S rI   )r'   rY   r[   s     r/   rV   z_InverseTransform.__call__  s'    yy$$$yy""1%%r0   c                 X    | j                   J | j                   j                  ||       S rI   )r'   ra   r`   s      r/   ra   z&_InverseTransform.log_abs_det_jacobian
  s,    yy$$$		..q!444r0   c                 8    | j                   j                  |      S rI   )r'   rk   rf   s     r/   rh   z_InverseTransform.forward_shape      yy&&u--r0   c                 8    | j                   j                  |      S rI   )r'   rh   rf   s     r/   rk   z_InverseTransform.inverse_shape  r   r0   rm   )rc   rn   ro   rp   r   r+   r   dependent_propertyr"   r#   rt   boolrq   ru   rB   r>   rG   rM   rd   rV   ra   rh   rk   rv   rw   s   @r/   r;   r;      s    
)) ) $[##6" 7" $[##6  7  #4 # # c   Y  3'?&5..r0   r;   c                       e Zd ZdZddee   f fdZd Z ej                  d      d        Z
 ej                  d      d        Zed	efd
       Zed	efd       Zed	efd       ZddZd Zd Zd Zd Zd Z xZS )r   ab  
    Composes multiple transforms in a chain.
    The transforms being composed are responsible for caching.

    Args:
        parts (list of :class:`Transform`): A list of transforms to compose.
        cache_size (int): Size of cache. If zero, no caching is done. If one,
            the latest single value is cached. Only 0 and 1 are supported.
    partsc                 ~    |r|D cg c]  }|j                  |       }}t        | 	  |       || _        y c c}w r{   )rG   r*   r+   r   )r,   r   r-   partr.   s       r/   r+   zComposeTransform.__init__   s?    =BCTT__Z0CECJ/
 Ds   :c                 V    t        |t              sy| j                  |j                  k(  S r   )r   r   r   rK   s     r/   rM   zComposeTransform.__eq__&  s#    %!12zzU[[((r0   Fr|   c                    | j                   st        j                  S | j                   d   j                  }| j                   d   j                  j
                  }t        | j                         D ]R  }||j                  j
                  |j                  j
                  z
  z  }t        ||j                  j
                        }T ||j
                  k\  sJ ||j
                  kD  r#t        j                  |||j
                  z
        }|S )Nr   )	r   r   realr"   r#   r8   reversedmaxindependent)r,   r"   r8   r   s       r/   r"   zComposeTransform.domain+  s    zz###A%%JJrN++55	TZZ( 	>D..1H1HHHIIt{{'<'<=I	> F,,,,,v''' ,,VYAQAQ5QRFr0   c                    | j                   st        j                  S | j                   d   j                  }| j                   d   j                  j
                  }| j                   D ]R  }||j                  j
                  |j                  j
                  z
  z  }t        ||j                  j
                        }T ||j
                  k\  sJ ||j
                  kD  r#t        j                  |||j
                  z
        }|S )Nr   r   )r   r   r   r#   r"   r8   r   r   )r,   r#   r8   r   s       r/   r#   zComposeTransform.codomain:  s    zz###::b>**JJqM((22	JJ 	@D004;;3H3HHHIIt}}'>'>?I	@ H.....x)))"..xXEWEW9WXHr0   r6   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrI   rq   ).0ps     r/   	<genexpr>z-ComposeTransform.bijective.<locals>.<genexpr>K  s     311;;3   )allr   r9   s    r/   rq   zComposeTransform.bijectiveI  s    3

333r0   c                 J    d}| j                   D ]  }||j                  z  } |S Nr%   )r   rB   )r,   rB   r   s      r/   rB   zComposeTransform.signM  s,     	!A!&&=D	!r0   c                 $   d }| j                   | j                         }|jt        t        | j                        D cg c]  }|j                   c}      }t        j                  |      | _         t        j                  |       |_         |S c c}w rI   )r'   r   r   r   r>   r<   r=   )r,   r>   r   s      r/   r>   zComposeTransform.invT  sn    99 ))+C;"8DJJ3G#HaAEE#HICC(DI{{4(CH
 $Is   Bc                 R    | j                   |k(  r| S t        | j                  |      S r{   )r&   r   r   rF   s     r/   rG   zComposeTransform.with_cache_  s&    z)K

zBBr0   c                 8    | j                   D ]
  } ||      } |S rI   )r   )r,   rR   r   s      r/   rV   zComposeTransform.__call__d  s#    JJ 	DQA	r0   c           	      p   | j                   st        j                  |      S |g}| j                   d d D ]  }|j                   ||d                 |j                  |       g }| j                  j
                  }t        | j                   |d d |dd        D ]x  \  }}}|j                  t        |j                  ||      ||j                  j
                  z
               ||j                  j
                  |j                  j
                  z
  z  }z t        j                  t        j                  |      S )Nr   r%   )r   torch
zeros_likeappendr"   r8   zipr   ra   r#   	functoolsreduceoperatoradd)r,   rR   rU   xsr   termsr8   s          r/   ra   z%ComposeTransform.log_abs_det_jacobiani  s   zz##A&& SJJsO 	$DIId2b6l#	$
		!KK))	djj"Sb'2ab6: 	IJD!QLL--a3YAVAV5V
 004;;3H3HHHI	I e44r0   c                 J    | j                   D ]  }|j                  |      } |S rI   )r   rh   r,   rg   r   s      r/   rh   zComposeTransform.forward_shape~  s*    JJ 	.D&&u-E	.r0   c                 \    t        | j                        D ]  }|j                  |      } |S rI   )r   r   rk   r   s      r/   rk   zComposeTransform.inverse_shape  s/    TZZ( 	.D&&u-E	.r0   c                     | j                   j                  dz   }|dj                  | j                  D cg c]  }|j	                          c}      z  }|dz  }|S c c}w )Nz(
    z,
    z
))r.   rc   joinr   rd   )r,   
fmt_stringr   s      r/   rd   zComposeTransform.__repr__  sT    ^^,,y8
innDJJ%Gqajjl%GHH
e
 &Hs   A
rl   rm   )rc   rn   ro   rp   listr   r+   rM   r   r   r"   r#   r   r   rq   ru   rB   rt   r>   rG   rV   ra   rh   rk   rd   rv   rw   s   @r/   r   r     s    d9o )
 $[##6 7 $[##6 7 44 4 4 c   Y  C

5*

r0   r   c                        e Zd ZdZd fd	ZddZ ej                  d      d        Z ej                  d      d        Z	e
defd	       Ze
defd
       Zd Zd Zd Zd Zd Zd Z xZS )r   a  
    Wrapper around another transform to treat
    ``reinterpreted_batch_ndims``-many extra of the right most dimensions as
    dependent. This has no effect on the forward or backward transforms, but
    does sum out ``reinterpreted_batch_ndims``-many of the rightmost dimensions
    in :meth:`log_abs_det_jacobian`.

    Args:
        base_transform (:class:`Transform`): A base transform.
        reinterpreted_batch_ndims (int): The number of extra rightmost
            dimensions to treat as dependent.
    c                 `    t         |   |       |j                  |      | _        || _        y r{   )r*   r+   rG   base_transformreinterpreted_batch_ndims)r,   r   r   r-   r.   s       r/   r+   zIndependentTransform.__init__  s.    J/,77
C)B&r0   c                 h    | j                   |k(  r| S t        | j                  | j                  |      S r{   )r&   r   r   r   rF   s     r/   rG   zIndependentTransform.with_cache  s5    z)K#!?!?J
 	
r0   Fr|   c                 j    t        j                  | j                  j                  | j                        S rI   )r   r   r   r"   r   r9   s    r/   r"   zIndependentTransform.domain  s,    &&&&(F(F
 	
r0   c                 j    t        j                  | j                  j                  | j                        S rI   )r   r   r   r#   r   r9   s    r/   r#   zIndependentTransform.codomain  s,    &&(($*H*H
 	
r0   r6   c                 .    | j                   j                  S rI   )r   rq   r9   s    r/   rq   zIndependentTransform.bijective  s    "",,,r0   c                 .    | j                   j                  S rI   )r   rB   r9   s    r/   rB   zIndependentTransform.sign  s    ""'''r0   c                     |j                         | j                  j                  k  rt        d      | j	                  |      S NToo few dimensions on input)dimr"   r8   r)   r   r[   s     r/   rQ   zIndependentTransform._call  s7    557T[[***:;;""1%%r0   c                     |j                         | j                  j                  k  rt        d      | j                  j                  |      S r   )r   r#   r8   r)   r   r>   r^   s     r/   rX   zIndependentTransform._inverse  s=    557T]],,,:;;""&&q))r0   c                 j    | j                   j                  ||      }t        || j                        }|S rI   )r   ra   r   r   )r,   rR   rU   results       r/   ra   z)IndependentTransform.log_abs_det_jacobian  s1    $$99!Q?(F(FGr0   c                 z    | j                   j                   dt        | j                         d| j                   dS )Nr   z, r   )r.   rc   r   r   r   r9   s    r/   rd   zIndependentTransform.__repr__  s:    ..))*!D1D1D,E+FbIgIgHhhijjr0   c                 8    | j                   j                  |      S rI   )r   rh   rf   s     r/   rh   z"IndependentTransform.forward_shape      ""0077r0   c                 8    | j                   j                  |      S rI   )r   rk   rf   s     r/   rk   z"IndependentTransform.inverse_shape  r   r0   rl   rm   )rc   rn   ro   rp   r+   rG   r   r   r"   r#   rt   r   rq   ru   rB   rQ   rX   ra   rd   rh   rk   rv   rw   s   @r/   r   r     s    C

 $[##6
 7

 $[##6
 7

 -4 - - (c ( (&
*

k88r0   r   c                        e Zd ZdZdZd fd	Zej                  d        Zej                  d        Z	ddZ
d Zd Zd	 Zd
 Zd Z xZS )r   a  
    Unit Jacobian transform to reshape the rightmost part of a tensor.

    Note that ``in_shape`` and ``out_shape`` must have the same number of
    elements, just as for :meth:`torch.Tensor.reshape`.

    Arguments:
        in_shape (torch.Size): The input event shape.
        out_shape (torch.Size): The output event shape.
        cache_size (int): Size of cache. If zero, no caching is done. If one,
            the latest single value is cached. Only 0 and 1 are supported. (Default 0.)
    Tc                    t        j                  |      | _        t        j                  |      | _        | j                  j	                         | j                  j	                         k7  rt        d      t        |   |       y )Nz6in_shape, out_shape have different numbers of elementsrD   )r   Sizein_shape	out_shapenumelr)   r*   r+   )r,   r   r   r-   r.   s       r/   r+   zReshapeTransform.__init__  sa    

8,I.== DNN$8$8$::UVVJ/r0   c                 p    t        j                  t         j                  t        | j                              S rI   )r   r   r   lenr   r9   s    r/   r"   zReshapeTransform.domain  s$    &&{'7'7T]]9KLLr0   c                 p    t        j                  t         j                  t        | j                              S rI   )r   r   r   r   r   r9   s    r/   r#   zReshapeTransform.codomain  s$    &&{'7'7T^^9LMMr0   c                 h    | j                   |k(  r| S t        | j                  | j                  |      S r{   )r&   r   r   r   rF   s     r/   rG   zReshapeTransform.with_cache  s,    z)Kt~~*UUr0   c                     |j                   d |j                         t        | j                        z
   }|j	                  || j
                  z         S rI   )rg   r   r   r   reshaper   )r,   rR   batch_shapes      r/   rQ   zReshapeTransform._call  s?    gg<#dmm*< <=yyt~~566r0   c                     |j                   d |j                         t        | j                        z
   }|j	                  || j
                  z         S rI   )rg   r   r   r   r   r   )r,   rU   r   s      r/   rX   zReshapeTransform._inverse  s?    gg=#dnn*= =>yyt}}455r0   c                     |j                   d |j                         t        | j                        z
   }|j	                  |      S rI   )rg   r   r   r   	new_zeros)r,   rR   rU   r   s       r/   ra   z%ReshapeTransform.log_abs_det_jacobian  s6    gg<#dmm*< <={{;''r0   c                     t        |      t        | j                        k  rt        d      t        |      t        | j                        z
  }||d  | j                  k7  rt        d||d   d| j                         |d | | j                  z   S Nr   zShape mismatch: expected z	 but got )r   r   r)   r   r,   rg   cuts      r/   rh   zReshapeTransform.forward_shape	  s    u:DMM**:;;%j3t}}--;$--'+E#$K=	$--Q  Tc{T^^++r0   c                     t        |      t        | j                        k  rt        d      t        |      t        | j                        z
  }||d  | j                  k7  rt        d||d   d| j                         |d | | j                  z   S r   )r   r   r)   r   r   s      r/   rk   zReshapeTransform.inverse_shape  s    u:DNN++:;;%j3t~~..;$..(+E#$K=	$..AQR  Tc{T]]**r0   rl   rm   )rc   rn   ro   rp   rq   r+   r   r   r"   r#   rG   rQ   rX   ra   rh   rk   rv   rw   s   @r/   r   r     sk     I0 ##M $M ##N $NV
76(,+r0   r   c                   `    e Zd ZdZej
                  Zej                  ZdZ	dZ
d Zd Zd Zd Zy)	r   z8
    Transform via the mapping :math:`y = \exp(x)`.
    Tr%   c                 "    t        |t              S rI   )r   r   rK   s     r/   rM   zExpTransform.__eq__(      %..r0   c                 "    |j                         S rI   )expr[   s     r/   rQ   zExpTransform._call+      uuwr0   c                 "    |j                         S rI   logr^   s     r/   rX   zExpTransform._inverse.  r   r0   c                     |S rI   rJ   r`   s      r/   ra   z!ExpTransform.log_abs_det_jacobian1      r0   Nrc   rn   ro   rp   r   r   r"   positiver#   rq   rB   rM   rQ   rX   ra   rJ   r0   r/   r   r     s=     F##HID/r0   r   c                        e Zd ZdZej
                  Zej
                  ZdZd fd	Z	ddZ
edefd       Zd Zd Zd	 Zd
 Zd Zd Z xZS )r   zD
    Transform via the mapping :math:`y = x^{\text{exponent}}`.
    Tc                 J    t         |   |       t        |      \  | _        y r{   )r*   r+   r   exponent)r,   r   r-   r.   s      r/   r+   zPowerTransform.__init__>  s"    J/(2r0   c                 R    | j                   |k(  r| S t        | j                  |      S r{   )r&   r   r   rF   s     r/   rG   zPowerTransform.with_cacheB  s&    z)Kdmm
CCr0   r6   c                 6    | j                   j                         S rI   )r   rB   r9   s    r/   rB   zPowerTransform.signG  s    }}!!##r0   c                     t        |t              sy| j                  j                  |j                        j	                         j                         S r   )r   r   r   eqr   itemrK   s     r/   rM   zPowerTransform.__eq__K  s:    %0}}/335::<<r0   c                 8    |j                  | j                        S rI   powr   r[   s     r/   rQ   zPowerTransform._callP  s    uuT]]##r0   c                 >    |j                  d| j                  z        S r   r   r^   s     r/   rX   zPowerTransform._inverseS  s    uuQ&''r0   c                 ^    | j                   |z  |z  j                         j                         S rI   )r   absr   r`   s      r/   ra   z#PowerTransform.log_abs_det_jacobianV  s(    !A%**,0022r0   c                 X    t        j                  |t        | j                  dd            S Nrg   rJ   r   broadcast_shapesgetattrr   rf   s     r/   rh   zPowerTransform.forward_shapeY  "    %%eWT]]GR-PQQr0   c                 X    t        j                  |t        | j                  dd            S r  r  rf   s     r/   rk   zPowerTransform.inverse_shape\  r  r0   rl   rm   )rc   rn   ro   rp   r   r   r"   r#   rq   r+   rG   r   ru   rB   rM   rQ   rX   ra   rh   rk   rv   rw   s   @r/   r   r   5  sk     !!F##HI3D
 $c $ $=
$(3RRr0   r   c                     t        j                  | j                        }t        j                  t        j                  |       |j
                  d|j                  z
        S N      ?minr   )r   finfodtypeclampsigmoidtinyeps)rR   r  s     r/   _clipped_sigmoidr  `  s<    KK E;;u}}Q'UZZS599_MMr0   c                   `    e Zd ZdZej
                  Zej                  ZdZ	dZ
d Zd Zd Zd Zy)	r   zg
    Transform via the mapping :math:`y = \frac{1}{1 + \exp(-x)}` and :math:`x = \text{logit}(y)`.
    Tr%   c                 "    t        |t              S rI   )r   r   rK   s     r/   rM   zSigmoidTransform.__eq__o      %!122r0   c                     t        |      S rI   )r  r[   s     r/   rQ   zSigmoidTransform._callr  s    ""r0   c                     t        j                  |j                        }|j                  |j                  d|j
                  z
        }|j                         | j                         z
  S r	  )r   r  r  r  r  r  r   log1p)r,   rU   r  s      r/   rX   zSigmoidTransform._inverseu  sK    AGG$GG

eiiG8uuw1"%%r0   c                 \    t        j                  |        t        j                  |      z
  S rI   )Fr   r`   s      r/   ra   z%SigmoidTransform.log_abs_det_jacobianz  s!    

A2A..r0   N)rc   rn   ro   rp   r   r   r"   unit_intervalr#   rq   rB   rM   rQ   rX   ra   rJ   r0   r/   r   r   e  s=     F((HID3#&
/r0   r   c                   `    e Zd ZdZej
                  Zej                  ZdZ	dZ
d Zd Zd Zd Zy)	r   z
    Transform via the mapping :math:`\text{Softplus}(x) = \log(1 + \exp(x))`.
    The implementation reverts to the linear function when :math:`x > 20`.
    Tr%   c                 "    t        |t              S rI   )r   r   rK   s     r/   rM   zSoftplusTransform.__eq__  s    %!233r0   c                     t        |      S rI   r   r[   s     r/   rQ   zSoftplusTransform._call  s    {r0   c                 b    | j                         j                         j                         |z   S rI   )expm1negr   r^   s     r/   rX   zSoftplusTransform._inverse  s'    zz|!%%'!++r0   c                     t        |        S rI   r   r`   s      r/   ra   z&SoftplusTransform.log_abs_det_jacobian  s    !}r0   Nr   rJ   r0   r/   r   r   ~  s=    
 F##HID4,r0   r   c                   n    e Zd ZdZej
                  Z ej                  dd      ZdZ	dZ
d Zd Zd Zd	 Zy
)r   a  
    Transform via the mapping :math:`y = \tanh(x)`.

    It is equivalent to

    .. code-block:: python

        ComposeTransform(
            [
                AffineTransform(0.0, 2.0),
                SigmoidTransform(),
                AffineTransform(-1.0, 2.0),
            ]
        )

    However this might not be numerically stable, thus it is recommended to use `TanhTransform`
    instead.

    Note that one should use `cache_size=1` when it comes to `NaN/Inf` values.

    g      r
  Tr%   c                 "    t        |t              S rI   )r   r   rK   s     r/   rM   zTanhTransform.__eq__  s    %//r0   c                 "    |j                         S rI   )tanhr[   s     r/   rQ   zTanhTransform._call  s    vvxr0   c                 ,    t        j                  |      S rI   )r   atanhr^   s     r/   rX   zTanhTransform._inverse  s     {{1~r0   c                 V    dt        j                  d      |z
  t        d|z        z
  z  S )N       @g       )mathr   r   r`   s      r/   ra   z"TanhTransform.log_abs_det_jacobian  s*     dhhsma'(4!8*<<==r0   N)rc   rn   ro   rp   r   r   r"   intervalr#   rq   rB   rM   rQ   rX   ra   rJ   r0   r/   r   r     sF    , F#{##D#.HID0
>r0   r   c                   R    e Zd ZdZej
                  Zej                  Zd Z	d Z
d Zy)r   z*Transform via the mapping :math:`y = |x|`.c                 "    t        |t              S rI   )r   r   rK   s     r/   rM   zAbsTransform.__eq__  r   r0   c                 "    |j                         S rI   )r   r[   s     r/   rQ   zAbsTransform._call  r   r0   c                     |S rI   rJ   r^   s     r/   rX   zAbsTransform._inverse  r   r0   N)rc   rn   ro   rp   r   r   r"   r   r#   rM   rQ   rX   rJ   r0   r/   r   r     s*    5F##H/r0   r   c                        e Zd ZdZdZd fd	Zedefd       Z e	j                  d      d        Z e	j                  d      d	        Zdd
Zd Zedefd       Zd Zd Zd Zd Zd Z xZS )r   a  
    Transform via the pointwise affine mapping :math:`y = \text{loc} + \text{scale} \times x`.

    Args:
        loc (Tensor or float): Location parameter.
        scale (Tensor or float): Scale parameter.
        event_dim (int): Optional size of `event_shape`. This should be zero
            for univariate random variables, 1 for distributions over vectors,
            2 for distributions over matrices, etc.
    Tc                 P    t         |   |       || _        || _        || _        y r{   )r*   r+   locscale
_event_dim)r,   r5  r6  r8   r-   r.   s        r/   r+   zAffineTransform.__init__  s(    J/
#r0   r6   c                     | j                   S rI   )r7  r9   s    r/   r8   zAffineTransform.event_dim  s    r0   Fr|   c                     | j                   dk(  rt        j                  S t        j                  t        j                  | j                         S Nr   r8   r   r   r   r9   s    r/   r"   zAffineTransform.domain  7    >>Q###&&{'7'7HHr0   c                     | j                   dk(  rt        j                  S t        j                  t        j                  | j                         S r:  r;  r9   s    r/   r#   zAffineTransform.codomain  r<  r0   c                 ~    | j                   |k(  r| S t        | j                  | j                  | j                  |      S r{   )r&   r   r5  r6  r8   rF   s     r/   rG   zAffineTransform.with_cache  s7    z)KHHdjj$..Z
 	
r0   c                 8   t        |t              syt        | j                  t              r4t        |j                  t              r| j                  |j                  k7  r7y| j                  |j                  k(  j	                         j                         syt        | j                  t              r5t        |j                  t              r| j                  |j                  k7  ryy| j                  |j                  k(  j	                         j                         syy)NFT)r   r   r5  r   r   r   r6  rK   s     r/   rM   zAffineTransform.__eq__  s    %1dhh(Z		7-Kxx599$HH		)..0557djj'*z%++w/OzzU[[(
  JJ%++-22499;r0   c                     t        | j                  t              r6t        | j                        dkD  rdS t        | j                        dk  rdS dS | j                  j	                         S )Nr   r%   r   )r   r6  r   floatrB   r9   s    r/   rB   zAffineTransform.sign  sR    djj'*djj)A-1Utzz9JQ9N2UTUUzz  r0   c                 :    | j                   | j                  |z  z   S rI   r5  r6  r[   s     r/   rQ   zAffineTransform._call  s    xx$**q.((r0   c                 :    || j                   z
  | j                  z  S rI   rC  r^   s     r/   rX   zAffineTransform._inverse  s    DHH

**r0   c                    |j                   }| j                  }t        |t              r3t	        j
                  |t        j                  t        |                  }n#t	        j                  |      j                         }| j                  rQ|j                         d | j                    dz   }|j                  |      j                  d      }|d | j                    }|j                  |      S )N)r   r   )rg   r6  r   r   r   	full_liker-  r   r   r8   sizeviewsumexpand)r,   rR   rU   rg   r6  r   result_sizes          r/   ra   z$AffineTransform.log_abs_det_jacobian  s    

eW%__QU(<=FYYu%))+F>> ++-(94>>/:UBK[[-11"5F+T^^O,E}}U##r0   c           	          t        j                  |t        | j                  dd      t        | j                  dd            S r  r   r  r  r5  r6  rf   s     r/   rh   zAffineTransform.forward_shape+  7    %%7488Wb174::wPR3S
 	
r0   c           	          t        j                  |t        | j                  dd      t        | j                  dd            S r  rM  rf   s     r/   rk   zAffineTransform.inverse_shape0  rN  r0   r   r   rm   )rc   rn   ro   rp   rq   r+   rt   ru   r8   r   r   r"   r#   rG   rM   rB   rQ   rX   ra   rh   rk   rv   rw   s   @r/   r   r     s    	 I$ 3   $[##6I 7I
 $[##6I 7I

( !c ! !
)+$


r0   r   c                   d    e Zd ZdZej
                  Zej                  ZdZ	d Z
d Zd	dZd Zd Zy)
r   a  
    Transforms an uncontrained real vector :math:`x` with length :math:`D*(D-1)/2` into the
    Cholesky factor of a D-dimension correlation matrix. This Cholesky factor is a lower
    triangular matrix with positive diagonals and unit Euclidean norm for each row.
    The transform is processed as follows:

        1. First we convert x into a lower triangular matrix in row order.
        2. For each row :math:`X_i` of the lower triangular part, we apply a *signed* version of
           class :class:`StickBreakingTransform` to transform :math:`X_i` into a
           unit Euclidean length vector using the following steps:
           - Scales into the interval :math:`(-1, 1)` domain: :math:`r_i = \tanh(X_i)`.
           - Transforms into an unsigned domain: :math:`z_i = r_i^2`.
           - Applies :math:`s_i = StickBreakingTransform(z_i)`.
           - Transforms back into signed domain: :math:`y_i = sign(r_i) * \sqrt{s_i}`.
    Tc                    t        j                  |      }t        j                  |j                        j                  }|j                  d|z   d|z
        }t        |d      }|dz  }d|z
  j                         j                  d      }|t        j                  |j                  d   |j                  |j                        z   }|t        |dd df   ddgd	      z  }|S )
Nr   r%   r  diag   )r  device.r   value)r   r(  r  r  r  r  r	   sqrtcumprodeyerg   rV  r
   )r,   rR   r  rzz1m_cumprod_sqrtrU   s          r/   rQ   zCorrCholeskyTransform._callK  s    JJqMkk!''"&&GGSa#gG.qr* qDE<<>11"5		!''"+QWWQXXFF$S#2#X.Aa@@r0   c                 ,   dt        j                  ||z  d      z
  }t        |dd df   ddgd      }t        |d      }t        |d      }||j	                         z  }|j                         |j                         j                         z
  dz  }|S )	Nr%   r   r   .r   rW  rS  rU  )r   cumsumr
   r   rY  r  r#  )r,   rU   y_cumsumy_cumsum_shiftedy_vecy_cumsum_vectrR   s           r/   rX   zCorrCholeskyTransform._inverseZ  s     u||AEr22xSbS1Aq6C"12.)*:D\''))WWY(A-r0   Nc                    d||z  j                  d      z
  }t        |d      }d|j                         j                  d      z  }d|t	        d|z        z   t        j                  d      z
  j                  d      z  }||z   S )Nr%   r   r`  rS        ?r,  )ra  r   r   rI  r   r-  )r,   rR   rU   intermediates
y1m_cumsumy1m_cumsum_trilstick_breaking_logdettanh_logdets           r/   ra   z*CorrCholeskyTransform.log_abs_det_jacobianf  s     !a%B//
 -ZbA #&;&;&=&A&A"&E EAa 00488C=@EE"EMM${22r0   c                     t        |      dk  rt        d      |d   }t        dd|z  z   dz  dz         }||dz
  z  dz  |k7  rt        d      |d d ||fz   S )Nr%   r   r   g      ?rU  ri  z-Input is not a flattend lower-diagonal number)r   r)   round)r,   rg   NDs       r/   rh   z#CorrCholeskyTransform.forward_shapet  st    u:>:;;"I4!a%<C'#-.A;!q LMMSbzQF""r0   c                     t        |      dk  rt        d      |d   |d   k7  rt        d      |d   }||dz
  z  dz  }|d d |fz   S )NrU  r   rh  r   zInput is not squarer%   r   r)   )r,   rg   rr  rq  s       r/   rk   z#CorrCholeskyTransform.inverse_shape~  sc    u:>:;;9b	!233"IQK1SbzQD  r0   rI   )rc   rn   ro   rp   r   real_vectorr"   corr_choleskyr#   rq   rQ   rX   ra   rh   rk   rJ   r0   r/   r   r   6  s=      $$F((HI
3#!r0   r   c                   ^    e Zd ZdZej
                  Zej                  Zd Z	d Z
d Zd Zd Zy)r   a<  
    Transform from unconstrained space to the simplex via :math:`y = \exp(x)` then
    normalizing.

    This is not bijective and cannot be used for HMC. However this acts mostly
    coordinate-wise (except for the final normalization), and thus is
    appropriate for coordinate-wise optimization algorithms.
    c                 "    t        |t              S rI   )r   r   rK   s     r/   rM   zSoftmaxTransform.__eq__  r  r0   c                 |    |}||j                  dd      d   z
  j                         }||j                  dd      z  S )Nr   Tr   )r   r   rI  )r,   rR   logprobsprobss       r/   rQ   zSoftmaxTransform._call  s@    HLLT2155::<uyyT***r0   c                 &    |}|j                         S rI   r   )r,   rU   r{  s      r/   rX   zSoftmaxTransform._inverse  s    yy{r0   c                 8    t        |      dk  rt        d      |S Nr%   r   rt  rf   s     r/   rh   zSoftmaxTransform.forward_shape      u:>:;;r0   c                 8    t        |      dk  rt        d      |S r~  rt  rf   s     r/   rk   zSoftmaxTransform.inverse_shape  r  r0   N)rc   rn   ro   rp   r   ru  r"   simplexr#   rM   rQ   rX   rh   rk   rJ   r0   r/   r   r     s8     $$F""H3+

r0   r   c                   h    e Zd ZdZej
                  Zej                  ZdZ	d Z
d Zd Zd Zd Zd Zy	)
r   a  
    Transform from unconstrained space to the simplex of one additional
    dimension via a stick-breaking process.

    This transform arises as an iterated sigmoid transform in a stick-breaking
    construction of the `Dirichlet` distribution: the first logit is
    transformed via sigmoid to the first probability and the probability of
    everything else, and then the process recurses.

    This is bijective and appropriate for use in HMC; however it mixes
    coordinates together and is less appropriate for optimization.
    Tc                 "    t        |t              S rI   )r   r   rK   s     r/   rM   zStickBreakingTransform.__eq__      %!788r0   c                 (   |j                   d   dz   |j                  |j                   d         j                  d      z
  }t        ||j	                         z
        }d|z
  j                  d      }t        |ddgd      t        |ddgd      z  }|S )Nr   r%   r   rW  )rg   new_onesra  r  r   rZ  r
   )r,   rR   offsetr]  	z_cumprodrU   s         r/   rQ   zStickBreakingTransform._call  s    q1::aggbk#:#A#A"#EEQ-.UOOB'	Aq6#c)aV1&EEr0   c                    |dd df   }|j                   d   |j                  |j                   d         j                  d      z
  }d|j                  d      z
  }t        j                  |t        j
                  |j                        j                        }|j                         |j                         z
  |j                         z   }|S )N.r   r%   )r  )	rg   r  ra  r   r  r  r  r  r   )r,   rU   y_cropr  sfrR   s         r/   rX   zStickBreakingTransform._inverse  s    38qzz&,,r*:;BB2FFr"" [[QWW!5!:!:;JJL2668#fjjl2r0   c                 ,   |j                   d   dz   |j                  |j                   d         j                  d      z
  }||j                         z
  }| t	        j
                  |      z   |dd df   j                         z   j                  d      }|S )Nr   r%   .)rg   r  ra  r   r  
logsigmoidrI  )r,   rR   rU   r  detJs        r/   ra   z+StickBreakingTransform.log_abs_det_jacobian  s    q1::aggbk#:#A#A"#EE

Q\\!_$qcrc{'88==bAr0   c                 R    t        |      dk  rt        d      |d d |d   dz   fz   S Nr%   r   r   rt  rf   s     r/   rh   z$StickBreakingTransform.forward_shape  5    u:>:;;SbzU2Y],,,r0   c                 R    t        |      dk  rt        d      |d d |d   dz
  fz   S r  rt  rf   s     r/   rk   z$StickBreakingTransform.inverse_shape  r  r0   N)rc   rn   ro   rp   r   ru  r"   r  r#   rq   rM   rQ   rX   ra   rh   rk   rJ   r0   r/   r   r     sB     $$F""HI9-
-r0   r   c                   t    e Zd ZdZ ej
                  ej                  d      Zej                  Z	d Z
d Zd Zy)r   z
    Transform from unconstrained matrices to lower-triangular matrices with
    nonnegative diagonal entries.

    This is useful for parameterizing positive definite matrices in terms of
    their Cholesky factorization.
    rU  c                 "    t        |t              S rI   )r   r   rK   s     r/   rM   zLowerCholeskyTransform.__eq__  r  r0   c                     |j                  d      |j                  dd      j                         j                         z   S Nr   rh  )dim1dim2)trildiagonalr   
diag_embedr[   s     r/   rQ   zLowerCholeskyTransform._call  4    vvbzAJJBRJ8<<>IIKKKr0   c                     |j                  d      |j                  dd      j                         j                         z   S r  )r  r  r   r  r^   s     r/   rX   zLowerCholeskyTransform._inverse  r  r0   N)rc   rn   ro   rp   r   r   r   r"   lower_choleskyr#   rM   rQ   rX   rJ   r0   r/   r   r     s?     %[$$[%5%5q9F))H9LLr0   r   c                   t    e Zd ZdZ ej
                  ej                  d      Zej                  Z	d Z
d Zd Zy)r   zN
    Transform from unconstrained matrices to positive-definite matrices.
    rU  c                 "    t        |t              S rI   )r   r   rK   s     r/   rM   z PositiveDefiniteTransform.__eq__  s    %!:;;r0   c                 @     t               |      }||j                  z  S rI   )r   mTr[   s     r/   rQ   zPositiveDefiniteTransform._call  s    $"$Q'144xr0   c                 r    t         j                  j                  |      }t               j	                  |      S rI   )r   linalgcholeskyr   r>   r^   s     r/   rX   z"PositiveDefiniteTransform._inverse
  s*    LL!!!$%'++A..r0   N)rc   rn   ro   rp   r   r   r   r"   positive_definiter#   rM   rQ   rX   rJ   r0   r/   r   r     s=     %[$$[%5%5q9F,,H</r0   r   c                        e Zd ZU dZee   ed<   d fd	Zede	fd       Z
ede	fd       ZddZd Zd	 Zd
 Zedefd       Zej(                  d        Zej(                  d        Z xZS )r   a  
    Transform functor that applies a sequence of transforms `tseq`
    component-wise to each submatrix at `dim`, of length `lengths[dim]`,
    in a way compatible with :func:`torch.cat`.

    Example::

       x0 = torch.cat([torch.range(1, 10), torch.range(1, 10)], dim=0)
       x = torch.cat([x0, x0], dim=0)
       t0 = CatTransform([ExpTransform(), identity_transform], dim=0, lengths=[10, 10])
       t = CatTransform([t0, t0], dim=0, lengths=[20, 20])
       y = t(x)
    
transformsc                 v   t        d |D              sJ |r|D cg c]  }|j                  |       }}t        |   |       t	        |      | _        |dgt        | j
                        z  }t	        |      | _        t        | j                        t        | j
                        k(  sJ || _        y c c}w )Nc              3   <   K   | ]  }t        |t                y wrI   r   r   r   rf  s     r/   r   z(CatTransform.__init__.<locals>.<genexpr>!       ::a+:   rD   r%   )	r   rG   r*   r+   r   r  r   lengthsr   )r,   tseqr   r  r-   rf  r.   s         r/   r+   zCatTransform.__init__   s    :T::::6:;ALL,;D;J/t*?cC00GG}4<< C$8888 <s   B6r6   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrI   )r8   r  s     r/   r   z)CatTransform.event_dim.<locals>.<genexpr>.       811;;8r   )r   r  r9   s    r/   r8   zCatTransform.event_dim,      8888r0   c                 ,    t        | j                        S rI   )rI  r  r9   s    r/   lengthzCatTransform.length0  s    4<<  r0   c                 |    | j                   |k(  r| S t        | j                  | j                  | j                  |      S rI   )r&   r   r  r   r  rF   s     r/   rG   zCatTransform.with_cache4  s2    z)KDOOTXXt||ZPPr0   c                    |j                          | j                   cxk  r|j                         k  sJ  J |j                  | j                         | j                  k(  sJ g }d}t        | j                  | j
                        D ]>  \  }}|j                  | j                   ||      }|j                   ||             ||z   }@ t        j                  || j                         S Nr   r`  )
r   rG  r  r   r  r  narrowr   r   cat)r,   rR   yslicesstarttransr  xslices          r/   rQ   zCatTransform._call9  s    x488-aeeg-----vvdhh4;;... $,,? 	#ME6XXdhhv6FNN5=)FNE	# yydhh//r0   c                    |j                          | j                   cxk  r|j                         k  sJ  J |j                  | j                         | j                  k(  sJ g }d}t        | j                  | j
                        D ]G  \  }}|j                  | j                   ||      }|j                  |j                  |             ||z   }I t        j                  || j                         S r  )r   rG  r  r   r  r  r  r   r>   r   r  )r,   rU   xslicesr  r  r  yslices          r/   rX   zCatTransform._inverseD  s    x488-aeeg-----vvdhh4;;... $,,? 	#ME6XXdhhv6FNN599V,-FNE	# yydhh//r0   c                    |j                          | j                   cxk  r|j                         k  sJ  J |j                  | j                         | j                  k(  sJ |j                          | j                   cxk  r|j                         k  sJ  J |j                  | j                         | j                  k(  sJ g }d}t        | j                  | j
                        D ]  \  }}|j                  | j                   ||      }|j                  | j                   ||      }|j                  ||      }	|j                  | j                  k  r#t        |	| j                  |j                  z
        }	|j                  |	       ||z   } | j                   }
|
dk\  r|
|j                         z
  }
|
| j                  z   }
|
dk  rt        j                  ||
      S t        |      S r  )r   rG  r  r   r  r  r  ra   r8   r   r   r   r  rI  )r,   rR   rU   
logdetjacsr  r  r  r  r  	logdetjacr   s              r/   ra   z!CatTransform.log_abs_det_jacobianO  s   x488-aeeg-----vvdhh4;;...x488-aeeg-----vvdhh4;;...
 $,,? 	#ME6XXdhhv6FXXdhhv6F2266BI/*9dnnu6VW	i(FNE	# hh!8-CDNN"799ZS11z?"r0   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrI   r   r  s     r/   r   z)CatTransform.bijective.<locals>.<genexpr>j  r  r   r   r  r9   s    r/   rq   zCatTransform.bijectiveh  r  r0   c                     t        j                  | j                  D cg c]  }|j                   c}| j                  | j
                        S c c}w rI   )r   r  r  r"   r   r  r,   rf  s     r/   r"   zCatTransform.domainl  s8    #/!QXX/4<<
 	
/   Ac                     t        j                  | j                  D cg c]  }|j                   c}| j                  | j
                        S c c}w rI   )r   r  r  r#   r   r  r  s     r/   r#   zCatTransform.codomainr  s8    !%1AQZZ1488T\\
 	
1r  )r   Nr   rm   )rc   rn   ro   rp   r   r   rs   r+   r   ru   r8   r  rG   rQ   rX   ra   rt   r   rq   r   r   r"   r#   rv   rw   s   @r/   r   r     s     Y
 93 9 9 ! ! !Q
	0	0#2 94 9 9 ##
 $

 ##
 $
r0   r   c                        e Zd ZU dZee   ed<   d fd	ZddZd Z	d Z
d Zd Zed	efd
       Zej"                  d        Zej"                  d        Z xZS )r   aW  
    Transform functor that applies a sequence of transforms `tseq`
    component-wise to each submatrix at `dim`
    in a way compatible with :func:`torch.stack`.

    Example::

       x = torch.stack([torch.range(1, 10), torch.range(1, 10)], dim=1)
       t = StackTransform([ExpTransform(), identity_transform], dim=1)
       y = t(x)
    r  c                     t        d |D              sJ |r|D cg c]  }|j                  |       }}t        |   |       t	        |      | _        || _        y c c}w )Nc              3   <   K   | ]  }t        |t                y wrI   r  r  s     r/   r   z*StackTransform.__init__.<locals>.<genexpr>  r  r  rD   )r   rG   r*   r+   r   r  r   )r,   r  r   r-   rf  r.   s        r/   r+   zStackTransform.__init__  s]    :T::::6:;ALL,;D;J/t* <s   Ac                 f    | j                   |k(  r| S t        | j                  | j                  |      S rI   )r&   r   r  r   rF   s     r/   rG   zStackTransform.with_cache  s,    z)KdootxxDDr0   c                     t        |j                  | j                              D cg c]  }|j                  | j                  |        c}S c c}w rI   )rangerG  r   select)r,   r]  is      r/   _slicezStackTransform._slice  s7    /4QVVDHH5E/FG!1%GGGs   #Ac                    |j                          | j                   cxk  r|j                         k  sJ  J |j                  | j                         t        | j                        k(  sJ g }t	        | j                  |      | j                        D ]  \  }}|j                   ||              t        j                  || j                         S Nr`  )	r   rG  r   r  r   r  r   r   stack)r,   rR   r  r  r  s        r/   rQ   zStackTransform._call  s    x488-aeeg-----vvdhh3t#7777 QA 	*MFENN5=)	*{{711r0   c                    |j                          | j                   cxk  r|j                         k  sJ  J |j                  | j                         t        | j                        k(  sJ g }t	        | j                  |      | j                        D ]%  \  }}|j                  |j                  |             ' t        j                  || j                         S r  )
r   rG  r   r  r   r  r   r>   r   r  )r,   rU   r  r  r  s        r/   rX   zStackTransform._inverse  s    x488-aeeg-----vvdhh3t#7777 QA 	.MFENN599V,-	.{{711r0   c                    |j                          | j                   cxk  r|j                         k  sJ  J |j                  | j                         t        | j                        k(  sJ |j                          | j                   cxk  r|j                         k  sJ  J |j                  | j                         t        | j                        k(  sJ g }| j	                  |      }| j	                  |      }t        ||| j                        D ]'  \  }}}|j                  |j                  ||             ) t        j                  || j                         S r  )
r   rG  r   r  r  r   r   ra   r   r  )	r,   rR   rU   r  r  r  r  r  r  s	            r/   ra   z#StackTransform.log_abs_det_jacobian  s   x488-aeeg-----vvdhh3t#7777x488-aeeg-----vvdhh3t#7777
++a.++a.%('4??%K 	J!FFEe88HI	J{{:48844r0   r6   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrI   r   r  s     r/   r   z+StackTransform.bijective.<locals>.<genexpr>  r  r   r  r9   s    r/   rq   zStackTransform.bijective  r  r0   c                     t        j                  | j                  D cg c]  }|j                   c}| j                        S c c}w rI   )r   r  r  r"   r   r  s     r/   r"   zStackTransform.domain  s/      DOO!Dq!((!DdhhOO!D   Ac                     t        j                  | j                  D cg c]  }|j                   c}| j                        S c c}w rI   )r   r  r  r#   r   r  s     r/   r#   zStackTransform.codomain  s/      doo!F!**!FQQ!Fr  rP  rm   )rc   rn   ro   rp   r   r   rs   r+   rG   r  rQ   rX   ra   rt   r   rq   r   r   r"   r#   rv   rw   s   @r/   r   r   y  s    
 YE
H22
5 94 9 9 ##P $P ##R $Rr0   r   c                        e Zd ZdZdZej                  ZdZd fd	Z	e
dej                  fd       Zd Zd Zd	 Zdd
Z xZS )r   aA  
    Transform via the cumulative distribution function of a probability distribution.

    Args:
        distribution (Distribution): Distribution whose cumulative distribution function to use for
            the transformation.

    Example::

        # Construct a Gaussian copula from a multivariate normal.
        base_dist = MultivariateNormal(
            loc=torch.zeros(2),
            scale_tril=LKJCholesky(2).sample(),
        )
        transform = CumulativeDistributionTransform(Normal(0, 1))
        copula = TransformedDistribution(base_dist, [transform])
    Tr%   c                 4    t         |   |       || _        y r{   )r*   r+   distribution)r,   r  r-   r.   s      r/   r+   z(CumulativeDistributionTransform.__init__  s    J/(r0   r6   c                 .    | j                   j                  S rI   )r  supportr9   s    r/   r"   z&CumulativeDistributionTransform.domain  s      (((r0   c                 8    | j                   j                  |      S rI   )r  cdfr[   s     r/   rQ   z%CumulativeDistributionTransform._call  s      $$Q''r0   c                 8    | j                   j                  |      S rI   )r  icdfr^   s     r/   rX   z(CumulativeDistributionTransform._inverse  s      %%a((r0   c                 8    | j                   j                  |      S rI   )r  log_probr`   s      r/   ra   z4CumulativeDistributionTransform.log_abs_det_jacobian  s      ))!,,r0   c                 R    | j                   |k(  r| S t        | j                  |      S r{   )r&   r   r  rF   s     r/   rG   z*CumulativeDistributionTransform.with_cache  s(    z)K.t/@/@ZXXr0   rl   rm   )rc   rn   ro   rp   rq   r   r  r#   rB   r+   rt   rr   r"   rQ   rX   ra   rG   rv   rw   s   @r/   r   r     sZ    $ I((HD) ).. ) )()-Yr0   r   ).r   r-  r   r<   typingr   r   torch.nn.functionalnn
functionalr  torch.distributionsr   torch.distributions.utilsr   r   r   r   r	   r
   r   torch.typesr   __all__r   r;   r   r    r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   r0   r/   <module>r     s_           +  . 0f fR;.	 ;.|wy wt &b) D89 D8NB+y B+J9 .(RY (RVN
/y /2	 0*>I *>Z9  `
i `
FP!I P!f!y !H5-Y 5-pLY L,/	 /(g
9 g
TERY ERP+Yi +Yr0   