o
    h                     @   sf   d dl ZejdddedfddZG dd dZG d	d
 d
eZG dd deZG dd deZdS )    Nweight)
edge_attrsluc                 c   s    dd l }tttd}|  }tj| t||dd}|	|}|| ||d}|j
}	tdd |  D D ]1\}
}|j|	|d}| |
 | |d}|||
|	 < | |||	 < |||
| }||
|ffV  q7d S )	Nr   )fullr   cg)nodelistr   cscdtypec                 s   s     | ]\}}t ||fV  qd S N)sorted).0uv r   ^/var/www/vscode/kcb/lib/python3.10/site-packages/networkx/algorithms/centrality/flow_matrix.py	<genexpr>   s    z"flow_matrix_row.<locals>.<genexpr>g      ?)numpyFullInverseLaplacianSuperLUInverseLaplacianCGInverseLaplaciannumber_of_nodesnxlaplacian_matrixrangeasformatastypewr   edgeszerosgetget_rows)Gr   r
   solvernp
solvernamenLCr   r   r   Bcrowr   r   r   flow_matrix_row   s&   
r,   c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )InverseLaplacianNc                 C   st   dd l a|j\}}|| _|| _|d u r| || _n|| _tj| j|f|d| _|dd dd f | _	| 
| d S )Nr   r	      )r   r$   shaper
   r&   widthr   r   r(   L1init_solver)selfr'   r0   r
   r&   r   r   r   __init__%   s   
zInverseLaplacian.__init__c                 C   s   d S r   r   r3   r'   r   r   r   r2   4   s   zInverseLaplacian.init_solverc                 C   
   t dNzImplement solverr   NetworkXErrorr3   rr   r   r   solve7      
zInverseLaplacian.solvec                 C   r6   r7   r8   r:   r   r   r   solve_inverse:   r=   zInverseLaplacian.solve_inversec                 C   s8   t ||d D ]}| || j|| j dd f< q| jS Nr.   )r   r>   r(   r   )r3   r1r2r;   r   r   r   r!   =   s    zInverseLaplacian.get_rowsc                 C   s.   |  || j|| j dd f< | j|| j  S r?   )r>   r(   r   r:   r   r   r   get_rowB   s   zInverseLaplacian.get_rowc                 C   s^   d}t |D ]&\}}d}t|d }t|dkr,|| }| |  d }t||}q|S )Nr   r.   )	enumerater$   nonzerolenmaxmin)r3   r'   mir+   r   yr   r   r   r   r0   F   s   
zInverseLaplacian.width)NN)
__name__
__module____qualname__r4   r2   r<   r>   r!   rB   r0   r   r   r   r   r-   $   s    
r-   c                   @   $   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s<   t j|j| jd| _t j| j | jdd dd f< d S Nr	   r.   )	r$   r   r/   r
   ILlinalginvr1   todenser5   r   r   r   r2   S   s   (z FullInverseLaplacian.init_solverc                 C   s    t j|j| jd}| j| }|S )Nr	   )r$   r   r/   r
   rQ   r3   rhssr   r   r   r<   W   s   
zFullInverseLaplacian.solvec                 C   s   | j |dd f S r?   )rQ   r:   r   r   r   r>   \   s   z"FullInverseLaplacian.solve_inverseNrL   rM   rN   r2   r<   r>   r   r   r   r   r   R   s    r   c                   @   rO   )r   c                 C   s"   dd l }|jj| j | _d S )Nr   )scipysparserR   
factorizedr1   tocsclusolve)r3   r'   spr   r   r   r2   a   s   z#SuperLUInverseLaplacian.init_solverc                 C   s,   t j| j| jd}d||< | |dd  S rP   )r$   r   r&   r
   r]   r3   r;   rV   r   r   r   r>   f   s   z%SuperLUInverseLaplacian.solve_inversec                 C   s0   t j|j| jd}| |dd  |dd < |S rP   )r$   r   r/   r
   r]   rU   r   r   r   r<   k   s   zSuperLUInverseLaplacian.solveN)rL   rM   rN   r2   r>   r<   r   r   r   r   r   `   s    r   c                   @   rO   )r   c                 C   sD   dd l atjj| j }| jd }tjjj||f|j	d| _
d S )Nr   r.   )r/   matvec)rY   r^   rZ   rR   spilur1   r\   r&   LinearOperatorr<   M)r3   r'   ilur&   r   r   r   r2   r   s   
zCGInverseLaplacian.init_solverc                 C   sD   t j|j| jd}tjjj| j|dd  | j	ddd |dd < |S )Nr	   r.   r   rc   atol)
r$   r   r/   r
   r^   rZ   rR   r   r1   rc   rU   r   r   r   r<   z   s   .zCGInverseLaplacian.solvec                 C   s>   t | j| j}d||< tjjj| j|dd  | j	ddd S )Nr.   r   re   )
r$   r   r&   r
   r^   rZ   rR   r   r1   rc   r_   r   r   r   r>      s   &z CGInverseLaplacian.solve_inverseNrX   r   r   r   r   r   q   s    r   )	networkxr   _dispatchablefloatr,   r-   r   r   r   r   r   r   r   <module>   s   
.