o
    {i#                     @   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g dZedg dZedg dZedg dZe defddZejej ej dddd Z!ejej"j#ej"j#dddd Z$ejej#ej#ej#ej#ej#ej#ej%ej d dd!d" Z&ejej#ej ejd#d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&
dd'd( Z)ejd)d*ej#ej#ej#d+d,d-d. Z*e d/d0 Z+ejd1ej#idd2d3 Z,e dhd4d5Z-ejej#ej d6dd7d8 Z.e d9d: Z/ejd*d;d<d= Z0ejej#ej#d>dd?d@ Z1ejd)d1ej idAdBdC Z2ejd)dDdEdF Z3ejd)d)ej	ej	dGdHdIdJdK Z4ejd)d)ej	ej	dGdHdIdLdM Z5ejd)d)dHdNdOdP Z6ejd)d)dQej	idHdIdRdS Z7ejd)d)dHdNdTdU Z8ejd)d)dHdNdVdW Z9ejd)d)dX	Zdid[d\Z:ejd)d)dXdjd]d^Z;ejd)d)dXed_dYdZdZfd`daZ<ejd)d)dXed_fdbdcZ=ejd)d)dHdNed_fdddeZ>dkdfdgZ?dS )l    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   Q/home/ubuntu/.local/lib/python3.10/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   sp  d}| }|j }|j}	|j}
|j}t||D ]l}|| || |	|
|   |	||    }||k r3|}|}|d8 }|dkrt|	|
|  t|	||  krWt|	|
|  }n	t|	||  }|t|| krpt|| }|t|  k r|}||f  S | }qt|D ]l}|| || |	|
|   |	||    }||k r|}|}|d8 }|dkrt|	|
|  t|	||  krt|	|
|  }n	t|	||  }|t|| krt|| }|t|  k r|}||f  S | }qt|	|
|  t|	||  krt|	|
|  }n	t|	||  }|t|| kr*t|| }|t|  kr4dS ||fS )Nr   r
   )r   r   )r.   r1   r2   r3   ranger;   fabsEPSILON)pivot_block_sizepivot_next_arcsearch_arc_numstate_vectornode_arc_datain_arcmincntr.   r1   r2   r3   rC   cr=   r   r   r   find_entering_arcv   s`   	($($&rQ   )uvc                 C   sJ   | | }|| }||kr!|| || k r|| }n|| }||ks|}|S r:   r   )r2   r3   r   r   rM   rR   rS   joinr   r   r   find_join_node   s   
rU   )rR   r5   r6   r7   firstsecondresultrM   c                 C   s0  |j }|j}|j}|j}|j}|j}	|j}
d}|| tjkr'|| }|| }n|| }|| }t	}d}|}|| krZ|	| }|| rF|| }nt	}||k rR|}|}d}|
| }|| ks9|}|| kr|	| }|| rkt	}n|| }||kry|}|}d}|
| }|| ks`|dkr|}|}n|}|}t
|||||dkS )Nr   r   r
   r   )r2   r3   r0   r!   r    r   r   r   r   INFINITYr4   )rT   rM   rL   spanning_treer2   r3   r0   r!   r    r   r   r6   rV   rW   r8   rX   rR   rC   dr5   r7   r   r   r   find_leaving_arc   sZ   

r\   )rR   rM   valc                 C   sR  |j }|j}|j}|j}|j}	|j}
|j}|jdkr{|| |j }||  |7  < || }|| krR|| r@||	|   |8  < n
||	|   |7  < |
| }|| ks1|| }|| kr{|| ri||	|   |7  < n
||	|   |8  < |
| }|| ksZ|jrt	j
||< ||	|j  dkrt	j||	|j < d S t	j||	|j < d S ||  ||< d S )Nr   )r2   r3   r0   r!   r   r   r    r8   r9   r   r   r6   r   r   )rT   leaving_arc_datarL   rZ   rM   r2   r3   r0   r!   r   r   r    r]   rR   r   r   r   update_flow,  s<   
	
r_   )
rR   wr5   r6   r7   rightstemnew_stempar_stemrM   c                  C   s~  | j }| j}| j}| j}| j}	| j}
| j}|j}|j}|j	}|| }|| }|	| }|| }|	| }|| }||krA||	|  }n|| }| ||< }g }|
| |}||kr|| }|||< |
| || }|||< |||< |||< |}|}|	| |	| kr|| }n|	| }|| }||ksX|||< |||< |||< ||	|< ||kr|||< |||< tt|D ]}|| }|||| < qd}|	| }|}||kr|| }|| ||< |
|  |
|< ||| ||  7 }|||< ||	|< |}||ks|||< ||| k|
|< |||< d}d}|	| |kr|}n|}|}||kr:|	| |kr:|	| |	|< || }||kr:|	| |ks$||krg||krg|}||krf|	| |krf||	|< || }||krf|	| |ksRn$|}||kr|	| |kr|	| |	|< || }||kr|	| |ksu|}||kr||  |7  < || }||ks|}||kr||  |8  < || }||ksd S d S )Nr   r   )r   r   r   r   r   r    r   r6   r5   r7   appendrE   len) rZ   r^   rT   rM   r2   r   r   r   r   r   r    r   r6   r5   r7   old_rev_threadold_succ_numold_last_succv_outrR   ra   lastrb   
dirty_revsrd   rc   r`   itmp_sctmp_lsup_limit_inup_limit_outr   r   r   update_spanning_tree]  s   


	


rr   Talways)rR   r5   r7   )fastmathinlinerD   c                 C   s   |j }|j}|j}|j}| j}| j}	|| r%||	 ||  |||   }
n||	 ||  |||   }
|||  }|}||krQ||  |
7  < || }||ks?d S d S r:   )r   r   r    r   r5   r7   )r^   r1   r.   rZ   r   r   r    r   r5   r7   sigmaendrR   r   r   r   update_potential  s   rx   c                 C   sf   |j |  d }|jr1||jkd@ }||j| 8 }|j| }|| |j|  }|| |j }|| S |S Nr
   )r%   r(   r)   r*   r+   r,   )arcgraphksmallvsubsequence_length2subsequence_numsubsequence_offsetr   r   r   arc_id  s   
r   rm   c           "      C   s  |j }|j}|j}|j}|j}| j}| j}	| j}
| j}|j	}d}g }g }t
|
D ]!}||
| d  }|dkr@||7 }|| q(|dk rI|| q(g }t|dkrt|dkrtj|
tjd}|d }|d }g }d||< || t|dkr|d }|d }|d ||krn<||kr|| |
 nd}t
|d|	 D ]"}||	 }|| rqt|| }t|kr|| d||< || qt|dksynEt
t|D ]>}|| }t}t}t}||kr|| |
 nd}t
|d|	 D ]}|t||  }||k r|}|}q|tkr|t||  qd}t
t|D ]X}|| }|| || |||   |||    dkr4qt|||j|j|} t| |||}!|!jtkrQd|f  S t| |!||| |!jrlt||!| || t|!||| qd|fS )Nr   r
   r   Tr   F)r.   r1   r2   r3   r/   r&   r'   r$   r%   r!   rE   re   rf   r;   zerosbool_popr   rY   MAXINVALIDrU   r   r   r\   r8   r_   r9   rr   rx   )"r{   rL   rZ   r.   r1   r2   r3   r/   n1n2r$   r%   r!   totalsupply_nodesdemand_nodesrR   curr
arc_vectorreachedststackrS   	first_arcr=   jrm   rP   min_costmin_arcrM   rT   r^   r   r   r   construct_initial_pivots'  s   






&r   c           !   
   C   sT  | | }| | }|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 ]&}|||  d ||< ||| |   d |	|< ||7 }||kr|d7 }|}qn/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;   r   uint16onesfloat64int32r   int8maxsqrtrE   r-   r   r#   )!r&   r'   r(   r$   r%   all_node_nummax_arc_numr"   r2   r3   r.   r/   r0   r1   r   r   r    r   r   r   r   r!   r|   r,   r*   r+   r)   rm   r   r=   rL   rZ   r{   r   r   r   allocate_graph_structures  sz   


r   )rR   rC   c                 C   s  | j }| j}|j}|j}|j}|j}|j}	|j}
|j}|j	}|j
}|j}|j}|j}|j}|j}|dkr6dS d}t|D ]}||| 7 }q<t|tkrNdS d}t|D ]}|| |kr`|| }|| dkrjd||< tj||< qT|d | }|}d||< d||< d||< ||d< |d ||< |d ||< | ||< d||< |}t|D ]c}|||< |||< |d ||< |||d < d||< |||< tj||< || dkrd||< d||< ||	|< ||
|< || ||< d||< nd||< |||< ||	|< ||
|< ||  ||< |||< |d7 }qd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   )r{   rL   rZ   r$   r%   r.   r/   r0   r1   r2   r3   r   r   r   r   r   r   r    r!   
net_supplyrm   artificial_costr"   rC   rR   r   r   r   initialize_graph_structures  s   



r   c                 C   sR   t |jD ]!}||jk r| | ||j| d < q|||j  ||j| d < qd S ry   )rE   r$   r&   )left_node_supplyright_node_supplyr{   r/   r&   r   r   r   initialize_supply0  s
   
r   )ru   c                 C   s   ||t | |< d S r:   )r   )rz   cost_valr.   r{   r   r   r   set_cost9  s   r   )rm   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_matrixr{   r.   rm   r   r   r   r   initialize_cost>  s
   &r   )rt   rD   c                 C   s0   d}t | jd D ]}|| | ||  7 }q	|S Nr   r   )rE   r   )r0   r.   rP   rm   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rA|	|krAtj}nHt| j| j|j|j|}t||| |}|jtkr\tjS t||| || |jryt||||| j t|| j| j| t	||
||j
| |\}}
|dks1| j}| j}|tjkrt|j|j|j D ]}|| dkrt|| tkrtj  S d||< qt  }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   rQ   r!   r   rU   r2   r3   r   r   r\   r8   r   r_   r9   rr   rx   r1   r.   r0   rE   r$   r<   rG   r   rY   )rL   rZ   r{   max_iterrH   rJ   solution_statusboundedrM   iter_numberrI   rT   r^   r0   r1   rC   max_potrm   r   r   r   network_simplex_coreM  sx   
$

r   )rA   rX   F)rt   parallelrD   cachec                 C   sP   | | }d}t |jd D ]}|| || ||   }||| 7 }qt|S r   )numbapranger   r;   r   )rR   KrS   yuKrX   rm   rA   r   r   r   right_marginal_error  s   
r   c           	      C   sr   |j |  }d}t|jd D ]$}t|jd D ]}|||f |||f |||f   }||| 7 }qqt|S )Nr   r   r
   )Tr   r   r   rE   r;   r   )	rR   r   rS   r   r   rX   rm   r   rA   r   r   r   right_marginal_error_batch  s   
$
r   )rt   r   r   c                 C   sd   | j d }| j d }t| }t|D ]}t|D ]}|| | ||f  ||  |||f< qq|S r   )r   r;   
empty_liker   r   rE   )r   rR   rS   i_dimj_dimrX   rm   r   r   r   r   transport_plan  s   


&r   rX   c           
      C   sz   | j d }|j d }d}t|D ]%}t|D ]}| | ||  }	|tt|	|| ||   |	 7 }qq|||  S )Nr   r   )r   r   r   rE   r;   float32r<   )
old_uold_vnew_unew_vr   r   rX   rm   r   old_uvr   r   r   relative_change_in_plan  s   

*r   c                 C   sv   | j d }| j d }t| }t|D ]$}|| dkr#d||  }nt}t|D ]}|| ||f  |||f< q)q|S )Nr   r
   r         ?)r   r;   r   r   r   rY   rE   )r   xr   r   rX   rm   x_i_inverser   r   r   r   precompute_K_prime  s   


r   c                 C   sd   | j d }| j d }t| }t|D ]}t|D ]}| ||f | }t| |||f< qq|S r   )r   r;   r   r   r   rE   exp)r.   regularizationr   r   rX   rm   r   scaled_costr   r   r   K_from_cost  s   


r   )rt   r     &.>c                 C   s   t || }|}	|}
t|D ]_}||j|  }tt| r$ ||fS d||  }tt| r8 ||fS |}|}|d dkrVt|	|
||}||krR ||fS |}	|}
|d dkrlt||||}||krl ||fS q||fS )Nr      r   r   )r   rE   r   r;   anyisfiniter   r   )r   r   rR   rS   r   r   error_tolerancechange_toleranceK_primeprev_uprev_v	iterationnext_vnext_urelative_changeerrr   r   r   sinkhorn_iterations  s8   
 r   c                 C   s   t || }t|D ]F}|j|j|  }	tt|	 r! ||fS d||	  }
tt|
 r5 ||fS |
}|	}|d dkrOt||||}||krO ||fS q	||fS )Nr   r   r   )r   rE   r   r;   r   r   r   )r   r   rR   rS   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_yrR   rS   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q|S )N)r.   r   r   r
   r   )r   r   rE   )
r   r   r.   r   r   dim_idim_jrX   rm   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 ]0}t|D ])}|	||f |||f  }t|D ]}||  |||f | |||f  7  < qcqQqK|S )Nr   r
   r   r   )r   r;   r   r   r   r   r   rE   )r   r   r.   r   r   r   
batch_sizerR   rS   r   r   r   rX   rm   r   K_times_costbatchr   r   r   sinkhorn_distance_batchn  s0   






*r   c                    s@   t  }|jd |jd tjdd fdd}|S )Nr   r
   T)rt   c           	         s   t jd  jd}t jd  jd}t }t| ||||\}}t|||}d}tD ]}tD ]}||||f  ||f  7 }q7q1|S )Nr   r   r   )r;   r   r   r   r   r   rE   )	r   r   rR   rS   r   current_planrX   rm   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_onesr   r   _dummy_costrG   r   finfor   rY   r   
dummy_costr   r	   r   r   r#   r-   r4   r   rB   uint32rQ   typesr   rU   uint8r\   r_   r   rr   rx   r   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>   s   
Q

E
0
 


bM
W






X
	


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