U
    mdJ                     @   s  d dl Zd dlZd dlmZ d dlmZ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_random_state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 ]"}| | |krHd||< q.d||< q.|S )Nr   ZdtypeTF)setnpemptyshapeZuint8numbaZprange)ZarrZtest_setresulti r   J/home/sam/Atlas/atlas_env/lib/python3.8/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_align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 ]|d  }  d tkrtj|dtjd| |f< qvt|}td D ] }t fd
d|D }q|| |f< qvtd	| dD ]|d  }  d d	k rHtj|dtjd| |f< nLt|}tt	d D ]"}t fdd|D }qd|| |f< q
qh|S )Nc                 S   s   g | ]}t | qS r   )maxkeysr   r   r   r   r   
<listcomp>.   s     z$expand_relations.<locals>.<listcomp>c                 S   s   g | ]}t | qS r   )r(   valuesr*   r   r   r   r+   /   s     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   j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abs)r4   window_sizeZmax_n_samplesr   Zresult_indexmappingkr   )r   r3   r4   r5   r   expand_relations+   sH    

r?   c              	   C   s  t j|jt jd}|jd d d }t|jd D ]N}| | }|| }t|jd D ](}|| | dk sV|| | t| krqV| || |  }	||| |  }
t|jd D ]}||||f }|dk rq||| ||d    }|||f | }||dk }|
|	| |	|d   }|t||||f  }t||jd }t	||jd }|dkrp|| ||||f< qd||||f< qqVq2|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_indicesr3   Zcomparison_graph_indptrZcomparison_graph_indicesr>   Zcomparison_indexZraw_base_graph_indicesZbase_indicesZcomparison_indicesZintersection_sizeZ
union_sizer   r   r   build_neighborhood_similaritiesU   sJ    $ 

 

rG   c                 C   sL   | d krd S t | tttjfkr(| | S t | tttd fkr@| S tdd S )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    rP   )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   sr   |D ]h}|| krt || tttjfkr@|| | | f ||< q| | || kr|| f| | | f ||< q|S N)rH   rI   rJ   r   rK   )
new_paramsZexisting_paramsZn_modelsZparam_namesparamr   r   r   set_aligned_params   s    rh   c              	   C   s   |j d d }| j d }tj||ftjd}t|D ]}||krR| ||  ||< q4d}	t|| ||d  D ]@}
||
 }||krl|	||
 7 }	||  ||
 | ||   7  < ql|	dkrtjdd|||< q4||  |	  < q4|S )Nr   r   r   g        g      $      $@)r   r   rA   rB   r9   randomuniform)previous_embeddingZweights_indptrZweights_indicesZweights_dataZrelation_dictZ	n_samplesZ
n_featuresr   r   Znormalisationidxr3   r   r   r   init_from_existing_internal   s$    
rn   c                 C   sT   t jjt jjt jj}| D ]\}}t||t|< q t| |j	|j
|j|S re   )r   typedDictr   typesr8   r   r   rn   indptrindicesdata)rl   graphrF   Ztyped_relationsr   valr   r   r   init_from_existing   s    rw   c                   @   s4   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 re   )rQ   rS   rT   rU   rW   rR   r\   rV   alignment_regularisationalignment_window_sizerY   rX   
low_memoryrZ   r[   r]   random_stater_   r^   r`   ra   rb   rc   transform_seedforce_approximation_algorithmverboserd   ab)selfrQ   rR   rS   rT   rU   rV   rW   r   r   rX   rY   r   rZ   r[   r\   r]   r^   r   r   r   r_   r`   ra   rb   rc   r   r   r   rd   r   r   r   __init__   s:    !zAlignedUMAP.__init__c                    s  d|krt d|d _tjttfks0tt tttjfksHtt d tjksbtd k	rttttjfksttd tjkstnd gt  tj	tttjfkrt dt _
 fddtj
D _jd krd}nj}|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 ]}t%j| j&j| jj	|}d
t'|(  }|| j)tj*dd}|| |d  }||d	k }t+|d	kd	 }|t,|d |t-||g q|.t/t0d)tj1}t2|||	|
|||||j3dd_4t5j4D ]@\}}t6j| jj7dd8 d	k}t9j	tj:||< qS )NrF   <Aligned UMAP requires relations between data to be specifiedr   z6n_components must be a single integer, and cannot varyc                    s   g | ]}t tj|tj|tj|tj|tj|tj|tj|tj	|tj
|tj|jjjjjjjjjjjjjjjjd  | | qS ))rQ   rX   rU   r\   rV   rY   r]   r[   rZ   rd   rR   rS   rT   r   r   r_   r^   r`   ra   rb   rc   r   r   r   r   r   )r   rP   rQ   rX   rU   r\   rV   rY   r]   r[   rZ   rd   rR   rS   rT   r   r   r_   r^   r`   ra   rb   rc   r   r   r   r   r   fitr1   Xr   yr   r   r+   6  s@   









 z#AlignedUMAP.fit.<locals>.<listcomp>   r<   r   ri   C)orderr.   r'   T)lambda_Z
move_other)Zaxis);rO   dict_relations_rH   rI   rJ   AssertionErrorr   rK   r7   rR   	n_models_r9   mappers_rU   r0   r   r?   r   ro   List
empty_listrq   r8   float64appendgraph_rr   rs   tocoorowcolr   rt   rj   RandomStater   rG   r	   Z	_raw_datar;   r(   astyperB   wherer&   Zvstackrandint	INT32_MIN	INT32_MAXint64r
   r   embeddings_	enumerater:   sumflattenr6   nan)r   r   r   
fit_paramsrU   r<   rF   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| | jS re   )r   r   )r   r   r   r   r   r   r   fit_transform  s    zAlignedUMAP.fit_transformc                 K   s  d|krt d|d }t|}t|| j| j| _|  jd7  _tt| j| jt| j| jt| j	| jt| j
| jt| j| jt| j| jt| j| jt| j| jt| j| jt| j| j| j| j| jd||}|  j|g7  _|  jt|g7  _| j	d kr
d}n| 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 }t| jD ]\}}| |j!j" | |j!j# |	 |j!$ j% |
 |j!$ j& |t'| jd kr| t(|j!$ j)| n$| t*j+|j,j-d |d t*jd qt.| j}t/|||}t0| j1d |j!|}| j1 | t*j23| j}|4t5t6d	7t*j8}t9| j1| j1|	|
|||||| j:d

| _1d S )NrF   r   r   )rQ   rX   rU   r\   rV   rY   r]   r[   rZ   rd   rR   r   r   r   r   r   r.   r'   )r   );rO   r   rh   __dict__r   r   rP   rQ   rX   rU   r\   rV   rY   r]   r[   rZ   rd   rR   r   r   r   r   r   r   r   ro   r   r   rq   r8   r   r   r   r   rr   rs   r   r   r   r7   r   rt   r   r6   Z
embedding_r   r?   rG   rw   r   rj   r   r   r   r   r   r   r
   r   )r   r   r   r   Znew_dict_relationsZ
new_mapperrU   r   r   r   r   r   r   r   Znew_relationsZnew_regularisation_weightsZnew_embeddingr   r   r   r   r   update  s        
  zAlignedUMAP.update)ry   r-   rz   NNr@   r{   r|   r'   r}   r@   Fr@   r@   r@   r~   r   NNNFr.   r   Nr   r   FFF)N)N)N)__name__
__module____qualname__r   r   r   r   r   r   r   r   rx      sD                                
B
 
rx   )r'   )&numpyr   r   Zsklearn.baser   Zsklearn.utilsr   r   Zumap.sparser   rD   r   rE   Z
umap.umap_r   r   Zumap.spectralr	   Zumap.layoutsr
   Ziinfor8   minr   r(   r   Znjitr   r   r&   r?   rG   rP   ZPARAM_NAMESrh   rn   rw   rx   r   r   r   r   <module>   s2   


	
*
,
