U
    ÅmœdÌJ  ã                   @   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r¶t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r‚qV| || |  }	||| |  }
t|jd ƒD ]Î}||||f }|dk rÌq°||| ||d  …  ¡ }|||f | }||dk }|
|	| |	|d  … }|t||||f ƒ }t||ƒjd }t	||ƒjd }|dk�rp|| ||||f< q°d||||f< q°qVq2|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rÌt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ç{®Gáz„?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	ržtˆƒtttjfks‚t‚tˆƒd tˆjƒks¬t‚nd gtˆ ƒ ‰tˆj	ƒtttjfkrÊt 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 |ƒ¡ �q¶t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�¡ �q¦t.| jƒ}t/|||ƒ}t0| j1d |j!|ƒ}| j1  |¡ t*j2 3| 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   


	
*
,
