
    _-PhY                         d Z ddlmZ ddlmZmZmZ ddlZddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZ ddlmZmZ d	d
lmZ d	dlmZ dddifdddifddddifdddifdddfdZd ZdS )z Classical AMG (Ruge-Stuben AMG).    )warn)
csr_matrixisspmatrix_csrSparseEfficiencyWarningN)MultilevelSolver)change_smoothers) classical_strength_of_connection symmetric_strength_of_connection evolution_strength_of_connectiondistance_strength_of_connection#energy_based_strength_of_connectionalgebraic_distanceaffinity_distance)direct_interpolationclassical_interpolation   )split)CR	classicalthetag      ?RSsecond_passFgauss_seidelsweep	symmetric   
   c	                    t          j                    g}
t          |           sH	 t          |           } t	          dt
                     n"# t          $ r}t          d          |d}~ww xY w|                                 } | j	        d         | j	        d         k    rt          d          | |
d         _        t          |
          |k     ra|
d         j        j	        d         |k    rEt          |
||||          }|rn/t          |
          |k     r|
d         j        j	        d         |k    Et          |
fi |	}t          |||           |S )am
  Create a multilevel solver using Classical AMG (Ruge-Stuben AMG).

    Parameters
    ----------
    A : csr_matrix
        Square matrix in CSR format
    strength : str
        Valid strings are ['symmetric', 'classical', 'evolution', 'distance',
        'algebraic_distance','affinity', 'energy_based', None].
        Method used to determine the strength of connection between unknowns
        of the linear system.  Method-specific parameters may be passed in
        using a tuple, e.g. strength=('symmetric',{'theta': 0.25 }). If
        strength=None, all nonzero entries of the matrix are considered strong.
    CF : str or tuple, default 'RS'
        Method used for coarse grid selection (C/F splitting)
        Supported methods are RS, PMIS, PMISc, CLJP, CLJPc, and CR.
    interpolation : str, default 'classical'
        Method for interpolation. Options include 'direct', 'classical'.
    presmoother : str or dict
        Method used for presmoothing at each level.  Method-specific parameters
        may be passed in using a tuple, e.g.
        presmoother=('gauss_seidel',{'sweep':'symmetric}), the default.
    postsmoother : str or dict
        Postsmoothing method with the same usage as presmoother
    max_levels : int, default 30
        Maximum number of levels to be used in the multilevel solver.
    max_coarse : int, default 20
        Maximum number of variables permitted on the coarse grid.
    keep : bool, default False
        Flag to indicate keeping strength of connection (C) in the
        hierarchy for diagnostics.

    Returns
    -------
    ml : MultilevelSolver
        Multigrid hierarchy of matrices and prolongation operators

    Examples
    --------
    >>> from pyamg.gallery import poisson
    >>> from pyamg import ruge_stuben_solver
    >>> A = poisson((10,),format='csr')
    >>> ml = ruge_stuben_solver(A,max_coarse=3)

    Notes
    -----
    "coarse_solver" is an optional argument and is the solver used at the
    coarsest grid.  The default is a pseudo-inverse.  Most simply,
    coarse_solver can be one of ['splu', 'lu', 'cholesky, 'pinv',
    'gauss_seidel', ... ].  Additionally, coarse_solver may be a tuple
    (fn, args), where fn is a string such as ['splu', 'lu', ...] or a callable
    function, and args is a dictionary of arguments to be passed to fn.
    See [2001TrOoSc]_ for additional details.


    References
    ----------
    .. [2001TrOoSc] Trottenberg, U., Oosterlee, C. W., and Schuller, A.,
       "Multigrid" San Diego: Academic Press, 2001.  Appendix A

    See Also
    --------
    aggregation.smoothed_aggregation_solver, MultilevelSolver,
    aggregation.rootnode_solver
    zImplicit conversion of A to CSRzEArgument A must have type csr_matrix, or be convertible to csr_matrixNr   r   zexpected square matrix)r   Levelr   r   r   r   	Exception	TypeErrorasfptypeshape
ValueErrorAlen_extend_hierarchyr   )r&   strengthCFinterpolationpresmootherpostsmoother
max_levels
max_coarsekeepkwargslevelsebottommls                 Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pyamg/classical/classical.pyruge_stuben_solverr7      sw   P $&&'F ! F	F1A2(* * * * 	F 	F 	F > ? ?DEF	F 	


AwqzQWQZ1222F2JL
f++

"
"vbz|'9!'<z'I'I"68RMM 		 f++

"
"vbz|'9!'<z'I'I 
&	+	+F	+	+BRl333Is   $A
 

A)A$$A)c                     d }| d         j         } ||          \  }}|dk    rt          |fi |}	n|dk    rt          |fi |}	ny|dk    rt          |fi |}	ne|dv rt	          |fi |}	nS|dk    rt          |fi |}	n?|dk    rt          |fi |}	n+|d	k    rt          |fi |}	n||}	nt          d|            ||          \  }}|dk    rt          j
        |	fi |}
n|dk    rt          j        |	fi |}
nq|dk    rt          j        |	fi |}
nX|dk    rt          j        |	fi |}
n?|dk    rt          j        |	fi |}
n&|dk    rt          |	fi |}
nt          d|           t!          j        |
          }|t%          |
          k    s|dk    rdS  ||          \  }}|dk    rt'          ||	|
fi |}n(|dk    rt)          ||	|
fi |}nt          d|           |j                                        }|r|	| d         _        |
                    t2                    | d         _        || d         _        || d         _        |                     t=          j                               ||z  |z  }|| d         _         dS )zExtend the multigrid hierarchy.c                 T    t          | t                    r| d         | d         fS | i fS )Nr   r   )
isinstancetuple)vs    r6   
unpack_argz%_extend_hierarchy.<locals>.unpack_arg{   s/    a 	Q41:"u    r   r   r   distance)ode	evolutionenergy_basedr   affinityNz,Unrecognized strength of connection method: r   PMISPMIScCLJPCLJPcr   zUnknown C/F splitting method r   TdirectzUnknown interpolation method F) r&   r
   r	   r   r   r   r   r   r%   r   r   rD   rE   rF   rG   r   npsumr'   r   r   TtocsrCastypebool	splittingPRappendr   r    )r2   r)   r*   r+   r0   r=   r&   fnr1   rM   rP   num_fptsrQ   rR   s                 r6   r(   r(   y   sl     
 	r
A H%%JB	[,Q99&99	{		,Q99&99	z		+A8888	#	#	#,Q99&99	~		/<<V<<	#	#	#q++F++	z		a**6**	LLLMMM BJB	TzzHQ))&))			vJq++F++			wK,,V,,			vJq++F++			wK,,V,,			tqOOFOO		===>>> vi  HC	NN""At M**JB	[#Aq)>>v>>	x Ay;;F;;HHHIII 	
		A  r
$++D11F2JF2JLF2JL MM"(**+++	A	AF2JL5r>   )__doc__warningsr   scipy.sparser   r   r   numpyrI   pyamg.multilevelr   pyamg.relaxation.smoothingr   pyamg.strengthr	   r
   r   r   r   r   r   pyamg.classical.interpolater   r    r   crr   r7   r(    r>   r6   <module>ra      s|   & &       L L L L L L L L L L     - - - - - - 7 7 7 7 7 7* * * * * * * * * * * * * * * * * * V U U U U U U U             "-wo >-!78%0$2Wk4J#K%3g{5K$L"$%b b b bLP P P P Pr>   