
    rh                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	Z	d dl
mc mZ d dl	mZ d dlmZ d dlmZ d dlmZmZmZmZmZ 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      Z0 G d. d/e      Z1 G d0 d1e      Z2 G d2 d3e      Z3y)4    N)Sequence)OptionalUnion)Tensor)constraints)Distribution)_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deddf 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codomain
cache_sizereturnNc                 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__)selfr(   	__class__s     q/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/distributions/transforms.pyr1   zTransform.__init__b   sB    %@D	?1_)D899    c                 D    | j                   j                         }d |d<   |S )Nr-   )__dict__copy)r2   states     r4   __getstate__zTransform.__getstate__m   s"    ""$fr5   c                     | 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/   r2   s    r4   r<   zTransform.event_dimr   s:    ;;  DMM$;$;;;;(((UVVr5   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)r2   invs     r4   rB   zTransform.invx   sB     99 ))+C;#D)CC(DI
r5   c                     t         )z
        Returns the sign of the determinant of the Jacobian, if applicable.
        In general this only makes sense for bijective transforms.
        NotImplementedErrorr=   s    r4   signzTransform.sign   s
     "!r5   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,   typer1   r#   rE   r2   r(   s     r4   
with_cachezTransform.with_cache   sU    z)K:)"4"444:44!T$ZL0N"OPPr5   c                 
    | |u S N r2   others     r4   __eq__zTransform.__eq__   s    u}r5   c                 &    | j                  |       S rM   )rQ   rO   s     r4   __ne__zTransform.__ne__   s    ;;u%%%r5   c                     | j                   dk(  r| j                  |      S | j                  \  }}||u r|S | j                  |      }||f| _        |S )z2
        Computes the transform `x => y`.
        r   )r,   _callr.   )r2   xx_oldy_oldys        r4   __call__zTransform.__call__   sY     q ::a= ''u:LJJqMa4r5   c                     | j                   dk(  r| j                  |      S | j                  \  }}||u r|S | j                  |      }||f| _        |S )z1
        Inverts the transform `y => x`.
        r   )r,   _inverser.   )r2   rY   rW   rX   rV   s        r4   	_inv_callzTransform._inv_call   s[     q ==##''u:LMM!a4r5   c                     t         )zD
        Abstract method to compute forward transformation.
        rD   r2   rV   s     r4   rU   zTransform._call   
     "!r5   c                     t         )zD
        Abstract method to compute inverse transformation.
        rD   r2   rY   s     r4   r\   zTransform._inverse   r`   r5   c                     t         )zU
        Computes the log det jacobian `log |dy/dx|` given input and output.
        rD   r2   rV   rY   s      r4   log_abs_det_jacobianzTransform.log_abs_det_jacobian   r`   r5   c                 4    | j                   j                  dz   S )Nz())r3   __name__r=   s    r4   __repr__zTransform.__repr__   s    ~~&&--r5   c                     |S )z{
        Infers the shape of the forward computation, given the input shape.
        Defaults to preserving shape.
        rN   r2   shapes     r4   forward_shapezTransform.forward_shape   	    
 r5   c                     |S )z}
        Infers the shapes of the inverse computation, given the output shape.
        Defaults to preserving shape.
        rN   rj   s     r4   inverse_shapezTransform.inverse_shape   rm   r5   r   )r)   r#   r+   )rg   
__module____qualname____doc__	bijectiver   
Constraint__annotations__intr1   r:   propertyr<   rB   rF   rK   rQ   rS   rZ   r]   rU   r\   re   rh   rl   ro   __classcell__r3   s   @r4   r#   r#   1   s    *X I"""$$$	3 	t 	
 W3 W W
   "c " "Q&""".r5   r#   c                        e Zd ZdZdedd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.
    	transformr)   Nc                 H    t         |   |j                         || _        y NrH   )r0   r1   r,   r-   )r2   r}   r3   s     r4   r1   z_InverseTransform.__init__   s     I$9$9:(	r5   Fis_discretec                 J    | j                   J | j                   j                  S rM   )r-   r'   r=   s    r4   r&   z_InverseTransform.domain   s"    yy$$$yy!!!r5   c                 J    | j                   J | j                   j                  S rM   )r-   r&   r=   s    r4   r'   z_InverseTransform.codomain   s"    yy$$$yyr5   c                 J    | j                   J | j                   j                  S rM   )r-   ru   r=   s    r4   ru   z_InverseTransform.bijective   s"    yy$$$yy"""r5   c                 J    | j                   J | j                   j                  S rM   )r-   rF   r=   s    r4   rF   z_InverseTransform.sign   s     yy$$$yy~~r5   c                     | j                   S rM   )r-   r=   s    r4   rB   z_InverseTransform.inv   s    yyr5   c                 h    | j                   J | j                  j                  |      j                  S rM   )r-   rB   rK   rJ   s     r4   rK   z_InverseTransform.with_cache   s-    yy$$$xx"":.222r5   c                 r    t        |t              sy| j                  J | j                  |j                  k(  S NF)
isinstancer?   r-   rO   s     r4   rQ   z_InverseTransform.__eq__   s3    %!23yy$$$yyEJJ&&r5   c                 `    | j                   j                   dt        | j                         dS )N())r3   rg   reprr-   r=   s    r4   rh   z_InverseTransform.__repr__  s)    ..))*!DO+<A>>r5   c                 T    | j                   J | j                   j                  |      S rM   )r-   r]   r_   s     r4   rZ   z_InverseTransform.__call__	  s'    yy$$$yy""1%%r5   c                 X    | j                   J | j                   j                  ||       S rM   )r-   re   rd   s      r4   re   z&_InverseTransform.log_abs_det_jacobian  s,    yy$$$		..q!444r5   c                 8    | j                   j                  |      S rM   )r-   ro   rj   s     r4   rl   z_InverseTransform.forward_shape      yy&&u--r5   c                 8    | j                   j                  |      S rM   )r-   rl   rj   s     r4   ro   z_InverseTransform.inverse_shape  r   r5   rq   )rg   rr   rs   rt   r#   r1   r   dependent_propertyr&   r'   ry   boolru   rx   rF   rB   rK   rQ   rh   rZ   re   rl   ro   rz   r{   s   @r4   r?   r?      s    
)) ) ) $[##6" 7" $[##6  7  #4 # # c   Y  3'?&5..r5   r?   c                   
    e Zd ZdZddee   dedd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.
    partsr(   r)   Nc                 ~    |r|D cg c]  }|j                  |       }}t        | 	  |       || _        y c c}w r   )rK   r0   r1   r   )r2   r   r(   partr3   s       r4   r1   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   rO   s     r4   rQ   zComposeTransform.__eq__)  s#    %!12zzU[[((r5   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'   r<   reversedmaxindependent)r2   r&   r<   r   s       r4   r&   zComposeTransform.domain.  s    zz###A%%JJrN++55	TZZ( 	>D..1H1HHHIIt{{'<'<=I	> F,,,,,v''' ,,VYAQAQ5QRFr5   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&   r<   r   r   )r2   r'   r<   r   s       r4   r'   zComposeTransform.codomain=  s    zz###::b>**JJqM((22	JJ 	@D004;;3H3HHHIIt}}'>'>?I	@ H.....x)))"..xXEWEW9WXHr5   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrM   ru   ).0ps     r4   	<genexpr>z-ComposeTransform.bijective.<locals>.<genexpr>N  s     311;;3   )allr   r=   s    r4   ru   zComposeTransform.bijectiveL  s    3

333r5   c                 J    d}| j                   D ]  }||j                  z  } |S Nr+   )r   rF   )r2   rF   r   s      r4   rF   zComposeTransform.signP  s,     	!A!&&=D	!r5   c                 $   d }| j                   | j                         }|jt        t        | j                        D cg c]  }|j                   c}      }t        j                  |      | _         t        j                  |       |_         |S c c}w rM   )r-   r   r   r   rB   r@   rA   )r2   rB   r   s      r4   rB   zComposeTransform.invW  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   rJ   s     r4   rK   zComposeTransform.with_cacheb  s&    z)K

zBBr5   c                 8    | j                   D ]
  } ||      } |S rM   )r   )r2   rV   r   s      r4   rZ   zComposeTransform.__call__g  s#    JJ 	DQA	r5   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&   r<   zipr	   re   r'   	functoolsreduceoperatoradd)r2   rV   rY   xsr   termsr<   s          r4   re   z%ComposeTransform.log_abs_det_jacobianl  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4r5   c                 J    | j                   D ]  }|j                  |      } |S rM   )r   rl   r2   rk   r   s      r4   rl   zComposeTransform.forward_shape  s*    JJ 	.D&&u-E	.r5   c                 \    t        | j                        D ]  }|j                  |      } |S rM   )r   r   ro   r   s      r4   ro   zComposeTransform.inverse_shape  s/    TZZ( 	.D&&u-E	.r5   c                     | j                   j                  dz   }|dj                  | j                  D cg c]  }|j	                          c}      z  }|dz  }|S c c}w )Nz(
    z,
    z
))r3   rg   joinr   rh   )r2   
fmt_stringr   s      r4   rh   zComposeTransform.__repr__  sT    ^^,,y8
innDJJ%Gqajjl%GHH
e
 &Hs   A
rp   rq   )rg   rr   rs   rt   listr#   rx   r1   rQ   r   r   r&   r'   r   r   ru   rF   ry   rB   rK   rZ   re   rl   ro   rh   rz   r{   s   @r4   r   r     s    d9o 3 t )
 $[##6 7 $[##6 7 44 4 4 c   Y  C

5*

r5   r   c            	            e Zd ZdZ	 ddedededdf 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.
    base_transformreinterpreted_batch_ndimsr(   r)   Nc                 `    t         |   |       |j                  |      | _        || _        y r   )r0   r1   rK   r   r   )r2   r   r   r(   r3   s       r4   r1   zIndependentTransform.__init__  s0     	J/,77
C)B&r5   c                 h    | j                   |k(  r| S t        | j                  | j                  |      S r   )r,   r   r   r   rJ   s     r4   rK   zIndependentTransform.with_cache  s5    z)K#!?!?J
 	
r5   Fr   c                 j    t        j                  | j                  j                  | j                        S rM   )r   r   r   r&   r   r=   s    r4   r&   zIndependentTransform.domain  s,    &&&&(F(F
 	
r5   c                 j    t        j                  | j                  j                  | j                        S rM   )r   r   r   r'   r   r=   s    r4   r'   zIndependentTransform.codomain  s,    &&(($*H*H
 	
r5   c                 .    | j                   j                  S rM   )r   ru   r=   s    r4   ru   zIndependentTransform.bijective  s    "",,,r5   c                 .    | j                   j                  S rM   )r   rF   r=   s    r4   rF   zIndependentTransform.sign  s    ""'''r5   c                     |j                         | j                  j                  k  rt        d      | j	                  |      S NToo few dimensions on input)dimr&   r<   r/   r   r_   s     r4   rU   zIndependentTransform._call  s7    557T[[***:;;""1%%r5   c                     |j                         | j                  j                  k  rt        d      | j                  j                  |      S r   )r   r'   r<   r/   r   rB   rb   s     r4   r\   zIndependentTransform._inverse  s=    557T]],,,:;;""&&q))r5   c                 j    | j                   j                  ||      }t        || j                        }|S rM   )r   re   r	   r   )r2   rV   rY   results       r4   re   z)IndependentTransform.log_abs_det_jacobian  s1    $$99!Q?(F(FGr5   c                 z    | j                   j                   dt        | j                         d| j                   dS )Nr   z, r   )r3   rg   r   r   r   r=   s    r4   rh   zIndependentTransform.__repr__  s:    ..))*!D1D1D,E+FbIgIgHhhijjr5   c                 8    | j                   j                  |      S rM   )r   rl   rj   s     r4   rl   z"IndependentTransform.forward_shape      ""0077r5   c                 8    | j                   j                  |      S rM   )r   ro   rj   s     r4   ro   z"IndependentTransform.inverse_shape  r   r5   rp   rq   )rg   rr   rs   rt   r#   rx   r1   rK   r   r   r&   r'   ry   r   ru   rF   rU   r\   re   rh   rl   ro   rz   r{   s   @r4   r   r     s    " 	C!C $'C 	C
 
C
 $[##6
 7

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

 -4 - - (c ( (&
*

k88r5   r   c            	            e Zd ZdZdZ	 ddej                  dej                  deddf 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.)
    Tin_shape	out_shaper(   r)   Nc                    t        j                  |      | _        t        j                  |      | _        | j                  j	                         | j                  j	                         k7  rt        d      t        |   |       y )Nz6in_shape, out_shape have different numbers of elementsrH   )r   Sizer   r   numelr/   r0   r1   )r2   r   r   r(   r3   s       r4   r1   zReshapeTransform.__init__  sc     

8,I.== DNN$8$8$::UVVJ/r5   c                 p    t        j                  t         j                  t        | j                              S rM   )r   r   r   lenr   r=   s    r4   r&   zReshapeTransform.domain  s$    &&{'7'7T]]9KLLr5   c                 p    t        j                  t         j                  t        | j                              S rM   )r   r   r   r   r   r=   s    r4   r'   zReshapeTransform.codomain  s$    &&{'7'7T^^9LMMr5   c                 h    | j                   |k(  r| S t        | j                  | j                  |      S r   )r,   r   r   r   rJ   s     r4   rK   zReshapeTransform.with_cache  s,    z)Kt~~*UUr5   c                     |j                   d |j                         t        | j                        z
   }|j	                  || j
                  z         S rM   )rk   r   r   r   reshaper   )r2   rV   batch_shapes      r4   rU   zReshapeTransform._call
  s?    gg<#dmm*< <=yyt~~566r5   c                     |j                   d |j                         t        | j                        z
   }|j	                  || j
                  z         S rM   )rk   r   r   r   r   r   )r2   rY   r   s      r4   r\   zReshapeTransform._inverse  s?    gg=#dnn*= =>yyt}}455r5   c                     |j                   d |j                         t        | j                        z
   }|j	                  |      S rM   )rk   r   r   r   	new_zeros)r2   rV   rY   r   s       r4   re   z%ReshapeTransform.log_abs_det_jacobian  s6    gg<#dmm*< <={{;''r5   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   r2   rk   cuts      r4   rl   zReshapeTransform.forward_shape  s    u:DMM**:;;%j3t}}--;$--'+E#$K=	$--Q  Tc{T^^++r5   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      r4   ro   zReshapeTransform.inverse_shape   s    u:DNN++:;;%j3t~~..;$..(+E#$K=	$..AQR  Tc{T]]**r5   rp   rq   )rg   rr   rs   rt   ru   r   r   rx   r1   r   r   r&   r'   rK   rU   r\   re   rl   ro   rz   r{   s   @r4   r   r     s     I 	
0**
0 ::
0 	
0
 

0 ##M $M ##N $NV
76(,+r5   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 rM   )r   r   rO   s     r4   rQ   zExpTransform.__eq__5      %..r5   c                 "    |j                         S rM   )expr_   s     r4   rU   zExpTransform._call8      uuwr5   c                 "    |j                         S rM   logrb   s     r4   r\   zExpTransform._inverse;  r   r5   c                     |S rM   rN   rd   s      r4   re   z!ExpTransform.log_abs_det_jacobian>      r5   Nrg   rr   rs   rt   r   r   r&   positiver'   ru   rF   rQ   rU   r\   re   rN   r5   r4   r   r   +  s=     F##HID/r5   r   c                        e Zd ZdZej
                  Zej
                  ZdZdde	de
ddf 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}}`.
    Texponentr(   r)   Nc                 J    t         |   |       t        |      \  | _        y r   )r0   r1   r
   r   )r2   r   r(   r3   s      r4   r1   zPowerTransform.__init__K  s"    J/(2r5   c                 R    | j                   |k(  r| S t        | j                  |      S r   )r,   r   r   rJ   s     r4   rK   zPowerTransform.with_cacheO  s&    z)Kdmm
CCr5   c                 6    | j                   j                         S rM   )r   rF   r=   s    r4   rF   zPowerTransform.signT  s    }}!!##r5   c                     t        |t              sy| j                  j                  |j                        j	                         j                         S r   )r   r   r   eqr   itemrO   s     r4   rQ   zPowerTransform.__eq__X  s:    %0}}/335::<<r5   c                 8    |j                  | j                        S rM   powr   r_   s     r4   rU   zPowerTransform._call]  s    uuT]]##r5   c                 >    |j                  d| j                  z        S r   r   rb   s     r4   r\   zPowerTransform._inverse`  s    uuQ&''r5   c                 ^    | j                   |z  |z  j                         j                         S rM   )r   absr   rd   s      r4   re   z#PowerTransform.log_abs_det_jacobianc  s(    !A%**,0022r5   c                 X    t        j                  |t        | j                  dd            S Nrk   rN   r   broadcast_shapesgetattrr   rj   s     r4   rl   zPowerTransform.forward_shapef  "    %%eWT]]GR-PQQr5   c                 X    t        j                  |t        | j                  dd            S r  r  rj   s     r4   ro   zPowerTransform.inverse_shapei  r
  r5   rp   rq   )rg   rr   rs   rt   r   r   r&   r'   ru   r   rx   r1   rK   r   rF   rQ   rU   r\   re   rl   ro   rz   r{   s   @r4   r   r   B  s     !!F##HI3 3S 3 3D
 $c $ $=
$(3RRr5   r   c                     t        j                  | j                        }t        j                  t        j                  |       |j
                  d|j                  z
        S N      ?minr   )r   finfodtypeclampsigmoidtinyeps)rV   r  s     r4   _clipped_sigmoidr  m  s<    KK E;;u}}Q'UZZS599_MMr5   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 rM   )r   r   rO   s     r4   rQ   zSigmoidTransform.__eq__|      %!122r5   c                     t        |      S rM   )r  r_   s     r4   rU   zSigmoidTransform._call  s    ""r5   c                     t        j                  |j                        }|j                  |j                  d|j
                  z
        }|j                         | j                         z
  S r  )r   r  r  r  r  r  r   log1p)r2   rY   r  s      r4   r\   zSigmoidTransform._inverse  sK    AGG$GG

eiiG8uuw1"%%r5   c                 \    t        j                  |        t        j                  |      z
  S rM   )Fr   rd   s      r4   re   z%SigmoidTransform.log_abs_det_jacobian  s!    

A2A..r5   N)rg   rr   rs   rt   r   r   r&   unit_intervalr'   ru   rF   rQ   rU   r\   re   rN   r5   r4   r   r   r  s=     F((HID3#&
/r5   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 rM   )r   r   rO   s     r4   rQ   zSoftplusTransform.__eq__  s    %!233r5   c                     t        |      S rM   r   r_   s     r4   rU   zSoftplusTransform._call  s    {r5   c                 b    | j                         j                         j                         |z   S rM   )expm1negr   rb   s     r4   r\   zSoftplusTransform._inverse  s'    zz|!%%'!++r5   c                     t        |        S rM   r$  rd   s      r4   re   z&SoftplusTransform.log_abs_det_jacobian  s    !}r5   Nr   rN   r5   r4   r   r     s=    
 F##HID4,r5   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 rM   )r   r   rO   s     r4   rQ   zTanhTransform.__eq__  s    %//r5   c                 "    |j                         S rM   )tanhr_   s     r4   rU   zTanhTransform._call  s    vvxr5   c                 ,    t        j                  |      S rM   )r   atanhrb   s     r4   r\   zTanhTransform._inverse  s     {{1~r5   c                 V    dt        j                  d      |z
  t        d|z        z
  z  S )N       @g       )mathr   r   rd   s      r4   re   z"TanhTransform.log_abs_det_jacobian  s*     dhhsma'(4!8*<<==r5   N)rg   rr   rs   rt   r   r   r&   intervalr'   ru   rF   rQ   rU   r\   re   rN   r5   r4   r   r     sF    , F#{##D#.HID0
>r5   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 rM   )r   r   rO   s     r4   rQ   zAbsTransform.__eq__  r   r5   c                 "    |j                         S rM   )r  r_   s     r4   rU   zAbsTransform._call  r   r5   c                     |S rM   rN   rb   s     r4   r\   zAbsTransform._inverse  r   r5   N)rg   rr   rs   rt   r   r   r&   r   r'   rQ   rU   r\   rN   r5   r4   r   r     s*    5F##H/r5   r   c                       e Zd ZdZdZ	 	 ddeeef   deeef   dededdf
 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eef   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.
    Tlocscaler<   r(   r)   Nc                 P    t         |   |       || _        || _        || _        y r   )r0   r1   r8  r9  
_event_dim)r2   r8  r9  r<   r(   r3   s        r4   r1   zAffineTransform.__init__  s*     	J/
#r5   c                     | j                   S rM   )r;  r=   s    r4   r<   zAffineTransform.event_dim  s    r5   Fr   c                     | j                   dk(  rt        j                  S t        j                  t        j                  | j                         S Nr   r<   r   r   r   r=   s    r4   r&   zAffineTransform.domain  7    >>Q###&&{'7'7HHr5   c                     | j                   dk(  rt        j                  S t        j                  t        j                  | j                         S r>  r?  r=   s    r4   r'   zAffineTransform.codomain  r@  r5   c                 ~    | j                   |k(  r| S t        | j                  | j                  | j                  |      S r   )r,   r   r8  r9  r<   rJ   s     r4   rK   zAffineTransform.with_cache
  s7    z)KHHdjj$..Z
 	
r5   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   r8  r   r   r   r9  rO   s     r4   rQ   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;r5   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   r9  r   floatrF   r=   s    r4   rF   zAffineTransform.sign%  sR    djj'*djj)A-1Utzz9JQ9N2UTUUzz  r5   c                 :    | j                   | j                  |z  z   S rM   r8  r9  r_   s     r4   rU   zAffineTransform._call+  s    xx$**q.((r5   c                 :    || j                   z
  | j                  z  S rM   rG  rb   s     r4   r\   zAffineTransform._inverse.  s    DHH

**r5   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   )rk   r9  r   r   r   	full_liker1  r   r  r<   sizeviewsumexpand)r2   rV   rY   rk   r9  r   result_sizes          r4   re   z$AffineTransform.log_abs_det_jacobian1  s    

eW%__QU(<=FYYu%))+F>> ++-(94>>/:UBK[[-11"5F+T^^O,E}}U##r5   c           	          t        j                  |t        | j                  dd      t        | j                  dd            S r  r   r  r	  r8  r9  rj   s     r4   rl   zAffineTransform.forward_shape>  7    %%7488Wb174::wPR3S
 	
r5   c           	          t        j                  |t        | j                  dd      t        | j                  dd            S r  rQ  rj   s     r4   ro   zAffineTransform.inverse_shapeC  rR  r5   r   r   rq   )rg   rr   rs   rt   ru   r   r   rE  rx   r1   ry   r<   r   r   r&   r'   rK   rQ   rF   rU   r\   re   rl   ro   rz   r{   s   @r4   r   r     s   	 I 
$65=!
$ VU]#
$ 	
$
 
$ 

$ 3   $[##6I 7I
 $[##6I 7I

( !eFCK( ! !
)+$


r5   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eyerk   rZ  r   )r2   rV   r  rzz1m_cumprod_sqrtrY   s          r4   rU   zCorrCholeskyTransform._call^  s    JJqMkk!''"&&GGSa#gG.qr* qDE<<>11"5		!''"+QWWQXXFF$S#2#X.Aa@@r5   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   r[  rW  rY  )r   cumsumr   r   r]  r  r'  )r2   rY   y_cumsumy_cumsum_shiftedy_vecy_cumsum_vectrV   s           r4   r\   zCorrCholeskyTransform._inversem  s     u||AEr22xSbS1Aq6C"12.)*:D\''))WWY(A-r5   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   rd  rW        ?r0  )re  r   r   rM  r   r1  )r2   rV   rY   intermediates
y1m_cumsumy1m_cumsum_trilstick_breaking_logdettanh_logdets           r4   re   z*CorrCholeskyTransform.log_abs_det_jacobiany  s     !a%B//
 -ZbA #&;&;&=&A&A"&E EAa 00488C=@EE"EMM${22r5   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      ?rY  rm  z-Input is not a flattend lower-diagonal number)r   r/   round)r2   rk   NDs       r4   rl   z#CorrCholeskyTransform.forward_shape  st    u:>:;;"I4!a%<C'#-.A;!q LMMSbzQF""r5   c                     t        |      dk  rt        d      |d   |d   k7  rt        d      |d   }||dz
  z  dz  }|d d |fz   S )NrY  r   rl  r   zInput is not squarer+   r   r/   )r2   rk   rv  ru  s       r4   ro   z#CorrCholeskyTransform.inverse_shape  sc    u:>:;;9b	!233"IQK1SbzQD  r5   rM   )rg   rr   rs   rt   r   real_vectorr&   corr_choleskyr'   ru   rU   r\   re   rl   ro   rN   r5   r4   r   r   I  s=      $$F((HI
3#!r5   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 rM   )r   r    rO   s     r4   rQ   zSoftmaxTransform.__eq__  r  r5   c                 |    |}||j                  dd      d   z
  j                         }||j                  dd      z  S )Nr   Tr   )r   r   rM  )r2   rV   logprobsprobss       r4   rU   zSoftmaxTransform._call  s@    HLLT2155::<uyyT***r5   c                 &    |}|j                         S rM   r   )r2   rY   r  s      r4   r\   zSoftmaxTransform._inverse  s    yy{r5   c                 8    t        |      dk  rt        d      |S Nr+   r   rx  rj   s     r4   rl   zSoftmaxTransform.forward_shape      u:>:;;r5   c                 8    t        |      dk  rt        d      |S r  rx  rj   s     r4   ro   zSoftmaxTransform.inverse_shape  r  r5   N)rg   rr   rs   rt   r   ry  r&   simplexr'   rQ   rU   r\   rl   ro   rN   r5   r4   r    r      s8     $$F""H3+

r5   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 rM   )r   r"   rO   s     r4   rQ   zStickBreakingTransform.__eq__      %!788r5   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   r[  )rk   new_onesre  r  r   r^  r   )r2   rV   offsetra  	z_cumprodrY   s         r4   rU   zStickBreakingTransform._call  s    q1::aggbk#:#A#A"#EEQ-.UOOB'	Aq6#c)aV1&EEr5   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  )	rk   r  re  r   r  r  r  r  r   )r2   rY   y_cropr  sfrV   s         r4   r\   zStickBreakingTransform._inverse  s    38qzz&,,r*:;BB2FFr"" [[QWW!5!:!:;JJL2668#fjjl2r5   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+   .)rk   r  re  r   r  
logsigmoidrM  )r2   rV   rY   r  detJs        r4   re   z+StickBreakingTransform.log_abs_det_jacobian  s    q1::aggbk#:#A#A"#EE

Q\\!_$qcrc{'88==bAr5   c                 R    t        |      dk  rt        d      |d d |d   dz   fz   S Nr+   r   r   rx  rj   s     r4   rl   z$StickBreakingTransform.forward_shape  5    u:>:;;SbzU2Y],,,r5   c                 R    t        |      dk  rt        d      |d d |d   dz
  fz   S r  rx  rj   s     r4   ro   z$StickBreakingTransform.inverse_shape  r  r5   N)rg   rr   rs   rt   r   ry  r&   r  r'   ru   rQ   rU   r\   re   rl   ro   rN   r5   r4   r"   r"     sB     $$F""HI9-
-r5   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.
    rY  c                 "    t        |t              S rM   )r   r   rO   s     r4   rQ   zLowerCholeskyTransform.__eq__  r  r5   c                     |j                  d      |j                  dd      j                         j                         z   S Nr   rl  )dim1dim2)trildiagonalr   
diag_embedr_   s     r4   rU   zLowerCholeskyTransform._call  4    vvbzAJJBRJ8<<>IIKKKr5   c                     |j                  d      |j                  dd      j                         j                         z   S r  )r  r  r   r  rb   s     r4   r\   zLowerCholeskyTransform._inverse
  r  r5   N)rg   rr   rs   rt   r   r   r   r&   lower_choleskyr'   rQ   rU   r\   rN   r5   r4   r   r     s?     %[$$[%5%5q9F))H9LLr5   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.
    rY  c                 "    t        |t              S rM   )r   r   rO   s     r4   rQ   z PositiveDefiniteTransform.__eq__  s    %!:;;r5   c                 @     t               |      }||j                  z  S rM   )r   mTr_   s     r4   rU   zPositiveDefiniteTransform._call  s    $"$Q'144xr5   c                 r    t         j                  j                  |      }t               j	                  |      S rM   )r   linalgcholeskyr   rB   rb   s     r4   r\   z"PositiveDefiniteTransform._inverse  s*    LL!!!$%'++A..r5   N)rg   rr   rs   rt   r   r   r   r&   positive_definiter'   rQ   rU   r\   rN   r5   r4   r   r     s=     %[$$[%5%5q9F,,H</r5   r   c                       e Zd ZU dZee   ed<   	 	 	 ddee   dede	ee      deddf
 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)
    
transformsNtseqr   lengthsr(   r)   c                 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rM   r   r#   r   rj  s     r4   r   z(CatTransform.__init__.<locals>.<genexpr>:       ::a+:   rH   r+   )	r   rK   r0   r1   r   r  r   r  r   )r2   r  r   r  r(   rj  r3   s         r4   r1   zCatTransform.__init__3  s     :T::::6:;ALL,;D;J/t*?cC00GG}4<< C$8888 <s   B6c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrM   )r<   r  s     r4   r   z)CatTransform.event_dim.<locals>.<genexpr>G       811;;8r   )r   r  r=   s    r4   r<   zCatTransform.event_dimE      8888r5   c                 ,    t        | j                        S rM   )rM  r  r=   s    r4   lengthzCatTransform.lengthI  s    4<<  r5   c                 |    | j                   |k(  r| S t        | j                  | j                  | j                  |      S rM   )r,   r   r  r   r  rJ   s     r4   rK   zCatTransform.with_cacheM  s2    z)KDOOTXXt||ZPPr5   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   rd  )
r   rK  r  r   r  r  narrowr   r   cat)r2   rV   yslicesstarttransr  xslices          r4   rU   zCatTransform._callR  s    x488-aeeg-----vvdhh4;;... $,,? 	#ME6XXdhhv6FNN5=)FNE	# yydhh//r5   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   rK  r  r   r  r  r  r   rB   r   r  )r2   rY   xslicesr  r  r  yslices          r4   r\   zCatTransform._inverse]  s    x488-aeeg-----vvdhh4;;... $,,? 	#ME6XXdhhv6FNN599V,-FNE	# yydhh//r5   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   rK  r  r   r  r  r  re   r<   r	   r   r   r  rM  )r2   rV   rY   
logdetjacsr  r  r  r  r  	logdetjacr   s              r4   re   z!CatTransform.log_abs_det_jacobianh  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?"r5   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrM   r   r  s     r4   r   z)CatTransform.bijective.<locals>.<genexpr>  r  r   r   r  r=   s    r4   ru   zCatTransform.bijective  r  r5   c                     t        j                  | j                  D cg c]  }|j                   c}| j                  | j
                        S c c}w rM   )r   r  r  r&   r   r  r2   rj  s     r4   r&   zCatTransform.domain  s8    #/!QXX/4<<
 	
/   Ac                     t        j                  | j                  D cg c]  }|j                   c}| j                  | j
                        S c c}w rM   )r   r  r  r'   r   r  r  s     r4   r'   zCatTransform.codomain  s8    !%1AQZZ1488T\\
 	
1r  )r   Nr   rq   )rg   rr   rs   rt   r   r#   rw   r   rx   r   r1   r   r<   r  rK   rU   r\   re   ry   r   ru   r   r   r&   r'   rz   r{   s   @r4   r   r   "  s     Y
 +/y!  (3-(	
  
$ 93 9 9 ! ! !Q
	0	0#2 94 9 9 ##
 $

 ##
 $
r5   r   c            	            e Zd ZU dZee   ed<   	 ddee   dededdf 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  r  r   r(   r)   Nc                     t        d |D              sJ |r|D cg c]  }|j                  |       }}t        |   |       t	        |      | _        || _        y c c}w )Nc              3   <   K   | ]  }t        |t                y wrM   r  r  s     r4   r   z*StackTransform.__init__.<locals>.<genexpr>  r  r  rH   )r   rK   r0   r1   r   r  r   )r2   r  r   r(   rj  r3   s        r4   r1   zStackTransform.__init__  s_     :T::::6:;ALL,;D;J/t* <s   Ac                 f    | j                   |k(  r| S t        | j                  | j                  |      S rM   )r,   r!   r  r   rJ   s     r4   rK   zStackTransform.with_cache  s,    z)KdootxxDDr5   c                     t        |j                  | j                              D cg c]  }|j                  | j                  |        c}S c c}w rM   )rangerK  r   select)r2   ra  is      r4   _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 Nrd  )	r   rK  r   r  r   r  r   r   stack)r2   rV   r  r  r  s        r4   rU   zStackTransform._call  s    x488-aeeg-----vvdhh3t#7777 QA 	*MFENN5=)	*{{711r5   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   rK  r   r  r   r  r   rB   r   r  )r2   rY   r  r  r  s        r4   r\   zStackTransform._inverse  s    x488-aeeg-----vvdhh3t#7777 QA 	.MFENN599V,-	.{{711r5   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   rK  r   r  r  r   r   re   r   r  )	r2   rV   rY   r  r  r  r  r  r  s	            r4   re   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4r5   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrM   r   r  s     r4   r   z+StackTransform.bijective.<locals>.<genexpr>  r  r   r  r=   s    r4   ru   zStackTransform.bijective  r  r5   c                     t        j                  | j                  D cg c]  }|j                   c}| j                        S c c}w rM   )r   r  r  r&   r   r  s     r4   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 rM   )r   r  r  r'   r   r  s     r4   r'   zStackTransform.codomain  s/      doo!F!**!FQQ!Fr  rT  rq   )rg   rr   rs   rt   r   r#   rw   r   rx   r1   rK   r  rU   r\   re   ry   r   ru   r   r   r&   r'   rz   r{   s   @r4   r!   r!     s    
 Y JKY'.1CF	E
H22
5 94 9 9 ##P $P ##R $Rr5   r!   c                        e Zd ZdZdZej                  ZdZdde	de
ddf fdZede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+   distributionr(   r)   Nc                 4    t         |   |       || _        y r   )r0   r1   r  )r2   r  r(   r3   s      r4   r1   z(CumulativeDistributionTransform.__init__  s    J/(r5   c                 .    | j                   j                  S rM   )r  supportr=   s    r4   r&   z&CumulativeDistributionTransform.domain  s      (((r5   c                 8    | j                   j                  |      S rM   )r  cdfr_   s     r4   rU   z%CumulativeDistributionTransform._call  s      $$Q''r5   c                 8    | j                   j                  |      S rM   )r  icdfrb   s     r4   r\   z(CumulativeDistributionTransform._inverse  s      %%a((r5   c                 8    | j                   j                  |      S rM   )r  log_probrd   s      r4   re   z4CumulativeDistributionTransform.log_abs_det_jacobian  s      ))!,,r5   c                 R    | j                   |k(  r| S t        | j                  |      S r   )r,   r   r  rJ   s     r4   rK   z*CumulativeDistributionTransform.with_cache  s(    z)K.t/@/@ZXXr5   rp   rq   )rg   rr   rs   rt   ru   r   r   r'   rF   r   rx   r1   ry   r   rv   r&   rU   r\   re   rK   rz   r{   s   @r4   r   r     st    $ I((HD)\ )s )4 ) )!7!78 ) )()-Yr5   r   )4r   r1  r   r@   collections.abcr   typingr   r   r   torch.nn.functionalnn
functionalr  r   torch.distributionsr    torch.distributions.distributionr   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   rN   r5   r4   <module>r     sh       $ "     + 9  . 0f fR;.	 ;.|wy wt &b) I89 I8XG+y G+T9 .(RY (RVN
/y /2	 0*>I *>Z9  f
i f
RP!I P!f!y !H5-Y 5-pLY L,/	 /(m
9 m
`GRY GRT+Yi +Yr5   