o
    XεiIP                     @   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   dtypeTF)setnpemptyshapebool_numbaprange)arrtest_setresulti r   E/home/ubuntu/.local/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   linalgsvd)
embedding_baseembedding_to_alignanchorssubset1subset2MUSVRr   r   r   procrustes_align!   s   
r0      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   r2   r   )r3   valuesr5   r   r   r   r6   /   r7   r
      r   c                 S   s   g | ]}t |qS r   )r"   r5   r   r   r   r6   8   s    r   c                    s    g | ]}    |d qS )r:   getr   n)r   krelation_dictsr   r   r6   B   s     c                    s$   g | ]}  d    |dqS )r
   r:   r;   r=   )r   r?   reverse_relation_dictsr   r   r6   N   s   $ )	r3   r   fulllenint32ranger   arangearray)r@   window_sizemax_n_samplesr   jresult_indexmappingr   )r   r?   r@   rA   r   expand_relations+   sJ   

rM   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
   r9   r         ?)
r   zerosr   float32rE   rC   copyr   intersect1dunion1d)graphs_indptrgraphs_indices	relationsr   center_indexr   base_graph_indptrbase_graph_indicesrJ   comparison_graph_indptrcomparison_graph_indicesr?   comparison_indexraw_base_graph_indicesbase_indicescomparison_indicesintersection_size
union_sizer   r   r   build_neighborhood_similaritiesU   sR   $

%rb   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)iterable_or_valr>   r   r   r   get_nth_item_or_val   s   rl   )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)
isinstancerd   appendre   r   rf   )
new_paramsexisting_paramsn_modelsparam_namesparamr   r   r   set_aligned_params   s    

r   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   rO   rP   rE   randomuniform)previous_embeddingweights_indptrweights_indicesweights_datarelation_dict	n_samples
n_featuresr   r   normalisationidxrJ   r   r   r   init_from_existing_internal   s&   
r   c                 C   sT   t jjt jjt jj}| D ]\}}t||t|< qt| |j	|j
|j|S r   )r   typedDictr   typesrD   r    r   r   indptrindicesdata)r   graphrV   typed_relationsr   valr   r   r   init_from_existing   s   r   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   r9   	euclideanNrN   spectral{Gz?r1   皙?F         @r:   categorical      ?*   c                 C   s   || _ || _|| _|| _|| _|| _|| _|| _|| _|	| _	|| _
|
| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _d S r   )rm   ro   rp   rq   rs   rn   rx   rr   alignment_regularisationalignment_window_sizeru   rt   
low_memoryrv   rw   ry   random_stater{   rz   r|   r}   r~   r   transform_seedforce_approximation_algorithmverboser   ab)selfrm   rn   ro   rp   rq   rr   rs   r   r   rt   ru   r   rv   rw   rx   ry   rz   r   r   r   r{   r|   r}   r~   r   r   r   r   r   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 )NrV   <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 )rm   rt   rq   rx   rr   rs   ru   ry   rw   rv   r   rn   ro   rp   r   r   r{   rz   r|   r}   r~   r   r   r   r   r   r   r   )r   rl   rm   rt   rq   rx   rr   rs   ru   ry   rw   rv   r   rn   ro   rp   r   r   r{   rz   r|   r}   r~   r   r   r   r   r   r   fitr=   Xr   yr   r   r6   C  sv    	
z#AlignedUMAP.fit.<locals>.<listcomp>rH   r   r   C)orderr:   r1   T)lambda_
move_other)axis):rj   dict_relations_rc   rd   re   r   rf   rC   rn   	n_models_rq   rE   mappers_r<   r   rM   r   r   List
empty_listr   rD   float64r   graph_r   r   tocoorowcolr   r   r   RandomStater   rb   r   	_raw_dataabsr3   astyperP   wherer0   vstackrandint	INT32_MIN	INT32_MAXint64r	   r   embeddings_	enumeraterG   sumflattenrB   nan)r   r   r   
fit_paramsrq   rH   rV   indptr_listindices_listheadstailsepochs_per_samplesmapperrng_state_transformregularisation_weights
first_init	expansionfirst_embedding
embeddingsr   	next_initnext_embeddinganchor_dataleft_anchorsright_anchorsseed_triplet	embeddingdisconnected_verticesr   r   r   r   '  s   


!


$


 zAlignedUMAP.fitc                 K   s   | j ||fi | | jS r   )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 )(NrV   r   r   r   rm   rt   rq   rx   rr   rs   ru   ry   rw   rv   r   rn   ro   rp   r   r   r{   rz   r|   r}   r~   r   r   r   r   r   r   r
   rH   r   r   r:   r1   )r   r   )Qrj   r   dictr   r   __dict__r   rc   rn   rd   re   r   rf   rq   r   rl   rm   rt   rx   rr   rs   ru   ry   rw   rv   r   ro   rp   r   r   r{   rz   r|   r}   r~   r   r   r   r   r   r   r   r   r   r<   r   rM   r   r   r   r   r   rD   r   r   r   r   r   r   r   r   r   rC   r   r   rB   
embedding_r   rb   r"   r   r   r   r   r   r   r   r   r   r	   r   )r   r   r   r   new_dict_relationsrq   
new_mapperrH   new_relationsr   r   r   r   r   r   r   new_regularisation_weightsinv_dict_relationsnew_embeddingr   r   r   r   r   update  s   
	
 !"$zAlignedUMAP.update)r   r9   r   NNrN   r   r   r1   r   rN   FrN   rN   rN   r   r   NNNFr:   r   Nr   r   FFFr   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r      sF    

B 
r   )r1   )%numpyr   r   sklearn.baser   sklearn.utilsr   umap.sparser   rR   r   rS   
umap.umap_r   r   umap.spectralr   umap.layoutsr	   iinforD   minr   r3   r   njitr   r"   r0   rM   rb   rl   PARAM_NAMESr   r   r   r   r   r   r   r   <module>   s4    



	*
.
