U
    ֽ|eJ                     @   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   dtypeTF)setnpemptyshapeuint8numbaprange)arrZtest_setresulti r   N/var/www/website-v5/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   linalg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 ]|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   r0   /   s     r      r   c                 S   s   g | ]}t |qS r   )r"   r/   r   r   r   r0   8   s     r   c                    s    g | ]}    |d qS )r3   getr   n)r   jrelation_dictsr   r   r0   B   s     c                    s$   g | ]}  d    |dqS )r   r3   r4   r6   )r   r8   reverse_relation_dictsr   r   r0   N   s     )
r-   r   fulllenint32ranger   arangearrayabs)r9   window_sizemax_n_samplesr   Zresult_indexmappingkr   )r   r8   r9   r:   r   expand_relations+   sH    

rF   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   r2   r         ?)
r   zerosr   float32r>   r<   copyr   intersect1dunion1d)Zgraphs_indptrZgraphs_indices	relationsr   Zcenter_indexr   Zbase_graph_indptrZbase_graph_indicesr8   Zcomparison_graph_indptrZcomparison_graph_indicesrE   Zcomparison_indexZraw_base_graph_indicesZbase_indicesZcomparison_indicesZintersection_sizeZ
union_sizer   r   r   build_neighborhood_similaritiesU   sJ    $ 

 

rN   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_valr7   r   r   r   get_nth_item_or_val   s    rW   )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)rO   rP   rQ   r   rR   )
new_paramsZexisting_paramsZn_modelsparam_namesparamr   r   r   set_aligned_params   s    rp   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   rH   rI   r>   randomuniform)previous_embeddingZweights_indptrZweights_indicesZweights_dataZrelation_dict	n_samples
n_featuresr   r   normalisationidxr8   r   r   r   init_from_existing_internal   s$    
ry   c                 C   sT   t jjt jjt jj}| D ]\}}t||t|< q t| |j	|j
|j|S rl   )r   typedDictr   typesr=   r    r   ry   indptrindicesdata)rt   graphrM   Ztyped_relationsr   valr   r   r   init_from_existing   s    r   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   r2   	euclideanNrG   spectral{Gz?r,   皙?F         @r3   categorical      ?*   c                 C   s   || _ || _|| _|| _|| _|| _|| _|| _|| _|	| _	|| _
|
| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _d S rl   )rX   rZ   r[   r\   r^   rY   rc   r]   alignment_regularisationalignment_window_sizer`   r_   
low_memoryra   rb   rd   random_staterf   re   rg   rh   ri   rj   transform_seedforce_approximation_algorithmverboserk   ab)selfrX   rY   rZ   r[   r\   r]   r^   r   r   r_   r`   r   ra   rb   rc   rd   re   r   r   r   rf   rg   rh   ri   rj   r   r   r   rk   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 )NrM   <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 ))rX   r_   r\   rc   r]   r`   rd   rb   ra   rk   rY   rZ   r[   r   r   rf   re   rg   rh   ri   rj   r   r   r   r   r   )r   rW   rX   r_   r\   rc   r]   r`   rd   rb   ra   rk   rY   rZ   r[   r   r   rf   re   rg   rh   ri   rj   r   r   r   r   r   fitr6   Xr   yr   r   r0   6  s@   









 z#AlignedUMAP.fit.<locals>.<listcomp>   rB   r   rq   C)orderr3   r,   T)lambda_
move_other)axis);rV   dict_relations_rO   rP   rQ   AssertionErrorr   rR   r<   rY   	n_models_r>   mappers_r\   r5   r   rF   r   rz   List
empty_listr|   r=   float64appendgraph_r}   r~   tocoorowcolr   r   rr   RandomStater   rN   r	   	_raw_datarA   r-   astyperI   wherer+   vstackrandint	INT32_MIN	INT32_MAXint64r
   r   embeddings_	enumerater@   sumflattenr;   nan)r   r   r   
fit_paramsr\   rB   rM   indptr_listindices_listheadstailsepochs_per_samplesmapperrng_state_transformregularisation_weightsZ
first_init	expansionZfirst_embeddingZ
embeddingsr   Z	next_initZnext_embeddingZanchor_dataZleft_anchorsZright_anchorsseed_triplet	embeddingdisconnected_verticesr   r   r   r     s    

 


$


 zAlignedUMAP.fitc                 K   s   | j ||f| | jS rl   )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 )NrM   r   r   )rX   r_   r\   rc   r]   r`   rd   rb   ra   rk   rY   r   r   r   r   r   r3   r,   )r   );rV   r   rp   __dict__r   r   rW   rX   r_   r\   rc   r]   r`   rd   rb   ra   rk   rY   r   r   r   r   r   r"   r   rz   r   r   r|   r=   r   r   r   r   r}   r~   r   r   r   r<   r   r   r   r;   
embedding_r   rF   rN   r   r   rr   r   r   r   r   r   r   r
   r   )r   r   r   r   Znew_dict_relationsZ
new_mapperr\   r   r   r   r   r   r   r   Znew_relationsZnew_regularisation_weightsZnew_embeddingr   r   r   r   r   update  s        
  zAlignedUMAP.update)r   r2   r   NNrG   r   r   r,   r   rG   FrG   rG   rG   r   r   NNNFr3   r   Nr   r   FFF)N)N)N)__name__
__module____qualname__r   r   r   r   r   r   r   r   r      sD                                
B
 
r   )r,   )&numpyr   r   sklearn.baser   sklearn.utilsr   r   umap.sparser   rK   r   rL   Z
umap.umap_r   r   umap.spectralr	   umap.layoutsr
   iinfor=   minr   r-   r   njitr   r"   r+   rF   rN   rW   ZPARAM_NAMESrp   ry   r   r   r   r   r   r   <module>   s2   


	
*
,
