
    (^i                        d dl mZ d dlmZ d dlmZ d dlZd dlmZ  G d de      Z	 G d d	e      Z
 G d
 de      Zee	e
ef   ZddZddZ G d de      Zy)    )annotations)
NamedTuple)UnionN)
_truncnormc                      e Zd ZU ded<   y) _BatchedCategoricalDistributions
np.ndarrayweightsN__name__
__module____qualname____annotations__     o/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/optuna/samplers/_tpe/probability_distributions.pyr   r      s    r   r   c                  6    e Zd ZU ded<   ded<   ded<   ded<   y)_BatchedTruncNormDistributionsr	   musigmafloatlowhighNr   r   r   r   r   r      s    N	J
Kr   r   c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)	&_BatchedDiscreteTruncNormDistributionsr	   r   r   r   r   r   stepNr   r   r   r   r   r      s    N	J
K
Kr   r   c                   | j                   |j                   k(  rt        | j                         dk(  sJ t        j                  |      }|t        j                  | |   d         }| |   }||   }t        j                  | t
              }d|d<   |dd |dd k7  |dd |dd k7  z  |dd t        j                  |j                  t              }t        j                  |      dz
  ||<   ||   ||   |fS )	z
    This function is a quicker version of:
        np.unique(np.concatenate([a[:, None], b[:, None]], axis=-1), return_inverse=True).
       stable)kinddtypeTr   N)
shapelennpargsort
empty_likeboolemptysizeintcumsum)abordera_orderb_orderis_first_occurrenceinvs          r   _unique_inverse_2dr5   %   s    
 77agg#agg,!"333JJqME"**QuXH56EhGhG--6!&qr{gcrl:wqr{gVYWYl?Z[
((7<<s
+C./!3CJ&'1D)EsJJr   c                    t        | j                         |j                               \  }}}t        j                  ||      |   j	                  | j
                        S )z
    This function reduces the log Gaussian probability mass computation by avoiding the
    duplicated evaluations using the np.unique_inverse(...) equivalent operation.
    )r5   ravelr   _log_gauss_massreshaper$   )r.   r/   a_uniqb_uniqr4   s        r   _log_gauss_mass_uniquer<   8   sJ    
 -QWWY	BFFC%%ff5c:BB177KKr   c                  2    e Zd ZU ded<   ded<   ddZd	dZy)
_MixtureOfProductDistributionr	   r
   zlist[_BatchedDistributions]distributionsc           
     B   |j                  t        | j                        | j                  |      }t        j                  |t        | j
                        ft              }g g }}g }t        | j
                        D ]6  \  }}	t        |	t              r|	j                  |d d f   }
|j                  |      }t        j                  |
d      }t        j                  |d d df   d      j                         sJ d|d d df<   t        j                  ||d d t        j                  f   k  d      |d d |f<   t        |	t               r#|j#                  |	       |j#                  |       t        |	t$              r5|j#                  |       |j#                  |	       |j#                  |       7J  t        |      rt        j&                  |D 	cg c]  }	|	j(                  |    c}	      }t        j&                  |D 	cg c]  }	|	j*                  |    c}	      }t        j,                  |D 	cg c]  }	|	j.                   c}	      }t        j,                  |D 	cg c]  }	|	j0                   c}	      }t        j,                  |D 	cg c]  }	t3        |	dd       c}	      }t5        j6                  ||dz  z
  d d t        j                  f   |z
  |z  ||dz  z   d d t        j                  f   |z
  |z  |||	      j8                  |d d |f<   t        j:                  |dk7        d
   }||   ||   ||   }}}t        j<                  |t        j>                  |d d |f   |z
  |z        |z  z   ||      |d d |f<   |S c c}	w c c}	w c c}	w c c}	w c c}	w )N)pr+   r!   r#   axisr   r   g           )r.   r/   locscalerandom_stater   ) choicer%   r
   r&   r*   r?   r   	enumerate
isinstancer   randr-   iscloseallsumnewaxisr   appendr   asarrayr   r   arrayr   r   getattrr   rvsTnonzeroclipround)selfrng
batch_sizeactive_indicesret	disc_indsnumerical_indsnumerical_distsidactive_weightsrnd_quantile	cum_probs
active_musactive_sigmaslowshighsstepssteps_not_0low_dstep_dhigh_ds                         r   samplez$_MixtureOfProductDistribution.sampleE   s"   C$5JWhh
C(:(:$;<EJ$&>	  	 d001 	DAq!=>!">1+<!="xx
3IIn2>	zz)ArE"2A6::<<<#$	!R% FF9|ArzzM/J#JQSTAqD	A=>&&q)%%a(AEF  #&&q)%%a(u!	$ ?$SaQTT.%9$STJJJ'YA(?'YZM88O<qQUU<=DHHo>aff>?EHHO!ga5OPE%/^^519$am4zA]REAI%q"**}5
BmS# & a >!" **Uc\215K$($5u[7I5Q\K]66E "#al"3e";v!EFOOQVX^!C9 
# %T'Y<>Os   NN6N#NNc                   t        j                  t        |      t        | j                        ft         j                        }g }g }t        | j                        D ]
  \  }}t        |t              r|d d |t         j                  t         j                  f   j                  t         j                        }|t        j                  t        j                  |j                  t         j                     |d            d   z  }t        |t              r#|j                  |       |j                  |       t        |t               rt        j"                  |d d |f   d      \  }}	t%        |j&                  |j(                        \  }
}}|t+        ||j,                  dz  z
  d d t         j                  f   |
z
  |z  ||j,                  dz  z   d d t         j                  f   |
z
  |z        t        j.                  |	|         z  }|t1        j2                  |j4                  |j,                  dz  z
  |
z
  |z  |j6                  |j,                  dz  z   |
z
  |z        |   z  }J  t        |      rt        j8                  |D cg c]  }|j&                   c}      j:                  }t        j8                  |D cg c]  }|j(                   c}      j:                  }|t1        j<                  |d d t         j                  |f   t        j8                  |D cg c]  }|j4                   c}      |z
  |z  t        j8                  |D cg c]  }|j6                   c}      |z
  |z  ||      j?                  d      z  }|t        j                  | j                  t         j                           z  }|jA                  d	      }d
|t        jB                  |      <   t        jD                  d      5  t        j                  t        jF                  ||d d d f   z
        j?                  d	            |z   cd d d        S c c}w c c}w c c}w c c}w # 1 sw Y   y xY w)Nr!   r#   rB   ).r   T)return_inverserD   )r.   r/   rE   rF   r   r   ignore)divide)$r&   zerosr%   r
   float64rI   r?   rJ   r   rO   astypeint64logtake_along_axisr   rP   r   uniquer5   r   r   r<   r   ix_r   r8   r   r   rQ   rU   logpdfrN   maxisneginferrstateexp)rY   xweighted_log_pdf
cont_dists	cont_indsra   rb   xixi_uniqxi_invmu_uniq
sigma_uniqmu_sigma_invmus_contsigmas_contmax_s                   r   log_pdfz%_MixtureOfProductDistribution.log_pdfr   s   88SVS->$?rzzR
	d001 	DAq!=>q!RZZ34;;BHHE BFF2+=+=aii

>SUW^`+a$b%   A=>!!!$  #AEF"$))AadGD"I4FqttQWW4U1\ $:
*ArzzM:WD
R
*ArzzM:WD
R% &&.%0 0 
 !J$>$>UUQVVaZ''1Z?VVaffqj(72j@% %    
 u-	0 y>zz"<A144"<=??H**z%B!agg%BCEEK
 1 1!RZZ*+::j9quu9:XET::z:!qvv:;hF+U!! crcl 	BFF4<<

#;<<###+"#R[[[[) 	W66"&&!1DDM!ABFFAFNORVV	W 	W #=%B ::	W 	Ws%   
QQQQ=AQ  Q)N)rZ   znp.random.RandomStater[   r,   returnr	   )r   r	   r   r	   )r   r   r   r   ro   r   r   r   r   r>   r>   A   s    ..+Z,Wr   r>   )r.   r	   r/   r	   r   z)tuple[np.ndarray, np.ndarray, np.ndarray])r.   r	   r/   r	   r   r	   )
__future__r   typingr   r   numpyr&   optuna.samplers._tper   r   r   r   _BatchedDistributionsr5   r<   r>   r   r   r   <module>r      so    "    +z Z Z  $"*, K&L]WJ ]Wr   