
    9j                     z   d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmc m	Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZ d dlmZ g d	Z G d
 d      Z G d de      Z G d de      Z eg       Z G d de      Z G d de      Z  G d de      Z! G d de      Z"d Z# G d de      Z$ G d de      Z% G d de      Z& G d d e      Z' G d! d"e      Z( G d# d$e      Z) G d% d&e      Z* G d' d(e      Z+ G d) d*e      Z, G d+ d,e      Z- G d- d.e      Z. G d/ d0e      Z/ G d1 d2e      Z0y)3    N)Sequence)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     ^/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/distributions/transforms.pyr/   zTransform.__init__a   sB    %=A	?1_)D899    c                 D    | j                   j                         }d |d<   |S )Nr+   )__dict__copy)r0   states     r2   __getstate__zTransform.__getstate__l   s"    ""$fr3   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-   r0   s    r2   r:   zTransform.event_dimq   s:    ;;  DMM$;$;;;;(((UVVr3   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)r0   invs     r2   r@   zTransform.invw   sB     99 ))+C;#D)CC(DI
r3   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    r2   signzTransform.sign   s
     "!r3   c                     | j                   |k(  r| S t        |       j                  t        j                  u r t        |       |      S t	        t        |        d      )Nr&   z.with_cache is not implemented)r*   typer/   r!   rC   r0   r&   s     r2   
with_cachezTransform.with_cache   sU    z)K:)"4"444:44!T$ZL0N"OPPr3   c                 
    | |u S N r0   others     r2   __eq__zTransform.__eq__   s    u}r3   c                 &    | j                  |       S rK   )rO   rM   s     r2   __ne__zTransform.__ne__   s    ;;u%%%r3   c                     | j                   dk(  r| j                  |      S | j                  \  }}||u r|S | j                  |      }||f| _        |S )z2
        Computes the transform `x => y`.
        r   )r*   _callr,   )r0   xx_oldy_oldys        r2   __call__zTransform.__call__   sY     q ::a= ''u:LJJqMa4r3   c                     | j                   dk(  r| j                  |      S | j                  \  }}||u r|S | j                  |      }||f| _        |S )z1
        Inverts the transform `y => x`.
        r   )r*   _inverser,   )r0   rW   rU   rV   rT   s        r2   	_inv_callzTransform._inv_call   s[     q ==##''u:LMM!a4r3   c                     t         )zD
        Abstract method to compute forward transformation.
        rB   r0   rT   s     r2   rS   zTransform._call   
     "!r3   c                     t         )zD
        Abstract method to compute inverse transformation.
        rB   r0   rW   s     r2   rZ   zTransform._inverse   r^   r3   c                     t         )zU
        Computes the log det jacobian `log |dy/dx|` given input and output.
        rB   r0   rT   rW   s      r2   log_abs_det_jacobianzTransform.log_abs_det_jacobian   r^   r3   c                 4    | j                   j                  dz   S )Nz())r1   __name__r;   s    r2   __repr__zTransform.__repr__   s    ~~&&--r3   c                     |S )z{
        Infers the shape of the forward computation, given the input shape.
        Defaults to preserving shape.
        rL   r0   shapes     r2   forward_shapezTransform.forward_shape   	    
 r3   c                     |S )z}
        Infers the shapes of the inverse computation, given the output shape.
        Defaults to preserving shape.
        rL   rh   s     r2   inverse_shapezTransform.inverse_shape   rk   r3   r   )r'   r!   r)   )re   
__module____qualname____doc__	bijectiver   
Constraint__annotations__intr/   r8   propertyr:   r@   rD   rI   rO   rQ   rX   r[   rS   rZ   rc   rf   rj   rm   __classcell__r1   s   @r2   r!   r!   0   s    *X I"""$$$	3 	t 	
 W3 W W
   "c " "Q&""".r3   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 NrF   )r.   r/   r*   r+   )r0   r{   r1   s     r2   r/   z_InverseTransform.__init__   s     I$9$9:(	r3   Fis_discretec                 \    | j                   t        d      | j                   j                  S N_inv must not be None)r+   AssertionErrorr%   r;   s    r2   r$   z_InverseTransform.domain   s*     99 !899yy!!!r3   c                 \    | j                   t        d      | j                   j                  S r   )r+   r   r$   r;   s    r2   r%   z_InverseTransform.codomain   s*     99 !899yyr3   c                 \    | j                   t        d      | j                   j                  S r   )r+   r   rs   r;   s    r2   rs   z_InverseTransform.bijective   s(    99 !899yy"""r3   c                 \    | j                   t        d      | j                   j                  S r   )r+   r   rD   r;   s    r2   rD   z_InverseTransform.sign   s&    99 !899yy~~r3   c                     | j                   S rK   )r+   r;   s    r2   r@   z_InverseTransform.inv   s    yyr3   c                 z    | j                   t        d      | j                  j                  |      j                  S r   )r+   r   r@   rI   rH   s     r2   rI   z_InverseTransform.with_cache  s3    99 !899xx"":.222r3   c                     t        |t              sy| j                  t        d      | j                  |j                  k(  S )NFr   )
isinstancer=   r+   r   rM   s     r2   rO   z_InverseTransform.__eq__  s9    %!2399 !899yyEJJ&&r3   c                 `    | j                   j                   dt        | j                         dS )N())r1   re   reprr+   r;   s    r2   rf   z_InverseTransform.__repr__  s)    ..))*!DO+<A>>r3   c                 f    | j                   t        d      | j                   j                  |      S r   )r+   r   r[   r]   s     r2   rX   z_InverseTransform.__call__  s-    99 !899yy""1%%r3   c                 j    | j                   t        d      | j                   j                  ||       S r   )r+   r   rc   rb   s      r2   rc   z&_InverseTransform.log_abs_det_jacobian  s2    99 !899		..q!444r3   c                 8    | j                   j                  |      S rK   )r+   rm   rh   s     r2   rj   z_InverseTransform.forward_shape      yy&&u--r3   c                 8    | j                   j                  |      S rK   )r+   rj   rh   s     r2   rm   z_InverseTransform.inverse_shape  r   r3   ro   )re   rp   rq   rr   r!   r/   r   dependent_propertyr$   r%   rw   boolrs   rv   rD   r@   rI   rO   rf   rX   rc   rj   rm   rx   ry   s   @r2   r=   r=      s    
)) ) ) $[##6" 7"
 $[##6  7 
 #4 # #
 c  
 Y  3
'?&
5
..r3   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}   )rI   r.   r/   r   )r0   r   r&   partr1   s       r2   r/   zComposeTransform.__init__,  s?    =BCTT__Z0CECJ/
 Ds   :c                 V    t        |t              sy| j                  |j                  k(  S NF)r   r   r   rM   s     r2   rO   zComposeTransform.__eq__2  s#    %!12zzU[[((r3   Fr~   c                 B   | 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  rt        d| d|j
                         ||j
                  kD  r#t        j                  |||j
                  z
        }|S )Nr   
event_dim z must be >= domain.event_dim )
r   r   realr$   r%   r:   reversedmaxr   independent)r0   r$   r:   r   s       r2   r$   zComposeTransform.domain7  s     zz###A%%JJrN++55	TZZ( 	>D..1H1HHHIIt{{'<'<=I	> v''' YK'DVEUEUDVW  v''' ,,VYAQAQ5QRFr3   c                 0   | 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  rt        d| d|j
                         ||j
                  kD  r#t        j                  |||j
                  z
        }|S )Nr   r   r   z must be >= codomain.event_dim )	r   r   r   r%   r$   r:   r   r   r   )r0   r%   r:   r   s       r2   r%   zComposeTransform.codomainJ  s     zz###::b>**JJqM((22	JJ 	@D004;;3H3HHHIIt}}'>'>?I	@ x))) YK'FxGYGYFZ[  x)))"..xXEWEW9WXHr3   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrK   rs   ).0ps     r2   	<genexpr>z-ComposeTransform.bijective.<locals>.<genexpr>_  s     311;;3   )allr   r;   s    r2   rs   zComposeTransform.bijective]  s    3

333r3   c                 J    d}| j                   D ]  }||j                  z  } |S Nr)   )r   rD   )r0   rD   r   s      r2   rD   zComposeTransform.signa  s,     	!A!&&=D	!r3   c                 $   d }| j                   | j                         }|jt        t        | j                        D cg c]  }|j                   c}      }t        j                  |      | _         t        j                  |       |_         |S c c}w rK   )r+   r   r   r   r@   r>   r?   )r0   r@   r   s      r2   r@   zComposeTransform.invh  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   rH   s     r2   rI   zComposeTransform.with_caches  s&    z)K

zBBr3   c                 8    | j                   D ]
  } ||      } |S rK   )r   )r0   rT   r   s      r2   rX   zComposeTransform.__call__x  s#    JJ 	DQA	r3   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   rc   r%   	functoolsreduceoperatoradd)r0   rT   rW   xsr   termsr:   s          r2   rc   z%ComposeTransform.log_abs_det_jacobian}  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4r3   c                 J    | j                   D ]  }|j                  |      } |S rK   )r   rj   r0   ri   r   s      r2   rj   zComposeTransform.forward_shape  s*    JJ 	.D&&u-E	.r3   c                 \    t        | j                        D ]  }|j                  |      } |S rK   )r   r   rm   r   s      r2   rm   zComposeTransform.inverse_shape  s/    TZZ( 	.D&&u-E	.r3   c                     | j                   j                  dz   }|dj                  | j                  D cg c]  }|j	                          c}      z  }|dz  }|S c c}w )Nz(
    z,
    z
))r1   re   joinr   rf   )r0   
fmt_stringr   s      r2   rf   zComposeTransform.__repr__  sT    ^^,,y8
innDJJ%Gqajjl%GHH
e
 &Hs   A
rn   ro   )re   rp   rq   rr   listr!   rv   r/   rO   r   r   r$   r%   r	   r   rs   rD   rw   r@   rI   rX   rc   rj   rm   rf   rx   ry   s   @r2   r   r   !  s    d9o 3 t )
 $[##6 7" $[##6 7" 44 4 4 c   Y  C

5*

r3   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}   )r.   r/   rI   r   r   )r0   r   r   r&   r1   s       r2   r/   zIndependentTransform.__init__  s0     	J/,77
C)B&r3   c                 h    | j                   |k(  r| S t        | j                  | j                  |      S r}   )r*   r   r   r   rH   s     r2   rI   zIndependentTransform.with_cache  s5    z)K#!?!?J
 	
r3   Fr~   c                 j    t        j                  | j                  j                  | j                        S rK   )r   r   r   r$   r   r;   s    r2   r$   zIndependentTransform.domain  s.     &&&&(F(F
 	
r3   c                 j    t        j                  | j                  j                  | j                        S rK   )r   r   r   r%   r   r;   s    r2   r%   zIndependentTransform.codomain  s.     &&(($*H*H
 	
r3   c                 .    | j                   j                  S rK   )r   rs   r;   s    r2   rs   zIndependentTransform.bijective  s    "",,,r3   c                 .    | j                   j                  S rK   )r   rD   r;   s    r2   rD   zIndependentTransform.sign  s    ""'''r3   c                     |j                         | j                  j                  k  rt        d      | j	                  |      S NToo few dimensions on input)dimr$   r:   r-   r   r]   s     r2   rS   zIndependentTransform._call  s7    557T[[***:;;""1%%r3   c                     |j                         | j                  j                  k  rt        d      | j                  j                  |      S r   )r   r%   r:   r-   r   r@   r`   s     r2   rZ   zIndependentTransform._inverse  s=    557T]],,,:;;""&&q))r3   c                 j    | j                   j                  ||      }t        || j                        }|S rK   )r   rc   r   r   )r0   rT   rW   results       r2   rc   z)IndependentTransform.log_abs_det_jacobian  s1    $$99!Q?(F(FGr3   c                 z    | j                   j                   dt        | j                         d| j                   dS )Nr   z, r   )r1   re   r   r   r   r;   s    r2   rf   zIndependentTransform.__repr__  s:    ..))*!D1D1D,E+FbIgIgHhhijjr3   c                 8    | j                   j                  |      S rK   )r   rj   rh   s     r2   rj   z"IndependentTransform.forward_shape      ""0077r3   c                 8    | j                   j                  |      S rK   )r   rm   rh   s     r2   rm   z"IndependentTransform.inverse_shape  r   r3   rn   ro   )re   rp   rq   rr   r!   rv   r/   rI   r   r   r$   r%   rw   r   rs   rD   rS   rZ   rc   rf   rj   rm   rx   ry   s   @r2   r   r     s    " 	C!C $'C 	C
 
C
 $[##6
 7

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

 -4 - - (c ( (&
*

k88r3   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 elementsrF   )r   Sizer   r   numelr-   r.   r/   )r0   r   r   r&   r1   s       r2   r/   zReshapeTransform.__init__  sc     

8,I.== DNN$8$8$::UVVJ/r3   c                 p    t        j                  t         j                  t        | j                              S rK   )r   r   r   lenr   r;   s    r2   r$   zReshapeTransform.domain  s&     &&{'7'7T]]9KLLr3   c                 p    t        j                  t         j                  t        | j                              S rK   )r   r   r   r   r   r;   s    r2   r%   zReshapeTransform.codomain  s&     &&{'7'7T^^9LMMr3   c                 h    | j                   |k(  r| S t        | j                  | j                  |      S r}   )r*   r   r   r   rH   s     r2   rI   zReshapeTransform.with_cache  s,    z)Kt~~*UUr3   c                     |j                   d |j                         t        | j                        z
   }|j	                  || j
                  z         S rK   )ri   r   r   r   reshaper   )r0   rT   batch_shapes      r2   rS   zReshapeTransform._call  s?    gg<#dmm*< <=yyt~~566r3   c                     |j                   d |j                         t        | j                        z
   }|j	                  || j
                  z         S rK   )ri   r   r   r   r   r   )r0   rW   r   s      r2   rZ   zReshapeTransform._inverse#  s?    gg=#dnn*= =>yyt}}455r3   c                     |j                   d |j                         t        | j                        z
   }|j	                  |      S rK   )ri   r   r   r   	new_zeros)r0   rT   rW   r   s       r2   rc   z%ReshapeTransform.log_abs_det_jacobian'  s6    gg<#dmm*< <={{;''r3   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   r0   ri   cuts      r2   rj   zReshapeTransform.forward_shape+  s    u:DMM**:;;%j3t}}--;$--'+E#$K=	$--Q  Tc{T^^++r3   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      r2   rm   zReshapeTransform.inverse_shape5  s    u:DNN++:;;%j3t~~..;$..(+E#$K=	$..AQR  Tc{T]]**r3   rn   ro   )re   rp   rq   rr   rs   r   r   rv   r/   r   r   r$   r%   rI   rS   rZ   rc   rj   rm   rx   ry   s   @r2   r   r     s     I 	
0**
0 ::
0 	
0
 

0 ##M $M ##N $NV
76(,+r3   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 rK   )r   r   rM   s     r2   rO   zExpTransform.__eq__J      %..r3   c                 "    |j                         S rK   )expr]   s     r2   rS   zExpTransform._callM      uuwr3   c                 "    |j                         S rK   logr`   s     r2   rZ   zExpTransform._inverseP  r   r3   c                     |S rK   rL   rb   s      r2   rc   z!ExpTransform.log_abs_det_jacobianS      r3   Nre   rp   rq   rr   r   r   r$   positiver%   rs   rD   rO   rS   rZ   rc   rL   r3   r2   r   r   @  s=     F##HID/r3   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}   )r.   r/   r   r   )r0   r   r&   r1   s      r2   r/   zPowerTransform.__init__`  s"    J/(2r3   c                 R    | j                   |k(  r| S t        | j                  |      S r}   )r*   r   r   rH   s     r2   rI   zPowerTransform.with_cached  s&    z)Kdmm
CCr3   c                 6    | j                   j                         S rK   )r   rD   r;   s    r2   rD   zPowerTransform.signi  s    }}!!##r3   c                     t        |t              sy| j                  j                  |j                        j	                         j                         S r   )r   r   r   eqr   itemrM   s     r2   rO   zPowerTransform.__eq__m  s:    %0}}/335::<<r3   c                 8    |j                  | j                        S rK   powr   r]   s     r2   rS   zPowerTransform._callr  s    uuT]]##r3   c                 >    |j                  d| j                  z        S r   r  r`   s     r2   rZ   zPowerTransform._inverseu  s    uuQ&''r3   c                 ^    | j                   |z  |z  j                         j                         S rK   )r   absr   rb   s      r2   rc   z#PowerTransform.log_abs_det_jacobianx  s(    !A%**,0022r3   c                 X    t        j                  |t        | j                  dd            S Nri   rL   r   broadcast_shapesgetattrr   rh   s     r2   rj   zPowerTransform.forward_shape{  "    %%eWT]]GR-PQQr3   c                 X    t        j                  |t        | j                  dd            S r  r	  rh   s     r2   rm   zPowerTransform.inverse_shape~  r  r3   rn   ro   )re   rp   rq   rr   r   r   r$   r%   rs   r   rv   r/   rI   r	   rD   rO   rS   rZ   rc   rj   rm   rx   ry   s   @r2   r   r   W  s     !!F##HI3 3S 3 3D
 $c $ $=
$(3RRr3   r   c                     t        j                  | j                        }t        j                  t        j                  |       |j
                  d|j                  z
        S N      ?minr   )r   finfodtypeclampsigmoidtinyeps)rT   r  s     r2   _clipped_sigmoidr    s<    KK E;;u}}Q'UZZS599_MMr3   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 rK   )r   r   rM   s     r2   rO   zSigmoidTransform.__eq__      %!122r3   c                     t        |      S rK   )r  r]   s     r2   rS   zSigmoidTransform._call  s    ""r3   c                     t        j                  |j                        }|j                  |j                  d|j
                  z
        }|j                         | j                         z
  S r  )r   r  r  r  r  r  r   log1p)r0   rW   r  s      r2   rZ   zSigmoidTransform._inverse  sK    AGG$GG

eiiG8uuw1"%%r3   c                 \    t        j                  |        t        j                  |      z
  S rK   )Fr   rb   s      r2   rc   z%SigmoidTransform.log_abs_det_jacobian  s!    

A2A..r3   N)re   rp   rq   rr   r   r   r$   unit_intervalr%   rs   rD   rO   rS   rZ   rc   rL   r3   r2   r   r     s=     F((HID3#&
/r3   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 rK   )r   r   rM   s     r2   rO   zSoftplusTransform.__eq__  s    %!233r3   c                     t        |      S rK   r   r]   s     r2   rS   zSoftplusTransform._call  s    {r3   c                 b    | j                         j                         j                         |z   S rK   )expm1negr   r`   s     r2   rZ   zSoftplusTransform._inverse  s'    zz|!%%'!++r3   c                     t        |        S rK   r&  rb   s      r2   rc   z&SoftplusTransform.log_abs_det_jacobian  s    !}r3   Nr   rL   r3   r2   r   r     s=    
 F##HID4,r3   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 rK   )r   r   rM   s     r2   rO   zTanhTransform.__eq__  s    %//r3   c                 "    |j                         S rK   )tanhr]   s     r2   rS   zTanhTransform._call  s    vvxr3   c                 ,    t        j                  |      S rK   )r   atanhr`   s     r2   rZ   zTanhTransform._inverse  s     {{1~r3   c                 V    dt        j                  d      |z
  t        d|z        z
  z  S )N       @g       )mathr   r   rb   s      r2   rc   z"TanhTransform.log_abs_det_jacobian  s*     dhhsma'(4!8*<<==r3   N)re   rp   rq   rr   r   r   r$   intervalr%   rs   rD   rO   rS   rZ   rc   rL   r3   r2   r   r     sF    , F#{##D#.HID0
>r3   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 rK   )r   r   rM   s     r2   rO   zAbsTransform.__eq__  r   r3   c                 "    |j                         S rK   )r  r]   s     r2   rS   zAbsTransform._call  r   r3   c                     |S rK   rL   r`   s     r2   rZ   zAbsTransform._inverse  r   r3   N)re   rp   rq   rr   r   r   r$   r   r%   rO   rS   rZ   rL   r3   r2   r   r     s*    5F##H/r3   r   c                       e Zd ZdZdZ	 	 ddeez  deez  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z  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}   )r.   r/   r:  r;  
_event_dim)r0   r:  r;  r:   r&   r1   s        r2   r/   zAffineTransform.__init__  s*     	J/
#r3   c                     | j                   S rK   )r=  r;   s    r2   r:   zAffineTransform.event_dim  s    r3   Fr~   c                     | j                   dk(  rt        j                  S t        j                  t        j                  | j                         S Nr   r:   r   r   r   r;   s    r2   r$   zAffineTransform.domain  9     >>Q###&&{'7'7HHr3   c                     | j                   dk(  rt        j                  S t        j                  t        j                  | j                         S r@  rA  r;   s    r2   r%   zAffineTransform.codomain  rB  r3   c                 ~    | j                   |k(  r| S t        | j                  | j                  | j                  |      S r}   )r*   r   r:  r;  r:   rH   s     r2   rI   zAffineTransform.with_cache!  s7    z)KHHdjj$..Z
 	
r3   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   r:  r   r   r   r;  rM   s     r2   rO   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;r3   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   r;  r   floatrD   r;   s    r2   rD   zAffineTransform.sign<  sR    djj'*djj)A-1Utzz9JQ9N2UTUUzz  r3   c                 :    | j                   | j                  |z  z   S rK   r:  r;  r]   s     r2   rS   zAffineTransform._callB  s    xx$**q.((r3   c                 :    || j                   z
  | j                  z  S rK   rI  r`   s     r2   rZ   zAffineTransform._inverseE  s    DHH

**r3   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   )ri   r;  r   r   r   	full_liker3  r   r  r:   sizeviewsumexpand)r0   rT   rW   ri   r;  r   result_sizes          r2   rc   z$AffineTransform.log_abs_det_jacobianH  s    

eW%__QU(<=FYYu%))+F>> ++-(94>>/:UBK[[-11"5F+T^^O,E}}U##r3   c           	          t        j                  |t        | j                  dd      t        | j                  dd            S r  r   r
  r  r:  r;  rh   s     r2   rj   zAffineTransform.forward_shapeU  7    %%7488Wb174::wPR3S
 	
r3   c           	          t        j                  |t        | j                  dd      t        | j                  dd            S r  rS  rh   s     r2   rm   zAffineTransform.inverse_shapeZ  rT  r3   r   r   ro   )re   rp   rq   rr   rs   r   rG  rv   r/   rw   r:   r   r   r$   r%   rI   rO   rD   rS   rZ   rc   rj   rm   rx   ry   s   @r2   r   r     s    	 I 
$e^
$ ~
$ 	
$
 
$ 

$ 3   $[##6I 7I
 $[##6I 7I

( !fsl ! !
)+$


r3   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 unconstrained 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eyeri   r\  r   )r0   rT   r  rzz1m_cumprod_sqrtrW   s          r2   rS   zCorrCholeskyTransform._callu  s    JJqMkk!''"&&GGSa#gG.qr* qDE<<>11"5		!''"+QWWQXXFF$S#2#X.Aa@@r3   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]  rY  r[  )r   cumsumr   r
   r_  r  r)  )r0   rW   y_cumsumy_cumsum_shiftedy_vecy_cumsum_vectrT   s           r2   rZ   zCorrCholeskyTransform._inverse  s     u||AEr22xSbS1Aq6C"12.)*:D\''))WWY(A-r3   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   rf  rY        ?r2  )rg  r
   r   rO  r   r3  )r0   rT   rW   intermediates
y1m_cumsumy1m_cumsum_trilstick_breaking_logdettanh_logdets           r2   rc   z*CorrCholeskyTransform.log_abs_det_jacobian  s     !a%B//
 -ZbA #&;&;&=&A&A"&E EAa 00488C=@EE"EMM${22r3   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      ?r[  ro  z.Input is not a flattened lower-diagonal number)r   r-   round)r0   ri   NDs       r2   rj   z#CorrCholeskyTransform.forward_shape  st    u:>:;;"I4!a%<C'#-.A;!q MNNSbzQF""r3   c                     t        |      dk  rt        d      |d   |d   k7  rt        d      |d   }||dz
  z  dz  }|d d |fz   S )Nr[  r   rn  r   zInput is not squarer)   r   r-   )r0   ri   rx  rw  s       r2   rm   z#CorrCholeskyTransform.inverse_shape  sc    u:>:;;9b	!233"IQK1SbzQD  r3   rK   )re   rp   rq   rr   r   real_vectorr$   corr_choleskyr%   rs   rS   rZ   rc   rj   rm   rL   r3   r2   r   r   `  s=      $$F((HI
3#!r3   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 rK   )r   r   rM   s     r2   rO   zSoftmaxTransform.__eq__  r  r3   c                 |    |}||j                  dd      d   z
  j                         }||j                  dd      z  S )Nr   Tr   )r   r   rO  )r0   rT   logprobsprobss       r2   rS   zSoftmaxTransform._call  s@    HLLT2155::<uyyT***r3   c                 &    |}|j                         S rK   r   )r0   rW   r  s      r2   rZ   zSoftmaxTransform._inverse  s    yy{r3   c                 8    t        |      dk  rt        d      |S Nr)   r   rz  rh   s     r2   rj   zSoftmaxTransform.forward_shape      u:>:;;r3   c                 8    t        |      dk  rt        d      |S r  rz  rh   s     r2   rm   zSoftmaxTransform.inverse_shape  r  r3   N)re   rp   rq   rr   r   r{  r$   simplexr%   rO   rS   rZ   rj   rm   rL   r3   r2   r   r     s8     $$F""H3+

r3   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 rK   )r   r    rM   s     r2   rO   zStickBreakingTransform.__eq__      %!788r3   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]  )ri   new_onesrg  r  r   r`  r   )r0   rT   offsetrc  	z_cumprodrW   s         r2   rS   zStickBreakingTransform._call  s    q1::aggbk#:#A#A"#EEQ-.UOOB'	Aq6#c)aV1&EEr3   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  )	ri   r  rg  r   r  r  r  r  r   )r0   rW   y_cropr  sfrT   s         r2   rZ   zStickBreakingTransform._inverse  s    38qzz&,,r*:;BB2FFr"" [[QWW!5!:!:;JJL2668#fjjl2r3   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)   .)ri   r  rg  r   r!  
logsigmoidrO  )r0   rT   rW   r  detJs        r2   rc   z+StickBreakingTransform.log_abs_det_jacobian  s    q1::aggbk#:#A#A"#EE

Q\\!_$qcrc{'88==bAr3   c                 R    t        |      dk  rt        d      |d d |d   dz   fz   S Nr)   r   r   rz  rh   s     r2   rj   z$StickBreakingTransform.forward_shape  5    u:>:;;SbzU2Y],,,r3   c                 R    t        |      dk  rt        d      |d d |d   dz
  fz   S r  rz  rh   s     r2   rm   z$StickBreakingTransform.inverse_shape	  r  r3   N)re   rp   rq   rr   r   r{  r$   r  r%   rs   rO   rS   rZ   rc   rj   rm   rL   r3   r2   r    r      sB     $$F""HI9-
-r3   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.
    r[  c                 "    t        |t              S rK   )r   r   rM   s     r2   rO   zLowerCholeskyTransform.__eq__  r  r3   c                     |j                  d      |j                  dd      j                         j                         z   S Nr   rn  )dim1dim2)trildiagonalr   
diag_embedr]   s     r2   rS   zLowerCholeskyTransform._call  4    vvbzAJJBRJ8<<>IIKKKr3   c                     |j                  d      |j                  dd      j                         j                         z   S r  )r  r  r   r  r`   s     r2   rZ   zLowerCholeskyTransform._inverse!  r  r3   N)re   rp   rq   rr   r   r   r   r$   lower_choleskyr%   rO   rS   rZ   rL   r3   r2   r   r     s?     %[$$[%5%5q9F))H9LLr3   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.
    r[  c                 "    t        |t              S rK   )r   r   rM   s     r2   rO   z PositiveDefiniteTransform.__eq__-  s    %!:;;r3   c                 @     t               |      }||j                  z  S rK   )r   mTr]   s     r2   rS   zPositiveDefiniteTransform._call0  s    $"$Q'144xr3   c                 r    t         j                  j                  |      }t               j	                  |      S rK   )r   linalgcholeskyr   r@   r`   s     r2   rZ   z"PositiveDefiniteTransform._inverse4  s*    LL!!!$%'++A..r3   N)re   rp   rq   rr   r   r   r   r$   positive_definiter%   rO   rS   rZ   rL   r3   r2   r   r   %  s=     %[$$[%5%5q9F,,H</r3   r   c                       e Zd ZU dZee   ed<   	 	 	 ddee   dedee   dz  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                    t        d |D              st        d      |r|D cg c]  }|j                  |       }}t        |   |       t        |      | _        |dgt        | j                        z  }t        |      | _        t        | j                        t        | j                        k7  r8t        dt        | j                         dt        | j                         d      || _	        y c c}w )Nc              3   <   K   | ]  }t        |t                y wrK   r   r!   r   rl  s     r2   r   z(CatTransform.__init__.<locals>.<genexpr>Q       ::a+:   0All elements of tseq must be Transform instancesrF   r)   z	lengths (z) must match transforms (r   )
r   r   rI   r.   r/   r   r  r   r  r   )r0   r  r   r  r&   rl  r1   s         r2   r/   zCatTransform.__init__J  s     :T:: !STT6:;ALL,;D;J/t*?cC00GG}t||DOO 44 C-..GDOOH\G]]^_   <s   C5c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrK   )r:   r  s     r2   r   z)CatTransform.event_dim.<locals>.<genexpr>b       811;;8r   )r   r  r;   s    r2   r:   zCatTransform.event_dim`      8888r3   c                 ,    t        | j                        S rK   )rO  r  r;   s    r2   lengthzCatTransform.lengthd  s    4<<  r3   c                 |    | j                   |k(  r| S t        | j                  | j                  | j                  |      S rK   )r*   r   r  r   r  rH   s     r2   rI   zCatTransform.with_cacheh  s2    z)KDOOTXXt||ZPPr3   c                    |j                          | j                   cxk  r|j                         k  s,n t        d| j                    d|j                          d      |j                  | j                         | j                  k7  rAt        d| j                    d|j                  | j                          d| j                         g }d}t	        | j
                  | j                        D ]>  \  }}|j                  | j                   ||      }|j                   ||             ||z   }@ t        j                  || j                         S )	Ndim  out of range for tensor with  dimensionsx.size() =  must equal length r   rf  )r   r   rM  r  r   r  r  narrowr   r   cat)r0   rT   yslicesstarttransr  xslices          r2   rS   zCatTransform._callm  s   DHH.quuw. txxj >quuwi{S  66$((t{{* $((4txx(8'99LT[[MZ   $,,? 	#ME6XXdhhv6FNN5=)FNE	# yydhh//r3   c                    |j                          | j                   cxk  r|j                         k  s,n t        d| j                    d|j                          d      |j                  | j                         | j                  k7  rAt        d| j                    d|j                  | j                          d| j                         g }d}t	        | j
                  | j                        D ]G  \  }}|j                  | j                   ||      }|j                  |j                  |             ||z   }I t        j                  || j                         S )	Nr  r  r  y.size(r  r  r   rf  )r   r   rM  r  r   r  r  r  r   r@   r   r  )r0   rW   xslicesr  r  r  yslices          r2   rZ   zCatTransform._inverse~  s   DHH.quuw. txxj >quuwi{S  66$((t{{* $((4txx(8'99LT[[MZ   $,,? 	#ME6XXdhhv6FNN599V,-FNE	# yydhh//r3   c                 f   |j                          | j                   cxk  r|j                         k  s,n t        d| j                    d|j                          d      |j                  | j                         | j                  k7  rAt        d| j                    d|j                  | j                          d| j                         |j                          | j                   cxk  r|j                         k  s,n t        d| j                    d|j                          d      |j                  | j                         | j                  k7  rAt        d| j                    d|j                  | j                          d| 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 )Nr   out of range for x with r  r  r  r   out of range for y with r  r   rf  )r   r   rM  r  r   r  r  r  rc   r:   r   r   r   r  rO  )r0   rT   rW   
logdetjacsr  r  r  r  r  	logdetjacr   s              r2   rc   z!CatTransform.log_abs_det_jacobian  s=   DHH.quuw. txxj 9!%%'+N  66$((t{{* $((4txx(8'99LT[[MZ  DHH.quuw. txxj 9!%%'+N  66$((t{{* $((4txx(8'99LT[[MZ  
 $,,? 	#ME6XXdhhv6FXXdhhv6F2266BI/*9dnnu6VW	i(FNE	# hh!8-CDNN"799ZS11z?"r3   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrK   r   r  s     r2   r   z)CatTransform.bijective.<locals>.<genexpr>  r  r   r   r  r;   s    r2   rs   zCatTransform.bijective  r  r3   c                     t        j                  | j                  D cg c]  }|j                   c}| j                  | j
                        S c c}w rK   )r   r  r  r$   r   r  r0   rl  s     r2   r$   zCatTransform.domain  s:     #/!QXX/4<<
 	
/   Ac                     t        j                  | j                  D cg c]  }|j                   c}| j                  | j
                        S c c}w rK   )r   r  r  r%   r   r  r  s     r2   r%   zCatTransform.codomain  s:     !%1AQZZ1488T\\
 	
1r  )r   Nr   ro   )re   rp   rq   rr   r   r!   ru   r   rv   r/   r	   r:   r  rI   rS   rZ   rc   rw   r   rs   r   r   r$   r%   rx   ry   s   @r2   r   r   9  s     Y
 (,y!  #%	
  
, 93 9 9 ! ! !Q
0"0"##J 94 9 9 ##
 $

 ##
 $
r3   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t        d      |r|D cg c]  }|j                  |       }}t        |   |       t        |      | _        || _        y c c}w )Nc              3   <   K   | ]  }t        |t                y wrK   r  r  s     r2   r   z*StackTransform.__init__.<locals>.<genexpr>  r  r  r  rF   )r   r   rI   r.   r/   r   r  r   )r0   r  r   r&   rl  r1   s        r2   r/   zStackTransform.__init__  se     :T:: !STT6:;ALL,;D;J/t* <s   A'c                 f    | j                   |k(  r| S t        | j                  | j                  |      S rK   )r*   r   r  r   rH   s     r2   rI   zStackTransform.with_cache  s,    z)KdootxxDDr3   c                     t        |j                  | j                              D cg c]  }|j                  | j                  |        c}S c c}w rK   )rangerM  r   select)r0   rc  is      r2   _slicezStackTransform._slice  s7    /4QVVDHH5E/FG!1%GGGs   #Ac           
         |j                          | j                   cxk  r|j                         k  s,n t        d| j                    d|j                          d      |j                  | j                         t        | j                        k7  rJt        d| j                    d|j                  | j                          dt        | j                               g }t        | j                  |      | j                        D ]  \  }}|j                   ||              t        j                  || j                         S )Nr  r  r  r  r   must equal len(transforms) rf  )
r   r   rM  r   r  r   r  r   r   stack)r0   rT   r  r  r  s        r2   rS   zStackTransform._call  s   DHH.quuw. txxj >quuwi{S  66$((s4??33 $((4txx(8'99UVYZ^ZiZiVjUkl   QA 	*MFENN5=)	*{{711r3   c           
         |j                          | j                   cxk  r|j                         k  s,n t        d| j                    d|j                          d      |j                  | j                         t        | j                        k7  rJt        d| j                    d|j                  | j                          dt        | j                               g }t        | j                  |      | j                        D ]%  \  }}|j                  |j                  |             ' t        j                  || j                         S )Nr  r  r  r  r  r  rf  )r   r   rM  r   r  r   r  r   r@   r   r  )r0   rW   r  r  r  s        r2   rZ   zStackTransform._inverse  s   DHH.quuw. txxj >quuwi{S  66$((s4??33 $((4txx(8'99UVYZ^ZiZiVjUkl   QA 	.MFENN599V,-	.{{711r3   c           
      r   |j                          | j                   cxk  r|j                         k  s,n t        d| j                    d|j                          d      |j                  | j                         t        | j                        k7  rJt        d| j                    d|j                  | j                          dt        | j                               |j                          | j                   cxk  r|j                         k  s,n t        d| j                    d|j                          d      |j                  | j                         t        | j                        k7  rJt        d| j                    d|j                  | j                          dt        | j                               g }| j                  |      }| j                  |      }t        ||| j                        D ]'  \  }}}|j                  |j                  ||             ) t        j                  || j                   	      S )
Nr  r  r  r  r  r  r  r  rf  )r   r   rM  r   r  r  r   r   rc   r   r  )	r0   rT   rW   r  r  r  r  r  r  s	            r2   rc   z#StackTransform.log_abs_det_jacobian  s   DHH.quuw. txxj 9!%%'+N  66$((s4??33 $((4txx(8'99UVYZ^ZiZiVjUkl  DHH.quuw. txxj 9!%%'+N  66$((s4??33 $((4txx(8'99UVYZ^ZiZiVjUkl  
++a.++a.%('4??%K 	J!FFEe88HI	J{{:48844r3   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wrK   r   r  s     r2   r   z+StackTransform.bijective.<locals>.<genexpr>  r  r   r  r;   s    r2   rs   zStackTransform.bijective  r  r3   c                     t        j                  | j                  D cg c]  }|j                   c}| j                        S c c}w rK   )r   r  r  r$   r   r  s     r2   r$   zStackTransform.domain!  s1       DOO!Dq!((!DdhhOO!D   Ac                     t        j                  | j                  D cg c]  }|j                   c}| j                        S c c}w rK   )r   r  r  r%   r   r  s     r2   r%   zStackTransform.codomain&  s1       doo!F!**!FQQ!Fr  rV  ro   )re   rp   rq   rr   r   r!   ru   r   rv   r/   rI   r  rS   rZ   rc   rw   r   rs   r   r   r$   r%   rx   ry   s   @r2   r   r     s    
 Y JK	Y'	.1	CF			E
H2250 94 9 9 ##P $P ##R $Rr3   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j                  dz  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}   )r.   r/   r  )r0   r  r&   r1   s      r2   r/   z(CumulativeDistributionTransform.__init__C  s    J/(r3   c                 .    | j                   j                  S rK   )r  supportr;   s    r2   r$   z&CumulativeDistributionTransform.domainG  s      (((r3   c                 8    | j                   j                  |      S rK   )r  cdfr]   s     r2   rS   z%CumulativeDistributionTransform._callK  s      $$Q''r3   c                 8    | j                   j                  |      S rK   )r  icdfr`   s     r2   rZ   z(CumulativeDistributionTransform._inverseN  s      %%a((r3   c                 8    | j                   j                  |      S rK   )r  log_probrb   s      r2   rc   z4CumulativeDistributionTransform.log_abs_det_jacobianQ  s      ))!,,r3   c                 R    | j                   |k(  r| S t        | j                  |      S r}   )r*   r   r  rH   s     r2   rI   z*CumulativeDistributionTransform.with_cacheT  s(    z)K.t/@/@ZXXr3   rn   ro   )re   rp   rq   rr   rs   r   r"  r%   rD   r   rv   r/   rw   rt   r$   rS   rZ   rc   rI   rx   ry   s   @r2   r   r   ,  st    $ I((HD)\ )s )4 ) )..5 ) )()-Yr3   r   )1r   r3  r   r>   collections.abcr   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   rL   r3   r2   <module>r     sg       $     + 9  . 0f fRE.	 E.Py D &b) K89 K8\I+y I+X9 .(RY (RVN
/y /2	 0*>I *>Z9  h
i h
VP!I P!f!y !H5-Y 5-pLY L,/	 /(K
9 K
\bRY bRJ+Yi +Yr3   