
    קg)!                     X    d dl mZ d dlZd dlmZmZ d dlmZ dgZ G d de          Z	dS )    )DictN)Categoricalconstraints)DistributionMixtureSameFamilyc                       e Zd ZU dZi Zeeej        f         e	d<   dZ
	 d fd	Zd fd	Zej        d             Zed             Zed	             Zed
             Zed             Zd Zd Z ej                    fdZd Zd Zd Z xZS )r   a  
    The `MixtureSameFamily` distribution implements a (batch of) mixture
    distribution where all component are from different parameterizations of
    the same distribution type. It is parameterized by a `Categorical`
    "selecting distribution" (over `k` component) and a component
    distribution, i.e., a `Distribution` with a rightmost batch shape
    (equal to `[k]`) which indexes each (batch of) component.

    Examples::

        >>> # xdoctest: +SKIP("undefined vars")
        >>> # Construct Gaussian Mixture Model in 1D consisting of 5 equally
        >>> # weighted normal distributions
        >>> mix = D.Categorical(torch.ones(5,))
        >>> comp = D.Normal(torch.randn(5,), torch.rand(5,))
        >>> gmm = MixtureSameFamily(mix, comp)

        >>> # Construct Gaussian Mixture Model in 2D consisting of 5 equally
        >>> # weighted bivariate normal distributions
        >>> mix = D.Categorical(torch.ones(5,))
        >>> comp = D.Independent(D.Normal(
        ...          torch.randn(5,2), torch.rand(5,2)), 1)
        >>> gmm = MixtureSameFamily(mix, comp)

        >>> # Construct a batch of 3 Gaussian Mixture Models in 2D each
        >>> # consisting of 5 random weighted bivariate normal distributions
        >>> mix = D.Categorical(torch.rand(3,5))
        >>> comp = D.Independent(D.Normal(
        ...         torch.randn(3,5,2), torch.rand(3,5,2)), 1)
        >>> gmm = MixtureSameFamily(mix, comp)

    Args:
        mixture_distribution: `torch.distributions.Categorical`-like
            instance. Manages the probability of selecting component.
            The number of categories must match the rightmost batch
            dimension of the `component_distribution`. Must have either
            scalar `batch_shape` or `batch_shape` matching
            `component_distribution.batch_shape[:-1]`
        component_distribution: `torch.distributions.Distribution`-like
            instance. Right-most batch dimension indexes component.
    arg_constraintsFNc                    || _         || _        t          | j         t                    st	          d          t          | j        t
                    st	          d          | j         j        }| j        j        d d         }t          t          |          t          |                    D ]-\  }}|dk    r"|dk    r||k    rt	          d| d| d          .| j         j	        j
        d         }| j        j        d         }	||	||	k    rt	          d| d	|	 d          || _        | j        j        }
t          |
          | _        t                                          ||
|
           d S )NzU The Mixture distribution needs to be an  instance of torch.distributions.CategoricalzUThe Component distribution need to be an instance of torch.distributions.Distribution   z$`mixture_distribution.batch_shape` (z>) is not compatible with `component_distribution.batch_shape`()z"`mixture_distribution component` (z;) does not equal `component_distribution.batch_shape[-1]` (batch_shapeevent_shapevalidate_args)_mixture_distribution_component_distribution
isinstancer   
ValueErrorr   r   zipreversedlogitsshape_num_componentr   len_event_ndimssuper__init__)selfmixture_distributioncomponent_distributionr   mdbscdbssize1size2kmkcr   	__class__s              c/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/distributions/mixture_same_family.pyr   zMixtureSameFamily.__init__9   s    &:"'=$$4kBB 	?  
 $6EE 	?   )5+7<?? 	 	LE5zzeqjjUe^^ ,4 , ,$(, , ,   '.4R8)5b9>bnrR      
 !2>,,+] 	 	
 	
 	
 	
 	
    c                    t          j        |          }|| j        fz   }|                     t          |          }| j                            |          |_        | j                            |          |_        | j        |_        | j        |_        |j        j	        }t          t          |                              ||d           | j        |_        |S )NFr   )torchSizer   _get_checked_instancer   r   expandr   r   r   r   r   _validate_args)r   r   	_instancebatch_shape_compnewr   r(   s         r)   r/   zMixtureSameFamily.expandg   s    j--&$*=)??(():IFF&*&B&I&I'
 '
# %)$>$E$Ek$R$R!!0,1=%%..#E 	/ 	
 	
 	
 "0
r*   c                     | j         j        S N)r   supportr   s    r)   r6   zMixtureSameFamily.supportx   s     +33r*   c                     | j         S r5   )r   r7   s    r)   r    z&MixtureSameFamily.mixture_distribution~   s    ))r*   c                     | j         S r5   )r   r7   s    r)   r!   z(MixtureSameFamily.component_distribution   s    ++r*   c                     |                      | j        j                  }t          j        || j        j        z  d| j        z
            S Nr   dim)_pad_mixture_dimensionsr    probsr,   sumr!   meanr   )r   r?   s     r)   rA   zMixtureSameFamily.mean   sL    ,,T-F-LMMyD/44"t?P:P
 
 
 	
r*   c                 R   |                      | j        j                  }t          j        || j        j        z  d| j        z
            }t          j        || j        j        | 	                    | j                  z
  
                    d          z  d| j        z
            }||z   S )Nr   r<   g       @)r>   r    r?   r,   r@   r!   variancer   rA   _padpow)r   r?   mean_cond_varvar_cond_means       r)   rC   zMixtureSameFamily.variance   s     ,,T-F-LMM	D/88b4CT>T
 
 
 	T05		$)8L8LLQQRUVVVT&&
 
 
 },,r*   c                     |                      |          }| j                            |          }| j        j        }t          j        ||z  d          S r;   )rD   r!   cdfr    r?   r,   r@   )r   xcdf_xmix_probs       r)   rI   zMixtureSameFamily.cdf   sL    IIaLL+//22,2y)r2222r*   c                 
   | j         r|                     |           |                     |          }| j                            |          }t          j        | j        j        d          }t          j	        ||z   d          S r;   )
r0   _validate_samplerD   r!   log_probr,   log_softmaxr    r   	logsumexp)r   rJ   
log_prob_xlog_mix_probs       r)   rO   zMixtureSameFamily.log_prob   s     	%!!!$$$IIaLL099!<<
(%,"
 
 
 zL8bAAAAr*   c           
         t          j                    5  t          |          }t          | j                  }||z   }| j        }| j                            |          }|j        }| j                            |          }|	                    |t          j
        dgt          |          dz   z            z             }	|	                    t          j
        dgt          |          z            t          j
        dg          z   |z             }	t          j        |||	          }
|
                    |          cd d d            S # 1 swxY w Y   d S )Nr   )r,   no_gradr   r   r   r    sampler   r!   reshaper-   repeatgathersqueeze)r   sample_shape
sample_len	batch_len
gather_dimes
mix_sample	mix_shapecomp_samplesmix_sample_rsampless              r)   rV   zMixtureSameFamily.sample   s|   ]__ 	/ 	/\**JD,--I#i/J!B 299,GGJ"(I  6==lKKL &--EJsc"ggk':;;; L (..
A3Y/005:qc??BRG L l<\JJG??:..-	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   D$EE	E	c                 <    |                     d| j        z
            S )Nr   )	unsqueezer   )r   rJ   s     r)   rD   zMixtureSameFamily._pad   s    {{2 11222r*   c                 F   t          | j                  }t          | j        j                  }|dk    rdn||z
  }|j        }|                    |d d         t          j        |dgz            z   |dd          z   t          j        | j        dgz            z             }|S )Nr   r   r   )r   r   r    r   rW   r,   r-   r   )r   rJ   dist_batch_ndimscat_batch_ndims	pad_ndimsxss         r)   r>   z)MixtureSameFamily._pad_mixture_dimensions   s    t/00d7CDD(A--AA3Co3U	WIIssGjaS))*g j*aS0112
 
 r*   c                 6    d| j          d| j         }d|z   dz   S )Nz
  z,
  zMixtureSameFamily(r   )r    r!   )r   args_strings     r)   __repr__zMixtureSameFamily.__repr__   s2    P4,PP43NPP 	 );6<<r*   r5   )__name__
__module____qualname____doc__r	   r   strr   
Constraint__annotations__has_rsampler   r/   dependent_propertyr6   propertyr    r!   rA   rC   rI   rO   r,   r-   rV   rD   r>   rn   __classcell__)r(   s   @r)   r   r      s        ( (R :<OT#{556;;;K KO,
 ,
 ,
 ,
 ,
 ,
\     " #4 4 $#4
 * * X* , , X, 
 
 X
 
- 
- X
-3 3 3B B B #-%*,, / / / /23 3 3  = = = = = = =r*   )
typingr   r,   torch.distributionsr   r    torch.distributions.distributionr   __all__r    r*   r)   <module>r      s           8 8 8 8 8 8 8 8 9 9 9 9 9 9 
L= L= L= L= L= L= L= L= L= L=r*   