
    rh!                     h    d dl mZ 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)	    )OptionalN)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e   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j8                         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              z/var/www/html/ai-insurance-compliance-backend/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,   r2   zMixtureSameFamily.expandm   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,   r9   zMixtureSameFamily.support~   s    *4+G+G+O+OPPr-   c                     | j                   S r8   )r   r:   s    r,   r   z&MixtureSameFamily.mixture_distribution   s    )))r-   c                     | j                   S r8   )r   r:   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$   rB   s     r,   rD   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       @)rA   r   rB   r/   rC   r   variancer!   rD   _padpow)r$   rB   mean_cond_varvar_cond_means       r,   rF   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>   )rG   r   cdfr   rB   r/   rC   )r$   xcdf_xmix_probs       r,   rL   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>   )
r3   _validate_samplerG   r   log_probr/   log_softmaxr   r   	logsumexp)r$   rM   
log_prob_xlog_mix_probs       r,   rR   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   reshaper0   repeatgathersqueeze)r$   sample_shape
sample_len	batch_len
gather_dimes
mix_sample	mix_shapecomp_samplesmix_sample_rsampless              r,   rY   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$   rM   s     r,   rG   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   rZ   r/   r0   r!   )r$   rM   dist_batch_ndimscat_batch_ndims	pad_ndimsxss         r,   rA   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-   r8   )"__name__
__module____qualname____doc__r   dictstrr   
Constraint__annotations__has_rsampler   r   r   boolr#   r2   dependent_propertyr9   propertyr   r   r   rD   rF   rL   rR   r/   r0   rY   rG   rA   rq   __classcell__)r+   s   @r,   r	   r	      s   (T :<OT#{5556;K )-	/
)/
 !-/
  ~	/

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