
    瞤d                     p    d dl mZ ddlmZ d dlmZ d dlmZ d Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd ZeZdS )    )absolute_import   )numpy)sqrt)rangec                     g }| D ]+}t          j        |          r|                    |           ,t          j        |          t          j        |          fS )z1 Returns mean value discarding non finite values )r   isfiniteappendmeanstd)valuesvalid_valuesvs      ?lib/python3.11/site-packages/ete3/clustering/clustvalidation.py	safe_meanr   -   s\    L # #>! 	#""":l##UY|%<%<<<    c                 @   t          |           dk    r/| d         t          j        t          | d                             fS t          | d                   }g }g }t          |          D ]}g }| D ]7}t          j        ||                   r|                    ||                    8|                    t          j        |                     |                    t          j        |                     t          j        |          t          j        |          fS )z8 Returns mean profile discarding non finite values.
       r   )	lenr   zerosr   r	   r
   r   r   array)vectorslengthr   safe_stdpospos_meanr   s          r   safe_mean_vectorr   5   s    7||Qqz5;s71:7777__FIHV}} - - 	( 	(A~af%% (#'''H--...	(++,,,,;y!!5;x#8#888r   c                 "   |                                 }g }g }g }|D ]}|j        
|                                D ]}|j         | |j        |j                  dz  } | |j        |j                  }	|	|z
  dk    rd}
n|	|z
  t	          ||	          z  }
|                    |           |                    |	           |                    |
           t          |          \  }}t          |          \  }}t          |          \  }}|||fS )Nr           )get_sistersprofileiter_leaves_profilemaxr
   r   )fdistclustersisters
silhouette
intra_dist
inter_diststiabsr   intracluster_distintercluster_dists                 r   get_silhouette_widthr2   J   sD   !!##G JJJ % %:$$&& 	% 	%Az%E!)W_55a7E!)RZ00aCC<<AAA#Qq)A!!!$$$!!!$$$!!!$$$	%"  
++OJ&z22s&z22s(*;;;r   c                 x   |                                  skd |                                 D             }t          |          dk    rt          |          \  | _        | _        nd\  | _        | _        | j        | j        fS dgt          | j                  z  | _        | j        dgt          | j                  z  fS )zU This internal function updates the mean profile
    associated to an internal node. c                 *    g | ]}|j         	|j         S )N)r#   ).0ns     r   
<listcomp>z#get_avg_profile.<locals>.<listcomp>o   s+     7 7 7q z5 
555r   r   )NNr   )is_leaf
get_leavesr   r   r#   _std_profile)nodeleaf_vectorss     r   get_avg_profiler=   j   s     <<>> 
77 7T__->-> 7 7 7|Q/?/M/M,DM4,,/9,DM4,}d/// E#dm"4"44}seC$6$6666r   c                    t          |          dk     rt          d          g }|D ]I}|                                D ]2}|. | |j        |j                  dz  }|                    |           3Jt          j        |          }g }t          |          D ]@\  }}||dz   d         D ]-}	 | |j        |	j                  }
|                    |
           .At          j        |          }|dk    rd}n||z  }|S )z
    Returns the Dunn index for the given selection of nodes.

    J.C. Dunn. Well separated clusters and optimal fuzzy
    partitions. 1974. J.Cybern. 4. 95-104.

    r   z At least 2 clusters are requiredNr   r   )	r   
ValueErrorr9   r!   r
   r   r$   	enumeratemin)r%   clustersr)   cr,   r-   max_ar*   cicjr.   min_bDs                r   get_dunn_indexrI   {   s2    8}}Q;<<<J % % 	% 	%A}E!)QY//1!!!$$$		%
 Ij!!EJ8$$ ! !21Q344. 	! 	!Bbj"*--Aa    	! Ij!!E||EMHr   c                     	 ddl m} n# t          $ r t          d          w xY w| |k                                    rdS d |t          |           t          |                    d         z
  S )Nr   )pearsonrJscipy is required to execute this function. Please install it an try againr         ?)scipy.statsrK   ImportErrorRuntimeErroralllist)v1v2rK   s      r   pearson_distrU      s    i((((((( i i ighhhi 	b~~ 5sXXd2hhR11!444   	 #c                     	 ddl m} n# t          $ r t          d          w xY w| |k                                    rdS d |t          |           t          |                    d         z
  S )Nr   )	spearmanrrL   r   rM   )rN   rX   rO   rP   rQ   rR   )rS   rT   rX   s      r   spearman_distrY      s    i))))))) i i ighhhi 	b~~ 6sYYtBxxb221555rV   c                 p    | |k                                     rdS t          t          | |                    S )Nr   )rQ   r   square_euclidean_dist)rS   rT   s     r   euclidean_distr\      s6    
b~~ 4s*2b11333r   c                 T   | |k                                     rdS d}d}t          t          |                     D ]T}t          j        | |                   r8t          j        ||                   r|dz  }| |         ||         z
  }|||z  z  }U|dk    rt          d          ||z  S )Nr   r   r   zCannot calculate values)rQ   r   r   r   r	   r?   )rS   rT   validsdistancer,   ds         r   r[   r[      s    
b~~ sFH3r77^^  >"Q%   	U^BqE%:%: 	aKF1beA!OHqyy2333VOr   N)
__future__r    r   mathr   	six.movesr   r   r   r2   r=   rI   rU   rY   r\   r[   default_dist r   r   <module>rg      s   N ' & & & & &                  = = =9 9 9*< < <@7 7 7"     P	5 	5 	5	6 	6 	64 4 4   r   