
    Vh                     d    d dl Z d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 dgZ
 G d de      Zy)	    N)Tensor)constraints)Distribution)_sum_rightmost)_sizeIndependentc                   l    e Zd ZU dZi Zeeej                  f   e	d<   	 d fd	Z
d fd	Zedefd       Zedefd       Zej                   d        Zedefd	       Zedefd
       Zedefd       Z ej.                         fdefdZ ej.                         fdedefdZd Zd ZddZd Z xZS )r   a  
    Reinterprets some of the batch dims of a distribution as event dims.

    This is mainly useful for changing the shape of the result of
    :meth:`log_prob`. For example to create a diagonal Normal distribution with
    the same shape as a Multivariate Normal distribution (so they are
    interchangeable), you can::

        >>> from torch.distributions.multivariate_normal import MultivariateNormal
        >>> from torch.distributions.normal import Normal
        >>> loc = torch.zeros(3)
        >>> scale = torch.ones(3)
        >>> mvn = MultivariateNormal(loc, scale_tril=torch.diag(scale))
        >>> [mvn.batch_shape, mvn.event_shape]
        [torch.Size([]), torch.Size([3])]
        >>> normal = Normal(loc, scale)
        >>> [normal.batch_shape, normal.event_shape]
        [torch.Size([3]), torch.Size([])]
        >>> diagn = Independent(normal, 1)
        >>> [diagn.batch_shape, diagn.event_shape]
        [torch.Size([]), torch.Size([3])]

    Args:
        base_distribution (torch.distributions.distribution.Distribution): a
            base distribution
        reinterpreted_batch_ndims (int): the number of batch dims to
            reinterpret as event dims
    arg_constraintsc                 d   |t        |j                        kD  r$t        d| dt        |j                               |j                  |j                  z   }|t        |j                        z   }|d t        |      |z
   }|t        |      |z
  d  }|| _        || _        t        |   |||       y )NzQExpected reinterpreted_batch_ndims <= len(base_distribution.batch_shape), actual z vs validate_args)lenbatch_shape
ValueErrorevent_shape	base_distreinterpreted_batch_ndimssuper__init__)	selfbase_distributionr   r   shape	event_dimr   r   	__class__s	           O/home/dcms/DCMS/lib/python3.12/site-packages/torch/distributions/independent.pyr   zIndependent.__init__.   s     %s+<+H+H'II34D=N=Z=Z9[8\^  "--0A0M0MM-4E4Q4Q0RR	4c%j945CJ245*)B&kO    c                 V   | j                  t        |      }t        j                  |      }| j                  j                  || j                  d | j                   z         |_        | j                  |_        t        t        |'  || j                  d       | j                  |_
        |S )NFr   )_get_checked_instancer   torchSizer   expandr   r   r   r   _validate_args)r   r   	_instancenewr   s       r   r!   zIndependent.expand>   s    ((i@jj---$**+KT-K-KLL
 )-(F(F%k3()) 	) 	
 "00
r   returnc                 .    | j                   j                  S N)r   has_rsampler   s    r   r(   zIndependent.has_rsampleK   s    ~~)))r   c                 N    | j                   dkD  ry| j                  j                  S )Nr   F)r   r   has_enumerate_supportr)   s    r   r+   z!Independent.has_enumerate_supportO   s#    ))A-~~333r   c                     | j                   j                  }| j                  r t        j                  || j                        }|S r'   )r   supportr   r   independent)r   results     r   r-   zIndependent.supportU   s7    '')) ,,VT5S5STFr   c                 .    | j                   j                  S r'   )r   meanr)   s    r   r1   zIndependent.mean\       ~~"""r   c                 .    | j                   j                  S r'   )r   moder)   s    r   r4   zIndependent.mode`   r2   r   c                 .    | j                   j                  S r'   )r   variancer)   s    r   r6   zIndependent.varianced   s    ~~&&&r   c                 8    | j                   j                  |      S r'   )r   sampler   sample_shapes     r   r8   zIndependent.sampleh   s    ~~$$\22r   r:   c                 8    | j                   j                  |      S r'   )r   rsampler9   s     r   r<   zIndependent.rsamplek   s    ~~%%l33r   c                 d    | j                   j                  |      }t        || j                        S r'   )r   log_probr   r   )r   valuer>   s      r   r>   zIndependent.log_probn   s)    >>**51h(F(FGGr   c                 b    | j                   j                         }t        || j                        S r'   )r   entropyr   r   )r   rA   s     r   rA   zIndependent.entropyr   s'    ..((*gt'E'EFFr   c                 n    | j                   dkD  rt        d      | j                  j                  |      S )Nr   z5Enumeration over cartesian product is not implemented)r!   )r   NotImplementedErrorr   enumerate_support)r   r!   s     r   rD   zIndependent.enumerate_supportv   s:    ))A-%G  ~~//v/>>r   c                 j    | j                   j                  d| j                   d| j                   dz   S )N(z, ))r   __name__r   r   r)   s    r   __repr__zIndependent.__repr__}   s8    NN##$..!D$B$B#C1EF	
r   r'   )T) rH   
__module____qualname____doc__r
   dictstrr   
Constraint__annotations__r   r!   propertyboolr(   r+   dependent_propertyr-   r   r1   r4   r6   r   r    r8   r   r<   r>   rA   rD   rI   __classcell__)r   s   @r   r   r      s&   : :<OT#{5556; KOP  *T * * 4t 4 4
 ## $ #f # # #f # # '& ' ' #-%**, 36 3 -7EJJL 4E 4V 4HG?
r   )r   r   torch.distributionsr    torch.distributions.distributionr   torch.distributions.utilsr   torch.typesr   __all__r    r   r   <module>r[      s0      + 9 4  /s
, s
r   