
    IЦi                     ^   S SK r S SKrS SKrS SKrS SKrS SKJr  S SKrS SKJ	s  J
r  S SKJr  S SKJrJrJrJrJr  S SKJrJr  / SQr " S S5      r " S	 S
\5      r " S S\5      r\" / 5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS r " S S\5      r  " S S\5      r! " S S\5      r" " S S\5      r# " S S\5      r$ " S  S!\5      r% " S" S#\5      r& " S$ S%\5      r' " S& S'\5      r( " S( S)\5      r) " S* S+\5      r* " S, S-\5      r+ " S. S/\5      r,g)0    N)List)constraints)_sum_rightmostbroadcast_alllazy_propertytril_matrix_to_vecvec_to_tril_matrix)padsoftplus)AbsTransformAffineTransformCatTransformComposeTransformCorrCholeskyTransformCumulativeDistributionTransformExpTransformIndependentTransformLowerCholeskyTransformPositiveDefiniteTransformPowerTransformReshapeTransformSigmoidTransformSoftplusTransformTanhTransformSoftmaxTransformStackTransformStickBreakingTransform	Transformidentity_transformc                      ^  \ rS rSr% SrSr\R                  \S'   \R                  \S'   SU 4S jjr	S r
\S 5       r\S	 5       r\S
 5       rSS jrS rS rS rS rS rS rS rS rS rS rSrU =r$ )r   .   ac  
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                 |   > Xl         S U l        US:X  a  OUS:X  a  SU l        O[        S5      e[        TU ]  5         g )Nr      )NNzcache_size must be 0 or 1)_cache_size_inv_cached_x_y
ValueErrorsuper__init__)self
cache_size	__class__s     ]/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/torch/distributions/transforms.pyr+   Transform.__init___   s@    %	?1_)D899    c                 D    U R                   R                  5       nS US'   U$ )Nr'   )__dict__copy)r,   states     r/   __getstate__Transform.__getstate__j   s"    ""$fr1   c                     U R                   R                  U R                  R                  :X  a  U R                   R                  $ [        S5      e)Nz:Please use either .domain.event_dim or .codomain.event_dim)r"   	event_dimr#   r)   r,   s    r/   r9   Transform.event_dimo   s:    ;;  DMM$;$;;;;(((UVVr1   c                     SnU R                   b  U R                  5       nUc&  [        U 5      n[        R                  " U5      U l         U$ )zc
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@   Transform.invu   sB     99 ))+C;#D)CC(DI
r1   c                     [         e)z
Returns the sign of the determinant of the Jacobian, if applicable.
In general this only makes sense for bijective transforms.
NotImplementedErrorr:   s    r/   signTransform.sign   s
     "!r1   c                     U R                   U:X  a  U $ [        U 5      R                  [        R                  L a  [        U 5      " US9$ [	        [        U 5       S35      e)Nr-   z.with_cache is not implemented)r&   typer+   r   rD   r,   r-   s     r/   
with_cacheTransform.with_cache   sS    z)K:)"4"44:44!T$ZL0N"OPPr1   c                     XL $ N r,   others     r/   __eq__Transform.__eq__   s
    }r1   c                 .    U R                  U5      (       + $ rN   )rR   rP   s     r/   __ne__Transform.__ne__   s    ;;u%%%r1   c                     U R                   S:X  a  U R                  U5      $ U R                  u  p#XL a  U$ U R                  U5      nX4U l        U$ )z"
Computes the transform `x => y`.
r   )r&   _callr(   )r,   xx_oldy_oldys        r/   __call__Transform.__call__   sS     q ::a= '':LJJqM4r1   c                     U R                   S:X  a  U R                  U5      $ U R                  u  p#XL a  U$ U R                  U5      nXA4U l        U$ )z!
Inverts the transform `y => x`.
r   )r&   _inverser(   )r,   r\   rZ   r[   rY   s        r/   	_inv_callTransform._inv_call   sU     q ==##'':LMM!4r1   c                     [         e)z4
Abstract method to compute forward transformation.
rC   r,   rY   s     r/   rX   Transform._call   
     "!r1   c                     [         e)z4
Abstract method to compute inverse transformation.
rC   r,   r\   s     r/   r`   Transform._inverse   rf   r1   c                     [         e)zE
Computes the log det jacobian `log |dy/dx|` given input and output.
rC   r,   rY   r\   s      r/   log_abs_det_jacobianTransform.log_abs_det_jacobian   rf   r1   c                 4    U R                   R                  S-   $ )Nz())r.   __name__r:   s    r/   __repr__Transform.__repr__   s    ~~&&--r1   c                     U$ )zc
Infers the shape of the forward computation, given the input shape.
Defaults to preserving shape.
rO   r,   shapes     r/   forward_shapeTransform.forward_shape   	    
 r1   c                     U$ )ze
Infers the shapes of the inverse computation, given the output shape.
Defaults to preserving shape.
rO   rs   s     r/   inverse_shapeTransform.inverse_shape   rw   r1   )r&   r(   r'   r   r%   )ro   
__module____qualname____firstlineno____doc__	bijectiver   
Constraint__annotations__r+   r6   propertyr9   r@   rE   rK   rR   rU   r]   ra   rX   r`   rl   rp   ru   ry   __static_attributes____classcell__r.   s   @r/   r   r   .   s    *X I"""$$$	
 W W
   " "Q&""". r1   r   c                      ^  \ rS rSrSrS\4U 4S jjr\R                  " SS9S 5       r	\R                  " SS9S 5       r
\S	 5       r\S
 5       r\S 5       rSS jrS rS rS rS rS rS rSrU =r$ )r=      zp
Inverts a single :class:`Transform`.
This class is private; please instead use the ``Transform.inv`` property.
	transformc                 @   > [         TU ]  UR                  S9  Xl        g NrH   )r*   r+   r&   r'   )r,   r   r.   s     r/   r+   _InverseTransform.__init__   s    I$9$9:(	r1   Fis_discretec                 L    U R                   c   eU R                   R                  $ rN   )r'   r#   r:   s    r/   r"   _InverseTransform.domain   s"    yy$$$yy!!!r1   c                 L    U R                   c   eU R                   R                  $ rN   )r'   r"   r:   s    r/   r#   _InverseTransform.codomain   s"    yy$$$yyr1   c                 L    U R                   c   eU R                   R                  $ rN   )r'   r   r:   s    r/   r   _InverseTransform.bijective   s"    yy$$$yy"""r1   c                 L    U R                   c   eU R                   R                  $ rN   )r'   rE   r:   s    r/   rE   _InverseTransform.sign   s     yy$$$yy~~r1   c                     U R                   $ rN   r'   r:   s    r/   r@   _InverseTransform.inv   s    yyr1   c                 j    U R                   c   eU R                  R                  U5      R                  $ rN   )r'   r@   rK   rJ   s     r/   rK   _InverseTransform.with_cache   s-    yy$$$xx"":.222r1   c                 ~    [        U[        5      (       d  gU R                  c   eU R                  UR                  :H  $ NF)
isinstancer=   r'   rP   s     r/   rR   _InverseTransform.__eq__   s6    %!233yy$$$yyEJJ&&r1   c                 `    U R                   R                   S[        U R                  5       S3$ )N())r.   ro   reprr'   r:   s    r/   rp   _InverseTransform.__repr__  s)    ..))*!DO+<A>>r1   c                 V    U R                   c   eU R                   R                  U5      $ rN   )r'   ra   rd   s     r/   r]   _InverseTransform.__call__  s'    yy$$$yy""1%%r1   c                 X    U R                   c   eU R                   R                  X!5      * $ rN   )r'   rl   rk   s      r/   rl   &_InverseTransform.log_abs_det_jacobian
  s*    yy$$$		..q444r1   c                 8    U R                   R                  U5      $ rN   )r'   ry   rs   s     r/   ru   _InverseTransform.forward_shape      yy&&u--r1   c                 8    U R                   R                  U5      $ rN   )r'   ru   rs   s     r/   ry   _InverseTransform.inverse_shape  r   r1   r   r|   )ro   r}   r~   r   r   r   r+   r   dependent_propertyr"   r#   r   r   rE   r@   rK   rR   rp   r]   rl   ru   ry   r   r   r   s   @r/   r=   r=      s    
)) ) ##6" 7" ##6  7  # #    3'?&5.. .r1   r=   c                      ^  \ rS rSrSrSS\\   4U 4S jjjrS r\	R                  " SS9S 5       r\	R                  " SS9S	 5       r\S
 5       r\S 5       r\S 5       rSS jrS rS rS rS rS rSrU =r$ )r   i  aF  
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                    > U(       a   U Vs/ s H  o3R                  U5      PM     nn[        TU ]	  US9  Xl        g s  snf r   )rK   r*   r+   r   )r,   r   r-   partr.   s       r/   r+   ComposeTransform.__init__   s<    =BCUT__Z0UECJ/
 Ds   =c                 `    [        U[        5      (       d  gU R                  UR                  :H  $ r   )r   r   r   rP   s     r/   rR   ComposeTransform.__eq__&  s&    %!122zzU[[((r1   Fr   c                    U R                   (       d  [        R                  $ U R                   S   R                  nU R                   S   R                  R
                  n[        U R                   5       HQ  nX#R                  R
                  UR                  R
                  -
  -  n[        X#R                  R
                  5      nMS     X!R
                  :  d   eX!R
                  :  a#  [        R                  " XUR
                  -
  5      nU$ )Nr   )	r   r   realr"   r#   r9   reversedmaxindependent)r,   r"   r9   r   s       r/   r"   ComposeTransform.domain+  s    zz###A%%JJrN++55	TZZ(D..1H1HHHII{{'<'<=I ) ,,,,,''' ,,VAQAQ5QRFr1   c                    U R                   (       d  [        R                  $ U R                   S   R                  nU R                   S   R                  R
                  nU R                    HQ  nX#R                  R
                  UR                  R
                  -
  -  n[        X#R                  R
                  5      nMS     X!R
                  :  d   eX!R
                  :  a#  [        R                  " XUR
                  -
  5      nU$ )Nr   r   )r   r   r   r#   r"   r9   r   r   )r,   r#   r9   r   s       r/   r#   ComposeTransform.codomain:  s    zz###::b>**JJqM((22	JJD004;;3H3HHHII}}'>'>?I  .....)))"..xXEWEW9WXHr1   c                 :    [        S U R                   5       5      $ )Nc              3   8   #    U  H  oR                   v   M     g 7frN   r   ).0ps     r/   	<genexpr>-ComposeTransform.bijective.<locals>.<genexpr>K  s     3
1;;
   )allr   r:   s    r/   r   ComposeTransform.bijectiveI  s    3

333r1   c                 L    SnU R                    H  nXR                  -  nM     U$ Nr%   )r   rE   )r,   rE   r   s      r/   rE   ComposeTransform.signM  s%    A&&=D r1   c                 0   S nU R                   b  U R                  5       nUcn  [        [        U R                  5       Vs/ s H  o"R                  PM     sn5      n[
        R                  " U5      U l         [
        R                  " U 5      Ul         U$ s  snf rN   )r'   r   r   r   r@   r>   r?   )r,   r@   r   s      r/   r@   ComposeTransform.invT  sr    99 ))+C;"8DJJ3G#H3GaEE3G#HICC(DI{{4(CH
 $Is   Bc                 N    U R                   U:X  a  U $ [        U R                  US9$ r   )r&   r   r   rJ   s     r/   rK   ComposeTransform.with_cache_  s&    z)K

zBBr1   c                 <    U R                    H  nU" U5      nM     U$ rN   )r   )r,   rY   r   s      r/   r]   ComposeTransform.__call__d  s    JJDQA r1   c           	      ~   U R                   (       d  [        R                  " U5      $ U/nU R                   S S  H  nUR                  U" US   5      5        M     UR                  U5        / nU R                  R
                  n[        U R                   US S USS  5       Hu  u  pAnUR                  [        UR                  X5      XdR                  R
                  -
  5      5        XdR                  R
                  UR                  R
                  -
  -  nMw     [        R                  " [        R                  U5      $ )Nr   r%   )r   torch
zeros_likeappendr"   r9   zipr   rl   r#   	functoolsreduceoperatoradd)r,   rY   r\   xsr   termsr9   s          r/   rl   %ComposeTransform.log_abs_det_jacobiani  s    zz##A&& SJJsODIId2b6l# $
		!KK))	djj"Sb'2ab6:JDQLL--a3YAVAV5V
 004;;3H3HHHI ; e44r1   c                 N    U R                    H  nUR                  U5      nM     U$ rN   )r   ru   r,   rt   r   s      r/   ru   ComposeTransform.forward_shape~  s%    JJD&&u-E r1   c                 `    [        U R                  5       H  nUR                  U5      nM     U$ rN   )r   r   ry   r   s      r/   ry   ComposeTransform.inverse_shape  s*    TZZ(D&&u-E )r1   c                     U R                   R                  S-   nUSR                  U R                   Vs/ s H  o"R	                  5       PM     sn5      -  nUS-  nU$ s  snf )Nz(
    z,
    z
))r.   ro   joinr   rp   )r,   
fmt_stringr   s      r/   rp   ComposeTransform.__repr__  sV    ^^,,y8
innDJJ%GJqjjlJ%GHH
e
 &Hs   A
)r'   r   r{   r|   )ro   r}   r~   r   r   r   r   r+   rR   r   r   r"   r#   r   r   rE   r   r@   rK   r]   rl   ru   ry   rp   r   r   r   s   @r/   r   r     s    d9o  )
 ##6 7 ##6 7 4 4    C

5*

 r1   r   c                      ^  \ rS rSrSrSU 4S jjrSS jr\R                  " SS9S 5       r	\R                  " SS9S 5       r
\S	 5       r\S
 5       rS rS rS rS rS rS rSrU =r$ )r   i  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                 X   > [         TU ]  US9  UR                  U5      U l        X l        g r   )r*   r+   rK   base_transformreinterpreted_batch_ndims)r,   r   r   r-   r.   s       r/   r+   IndependentTransform.__init__  s,    J/,77
C)B&r1   c                 d    U R                   U:X  a  U $ [        U R                  U R                  US9$ r   )r&   r   r   r   rJ   s     r/   rK   IndependentTransform.with_cache  s5    z)K#!?!?J
 	
r1   Fr   c                 l    [         R                  " U R                  R                  U R                  5      $ rN   )r   r   r   r"   r   r:   s    r/   r"   IndependentTransform.domain  s,    &&&&(F(F
 	
r1   c                 l    [         R                  " U R                  R                  U R                  5      $ rN   )r   r   r   r#   r   r:   s    r/   r#   IndependentTransform.codomain  s,    &&(($*H*H
 	
r1   c                 .    U R                   R                  $ rN   )r   r   r:   s    r/   r   IndependentTransform.bijective  s    "",,,r1   c                 .    U R                   R                  $ rN   )r   rE   r:   s    r/   rE   IndependentTransform.sign  s    ""'''r1   c                     UR                  5       U R                  R                  :  a  [        S5      eU R	                  U5      $ NToo few dimensions on input)dimr"   r9   r)   r   rd   s     r/   rX   IndependentTransform._call  s7    557T[[***:;;""1%%r1   c                     UR                  5       U R                  R                  :  a  [        S5      eU R                  R                  U5      $ r   )r   r#   r9   r)   r   r@   rh   s     r/   r`   IndependentTransform._inverse  s=    557T]],,,:;;""&&q))r1   c                 f    U R                   R                  X5      n[        X0R                  5      nU$ rN   )r   rl   r   r   )r,   rY   r\   results       r/   rl   )IndependentTransform.log_abs_det_jacobian  s-    $$99!?(F(FGr1   c                 z    U R                   R                   S[        U R                  5       SU R                   S3$ )Nr   z, r   )r.   ro   r   r   r   r:   s    r/   rp   IndependentTransform.__repr__  s:    ..))*!D1D1D,E+FbIgIgHhhijjr1   c                 8    U R                   R                  U5      $ rN   )r   ru   rs   s     r/   ru   "IndependentTransform.forward_shape      ""0077r1   c                 8    U R                   R                  U5      $ rN   )r   ry   rs   s     r/   ry   "IndependentTransform.inverse_shape  r  r1   )r   r   r{   r|   )ro   r}   r~   r   r   r+   rK   r   r   r"   r#   r   r   rE   rX   r`   rl   rp   ru   ry   r   r   r   s   @r/   r   r     s    C

 ##6
 7

 ##6
 7

 - - ( (&
*

k88 8r1   r   c                      ^  \ rS rSrSrSrSU 4S jjr\R                  S 5       r	\R                  S 5       r
SS jrS rS	 rS
 rS rS rSrU =r$ )r   i  a1  
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.
Tc                   > [         R                  " U5      U l        [         R                  " U5      U l        U R                  R	                  5       U R                  R	                  5       :w  a  [        S5      e[        TU ]  US9  g )Nz6in_shape, out_shape have different numbers of elementsrH   )r   Sizein_shape	out_shapenumelr)   r*   r+   )r,   r  r  r-   r.   s       r/   r+   ReshapeTransform.__init__  sa    

8,I.== DNN$8$8$::UVVJ/r1   c                 r    [         R                  " [         R                  [        U R                  5      5      $ rN   )r   r   r   lenr  r:   s    r/   r"   ReshapeTransform.domain  s$    &&{'7'7T]]9KLLr1   c                 r    [         R                  " [         R                  [        U R                  5      5      $ rN   )r   r   r   r  r  r:   s    r/   r#   ReshapeTransform.codomain  s$    &&{'7'7T^^9LMMr1   c                 d    U R                   U:X  a  U $ [        U R                  U R                  US9$ r   )r&   r   r  r  rJ   s     r/   rK   ReshapeTransform.with_cache  s,    z)Kt~~*UUr1   c                     UR                   S UR                  5       [        U R                  5      -
   nUR	                  X R
                  -   5      $ rN   )rt   r   r  r  reshaper  )r,   rY   batch_shapes      r/   rX   ReshapeTransform._call  s=    gg<#dmm*< <=yy~~566r1   c                     UR                   S UR                  5       [        U R                  5      -
   nUR	                  X R
                  -   5      $ rN   )rt   r   r  r  r  r  )r,   r\   r  s      r/   r`   ReshapeTransform._inverse  s=    gg=#dnn*= =>yy}}455r1   c                     UR                   S UR                  5       [        U R                  5      -
   nUR	                  U5      $ rN   )rt   r   r  r  	new_zeros)r,   rY   r\   r  s       r/   rl   %ReshapeTransform.log_abs_det_jacobian  s6    gg<#dmm*< <={{;''r1   c                     [        U5      [        U R                  5      :  a  [        S5      e[        U5      [        U R                  5      -
  nXS  U R                  :w  a  [        SXS   SU R                   35      eUS U U R                  -   $ Nr   zShape mismatch: expected z	 but got )r  r  r)   r  r,   rt   cuts      r/   ru   ReshapeTransform.forward_shape  s    u:DMM**:;;%j3t}}--;$--'+E$K=	$--Q  Tc{T^^++r1   c                     [        U5      [        U R                  5      :  a  [        S5      e[        U5      [        U R                  5      -
  nXS  U R                  :w  a  [        SXS   SU R                   35      eUS U U R                  -   $ r   )r  r  r)   r  r!  s      r/   ry   ReshapeTransform.inverse_shape  s    u:DNN++:;;%j3t~~..;$..(+E$K=	$..AQR  Tc{T]]**r1   )r  r  r{   r|   )ro   r}   r~   r   r   r   r+   r   r   r"   r#   rK   rX   r`   rl   ru   ry   r   r   r   s   @r/   r   r     sp    	 I0 ##M $M ##N $NV
76(,+ +r1   r   c                   h    \ rS rSrSr\R                  r\R                  r	Sr
SrS rS rS rS rS	rg
)r   i  z0
Transform via the mapping :math:`y = \exp(x)`.
Tr%   c                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR   ExpTransform.__eq__%      %..r1   c                 "    UR                  5       $ rN   )exprd   s     r/   rX   ExpTransform._call(      uuwr1   c                 "    UR                  5       $ rN   logrh   s     r/   r`   ExpTransform._inverse+  r-  r1   c                     U$ rN   rO   rk   s      r/   rl   !ExpTransform.log_abs_det_jacobian.      r1   rO   Nro   r}   r~   r   r   r   r   r"   positiver#   r   rE   rR   rX   r`   rl   r   rO   r1   r/   r   r     s=     F##HID/r1   r   c                      ^  \ rS rSrSr\R                  r\R                  rSr	SU 4S jjr
SS jr\S 5       rS rS rS	 rS
 rS rS rSrU =r$ )r   i2  z<
Transform via the mapping :math:`y = x^{\text{exponent}}`.
Tc                 D   > [         TU ]  US9  [        U5      u  U l        g r   )r*   r+   r   exponent)r,   r9  r-   r.   s      r/   r+   PowerTransform.__init__:  s"    J/(2r1   c                 N    U R                   U:X  a  U $ [        U R                  US9$ r   )r&   r   r9  rJ   s     r/   rK   PowerTransform.with_cache>  s&    z)Kdmm
CCr1   c                 6    U R                   R                  5       $ rN   )r9  rE   r:   s    r/   rE   PowerTransform.signC  s    }}!!##r1   c                     [        U[        5      (       d  gU R                  R                  UR                  5      R	                  5       R                  5       $ r   )r   r   r9  eqr   itemrP   s     r/   rR   PowerTransform.__eq__G  s=    %00}}/335::<<r1   c                 8    UR                  U R                  5      $ rN   powr9  rd   s     r/   rX   PowerTransform._callL  s    uuT]]##r1   c                 >    UR                  SU R                  -  5      $ r   rD  rh   s     r/   r`   PowerTransform._inverseO  s    uuQ&''r1   c                 ^    U R                   U-  U-  R                  5       R                  5       $ rN   )r9  absr0  rk   s      r/   rl   #PowerTransform.log_abs_det_jacobianR  s(    !A%**,0022r1   c                 Z    [         R                  " U[        U R                  SS5      5      $ Nrt   rO   r   broadcast_shapesgetattrr9  rs   s     r/   ru   PowerTransform.forward_shapeU  "    %%eWT]]GR-PQQr1   c                 Z    [         R                  " U[        U R                  SS5      5      $ rM  rN  rs   s     r/   ry   PowerTransform.inverse_shapeX  rR  r1   )r9  r{   r|   )ro   r}   r~   r   r   r   r6  r"   r#   r   r+   rK   r   rE   rR   rX   r`   rl   ru   ry   r   r   r   s   @r/   r   r   2  sj     !!F##HI3D
 $ $=
$(3RR Rr1   r   c                     [         R                  " U R                  5      n[         R                  " [         R                  " U 5      UR
                  SUR                  -
  S9$ N      ?minr   )r   finfodtypeclampsigmoidtinyeps)rY   rZ  s     r/   _clipped_sigmoidr`  \  s<    KK E;;u}}Q'UZZS599_MMr1   c                   h    \ rS rSrSr\R                  r\R                  r	Sr
SrS rS rS rS rS	rg
)r   ia  z_
Transform via the mapping :math:`y = \frac{1}{1 + \exp(-x)}` and :math:`x = \text{logit}(y)`.
Tr%   c                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR   SigmoidTransform.__eq__j      %!122r1   c                     [        U5      $ rN   )r`  rd   s     r/   rX   SigmoidTransform._callm  s    ""r1   c                     [         R                  " UR                  5      nUR                  UR                  SUR
                  -
  S9nUR                  5       U* R                  5       -
  $ rV  )r   rZ  r[  r\  r^  r_  r0  log1p)r,   r\   rZ  s      r/   r`   SigmoidTransform._inversep  sK    AGG$GG

eiiG8uuw1"%%r1   c                 `    [         R                  " U* 5      * [         R                  " U5      -
  $ rN   )Fr   rk   s      r/   rl   %SigmoidTransform.log_abs_det_jacobianu  s!    

A2A..r1   rO   N)ro   r}   r~   r   r   r   r   r"   unit_intervalr#   r   rE   rR   rX   r`   rl   r   rO   r1   r/   r   r   a  s=     F((HID3#&
/r1   r   c                   h    \ rS rSrSr\R                  r\R                  r	Sr
SrS rS rS rS rS	rg
)r   iy  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                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR   SoftplusTransform.__eq__  s    %!233r1   c                     [        U5      $ rN   r   rd   s     r/   rX   SoftplusTransform._call  s    {r1   c                 b    U* R                  5       R                  5       R                  5       U-   $ rN   )expm1negr0  rh   s     r/   r`   SoftplusTransform._inverse  s'    zz|!%%'!++r1   c                     [        U* 5      * $ rN   rr  rk   s      r/   rl   &SoftplusTransform.log_abs_det_jacobian  s    !}r1   rO   Nr5  rO   r1   r/   r   r   y  s=     F##HID4,r1   r   c                   v    \ rS rSrSr\R                  r\R                  " SS5      r	Sr
SrS rS rS	 rS
 rSrg)r   i  aZ  
Transform via the mapping :math:`y = \tanh(x)`.

It is equivalent to
```
ComposeTransform([AffineTransform(0., 2.), SigmoidTransform(), AffineTransform(-1., 2.)])
```
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      rW  Tr%   c                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR   TanhTransform.__eq__  s    %//r1   c                 "    UR                  5       $ rN   )tanhrd   s     r/   rX   TanhTransform._call  s    vvxr1   c                 .    [         R                  " U5      $ rN   )r   atanhrh   s     r/   r`   TanhTransform._inverse  s     {{1~r1   c                 X    S[         R                  " S5      U-
  [        SU-  5      -
  -  $ )N       @g       )mathr0  r   rk   s      r/   rl   "TanhTransform.log_abs_det_jacobian  s*     dhhsma'(4!8*<<==r1   rO   N)ro   r}   r~   r   r   r   r   r"   intervalr#   r   rE   rR   rX   r`   rl   r   rO   r1   r/   r   r     sD     F##D#.HID0
>r1   r   c                   Z    \ rS rSrSr\R                  r\R                  r	S r
S rS rSrg)r   i  z,
Transform via the mapping :math:`y = |x|`.
c                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR   AbsTransform.__eq__  r)  r1   c                 "    UR                  5       $ rN   )rJ  rd   s     r/   rX   AbsTransform._call  r-  r1   c                     U$ rN   rO   rh   s     r/   r`   AbsTransform._inverse  r4  r1   rO   N)ro   r}   r~   r   r   r   r   r"   r6  r#   rR   rX   r`   r   rO   r1   r/   r   r     s.     F##H/r1   r   c                      ^  \ rS rSrSrSrSU 4S jjr\S 5       r\	R                  " SS9S 5       r\	R                  " SS9S	 5       rSS
 jrS r\S 5       rS rS rS rS rS rSrU =r$ )r   i  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                 D   > [         TU ]  US9  Xl        X l        X0l        g r   )r*   r+   locscale
_event_dim)r,   r  r  r9   r-   r.   s        r/   r+   AffineTransform.__init__  s"    J/
#r1   c                     U R                   $ rN   )r  r:   s    r/   r9   AffineTransform.event_dim  s    r1   Fr   c                     U R                   S:X  a  [        R                  $ [        R                  " [        R                  U R                   5      $ Nr   r9   r   r   r   r:   s    r/   r"   AffineTransform.domain  7    >>Q###&&{'7'7HHr1   c                     U R                   S:X  a  [        R                  $ [        R                  " [        R                  U R                   5      $ r  r  r:   s    r/   r#   AffineTransform.codomain  r  r1   c                 z    U R                   U:X  a  U $ [        U R                  U R                  U R                  US9$ r   )r&   r   r  r  r9   rJ   s     r/   rK   AffineTransform.with_cache  s7    z)KHHdjj$..Z
 	
r1   c                    [        U[        5      (       d  g[        U R                  [        R                  5      (       aE  [        UR                  [        R                  5      (       a  U R                  UR                  :w  a  gO;U R                  UR                  :H  R                  5       R                  5       (       d  g[        U R                  [        R                  5      (       aF  [        UR                  [        R                  5      (       a  U R                  UR                  :w  a  g gU R                  UR                  :H  R                  5       R                  5       (       d  gg)NFT)r   r   r  numbersNumberr   rA  r  rP   s     r/   rR   AffineTransform.__eq__  s    %11dhh//JIIw~~5
 5
 xx599$ % HH		)..05577djj'..11jKK7
 7
 zzU[[( )  JJ%++-22499;;r1   c                     [        U R                  [        R                  5      (       a8  [	        U R                  5      S:  a  S$ [	        U R                  5      S:  a  S$ S$ U R                  R                  5       $ )Nr   r%   r   )r   r  r  RealfloatrE   r:   s    r/   rE   AffineTransform.sign  sY    djj',,//djj)A-1Utzz9JQ9N2UTUUzz  r1   c                 :    U R                   U R                  U-  -   $ rN   r  r  rd   s     r/   rX   AffineTransform._call  s    xx$**q.((r1   c                 8    XR                   -
  U R                  -  $ rN   r  rh   s     r/   r`   AffineTransform._inverse  s    HH

**r1   c                    UR                   nU R                  n[        U[        R                  5      (       a5  [
        R                  " U[        R                  " [        U5      5      5      nO$[
        R                  " U5      R                  5       nU R                  (       aQ  UR                  5       S U R                  *  S-   nUR                  U5      R                  S5      nUS U R                  *  nUR                  U5      $ )N)r   r   )rt   r  r   r  r  r   	full_liker  r0  rJ  r9   sizeviewsumexpand)r,   rY   r\   rt   r  r   result_sizes          r/   rl   $AffineTransform.log_abs_det_jacobian  s    

eW\\**__QU(<=FYYu%))+F>> ++-(94>>/:UBK[[-11"5F+T^^O,E}}U##r1   c           	          [         R                  " U[        U R                  SS5      [        U R                  SS5      5      $ rM  r   rO  rP  r  r  rs   s     r/   ru   AffineTransform.forward_shape   7    %%7488Wb174::wPR3S
 	
r1   c           	          [         R                  " U[        U R                  SS5      [        U R                  SS5      5      $ rM  r  rs   s     r/   ry   AffineTransform.inverse_shape%  r  r1   )r  r  r  r   r   r|   )ro   r}   r~   r   r   r   r+   r   r9   r   r   r"   r#   rK   rR   rE   rX   r`   rl   ru   ry   r   r   r   s   @r/   r   r     s    	 I$   ##6I 7I
 ##6I 7I

0 ! !
)+$


 
r1   r   c                   n    \ rS rSrSr\R                  r\R                  r	Sr
S rS rSS jrS rS	 rS
rg)r   i+  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                    [         R                  " U5      n[         R                  " UR                  5      R                  nUR                  SU-   SU-
  S9n[        USS9nUS-  nSU-
  R                  5       R                  S5      nU[         R                  " UR                  S   UR                  UR                  S9-   nU[        USS S24   SS/SS	9-  nU$ )
Nr   r%   rX  diag   )r[  device.r   value)r   r~  rZ  r[  r_  r\  r	   sqrtcumprodeyert   r  r
   )r,   rY   r_  rzz1m_cumprod_sqrtr\   s          r/   rX   CorrCholeskyTransform._call?  s    JJqMkk!''"&&GGSa#gG.qr* qDE<<>11"5		!''"+QWWQXXFF$S#2#X.Aa@@r1   c                    S[         R                  " X-  SS9-
  n[        USS S24   SS/SS9n[        USS9n[        USS9nXER	                  5       -  nUR                  5       UR                  5       R                  5       -
  S-  nU$ )	Nr%   r   r   .r   r  r  r  )r   cumsumr
   r   r  rh  rv  )r,   r\   y_cumsumy_cumsum_shiftedy_vecy_cumsum_vectrY   s           r/   r`   CorrCholeskyTransform._inverseN  s     u||AEr22xSbS1Aq6C"12.)*:D''))WWY(A-r1   Nc                     SX"-  R                  SS9-
  n[        USS9nSUR                  5       R                  S5      -  nSU[	        SU-  5      -   [
        R                  " S5      -
  R                  SS9-  nXg-   $ )Nr%   r   r  r        ?r  )r  r   r0  r  r   r  )r,   rY   r\   intermediates
y1m_cumsumy1m_cumsum_trilstick_breaking_logdettanh_logdets           r/   rl   *CorrCholeskyTransform.log_abs_det_jacobianZ  s     !%B//
 -ZbA #&;&;&=&A&A"&E EAa 00488C=@EE"EMM$22r1   c                     [        U5      S:  a  [        S5      eUS   n[        SSU-  -   S-  S-   5      nX3S-
  -  S-  U:w  a  [        S5      eUS S X34-   $ )Nr%   r   r   g      ?r  r  z-Input is not a flattend lower-diagonal number)r  r)   round)r,   rt   NDs       r/   ru   #CorrCholeskyTransform.forward_shapeh  sp    u:>:;;"I4!a%<C'#-.A;!q LMMSbzQF""r1   c                     [        U5      S:  a  [        S5      eUS   US   :w  a  [        S5      eUS   nX"S-
  -  S-  nUS S U4-   $ )Nr  r   r  r   zInput is not squarer%   r  r)   )r,   rt   r  r  s       r/   ry   #CorrCholeskyTransform.inverse_shaper  sa    u:>:;;9b	!233"IQK1SbzQD  r1   rO   rN   )ro   r}   r~   r   r   r   real_vectorr"   corr_choleskyr#   r   rX   r`   rl   ru   ry   r   rO   r1   r/   r   r   +  s=     $$F((HI
3#!r1   r   c                   f    \ rS rSrSr\R                  r\R                  r	S r
S rS rS rS rSrg	)
r   i}  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                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR   SoftmaxTransform.__eq__  rd  r1   c                 x    UnX"R                  SS5      S   -
  R                  5       nX3R                  SS5      -  $ )Nr   Tr   )r   r+  r  )r,   rY   logprobsprobss       r/   rX   SoftmaxTransform._call  s<    LLT2155::<yyT***r1   c                 &    UnUR                  5       $ rN   r/  )r,   r\   r  s      r/   r`   SoftmaxTransform._inverse  s    yy{r1   c                 :    [        U5      S:  a  [        S5      eU$ Nr%   r   r  rs   s     r/   ru   SoftmaxTransform.forward_shape      u:>:;;r1   c                 :    [        U5      S:  a  [        S5      eU$ r  r  rs   s     r/   ry   SoftmaxTransform.inverse_shape  r  r1   rO   N)ro   r}   r~   r   r   r   r  r"   simplexr#   rR   rX   r`   ru   ry   r   rO   r1   r/   r   r   }  s8     $$F""H3+

r1   r   c                   p    \ rS rSrSr\R                  r\R                  r	Sr
S rS rS rS rS rS	 rS
rg)r   i  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                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR   StickBreakingTransform.__eq__      %!788r1   c                    UR                   S   S-   UR                  UR                   S   5      R                  S5      -
  n[        XR	                  5       -
  5      nSU-
  R                  S5      n[        USS/SS9[        USS/SS9-  nU$ )Nr   r%   r   r  )rt   new_onesr  r`  r0  r  r
   )r,   rY   offsetr  	z_cumprodr\   s         r/   rX   StickBreakingTransform._call  s    q1::aggbk#:#A#A"#EEQ-.UOOB'	Aq6#c)aV1&EEr1   c                    USS S24   nUR                   S   UR                  UR                   S   5      R                  S5      -
  nSUR                  S5      -
  n[        R                  " U[        R
                  " UR                  5      R                  S9nUR                  5       UR                  5       -
  UR                  5       -   nU$ )N.r   r%   )rY  )	rt   r  r  r   r\  rZ  r[  r^  r0  )r,   r\   y_cropr  sfrY   s         r/   r`   StickBreakingTransform._inverse  s    38qzz&,,r*:;BB2FFr"" [[QWW!5!:!:;JJL2668#fjjl2r1   c                 ,   UR                   S   S-   UR                  UR                   S   5      R                  S5      -
  nXR                  5       -
  nU* [        R
                  " U5      -   USS S24   R                  5       -   R                  S5      nU$ )Nr   r%   .)rt   r  r  r0  rk  
logsigmoidr  )r,   rY   r\   r  detJs        r/   rl   +StickBreakingTransform.log_abs_det_jacobian  s~    q1::aggbk#:#A#A"#EE

Q\\!_$qcrc{'88==bAr1   c                 T    [        U5      S:  a  [        S5      eUS S US   S-   4-   $ Nr%   r   r   r  rs   s     r/   ru   $StickBreakingTransform.forward_shape  5    u:>:;;SbzU2Y],,,r1   c                 T    [        U5      S:  a  [        S5      eUS S US   S-
  4-   $ r	  r  rs   s     r/   ry   $StickBreakingTransform.inverse_shape  r  r1   rO   N)ro   r}   r~   r   r   r   r  r"   r  r#   r   rR   rX   r`   rl   ru   ry   r   rO   r1   r/   r   r     sB     $$F""HI9-
-r1   r   c                   |    \ rS rSrSr\R                  " \R                  S5      r\R                  r
S rS rS rSrg)	r   i  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.
r  c                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR   LowerCholeskyTransform.__eq__  r  r1   c                 ~    UR                  S5      UR                  SSS9R                  5       R                  5       -   $ Nr   r  )dim1dim2)trildiagonalr+  
diag_embedrd   s     r/   rX   LowerCholeskyTransform._call  4    vvbzAJJBRJ8<<>IIKKKr1   c                 ~    UR                  S5      UR                  SSS9R                  5       R                  5       -   $ r  )r  r  r0  r  rh   s     r/   r`   LowerCholeskyTransform._inverse  r  r1   rO   N)ro   r}   r~   r   r   r   r   r   r"   lower_choleskyr#   rR   rX   r`   r   rO   r1   r/   r   r     s=     $$[%5%5q9F))H9LLr1   r   c                   |    \ rS rSrSr\R                  " \R                  S5      r\R                  r
S rS rS rSrg)	r   i  zF
Transform from unconstrained matrices to positive-definite matrices.
r  c                 "    [        U[        5      $ rN   )r   r   rP   s     r/   rR    PositiveDefiniteTransform.__eq__  s    %!:;;r1   c                 >    [        5       " U5      nXR                  -  $ rN   )r   mTrd   s     r/   rX   PositiveDefiniteTransform._call  s    "$Q'44xr1   c                 r    [         R                  R                  U5      n[        5       R	                  U5      $ rN   )r   linalgcholeskyr   r@   rh   s     r/   r`   "PositiveDefiniteTransform._inverse  s*    LL!!!$%'++A..r1   rO   N)ro   r}   r~   r   r   r   r   r   r"   positive_definiter#   rR   rX   r`   r   rO   r1   r/   r   r     s;     $$[%5%5q9F,,H</r1   r   c                      ^  \ rS rSr% Sr\\   \S'   SU 4S jjr\	S 5       r
\	S 5       rSS jrS rS	 rS
 r\S 5       r\R&                  S 5       r\R&                  S 5       rSrU =r$ )r   i  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                   > [        S U 5       5      (       d   eU(       a   U Vs/ s H  oUR                  U5      PM     nn[        TU ]  US9  [	        U5      U l        Uc  S/[        U R
                  5      -  n[	        U5      U l        [        U R                  5      [        U R
                  5      :X  d   eX l        g s  snf )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7frN   r   r   r   r  s     r/   r   (CatTransform.__init__.<locals>.<genexpr>       :T:a++T   rH   r%   )	r   rK   r*   r+   listr)  r  lengthsr   )r,   tseqr   r2  r-   r  r.   s         r/   r+   CatTransform.__init__  s    :T:::::6:;dLL,dD;J/t*?cC00GG}4<< C$8888 <s   C c                 :    [        S U R                   5       5      $ )Nc              3   8   #    U  H  oR                   v   M     g 7frN   )r9   r-  s     r/   r   )CatTransform.event_dim.<locals>.<genexpr>!       81;;r   )r   r)  r:   s    r/   r9   CatTransform.event_dim      8888r1   c                 ,    [        U R                  5      $ rN   )r  r2  r:   s    r/   lengthCatTransform.length#  s    4<<  r1   c                 ~    U R                   U:X  a  U $ [        U R                  U R                  U R                  U5      $ rN   )r&   r   r)  r   r2  rJ   s     r/   rK   CatTransform.with_cache'  s2    z)KDOOTXXt||ZPPr1   c                    UR                  5       * U R                   s=::  a  UR                  5       :  d   e   eUR                  U R                   5      U R                  :X  d   e/ nSn[        U R                  U R
                  5       H<  u  pEUR                  U R                   X55      nUR                  U" U5      5        X5-   nM>     [        R                  " X R                   S9$ Nr   r  )
r   r  r<  r   r)  r2  narrowr   r   cat)r,   rY   yslicesstarttransr<  xslices          r/   rX   CatTransform._call,  s    x488-aeeg-----vvdhh4;;... $,,?MEXXdhh6FNN5=)NE @ yyhh//r1   c                    UR                  5       * U R                   s=::  a  UR                  5       :  d   e   eUR                  U R                   5      U R                  :X  d   e/ nSn[        U R                  U R
                  5       HE  u  pEUR                  U R                   X55      nUR                  UR                  U5      5        X5-   nMG     [        R                  " X R                   S9$ rA  )r   r  r<  r   r)  r2  rB  r   r@   r   rC  )r,   r\   xslicesrE  rF  r<  yslices          r/   r`   CatTransform._inverse7  s    x488-aeeg-----vvdhh4;;... $,,?MEXXdhh6FNN599V,-NE @ yyhh//r1   c                    UR                  5       * U R                   s=::  a  UR                  5       :  d   e   eUR                  U R                   5      U R                  :X  d   eUR                  5       * U R                   s=::  a  UR                  5       :  d   e   eUR                  U R                   5      U R                  :X  d   e/ nSn[        U R                  U R
                  5       H  u  pVUR                  U R                   XF5      nUR                  U R                   XF5      nUR                  Xx5      n	UR                  U R                  :  a"  [        XR                  UR                  -
  5      n	UR                  U	5        XF-   nM     U R                   n
U
S:  a  XR                  5       -
  n
XR                  -   n
U
S:  a  [        R                  " X:S9$ [        U5      $ rA  )r   r  r<  r   r)  r2  rB  rl   r9   r   r   r   rC  r  )r,   rY   r\   
logdetjacsrE  rF  r<  rG  rK  	logdetjacr   s              r/   rl   !CatTransform.log_abs_det_jacobianB  s{   x488-aeeg-----vvdhh4;;...x488-aeeg-----vvdhh4;;...
 $,,?MEXXdhh6FXXdhh6F226BI/*9nnu6VW	i(NE @ hh!8-CNN"799Z11z?"r1   c                 :    [        S U R                   5       5      $ )Nc              3   8   #    U  H  oR                   v   M     g 7frN   r   r-  s     r/   r   )CatTransform.bijective.<locals>.<genexpr>]  r8  r   r   r)  r:   s    r/   r   CatTransform.bijective[  r:  r1   c                     [         R                  " U R                   Vs/ s H  oR                  PM     snU R                  U R
                  5      $ s  snf rN   )r   rC  r)  r"   r   r2  r,   r  s     r/   r"   CatTransform.domain_  s:    #/!XX/4<<
 	
/   Ac                     [         R                  " U R                   Vs/ s H  oR                  PM     snU R                  U R
                  5      $ s  snf rN   )r   rC  r)  r#   r   r2  rW  s     r/   r#   CatTransform.codomaine  s:    !%1AZZ1488T\\
 	
1rY  )r   r2  r)  )r   Nr   r|   )ro   r}   r~   r   r   r   r   r   r+   r   r9   r<  rK   rX   r`   rl   r   r   r   r   r"   r#   r   r   r   s   @r/   r   r     s     Y
 9 9 ! !Q
	0	0#2 9 9 ##
 $

 ##
 $
r1   r   c                      ^  \ rS rSr% Sr\\   \S'   SU 4S jjrSS jr	S r
S rS rS	 r\S
 5       r\R"                  S 5       r\R"                  S 5       rSrU =r$ )r   il  a7  
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                    > [        S U 5       5      (       d   eU(       a   U Vs/ s H  oDR                  U5      PM     nn[        TU ]  US9  [	        U5      U l        X l        g s  snf )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7frN   r,  r-  s     r/   r   *StackTransform.__init__.<locals>.<genexpr>|  r/  r0  rH   )r   rK   r*   r+   r1  r)  r   )r,   r3  r   r-   r  r.   s        r/   r+   StackTransform.__init__{  s]    :T:::::6:;dLL,dD;J/t* <s   A&c                 h    U R                   U:X  a  U $ [        U R                  U R                  U5      $ rN   )r&   r   r)  r   rJ   s     r/   rK   StackTransform.with_cache  s,    z)KdootxxDDr1   c                     [        UR                  U R                  5      5       Vs/ s H  o!R                  U R                  U5      PM      sn$ s  snf rN   )ranger  r   select)r,   r  is      r/   _sliceStackTransform._slice  s;    /4QVVDHH5E/FG/F!1%/FGGGs   %Ac                    UR                  5       * U R                   s=::  a  UR                  5       :  d   e   eUR                  U R                   5      [        U R                  5      :X  d   e/ n[	        U R                  U5      U R                  5       H  u  p4UR                  U" U5      5        M     [        R                  " X R                   S9$ Nr  )	r   r  r  r)  r   rg  r   r   stack)r,   rY   rD  rG  rF  s        r/   rX   StackTransform._call  s    x488-aeeg-----vvdhh3t#7777 QAMFNN5=) B{{711r1   c                    UR                  5       * U R                   s=::  a  UR                  5       :  d   e   eUR                  U R                   5      [        U R                  5      :X  d   e/ n[	        U R                  U5      U R                  5       H%  u  p4UR                  UR                  U5      5        M'     [        R                  " X R                   S9$ rj  )
r   r  r  r)  r   rg  r   r@   r   rk  )r,   r\   rJ  rK  rF  s        r/   r`   StackTransform._inverse  s    x488-aeeg-----vvdhh3t#7777 QAMFNN599V,- B{{711r1   c                    UR                  5       * U R                   s=::  a  UR                  5       :  d   e   eUR                  U R                   5      [        U R                  5      :X  d   eUR                  5       * U R                   s=::  a  UR                  5       :  d   e   eUR                  U R                   5      [        U R                  5      :X  d   e/ nU R	                  U5      nU R	                  U5      n[        XTU R                  5       H&  u  pgnUR                  UR                  Xg5      5        M(     [        R                  " X0R                   S9$ rj  )
r   r  r  r)  rg  r   r   rl   r   rk  )	r,   rY   r\   rN  rD  rJ  rG  rK  rF  s	            r/   rl   #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!FEe88HI &L{{:8844r1   c                 :    [        S U R                   5       5      $ )Nc              3   8   #    U  H  oR                   v   M     g 7frN   r   r-  s     r/   r   +StackTransform.bijective.<locals>.<genexpr>  r8  r   rT  r:   s    r/   r   StackTransform.bijective  r:  r1   c                     [         R                  " U R                   Vs/ s H  oR                  PM     snU R                  5      $ s  snf rN   )r   rk  r)  r"   r   rW  s     r/   r"   StackTransform.domain  s1      DOO!DOq((O!DdhhOO!D   Ac                     [         R                  " U R                   Vs/ s H  oR                  PM     snU R                  5      $ s  snf rN   )r   rk  r)  r#   r   rW  s     r/   r#   StackTransform.codomain  s1      doo!Fo**o!FQQ!Frw  )r   r)  r  r|   )ro   r}   r~   r   r   r   r   r   r+   rK   rg  rX   r`   rl   r   r   r   r   r"   r#   r   r   r   s   @r/   r   r   l  s    
 YE
H22
5 9 9 ##P $P ##R $Rr1   r   c                   |   ^  \ rS rSrSrSr\R                  rSr	SU 4S jjr
\S 5       rS rS rS	 rSS
 jrSrU =r$ )r   i  a  
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                 ,   > [         TU ]  US9  Xl        g r   )r*   r+   distribution)r,   r|  r-   r.   s      r/   r+   (CumulativeDistributionTransform.__init__  s    J/(r1   c                 .    U R                   R                  $ rN   )r|  supportr:   s    r/   r"   &CumulativeDistributionTransform.domain  s      (((r1   c                 8    U R                   R                  U5      $ rN   )r|  cdfrd   s     r/   rX   %CumulativeDistributionTransform._call  s      $$Q''r1   c                 8    U R                   R                  U5      $ rN   )r|  icdfrh   s     r/   r`   (CumulativeDistributionTransform._inverse  s      %%a((r1   c                 8    U R                   R                  U5      $ rN   )r|  log_probrk   s      r/   rl   4CumulativeDistributionTransform.log_abs_det_jacobian  s      ))!,,r1   c                 N    U R                   U:X  a  U $ [        U R                  US9$ r   )r&   r   r|  rJ   s     r/   rK   *CumulativeDistributionTransform.with_cache  s(    z)K.t/@/@ZXXr1   )r|  r{   r|   )ro   r}   r~   r   r   r   r   rm  r#   rE   r+   r   r"   rX   r`   rl   rK   r   r   r   s   @r/   r   r     sS    $ I((HD) ) )()-Y Yr1   r   )-r   r  r  r   r>   typingr   r   torch.nn.functionalnn
functionalrk  torch.distributionsr   torch.distributions.utilsr   r   r   r   r	   r
   r   __all__r   r=   r   r   r   r   r   r   r`  r   r   r   r   r   r   r   r   r   r   r   r   r   rO   r1   r/   <module>r     s_            +  .0f fR;.	 ;.|wy wt &b) D89 D8N@+y @+F9 ,'RY 'RTN
/y /0	 .!>I !>H9 "c
i c
LO!I O!d y  F5-Y 5-pLY L,/	 /(g
9 g
TERY ERP+Yi +Yr1   