o
    }oi5                     @  s  d dl mZ d dlmZ d dlZd dlZd dlmZ d dlmZ d dlZ	d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ e Zer~d dlmZ d dlmZ d dlmZ d dlm Z  e rd dlm!Z" ee#Z$dZ%G dd deZ&G dd deZ'G dd deZ(	dIddddJd'd(Z)dKd+d,Z*dLd-d.Z+dMd5d6Z,dNd8d9Z-dOd>d?Z.G d@dA dAeZ/dPdBdCZ0dQdDdEZ1dRdGdHZ2dS )S    )annotations)CallableN)Any)
NamedTuple)
get_logger)_CONSTRAINTS_KEY)Study)FrozenTrial)
TrialState)_imports)_check_plot_args)_is_log_scale)_is_numerical)go)make_subplots)plotly)Scatter)pltg?c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )		_AxisInfostrnameztuple[float, float]rangeboolis_logis_catN__name__
__module____qualname____annotations__ r    r    N/home/ubuntu/.local/lib/python3.10/site-packages/optuna/visualization/_rank.pyr   (   s
   
 r   c                   @  sF   e Zd ZU ded< ded< ded< ded< ded< d	ed
< d	ed< dS )_RankSubplotInfor   xaxisyaxisz	list[Any]xsyslist[FrozenTrial]trials
np.ndarrayzscolorsNr   r    r    r    r!   r"   /   s   
 r"   c                   @  s>   e Zd ZU ded< ded< ded< ded< ded	< d
ed< dS )_RankPlotInfo	list[str]paramszlist[list[_RankSubplotInfo]]sub_plot_infosr   target_namer)   r*   r+   r   has_custom_targetNr   r    r    r    r!   r,   9   s   
 r,   zObjective Value)targetr0   studyr   r.   list[str] | Noner2   %Callable[[FrozenTrial], float] | Noner0   r   return'go.Figure'c                C  s   t   t| |||}t|S )a  Plot parameter relations as scatter plots with colors indicating ranks of target value.

    Note that trials missing the specified parameters will not be plotted.

    Args:
        study:
            A :class:`~optuna.study.Study` object whose trials are plotted for their target values.
        params:
            Parameter list to visualize. The default is all parameters.
        target:
            A function to specify the value to display. If it is :obj:`None` and ``study`` is being
            used for single-objective optimization, the objective values are plotted.

            .. note::
                Specify this argument if ``study`` is being used for multi-objective optimization.
        target_name:
            Target's name to display on the color bar.

    Returns:
        A :class:`plotly.graph_objects.Figure` object.

    .. note::
        This function requires plotly >= 5.0.0.
    )r   check_get_rank_info_get_rank_plot)r3   r.   r2   r0   infor    r    r!   	plot_rankB   s    r<   datar)   c                 C  sT   t j| td}t | }t| D ]\}}t ||kd }t|t| ||< q|S )Ndtyper   )np
zeros_likefloatsort	enumeratewheresumlen)r=   orderdata_sortedidindicesr    r    r!   $_get_order_with_same_order_averagingg   s   
rM   c                   s^  t | | | jdtjfddd D }tdkr$td g nd u r-t|nD ]}||vr=td| dq/tdkrItd	 d
}d u rVdddd}t	
fddD t}tdkrt|td  nt	
dg}t| tdkrd }	d }
t |	|
}|gg}n fddD }t|| |dS )NF)deepcopystatesc                 S  s    h | ]}|j  D ]}|q	qS r    )r.   keys).0tp_namer    r    r!   	<setcomp>z        z!_get_rank_info.<locals>.<setcomp>r   z.Your study does not have any completed trials.z
Parameter z does not exist in your study.zparams is an empty list.Ttrialr	   r6   rB   c                 S  s   t t| jS N)typingcastrB   value)rV   r    r    r!   r2      s   z_get_rank_info.<locals>.targetc                   s   g | ]} |qS r    r    rQ   rV   )r2   r    r!   
<listcomp>       z"_get_rank_info.<locals>.<listcomp>            ?c                   s$   g | ]  fd dD qS )c                   s   g | ]
}t  |qS r    )_get_rank_subplot_info)rQ   x_param)r+   target_valuesr(   y_paramr    r!   r\      s    z-_get_rank_info.<locals>.<listcomp>.<listcomp>r    )rQ   )r+   r.   rc   r(   rd   r!   r\      s    )r.   r/   r0   r*   r+   r1   )rV   r	   r6   rB   )r   
get_trialsr
   COMPLETErG   _loggerwarningsorted
ValueErrorr@   arrayrM   (_convert_color_idxs_to_scaled_rgb_colorsra   r,   )r3   r.   r2   r0   
all_paramsinput_p_namer1   	raw_ranks
color_idxsrb   rd   sub_plot_infor/   r    )r+   r.   r2   rc   r(   r!   r9   p   sL   



(
r9   r(   r'   rc   r+   rb   rd   c              	     s   t  }t  }g }g }t D ]+\}	}
|
jt}|d ur.tdd |D r.||	 |
jv r=|
jv r=||	 q fdd|D }fdd|D }fdd|D }|| }d||< || }t|||||t	
||dS )Nc                 S  s   g | ]}|d kqS )g        r    rQ   xr    r    r!   r\      r]   z*_get_rank_subplot_info.<locals>.<listcomp>c                   s   g | ]} | qS r    r    rQ   rJ   )r(   r    r!   r\      r]   c                      g | ]}|j   qS r    r.   r[   )rb   r    r!   r\          c                   rv   r    rw   r[   re   r    r!   r\      rx   )   ry   ry   )r#   r$   r%   r&   r(   r*   r+   )_get_axis_inforD   system_attrsgetr   anyappendr.   r"   r@   rl   )r(   rc   r+   rb   rd   r#   r$   infeasible_trial_idsfiltered_idsidxrV   constraintsfiltered_trialsr%   r&   r*   r    )r(   rb   rd   r!   ra      s4   



ra   
param_namec                   sP  t |  }|r fdd| D }n	 fdd| D }tdd |D }tdd |D }t|  r`t|}t|}t|t| t }tdt|| }tdt|| }d}d}n>|r}t|}t|}|| t }|| }|| }d}d}n!t	|}	t
|	d	 }
d |	v r|
d	8 }
|
t }| }|
| }d}d}t ||f||d
S )Nc                   s   g | ]}|j  qS r    )r.   r|   rQ   rR   r   r    r!   r\          z"_get_axis_info.<locals>.<listcomp>c                   s*   g | ]} |j v rt|j  nd qS rW   )r.   r   r|   r   r   r    r!   r\      s    c                 S     g | ]}|d ur|qS rW   r    rQ   vr    r    r!   r\      r   c                 S  r   rW   r    r   r    r    r!   r\      r   
   TFr_   )r   r   r   r   )r   minmaxr   rB   mathlog10PADDING_RATIOpowsetrG   r   )r(   r   is_numericalvalues	min_value	max_valuepaddingr   r   unique_valuesspanr    r   r!   rz      sN   


rz   r;   print_raw_objectivesr   	'Scatter'c                   s   dfdd t j| jjrd	d
 | jD n| j| jjr$dd
 | jD n| jttt	j
j| j
ddddddd fdd
t| j| jD d}|S )NrV   r	   target_valuerB   r6   r   c                   sd   d| j  g}|dd | j D 7 }|d d| dg7 } r-|dd t| jD 7 }d|S )	NzTrial #c                 S  s   g | ]\}}| d | qS ): r    )rQ   kr   r    r    r!   r\   	  s    z=_get_rank_subplot.<locals>.get_hover_text.<locals>.<listcomp>z<b>r   z</b>c                 S  s    g | ]\}}d | d| qS )zObjective #r   r    )rQ   rJ   r   r    r    r!   r\     rU   z<br>)numberr.   itemsrD   r   join)rV   r   lines)r   r0   r    r!   get_hover_text  s   
z)_get_rank_subplot.<locals>.get_hover_textc                 S     g | ]}t |qS r    r   rs   r    r    r!   r\     r]   z%_get_rank_subplot.<locals>.<listcomp>c                 S  r   r    r   )rQ   yr    r    r!   r\     r]   r`   Grey)widthcolor)r   linemarkersFz%{hovertext}<extra></extra>c                   s   g | ]	\}} ||qS r    r    )rQ   rV   r   )r   r    r!   r\     s    )rt   r   markermode
showlegendhovertemplate	hovertext)rV   r	   r   rB   r6   r   )r   r   r#   r   r%   r$   r&   listmapr   r+   	label_rgbzipr(   r*   )r;   r0   r   scatterr    )r   r   r0   r!   _get_rank_subplot  s   
r   c                   @  s   e Zd ZU ded< ded< dS )	_TickInfozlist[float]	coloridxsr-   textNr   r    r    r    r!   r   !  s   
 r   c                   sN   t | }g d}t ||g d  fddttD }t||dS )N)r   g      ?r`   g      ?r_   )zmin.z25%z50%z75%zmax.c                   s&   g | ]} |  d | ddqS )z (3g)r    ru   	rank_textr   r    r!   r\   +  s   & z"_get_tick_info.<locals>.<listcomp>)r   r   )r@   rC   quantiler   rG   r   )rc   sorted_target_valuesr   r   r    r   r!   _get_tick_info&  s   
r   c                 C  s<  | j }| j}tjd| j dd}t|dkrtjg |dS t|dkr|d }|d }|d d }t|| j| j}tj||d}|j	||j
jd |j||jjd |j
jr]|j	d	d
 |jjrg|jd	d
 |j
jr{dd |j
jD }	|j	|	dd |jjrdd |jjD }	|j|	dd ntt|t|dddt| dt| d}|| t|D ]\}
}t|D ]\}}t|| |
 | j| j}|j||d |
d d || |
 j
}|| |
 j}|j	|j|d |
d d |j|j|d |
d d |jr|j	d	|d |
d d |jr|jd	|d |
d d |jr4dd |jD }	|j	|	d|d |
d d |jrMdd |jD }	|j|	d|d |
d d |
dkr^|j||d |
d d |t|d krs|j	||d |
d d qqt| j}d}tjd gd gdt|dddtd|j|jdddd d!}|| |S )"NzRank (r   )titler   )r=   layoutr^   r_   )
title_textr   category)typec                 S     g | ]}t |qS r    r   r   rQ   pr    r    r!   r\   I  rx   z"_get_rank_plot.<locals>.<listcomp>log)r   r   c                 S  r   r    r   r   r    r    r!   r\   L  rx   Tg{Gz?)rowscolsshared_xaxesshared_yaxeshorizontal_spacingvertical_spacing)rowcol)r   r   r   )r   r   r   c                 S  r   r    r   r   r    r    r!   r\   k  rx   )r   r   r   r   c                 S  r   r    r   r   r    r    r!   r\   n  rx   )r   r   r   RdYlBu_rr   r   )	thicknesstickvalsticktext)
colorscale	showscalecmincmaxcolorbarnoneF)rt   r   r   r   	hoverinfor   )r.   r/   r   Layoutr0   rG   Figurer   r1   update_xaxesr#   r   update_yaxesr$   r   r   r   update_layoutrD   	add_tracer   r*   r   dictr   r   )r;   r.   r/   r   rb   rd   rr   	sub_plotsfigure	log_rangex_iy_ir   r#   r$   	tick_infocolormapcolorbar_tracer    r    r!   r:   /  s   


	


r:   rq   c                 C  sf   d}t rtj|| }tdd |D }|S t|}|| d d d df }tj|d t	d}|S )Nr   c                 S  s   g | ]}t j|qS r    )r   r+   unlabel_rgb)rQ   clr    r    r!   r\     r   z<_convert_color_idxs_to_scaled_rgb_colors.<locals>.<listcomp>      r>   )
plotly_is_availabler   r+   sample_colorscaler@   rl   matplotlib_pltget_cmapasarrayint)rq   r   labeled_colorsscaled_rgb_colorscmapr+   
rgb_colorsr    r    r!   rm     s   
rm   rW   )
r3   r   r.   r4   r2   r5   r0   r   r6   r7   )r=   r)   r6   r)   )
r3   r   r.   r4   r2   r5   r0   r   r6   r,   )r(   r'   rc   r)   r+   r)   rb   r   rd   r   r6   r"   )r(   r'   r   r   r6   r   )r;   r"   r0   r   r   r   r6   r   )rc   r)   r6   r   )r;   r,   r6   r7   )rq   r)   r6   r)   )3
__future__r   collections.abcr   r   rX   r   r   numpyr@   optuna.loggingr   optuna.samplers._baser   optuna.studyr   optuna.trialr	   r
   $optuna.visualization._plotly_importsr   optuna.visualization._utilsr   r   r   3optuna.visualization.matplotlib._matplotlib_importsmatplotlib_importsis_successfulr   r   r   r   r   r   r   r   rh   r   r   r"   r,   r<   rM   r9   ra   rz   r   r   r   r:   rm   r    r    r    r!   <module>   sX    

%
	
=
%
2

	\