o
    .ѹgIP                     @   s  d dl 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mZ d dlmZ d dlmZ eejjd	 Zeejjd	 Zejd
ddd Zdd Ze dd Zd"ddZe dd Zdd ZdZ e fddZ!e dd Z"dd Z#G d d! d!eZ$dS )#    N)BaseEstimator)check_array)arr_intersect)	arr_union)UMAPmake_epochs_per_sample)spectral_layout)!optimize_layout_aligned_euclidean   T)parallelc                 C   sV   t |}tj| jd tjd}t| jd D ]}| | |v r$d||< qd||< q|S )Nr   ZdtypeTF)setnpemptyshapeZbool_numbaZprange)ZarrZtest_setresulti r   U/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/umap/aligned_umap.pyin1d   s   

r   c                 C   s   dd |   D S )Nc                 S   s   i | ]\}}||qS r   r   ).0keyvaluer   r   r   
<dictcomp>   s    zinvert_dict.<locals>.<dictcomp>)items)dr   r   r   invert_dict   s   r   c           
      C   sD   | |d  }||d  }|j | }tj|\}}}|| }	||	 S )Nr   r
   )Tr   ZlinalgZsvd)
Zembedding_baseZembedding_to_alignZanchorsZsubset1Zsubset2MUSVRr   r   r   procrustes_align!   s   
r$      c                    s  t dd D dd D  d }tjtd d| d |fdtjd}dd D t|jd	 D ] t|D ]B}||d  } | d tkrZtj|dtjd| |f< q:t|}t|d D ]t fd
d|D }qe|| |f< q:td	| dD ]B}||d  } | d d	k rtj|dtjd| |f< qt|}td	|d dD ]t fdd|D }q|| |f< qq4|S )Nc                 S      g | ]}t | qS r   )maxkeysr   r   r   r   r   
<listcomp>.       z$expand_relations.<locals>.<listcomp>c                 S   r&   r   )r'   valuesr)   r   r   r   r*   /   r+   r
      r   c                 S   s   g | ]}t |qS r   )r   r)   r   r   r   r*   8   s    r   c                    s    g | ]}    |d qS )r.   getr   n)r   krelation_dictsr   r   r*   B   s     c                    s$   g | ]}  d    |dqS )r
   r.   r/   r1   )r   r3   reverse_relation_dictsr   r   r*   N   s   $ )	r'   r   fulllenint32ranger   Zarangearray)r4   window_sizeZmax_n_samplesr   jZresult_indexmappingr   )r   r3   r4   r5   r   expand_relations+   sJ   

r>   c              	   C   s  t j|jt jd}|jd d d }t|jd D ]}| | }|| }t|jd D ]}|| | dk s>|| | t| kr?q*| || |  }	||| |  }
t|jd D ]m}||||f }|dk rdqV||| ||d    }|||f |||jd k   }||dk }|
|	| |	|d   }|t||||f  }t||jd }t	||jd }|dkr|| ||||f< qVd||||f< qVq*q|S )Nr   r
   r-   r         ?)
r   zerosr   float32r9   r7   copyr   intersect1dunion1d)Zgraphs_indptrZgraphs_indices	relationsr   Zcenter_indexr   Zbase_graph_indptrZbase_graph_indicesr<   Zcomparison_graph_indptrZcomparison_graph_indicesr3   Zcomparison_indexZraw_base_graph_indicesZbase_indicesZcomparison_indicesZintersection_sizeZ
union_sizer   r   r   build_neighborhood_similaritiesU   sR   $

%rF   c                 C   sH   | d u rd S t | tttjfv r| | S t | tttd fv r | S td)NzUnrecognized parameter type)	typelisttupler   ndarrayintfloatbool
ValueError)Ziterable_or_valr2   r   r   r   get_nth_item_or_val   s   rO   )n_neighborsn_componentsmetricmetric_kwdsn_epochslearning_rateinitmin_distspreadset_op_mix_ratiolocal_connectivityrepulsion_strengthnegative_sample_ratetransform_queue_sizeangular_rp_foresttarget_n_neighborstarget_metrictarget_metric_kwdstarget_weightuniquec                 C   s   |D ]U}|| v rWt || tr|| | |  qt || tr,|| | | f ||< qt || tjrAt|| | | ||< q| | || krW|| f| | | f ||< q|S N)
isinstancerH   appendrI   r   rJ   )
new_paramsZexisting_paramsZn_modelsZparam_namesparamr   r   r   set_aligned_params   s    

ri   c              	   C   s   |j d d }| j d }tj||ftjd}t|D ]T}||v r)| ||  ||< qd}	t|| ||d  D ] }
||
 }||v rV|	||
 7 }	||  ||
 | ||   7  < q6|	dkrftjdd|||< q||  |	  < q|S )Nr   r
   r   g        g      $      $@)r   r   r@   rA   r9   randomuniform)previous_embeddingZweights_indptrZweights_indicesZweights_dataZrelation_dictZ	n_samplesZ
n_featuresr   r   Znormalisationidxr<   r   r   r   init_from_existing_internal   s&   
ro   c                 C   sT   t jjt jjt jj}| D ]\}}t||t|< qt| |j	|j
|j|S rd   )r   typedDictr   typesr8   r   r   ro   indptrindicesdata)rm   graphrE   Ztyped_relationsr   valr   r   r   init_from_existing   s   rx   c                   @   sn   e Zd Z													
									
						
	
	
dddZdddZdddZdddZdS )AlignedUMAP   r-   	euclideanNr?   spectral{Gz?r%   皙?F         @r.   categorical      ?*   c                 C   s   || _ || _|| _|| _|| _|| _|| _|| _|| _|	| _	|| _
|
| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _d S rd   )rP   rR   rS   rT   rV   rQ   r[   rU   alignment_regularisationalignment_window_sizerX   rW   
low_memoryrY   rZ   r\   random_stater^   r]   r_   r`   ra   rb   transform_seedforce_approximation_algorithmverboserc   ab)selfrP   rQ   rR   rS   rT   rU   rV   r   r   rW   rX   r   rY   rZ   r[   r\   r]   r   r   r   r^   r_   r`   ra   rb   r   r   r   rc   r   r   r   __init__   s:   !
zAlignedUMAP.__init__c                    s  d|vrt d|d _tjttfv sJ t tttjfv s$J t d tjks1J d urOttttjfv sAJ td tjksNJ nd gt  tjtttjfv ret dt _	j
d u rrd_
j
} fddtj	D _|dj}tj|}tjjtjjd d d }tjjtjjd d d }tjjtjjd d d }	tjjtjjd d d }
tjjtjjd d d }jD ].}||jj ||jj |	|j j |
|j j |t|j j| qtj !j"}t#|||}t$jd	 j%jd	 jj|}d
t&|'  }|| j(tj)dd}tjjtjj)d d d d df }|| tdj	D ]M}t$j| j%j| jj|}d
t&|'  }|| j(tj)dd}|| |d  }||d	k }t*|d	kd	 }|t+|d |t,||g qV|-t.t/d(tj0}t1|||	|
|||||j2dd_3t4j3D ] \}}t5j| jj6dd7 d	k}t8jtj9||< qňS )NrE   <Aligned UMAP requires relations between data to be specifiedr
   6n_components must be a single integer, and cannot vary   c              	      s:  g | ]}t di d tj|dtj|dtj|dtj|dtj|djdtj|dtj	|dtj
|d	tj|d
tj|djdjdjdjdjdjdjdjdjdjdjdjdjdjdjdj | | qS )rP   rW   rT   r[   rU   rV   rX   r\   rZ   rY   rc   rQ   rR   rS   r   r   r^   r]   r_   r`   ra   rb   r   r   r   r   r   r   )r   rO   rP   rW   rT   r[   rU   rV   rX   r\   rZ   rY   rc   rQ   rR   rS   r   r   r^   r]   r_   r`   ra   rb   r   r   r   r   r   fitr1   Xr   yr   r   r*   C  sv    	
z#AlignedUMAP.fit.<locals>.<listcomp>r;   r   rj   C)orderr.   r%   T)lambda_Z
move_other)Zaxis):rN   dict_relations_rG   rH   rI   r   rJ   r7   rQ   	n_models_rT   r9   mappers_r0   r   r>   r   rp   List
empty_listrr   r8   float64rf   graph_rs   rt   tocoorowcolr   ru   rk   RandomStater   rF   r   Z	_raw_dataabsr'   astyperA   wherer$   Zvstackrandint	INT32_MIN	INT32_MAXint64r	   r   embeddings_	enumerater:   sumflattenr6   nan)r   r   r   
fit_paramsrT   r;   rE   indptr_listindices_listheadstailsepochs_per_samplesmapperrng_state_transformZregularisation_weightsZ
first_initZ	expansionZfirst_embeddingZ
embeddingsr   Z	next_initZnext_embeddingZanchor_dataZleft_anchorsZright_anchorsseed_tripletZ	embeddingZdisconnected_verticesr   r   r   r   '  s   


!


$


 zAlignedUMAP.fitc                 K   s   | j ||fi | | jS rd   )r   r   )r   r   r   r   r   r   r   fit_transform  s   zAlignedUMAP.fit_transformc                 K   s  d|vrt d|d }t|tsJ t|}t|| j| j| _t| jt	t
tjfv r/t d| jd u r7d| _| j}td'i dt| j| jdt| j| jdt| j| jdt| j| jd	t| j| jd
| jdt| j| jdt| j| jdt| j| jdt| j| jdt| j| jd| jd| jd| jd| jd| jd| jd| jd| j d| j!d| j"d| j#d| j$d| j%d| j&d| j'd| j()||}|  jd 7  _|  j*|g7  _*|  j+|g7  _+|,d!| j-}t.| j+|}t/j0j12t/j3j4d d d  }	t/j0j12t/j3j4d d d  }
t/j0j12t/j3j4d d d  }t/j0j12t/j3j4d d d  }t/j0j12t/j3j5d d d  }t6| j*D ]O\}}|	7|j8j9 |
7|j8j: |7|j8; j< |7|j8; j= |t>| j*d  kr|7t?|j8; j@| qF|7tjA|jBjCd" |d  tj5d# qFtD|	|
|}tE|}tF| jGd$ |j8|}| jG7| tjHI| j$}|JtKtLd%MtjN}tO| jG| jG|||||||| jPd&
| _Gd S )(NrE   r   r   r   rP   rW   rT   r[   rU   rV   rX   r\   rZ   rY   rc   rQ   rR   rS   r   r   r^   r]   r_   r`   ra   rb   r   r   r   r   r   r
   r;   r   r   r.   r%   )r   r   )QrN   re   dictr   ri   __dict__r   rG   rQ   rH   rI   r   rJ   rT   r   rO   rP   rW   r[   rU   rV   rX   r\   rZ   rY   rc   rR   rS   r   r   r^   r]   r_   r`   ra   rb   r   r   r   r   r   r   r   r   r0   r   r>   r   rp   r   r   rr   r8   r   r   rf   r   rs   rt   r   r   r   r7   r   ru   r6   Z
embedding_r   rF   r   rx   r   rk   r   r   r   r   r   r   r	   r   )r   r   r   r   Znew_dict_relationsrT   Z
new_mapperr;   Znew_relationsr   r   r   r   r   r   r   Znew_regularisation_weightsZinv_dict_relationsZnew_embeddingr   r   r   r   r   update  s   
	
 !"$zAlignedUMAP.update)rz   r-   r{   NNr?   r|   r}   r%   r~   r?   Fr?   r?   r?   r   r   NNNFr.   r   Nr   r   FFFrd   )__name__
__module____qualname__r   r   r   r   r   r   r   r   ry      sF    

B 
ry   )r%   )%Znumpyr   r   Zsklearn.baser   Zsklearn.utilsr   Zumap.sparser   rC   r   rD   Z
umap.umap_r   r   Zumap.spectralr   Zumap.layoutsr	   Ziinfor8   minr   r'   r   Znjitr   r   r$   r>   rF   rO   ZPARAM_NAMESri   ro   rx   ry   r   r   r   r   <module>   s4    



	*
.
