o
    ]Zh                     @   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)Z
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)Znodelistr   Zcscdtypec                 s   s     | ]\}}t ||fV  qd S N)sorted).0uv r   Y/var/www/auris/lib/python3.10/site-packages/networkx/algorithms/centrality/flow_matrix.py	<genexpr>   s    z"flow_matrix_row.<locals>.<genexpr>g      ?)numpyFullInverseLaplacianSuperLUInverseLaplacianCGInverseLaplacianZnumber_of_nodesnxZlaplacian_matrixrangeZasformatZastypewr	   edgeszerosgetget_rows)Gr   r   ZsolvernpZ
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   r'   r   r   r   r   r   __init__%   s   
zInverseLaplacian.__init__c                 C   s   d S r   r   r*   r   r   r   r   r)   4   s   zInverseLaplacian.init_solverc                 C   
   t dNzImplement solverr   ZNetworkXErrorr*   rr   r   r   solve7      
zInverseLaplacian.solvec                 C   r-   r.   r/   r0   r   r   r   solve_inverse:   r3   zInverseLaplacian.solve_inversec                 C   s8   t ||d D ]}| || j|| j dd f< q| jS Nr%   )r   r4   r   r   )r*   r1r2r1   r   r   r   r   =   s    zInverseLaplacian.get_rowsc                 C   s.   |  || j|| j dd f< | j|| j  S r5   )r4   r   r   r0   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   Znonzerolenmaxmin)r*   r   mir"   r   yr   r   r   r   r'   F   s   
zInverseLaplacian.width)NN)
__name__
__module____qualname__r+   r)   r2   r4   r   r8   r'   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invr(   Ztodenser,   r   r   r   r)   S   s   (z FullInverseLaplacian.init_solverc                 C   s    t j|j| jd}| j| }|S )Nr   )r   r   r&   r   rF   r*   rhssr   r   r   r2   W   s   
zFullInverseLaplacian.solvec                 C   s   | j |dd f S r5   )rF   r0   r   r   r   r4   \   s   z"FullInverseLaplacian.solve_inverseNrA   rB   rC   r)   r2   r4   r   r   r   r   r   R   s    r   c                   @   rD   )r   c                 C   s"   dd l }|jj| j | _d S )Nr   )scipysparserG   Z
factorizedr(   tocsclusolve)r*   r   spr   r   r   r)   a   s   z#SuperLUInverseLaplacian.init_solverc                 C   s,   t j| j| jd}d||< | |dd  S rE   )r   r   r   r   rP   r*   r1   rJ   r   r   r   r4   f   s   z%SuperLUInverseLaplacian.solve_inversec                 C   s0   t j|j| jd}| |dd  |dd < |S rE   )r   r   r&   r   rP   rI   r   r   r   r2   k   s   zSuperLUInverseLaplacian.solveN)rA   rB   rC   r)   r4   r2   r   r   r   r   r   `   s    r   c                   @   rD   )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&   Zmatvec)rM   rQ   rN   rG   Zspilur(   rO   r   ZLinearOperatorr2   M)r*   r   Zilur   r   r   r   r)   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   rS   Zatol)
r   r   r&   r   rQ   rN   rG   r   r(   rS   rI   r   r   r   r2   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   rT   )
r   r   r   r   rQ   rN   rG   r   r(   rS   rR   r   r   r   r4      s   &z CGInverseLaplacian.solve_inverseNrL   r   r   r   r   r   q   s    r   )	Znetworkxr   Z_dispatchablefloatr#   r$   r   r   r   r   r   r   r   <module>   s   
.