
    sg)!                     P    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	y)    )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_constraintsFc                    || _         || _        t        | j                   t              st	        d      t        | j                  t
              st	        d      | j                   j                  }| j                  j                  d d }t        t        |      t        |            D ](  \  }}|dk7  s|dk7  s||k7  st	        d| d| d       | j                   j                  j                  d   }| j                  j                  d   }	||	||	k7  rt	        d| d	|	 d      || _        | j                  j                  }
t        |
      | _        t        | A  ||
|
       y )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              Z/var/www/html/venv/lib/python3.12/site-packages/torch/distributions/mixture_same_family.pyr   zMixtureSameFamily.__init__9   s    &:"'=$$44kB? 
 $66E?  ))55++77<? 	LE5zeqjUe^ :4& A$$(6, 	 ''..44R8))55b9>bnr4RD 9D 
 !22>>,+] 	 	
    c                    t        j                  |      }|| j                  fz   }| j                  t        |      }| j
                  j                  |      |_        | 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    jj-&$*=*=)??(():IF&*&B&B&I&I'
# %)$>$>$E$Ek$R!!00,,11==.#E 	/ 	
 "00
r*   c                 .    | j                   j                  S N)r   supportr   s    r)   r6   zMixtureSameFamily.supportx   s     ++3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                  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   sP    ,,T-F-F-L-LMyyD//444"t?P?P:P
 	
r*   c                    | j                  | j                  j                        }t        j                  || j
                  j                  z  d| j                  z
        }t        j                  || j
                  j                  | j                  | j                        z
  j                  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-F-L-LM		D//888b4CTCT>T
 		T0055		$))8LLQQRUVVT&&&
 },,r*   c                     | j                  |      }| j                  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    IIaL++//2,,22yy)r22r*   c                    | j                   r| j                  |       | j                  |      }| j                  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   su    !!!$IIaL0099!<
((%%,,"
 zL8bAAr*   c           
         t        j                         5  t        |      }t        | j                        }||z   }| j                  }| j
                  j                  |      }|j                  }| j                  j                  |      }|j                  |t        j                  dgt        |      dz   z        z         }	|	j                  t        j                  dgt        |      z        t        j                  dg      z   |z         }	t        j                  |||	      }
|
j                  |      cd d d        S # 1 sw Y   y xY w)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299,GJ"((I  66==lKL &--EJJsc"gk':;;L (..

A3Y/05::qc?BRGL ll<\JG??:.-	/ 	/ 	/s   DD<<Ec                 >    |j                  d| j                  z
        S )Nr   )	unsqueezer   )r   rJ   s     r)   rD   zMixtureSameFamily._pad   s    {{2 1 1122r*   c                 N   t        | j                        }t        | j                  j                        }|dk(  rdn||z
  }|j                  }|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d77CCD(A-A3Co3U	WWIIsGjjaS)*g jj**aS012
 r*   c                 J    d| j                    d| j                   }d|z   dz   S )Nz
  z,
  zMixtureSameFamily(r   )r    r!   )r   args_strings     r)   __repr__zMixtureSameFamily.__repr__   s7    4,,-U43N3N2O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56;K KO,
\" ##4 $4
 * * , , 
 
 
- 
-3B #-%**, /23=r*   )
typingr   r,   torch.distributionsr   r    torch.distributions.distributionr   __all__r    r*   r)   <module>r      s)      8 9 
L= L=r*   