U
    |e#                     @   s>  d dl Zd dlZd dlmZ d dlmZmZ ejdej	dZ
ejdej	dZejdejdZdZdZeejjZeejjZejdejdZd	ZG d
d deZG dd deZeddddddddddg	Zeddddddddd d!g	Zed"d#d$d%d&d'd(gZed)d*d+d,d-d.gZe d/efd0d1Zejej ej d2d3d4d5 Z!ejej"j#ej"j#d6d3d7d8 Z$ejej#ej#ej#ej#ej#ej#ej%ej d9d3d:d; Z&ejej#ej ejd<d3d=d> Z'ejej(ej(ej#ej#ej#ej#ej#ej#ej#ej d?
d3d@dA Z)ejdBdCej#ej#ej#dDdEdFdG Z*e dHdI Z+ejdJej#id3dKdL Z,e ddMdNZ-ejej#ej dOd3dPdQ Z.e dRdS Z/ejdCdTdUdV Z0ejej#ej#dWd3dXdY Z1ejdBdJej idZd[d\ Z2ejdBd]d^d_ Z3ejdBdBej	ej	d`dadbdcdd Z4ejdBdBej	ej	d`dadbdedf Z5ejdBdBdadgdhdi Z6ejdBdBdjej	idadbdkdl Z7ejdBdBdadgdmdn Z8ejdBdBdadgdodp Z9ejdBdBdqddtduZ:ejdBdBdqddvdwZ;ejdBdBdqedxdrdsdsfdydzZ<ejdBdBdqedxfd{d|Z=ejdBdBdadgedxfd}d~Z>dddZ?dS )    N)
namedtuple)EnumIntEnum   dtype)r   r   g      <g:0yE>c                   @   s   e Zd ZdZdZdZdZdS )ProblemStatusr      r      N)__name__
__module____qualname__OPTIMALMAX_ITER_REACHED	UNBOUNDED
INFEASIBLE r   r   Z/var/www/website-v5/atlas_env/lib/python3.8/site-packages/pynndescent/optimal_transport.pyr	   4   s   r	   c                   @   s   e Zd ZdZdZdZdS )ArcStater   r   r
   N)r   r   r   STATE_UPPER
STATE_TREESTATE_LOWERr   r   r   r   r   <   s   r   SpanningTreeparentpredthread
rev_threadsucc_num	last_succforwardstaterootDiGraphn_nodesn_arcsnmuse_arc_mixing!num_total_big_subsequence_numberssubsequence_lengthnum_big_subsequencesmixing_coeffNodeArcDatacostsupplyflowpisourcetargetLeavingArcDatau_inu_outv_indeltachangegh㈵>c                 C   s$   t | | }|||t |  kS N)npabs)abrtolatoldiffr   r   r   isclosen   s    rB   )r=   e)localsc                 C   s~  d}| }|j }|j}	|j}
|j}t||D ]}|| || |	|
|   |	||    }||k rf|}|}|d8 }|dkr*t|	|
|  t|	||  krt|	|
|  }nt|	||  }|t|| krt|| }|t|  k r |}||f  S | }q*t|D ]}|| || |	|
|   |	||    }||k rL|}|}|d8 }|dkrt|	|
|  t|	||  krt|	|
|  }nt|	||  }|t|| krt|| }|t|  k r|}||f  S | }qt|	|
|  t|	||  kr.t|	|
|  }nt|	||  }|t|| krbt|| }|t|  krvdS ||fS )Nr   r
   )r   r   )r.   r1   r2   r3   ranger;   fabsEPSILON)pivot_block_sizepivot_next_arcsearch_arc_numZstate_vectornode_arc_datain_arcmincntr.   r1   r2   r3   rC   cr=   r   r   r   find_entering_arcv   s\    	($(

&&rP   )uvc                 C   sD   | | }|| }||kr<|| || k r2|| }q|| }q|}|S r:   r   )r2   r3   r   r   rL   rQ   rR   joinr   r   r   find_join_node   s    

rT   )rQ   r5   r6   r7   firstsecondresultrL   c                 C   s&  |j }|j}|j}|j}|j}|j}	|j}
d}|| tjkrN|| }|| }n|| }|| }t	}d}|}|| kr|	| }|| r|| }nt	}||k r|}|}d}|
| }qj|}|| kr|	| }|| rt	}n|| }||kr|}|}d}|
| }q|dkr
|}|}n|}|}t
|||||dkS )Nr   r   r
   r   )r2   r3   r0   r!   r    r   r   r   r   INFINITYr4   )rS   rL   rK   spanning_treer2   r3   r0   r!   r    r   r   r6   rU   rV   r8   rW   rQ   rC   dr5   r7   r   r   r   find_leaving_arc   sV    




r[   )rQ   rL   valc                 C   sF  |j }|j}|j}|j}|j}	|j}
|j}|jdkr|| |j }||  |7  < || }|| kr|| r||	|   |8  < n||	|   |7  < |
| }qZ|| }|| kr|| r||	|   |7  < n||	|   |8  < |
| }q|jr4t	j
||< ||	|j  dkr"t	j||	|j < nt	j||	|j < n||  ||< d S )Nr   )r2   r3   r0   r!   r   r   r    r8   r9   r   r   r6   r   r   )rS   leaving_arc_datarK   rY   rL   r2   r3   r0   r!   r   r   r    r\   rQ   r   r   r   update_flow,  s8    



r^   )
rQ   wr5   r6   r7   rightstemnew_stempar_stemrL   c                  C   s2  | j }| j}| j}| j}| j}	| j}
| j}|j}|j}|j	}|| }|| }|	| }|| }|	| }|| }||kr||	|  }n|| }| ||< }g }|
| |}||kr"|| }|||< |
| || }|||< |||< |||< |}|}|	| |	| kr|| }n|	| }|| }q|||< |||< |||< ||	|< ||kr\|||< |||< tt|D ]}|| }|||| < qhd}|	| }|}||kr|| }|| ||< |
|  |
|< ||| ||  7 }|||< ||	|< |}q|||< ||| k|
|< |||< d}d}|	| |kr(|}n|}|}||kr`|	| |kr`|	| |	|< || }q0||kr||kr|}||kr|	| |kr||	|< || }qxn4|}||kr|	| |kr|	| |	|< || }q|}||kr||  |7  < || }q|}||kr.||  |8  < || }qd S )Nr   r   )r   r   r   r   r   r    r   r6   r5   r7   appendrE   len) rY   r]   rS   rL   r2   r   r   r   r   r   r    r   r6   r5   r7   Zold_rev_threadZold_succ_numZold_last_succZv_outrQ   r`   lastra   Z
dirty_revsrc   rb   r_   iZtmp_scZtmp_lsZup_limit_inZup_limit_outr   r   r   update_spanning_tree]  s    








rh   Talways)rQ   r5   r7   )fastmathinlinerD   c                 C   s   |j }|j}|j}|j}| j}| j}	|| rJ||	 ||  |||   }
n||	 ||  |||   }
|||  }|}||kr||  |
7  < || }qvd S r:   )r   r   r    r   r5   r7   )r]   r1   r.   rY   r   r   r    r   r5   r7   sigmaendrQ   r   r   r   update_potential  s    rn   c                 C   sj   |j |  d }|jrb||jkd@ }||j| 8 }|j| }|| |j|  }|| |j }|| S |S d S Nr
   )r%   r(   r)   r*   r+   r,   )arcgraphkZsmallvZsubsequence_length2Zsubsequence_numZsubsequence_offsetr   r   r   arc_id  s    
rs   rg   c           "      C   s  |j }|j}|j}|j}|j}| j}| j}	| j}
| j}|j	}d}g }g }t
|
D ]B}||
| d  }|dkr||7 }|| qP|dk rP|| qPg }t|dkrt|dkrtj|
tjd}|d }|d }g }d||< || t|dkr,|d }|d }|d ||kr q,||kr6|| |
 nd}t
|d|	 D ]L}||	 }|| rbqHt|| }t|krH|| d||< || qHqnt
t|D ]}|| }t}t}t}||kr|| |
 nd}t
|d|	 D ]&}|t||  }||k r|}|}q|tkr|t||  qd}t
t|D ]}|| }|| || |||   |||    dkrzq<t|||j|j|} t| |||}!|!jtkrd|f  S t| |!||| |!jr<t||!| || t|!||| q<d|fS )Nr   r
   r   Tr   F)r.   r1   r2   r3   r/   r&   r'   r$   r%   r!   rE   rd   re   r;   zerosbool_poprs   rX   MAXINVALIDrT   r   r   r[   r8   r^   r9   rh   rn   )"rq   rK   rY   r.   r1   r2   r3   r/   n1n2r$   r%   r!   totalZsupply_nodesZdemand_nodesrQ   currZ
arc_vectorZreachedststackrR   Z	first_arcr=   jrg   rO   Zmin_costZmin_arcrL   rS   r]   r   r   r   construct_initial_pivots'  s    








&    r   c           !   
   C   s\  | | }| | }|d }|d|  }|}t j|t jd}t j|t jd}	t j|t jd}
t j|t jd}t j|t jd}t j|t jd}t j|t jd}t j|t jd}t j|t jd}t j|t jd}t j|t jd}t j|t jd}t j|t jd}t j|t jd}|rtt t 	|d}|}|| d }|| }|| }d}d}t
|d ddD ]P}|||  d ||< ||| |   d |	|< ||7 }||kr\|d7 }|}q\n`d}d}d}d}d}t
|d ddD ]:}|||  d ||< ||| |   d |	|< |d7 }qt|
|||||	}t|||||||||	}t||| ||||||	} ||| fS )Nr
   r   r   
   r   r   )r;   rt   uint16onesfloat64int32ru   int8maxsqrtrE   r-   r   r#   )!r&   r'   r(   r$   r%   Zall_node_numZmax_arc_numr"   r2   r3   r.   r/   r0   r1   r   r   r    r   r   r   r   r!   rr   r,   r*   r+   r)   rg   r   r=   rK   rY   rq   r   r   r   allocate_graph_structures  s    

        r   )rQ   rC   c                 C   s  | j }| j}|j}|j}|j}|j}|j}	|j}
|j}|j	}|j
}|j}|j}|j}|j}|j}|dkrldS d}t|D ]}||| 7 }qxt|tkrdS d}t|D ]6}|| |kr|| }|| dkrd||< tj||< q|d | }|}d||< d||< d||< ||d< |d ||< |d ||< | ||< d||< |}t|D ]}|||< |||< |d ||< |||d < d||< |||< tj||< || dkrd||< d||< ||	|< ||
|< || ||< d||< n6d||< |||< ||	|< ||
|< ||  ||< |||< |d7 }qFdS )Nr   F        r
   r   T)r$   r%   r.   r/   r0   r1   r2   r3   r   r   r   r   r   r   r    r!   rE   r;   rF   NET_SUPPLY_ERROR_TOLERANCEr   r   r   )rq   rK   rY   r$   r%   r.   r/   r0   r1   r2   r3   r   r   r   r   r   r   r    r!   Z
net_supplyrg   Zartificial_costr"   rC   rQ   r   r   r   initialize_graph_structures  s    


r   c                 C   sR   t |jD ]B}||jk r0| | ||j| d < q
|||j  ||j| d < q
d S ro   )rE   r$   r&   )Zleft_node_supplyZright_node_supplyrq   r/   r&   r   r   r   initialize_supply0  s    
r   )rk   c                 C   s   ||t | |< d S r:   )rs   )rp   Zcost_valr.   rq   r   r   r   set_cost9  s    r   )rg   r   c                 C   sP   t | jd D ]<}t | jd D ](}t|| jd  | | ||f || q qd S Nr   r
   )rE   shaper   )cost_matrixrq   r.   rg   r   r   r   r   initialize_cost>  s    r   )rj   rD   c                 C   s0   d}t | jd D ]}|| | ||  7 }q|S Nr   r   )rE   r   )r0   r.   rO   rg   r   r   r   
total_costE  s    r   )nogilc                 C   s  t tt|jd}|j}tj}t|| |\}}|s>tjS d}	t	|d||j
| |\}}
|dkr|	d7 }	|dkr|	|krtj}qt| j| j|j|j|}t||| |}|jtkrtjS t||| || |jrt||||| j t|| j| j| t	||
||j
| |\}}
qZ| j}| j}|tjkrxt|j|j|j D ]:}|| dkr<t|| tkrltj  S d||< q<t  }t|jD ]}|| |kr|| }q|dkrt|jD ]}||  |8  < q|S )Nr   r   r
   )!r   r;   r   r   r%   r	   r   r   r   rP   r!   r   rT   r2   r3   r   r   r[   r8   rw   r^   r9   rh   rn   r1   r.   r0   rE   r$   r<   rG   r   rX   )rK   rY   rq   max_iterrH   rJ   Zsolution_statusboundedrL   Ziter_numberrI   rS   r]   r0   r1   rC   Zmax_potrg   r   r   r   network_simplex_coreM  s         

       
	

r   )rA   rW   F)rj   parallelrD   cachec                 C   sP   | | }d}t |jd D ](}|| || ||   }||| 7 }qt|S r   )numbapranger   r;   r   )rQ   KrR   yuKrW   rg   rA   r   r   r   right_marginal_error  s    r   c           	      C   sr   |j |  }d}t|jd D ]H}t|jd D ]4}|||f |||f |||f   }||| 7 }q0qt|S )Nr   r   r
   )Tr   r   r   rE   r;   r   )	rQ   r   rR   r   r   rW   rg   r   rA   r   r   r   right_marginal_error_batch  s    
$r   )rj   r   r   c                 C   sd   | j d }| j d }t| }t|D ]6}t|D ](}|| | ||f  ||  |||f< q4q(|S r   )r   r;   
empty_liker   r   rE   )r   rQ   rR   i_dimj_dimrW   rg   r   r   r   r   transport_plan  s    


(r   rW   c           
      C   sz   | j d }|j d }d}t|D ]J}t|D ]<}| | ||  }	|tt|	|| ||   |	 7 }q.q"|||  S )Nr   r   )r   r   r   rE   r;   float32r<   )
Zold_uZold_vZnew_unew_vr   r   rW   rg   r   Zold_uvr   r   r   relative_change_in_plan  s    

,r   c                 C   sv   | j d }| j d }t| }t|D ]H}|| dkrFd||  }nt}t|D ]}|| ||f  |||f< qRq(|S )Nr   r
   r         ?)r   r;   r   r   r   rX   rE   )r   xr   r   rW   rg   Zx_i_inverser   r   r   r   precompute_K_prime  s    


r   c                 C   sd   | j d }| j d }t| }t|D ]6}t|D ](}| ||f | }t| |||f< q4q(|S r   )r   r;   r   r   r   rE   exp)r.   regularizationr   r   rW   rg   r   Zscaled_costr   r   r   K_from_cost  s    


r   )rj   r     &.>c                 C   s   t || }|}	|}
t|D ]}||j|  }tt| rB qd||  }tt| rd q|}|}|d dkrt|	|
||}||kr q|}	|}
|d dkrt||||}||kr qq||fS )Nr      r   r   )r   rE   r   r;   anyisfiniter   r   )r   r   rQ   rR   r   r   error_tolerancechange_toleranceK_primeZprev_uZprev_v	iterationnext_vnext_uZrelative_changeerrr   r   r   sinkhorn_iterations  s.    
r   c                 C   s   t || }t|D ]z}|j|j|  }	tt|	 r< qd||	  }
tt|
 r^ q|
}|	}|d dkrt||||}||kr qq||fS )Nr   r   r   )r   rE   r   r;   r   r   r   )r   r   rQ   rR   r   r   r   r   r   r   r   r   r   r   r   sinkhorn_iterations_batch%  s    
r   r   c              
   C   sr   | j d }|j d }tj|d| |jd}	tj|d| |jd}
t||}t| ||	|
||||d\}	}
t||	|
S )Nr   r   r   )r   r   r   )r   r;   fullr   r   r   r   )r   r   r.   r   r   r   r   dim_xdim_yrQ   rR   r   r   r   r   sinkhorn_transport_planA  s     




r   c           
      C   sd   t | |||d}|jd }|jd }d}t|D ].}t|D ] }	||||	f |||	f  7 }q<q0|S )N)r.   r   r   r
   r   )r   r   rE   )
r   r   r.   r   r   dim_idim_jrW   rg   r   r   r   r   sinkhorn_distance_  s       

 r   c              
   C   s   | j d }|j d }|j d }tj||fd| |jd}tj||fd| |jd}t||}	t| ||||	\}}|	j d }
|	j d }t|}t|
D ]`}t|D ]R}|	||f |||f  }t|D ],}||  |||f | |||f  7  < qqq|S )Nr   r
   r   r   )r   r;   r   r   r   r   rt   rE   )r   r   r.   r   r   r   
batch_sizerQ   rR   r   r   r   rW   rg   r   ZK_times_costbatchr   r   r   sinkhorn_distance_batchn  s,    






.r   c                    s@   t  }|jd |jd tjdd fdd}|S )Nr   r
   T)rj   c           	         s   t jd  jd}t jd  jd}t }t| ||||\}}t|||}d}tD ].}tD ] }||||f  ||f  7 }qnqb|S )Nr   r   r   )r;   r   r   r   r   r   rE   )	r   r   rQ   rR   r   Zcurrent_planrW   rg   r   r.   r   r   r   r   r   closure  s     
 z2make_fixed_cost_sinkhorn_distance.<locals>.closure)r   r   r   njit)r.   r   r   r   r   r   r   !make_fixed_cost_sinkhorn_distance  s    



r   )T)r   r   r   )r   r   )r   )@numpyr;   r   collectionsr   enumr   r   eyer   _mock_identityr   
_mock_onesrt   r   _dummy_costrG   r   finfor   rX   rw   Z
dummy_costrx   r	   r   r   r#   r-   r4   r   rB   uint32rP   typesr   rT   uint8r[   r^   r   rh   rn   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s4   
Q

E
0
 


bM
W






X
	





     )