
    9j"                     \    d dl Z d dl mZ d dlmZmZ d dlmZ d dlmZ dgZ	 G d de      Z
y)    N)Tensor)Categoricalconstraints)MixtureSameFamilyConstraint)DistributionMixtureSameFamilyc            	       >    e Zd ZU dZi Zeeej                  f   e	d<   dZ
	 ddedededz  ddf fd	Zd 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defd       Zd Zd Z ej6                         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_constraintsFNmixture_distributioncomponent_distributionvalidate_argsreturnc                    || _         || _        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_shaper   )_mixture_distribution_component_distribution
isinstancer   
ValueErrorr   r   zipreversedlogitsshape_num_componentr   len_event_ndimssuper__init__)selfr   r   r   mdbscdbssize1size2kmkcr   	__class__s              g/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/distributions/mixture_same_family.pyr"   zMixtureSameFamily.__init__;   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+   r1   zMixtureSameFamily.expando   s    jj-&$*=*=)??(():IF&*&B&B&I&I'
# %)$>$>$E$Ek$R!!00,,11==.#E 	/ 	
 "00
r,   c                 @    t        | j                  j                        S N)r   r   supportr#   s    r+   r8   zMixtureSameFamily.support   s     +4+G+G+O+OPPr,   c                     | j                   S r7   )r   r9   s    r+   r   z&MixtureSameFamily.mixture_distribution   s    )))r,   c                     | j                   S r7   )r   r9   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#   rA   s     r+   rC   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   rA   r.   rB   r   variancer    rC   _padpow)r#   rA   mean_cond_varvar_cond_means       r+   rE   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=   )rF   r   cdfr   rA   r.   rB   )r#   xcdf_xmix_probs       r+   rK   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=   )
r2   _validate_samplerF   r   log_probr.   log_softmaxr   r   	logsumexp)r#   rL   
log_prob_xlog_mix_probs       r+   rQ   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+   rX   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#   rL   s     r+   rF   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   rY   r.   r/   r    )r#   rL   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,   r7   )!__name__
__module____qualname____doc__r
   dictstrr   
Constraint__annotations__has_rsampler   r   boolr"   r1   dependent_propertyr8   propertyr   r   r   rC   rE   rK   rQ   r.   r/   rX   rF   r@   rp   __classcell__)r*   s   @r+   r   r      s   (T :<OT#{5556;K &*	2
)2
 !-2
 d{	2

 
2
h" ##Q $Q *k * * , , , 
f 
 
 
-& 
- 
-3B #-%**, /23=r,   )r.   r   torch.distributionsr   r   torch.distributions.constraintsr    torch.distributions.distributionr   __all__r    r,   r+   <module>r      s.      8 G 9 
R= R=r,   