
    _-Ph                        d Z ddlZddlmZmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZ ddlmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ eZ eZ!eZ"eZ# G d de          Z$ G d de          Z%ddZ&d Z'ddZ(ddZ)dS )zTest strength of connection.    N)TestCaseassert_equalassert_array_almost_equalassert_array_equalassert_allclose)sparse)poissonlinear_elasticityload_examplestencil_grid) classical_strength_of_connection symmetric_strength_of_connection evolution_strength_of_connectiondistance_strength_of_connection)incomplete_mat_mult_csr)approximate_spectral_radius)
scale_rows)set_tolc                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestStrengthOfConnectionc           	      :   g | _         t          j                            d           dD ]L}| j                             t          j        t          j                            ||                               MdD ],}| j                             t          |fd                     -dD ]-}| j                             t          ||fd                     .dD ]C}t          |          }| j                             |d         
                                           Dd S )	Ni@         r   r   r      
         csrformatr   r   r   	   knotairfoilbarA)casesnprandomseedappendr   
csr_matrixrandr	   r   tocsr)selfNnameexs       Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pyamg/tests/test_strength.pysetUpzTestStrengthOfConnection.setUp   s!   
 		y!!! 	G 	GAJf/	q!0D0DEEFFFF * 	; 	;AJgqd5999:::: 	= 	=AJgq!fU;;;<<<<. 	/ 	/Dd##BJbgmmoo....	/ 	/    c                 2   | j         D ]u}dD ]p}t          ||          }t          ||          }t          |j        |j                   t          |                                |                                           qvdd l}|                    dd           t          j
        t          j        g dg dg dg d	g d
g dg                    }|                    d          }t          |ddd                                          }t          |d         t          j        t          j        |j        d         |j        d         z                                                      dz             t          |ddd          }t          |j        d           t          |ddd          }t          |j        d           t          |ddd                                          }t          |d         d           t          |d         d           t          |ddd                                          }t          |d         d           t          |d         d           t          |d          d!           t          |dd"d                                          }t          |dd"d                                          }	t          ||	           t          |dd"d                                          }t          |d         d           t          |d#         d           t          |d         d           t          |ddd                                          }t          |dd"d                                          }	t          ||	           d S )$N        g?g      ?      ??r   ignorezImplicit conversion*)actionmessage)      @      皙      ?r<   r<   )grD   rC   r<         #@r<   )gffffffgffffff@      @g      r<   r<   )r<   grC   r<   r<   rG   )r<   r<   rE   r<   g      #rE   )r<   r<   r<   rC   rC   rE   r   r   	blocksize皙?Tfro)blocknormr   r   g     V@r   r>      absg(?)r   r   rE   min)r   r   r<   )r      g(?rS   r   gffffff?F)r   rS   )r+   classical_socreference_classical_socr   nnzr   toarraywarningsfilterwarningsr   r0   r,   arraytobsrr   sumrQ   dataflatten)
r3   r*   thetaresultexpectedrY   CSRtestBSRtestresult1result2s
             r7   %test_classical_strength_of_connectionz>TestStrengthOfConnection.test_classical_strength_of_connection+   s    	P 	PA6 P P&q%0021e<<VZ666)&..*:*:H<L<L<N<NOOOOP 	x9OPPP#BH.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.S %T %T U U --&-11 w4eDDDLLNNtrvgl1ogl1o&EFFNNPPQQTZZ	\ 	\ 	\ w4eDDDVZ###w4eDDDVZ### w4eDDDLLNNtg...tc***w4eDDDLLNNtc***tf---te,,,  EFFFNNPPEFFFNNPP!'7333w5uEEEMMOOtc***tc***tc***  DuEEEMMOOEFFFNNPP!'733333r9   c                    | j         D ]y}dD ]t}t          ||d          }t          ||d          }t          |j        |j                   t          |                                |                                           uzd S )Nr;   rR   )rN   r+   rU   rV   r   rW   r   rX   r3   r*   r`   ra   rb   s        r7   )test_classical_strength_of_connection_minzBTestStrengthOfConnection.test_classical_strength_of_connection_minf   s     	P 	PA6 P P&q%e<<<21e%HHHVZ666)&..*:*:H<L<L<N<NOOOOP	P 	Pr9   c                     | j         D ]u}dD ]p}t          ||          }t          ||          }t          |j        |j                   t          |                                |                                           qvd S N)r<   rK   r=   rE   g      $@)r+   symmetric_socreference_symmetric_socr   rW   r   rX   rj   s        r7   %test_symmetric_strength_of_connectionz>TestStrengthOfConnection.test_symmetric_strength_of_connectiono   s     	P 	PA3 P P&q%0021e<<VZ666)&..*:*:H<L<L<N<NOOOOP	P 	Pr9   c                    t          d          }g }|                    |d                                         |d         f           |D ]|\  }}dD ]t}t          |||          }t	          |||          }t          |j        |j                   t          |                                |                                           u}|D ]~\  }}dD ]v}t          |||d          }t	          |||d          }t          |j        |j                   t          |                                |                                           wd S )	Nr(   r*   vertices)      ?       @g      @)r`   )r=   rE   rs   F)r`   relative_drop)	r   r/   r2   distance_socreference_distance_socr   rW   r   rX   )r3   r^   r+   r*   Vr`   ra   rb   s           r7   $test_distance_strength_of_connectionz=TestStrengthOfConnection.test_distance_strength_of_connectionx   s|   I&&d3ioo''j)9:;;; 	P 	PFQ( P P%a%8881!QeDDDVZ666)&..*:*:H<L<L<N<NOOOO	P  	P 	PFQ( P P%a%uMMM1!Qe@EG G GVZ666)&..*:*:H<L<L<N<NOOOOP	P 	Pr9   c                 ,   g }t          j        t          j        dgg                    }t          j        t          j        dgg                    }t          j        t          j        dgg                    }t          j        t          j        dgg                    }|                    |||f           |                    |||f           |                    |||f           |                    |||f           t          j        t          j        ddgddgg                    }t          j        t          j        ddgddgg                    }t          j        t          j        ddgddgg                    }t          j        t          j        ddgddgg                    }t          j        t          j        d          t          j        g d	          t          j        g d
          ffd          }|                    |||f           |                    |||f           |                    |||f           |                    |||f           t          j        t          j        d          t          j        g d          t          j        g d          ffd          }|                    |||f           |                    |||f           |                    |||f           |                    |||f           t          j        t          j        d          t          j        ddg          t          j        ddg          ffd          }|                    |||f           |                    |||f           |                    |||f           |                    |||f           t          j        g dg dg dg dg dg          }|                                }d|d<   d|d<   |                                }d|dd d f<   |                                }d|d d df<   t          j        |          }t          j        |          }t          j        |          }t          j        |          }|                                }d|j        d d <   |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           d|j        d<   d|j        d<   d|j        d<   d|j        d<   |                                 |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           t          dd !          }|                                }d"|j        d<   d#|j        d$<   d%|j        d&<   t          j        t          j
        |j                            }|                                }d|j        d d <   |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           t          j        g d'g d(g d)g d*g d+g          }|                                }d,|d<   d-|d<   t          j        |          }t          j        |          }|                                }d|j        d d <   |                    |||f           |                    |||f           |                    |||f           |                    |||f           |D ]}	|	d                                         }|	d                                         }|	d                                         }|                                 |                                 |                                 |                                }
t          |j        |j        |j        |j        |j        |j        |
j        |
j        |
j        |j        d         
  
         |
                                 ||z                      |          }|                                 |                                 t'          |j        |
j                   t)          |j        |
j                   t)          |j        |
j                   d S ).Ng?rE   r<   rt   rB   g?gffffff@   )r   r   rS   rS   )r   rS   r   rS   rH   shaper   )r   r   rS   )r   rS   rS   r   r   rS   )r<   fffff0@皙@r<   333333@)r~   g+@@r<   rF   )r   r   g      (@ffffff@皙@)r<   r<   r   r<   r<   )r   rF   r   r<   g      *@g@rT   g333333$@)r   r   r   r%      r   r   r!   r"   g      @g333333'@r   g	   )                y        fffff0@y@333333?r   r   )yfffff0@        y+@        y@        r   y              #@)y        @y@333333 y      (@        ffffff@        y@        )r   r   r   r   r   )y333333@        y            #@y	r   y      *@        y@yffffff#@333333$)r   r0   r,   r[   r/   onescopyr^   eliminate_zerosr	   zerosr}   r2   tocscsort_indicesr   indptrindicesmultiplyr   r   )r3   r+   r*   BA2maskB2CA3casera   exacts               r7   test_incomplete_mat_mult_csrz5TestStrengthOfConnection.test_incomplete_mat_mult_csr   s	     bhw//00bhw//00rx"//00 B4&!1!122aD\"""aD\"""aT]###b"d^$$$ bhR2r(';<<==bhb	C9'=>>??rx#rRH(=>>??rx#rRH(=>>?? "'!**rx/E/E/1x/E/E/G "HOUW W WaD\"""aD\"""b"d^$$$b"d^$$$ "'!**rx			/B/B/1x			/B/B/D "ELRT T TaD\"""aD\"""b"d^$$$b"d^$$$ "'!**rxA/?/?/1xA/?/?/A "BIOQ Q QaD\"""aD\"""b"d^$$$b"d^$$$ H///000///,,,...	0 1 1
 FFHH$$VVXX1aaa4WWYY111a4a  r""r""a  vvxx	!!!aD\"""aD\"""b"d^$$$b"d^$$$aT]###b!T]###aD\"""aD\"""	!	!	!	"aD\"""aD\"""b"d^$$$b"d^$$$aT]###b!T]###aD\"""aD\""" F5)))FFHHq	r
r
bhqw//00vvxx	!!!aD\"""aD\"""aD\"""aD\"""aD\"""aD\""" HPPPPPPPPPMMMRRR	T U U
 FFHH$$a  a  vvxx	!!!aD\"""aD\"""aD\"""aD\""" 	> 	>DQAQA7==??DNNNNYY[[F#AHai$%Iqvv}$*NFKM M M ""$$$qSNN4((E   !!###%ej&+>>>u|V];;;u}fn====#	> 	>r9   c           	         g }dD ]t}t          |fd          }t          j        |j        d         df          }|                    |                                |                                dddd	           ud
D ]}t          j        ||z            }t          j        | d|z  d|z  d|z  | g| ddd|g||z  ||z  d          }t          j        |j        d         df          }|                    |                                |                                dddd	           d
D ]W}t          ||fd          \  }}|                    |                                |                                dddd	           Xt          d          }|d         
                                }t          j        |j        d         df          }|                    |                                |                                dddd	           |                    d          }|                    |                                |                                dddd	           t          j        dd|j        d         z  dz   t                                        dd          }|                    |                                |                                dddd	           |                    |                                |                                dddd	           d|j        |j        d         |j        d         <   |                                }d|j        |j        d         |j        d         <   |                                 |
                                }|                                 |                    |                                |                                dddd	           |                    d          }|                    |                                |                                dddd	           |D ]}t          j                            d           t-          |d         |d         |d         |d         |d         d !          }	t          j                            d           t/          |d         |d         |d         |d         |d         "          }
t1          |	                                |
                                d#           t          dd          \  }}t          j                            d$           t-          ||dddd !          }t          j        t          j        |j        d         d|j        d         z  t                    gdg|j        d         |j        d         d          }t          j        d%t          j        |j        d         d|j        d         z  t                    z  gdg|j        d         |j        d         d          }t          j                            d&           t-          ||z  |z                      d'          ||z  dddd !          }t1          |                                |                                d#           d S )(N)r   r   r   r   r!   r"   r   rS   rB   r   l2r*   r   epsilonkproj)r   rP   r   MbPjt @bsrg      @@   D_Ar(   r*   g       @r{   r   rI   dtyper<   r   iLIwr   r   r   r   Fr   r   	proj_typesymmetrize_measurer   r   r   decimall   }c rE   l   .a<Y rH   )r	   r,   r   r}   r/   r   r   spdiagsr
   r   r2   r\   arangefloatreshaper^   r   r   r   r   r-   r.   evolution_socreference_evolution_socr   rX   )r3   r+   r4   r*   r   ur6   Absrcara   rb   result_unscaledDDinvresult_scaleds                  r7   %test_evolution_strength_of_connectionz>TestStrengthOfConnection.test_evolution_strength_of_connection  s     	1 	1AU+++AQ((ALLqvvxxaffhh3 $0 0 1 1 1 1
  	1 	1A!AF1HeAgvax!D!"B1a0!A#qs5J J JAQ((ALLqvvxxaffhh3 $0 0 1 1 1 1  	2 	2A&1ve<<<FQLLqvvxxaffhh4 %1 1 2 2 2 2 )$$sGMMOOGQWQZO$$16688!&&((s#% % 	& 	& 	&www((499;;QVVXX#A#% % 	& 	& 	& Ia171:au555==b!DD16688!&&((s"$ $ 	% 	% 	%499;;QVVXX#A"$ $ 	% 	% 	% +.qx{18A;&'GGII*-qx{18A;&'	GGII	16688!&&((s"$ $ 	% 	% 	%www((499;;QVVXX#A"$ $ 	% 	% 	%  
	1 
	1BINN:&&&"2c7BsGR	]%'W6
6;= = =F INN:&&&.r#w379)}13CBvJP P PH &fnn&6&68H8H8J8J./1 1 1 1 1 #6%888A
	z"""'1c*+u;@B B B NBIagaj!AGAJ,eLLLM3
AGAJuF F F~s29QWQZ171:U#S#S#SST c171:qwqz%I I I
	z"""%qs1ummfm&E&E&*1fcQ059>@ @ @ 	"-"7"7"9"9"1"9"9";";Q	H 	H 	H 	H 	H 	Hr9   N)
__name__
__module____qualname__r8   rg   rk   rp   ry   r   r    r9   r7   r   r      s        / / /$94 94 94vP P PP P PP P P(K> K> K>ZUH UH UH UH UHr9   r   c                   &    e Zd Zd Zd Zd Zd ZdS )TestComplexStrengthOfConnectionc                    g | _         t          j                            d           dD ]}| j                             t          j        t          j                            ||                    t          j        dt          j                            ||          z            z              dD ]E}t          |fd          }|j	        d|j	        z  z   |_	        | j                             |           FdD ]n}t          ||fd          }|j	        dt          j                            |j	        j
        d                   z  z   |_	        | j                             |           od	D ]}t          |          }|d
                                         }|j	        dt          j                            |j	        j
        d                   z  z   |_	        | j                             |           d S )NiV8r                 ?r   r!   r"   r$   r   r&   r*   y              ?)r+   r,   r-   r.   r/   r   r0   r1   r	   r^   r}   r   r2   )r3   r4   r*   r5   r6   s        r7   r8   z%TestComplexStrengthOfConnection.setUps  s   
 		y!!! 	N 	NAJf/	q!0D0DEE & 1$ry~~a7K7K2K L LM N N N N * 	! 	!AU+++AVd16k)AFJa     	! 	!AAu---AVd29>>!&,q/#C#CCCAFJa    . 	! 	!Dd##B3AVd29>>!&,q/#C#CCCAFJa    		! 	!r9   c                     | j         D ]u}dD ]p}t          ||          }t          ||          }t          |j        |j                   t          |                                |                                           qvd S )Nr;   ri   rj   s        r7   rg   zETestComplexStrengthOfConnection.test_classical_strength_of_connection  s     	P 	PA6 P P&q%0021e<<VZ666)&..*:*:H<L<L<N<NOOOOP	P 	Pr9   c                     | j         D ]u}dD ]p}t          ||          }t          ||          }t          |j        |j                   t          |                                |                                           qvd S rm   )r+   ro   rn   r   rW   r   rX   )r3   r*   r`   rb   ra   s        r7   rp   zETestComplexStrengthOfConnection.test_symmetric_strength_of_connection  s     	P 	PA3 P P21e<<&q%00VZ666)&..*:*:H<L<L<N<NOOOOP	P 	Pr9   c           	         g }g dg dg dg}dt          |dd          z  }dt          j        |j        d         df          z  }d	|d<   d
|d<   |                    |                                |                                dddd           dt          j        |j        d         df          z  }d|ddddf<   d|ddddf<   d|d<   d
|d<   d	|d<   |                    |                                |                                dddd           |                    d          }|                    |                                |                                dddd           |D ]}t          j                            d           t          |d         |d         |d         |d         |d         d          }t          j                            d           t          |d         |d         |d         |d         |d                   }t          |                                |                                           dt          d d          z  }dt          j        d|j        d         dz   t          !                              dd          z  }t          j                            d"           t          ||ddd#d          }	t#          j        t          j        |j        d         d|j        d         z  t          !          gdg|j        d         |j        d         d          }
t#          j        d$t          j        |j        d         d|j        d         z  t          !          z  gdg|j        d         |j        d         d          }t          j                            d%           t          |
|z  |
z  ||z  ddd#d          }t          |                                |	                                d&           t          j                            d'           t          |
|z  |
z  ||z  ddd#d          }t          j                            d(           t          |
|z  |
z  ||z  dddd          }t          |                                |                                           t'          d d)          \  }}d|z  }d|z  }t          j                            d*           t          ||ddd#d          }	t#          j        t          j        |j        d         d|j        d         z  t          !          gdg|j        d         |j        d         d          }
t#          j        d$t          j        |j        d         d|j        d         z  t          !          z  gdg|j        d         |j        d         d          }t          j                            d+           t          |
|z  |
z                      d          ||z  ddd#d          }t          |                                |	                                d&           d S ),N)r<   rC   r<   )r   r   r   r   )r{   r{   r!   r"   r   rS   y333333?      (gffffff,r   rB   r   r   r   r<   r   )r   r   )r   rS   rO   rH   rI   i0ir*   r   r   r   r   Fr   r   r   r   iOr   rE   iO,r   l   L%  l   zU r   l   "? i\>s)r   r,   r   r}   r/   r   r\   r-   r.   r   r   r   rX   r	   r   r   r   r   r   r
   )r3   r+   stencilr*   r   r   r   ra   rb   r   r   r   r   resultDAresultl2s                  r7   r   zETestComplexStrengthOfConnection.test_evolution_strength_of_connection  s    $##%<%<%<>N>N>NOgve<<<<!'!*a)))!"16688!&&((s"$ $ 	% 	% 	% !'!*a)))!Bq&!)!Bq&!)%%$16688!&&((s"$ $ 	% 	% 	%www((499;;QVVXX#A"$ $ 	% 	% 	%  		L 		LBINN:&&&"2c7BsGR	]%'W6
6;= = =F INN:&&&.r#w379)}13CBvJP P PH &fnn&6&68H8H8J8JKKKK ....1agajl%888@@QGGG
	z"""'1cQ27;@B B B NBIagaj!AGAJ,eLLLM3
AGAJuF F F~s29QWQZ171:U#S#S#SST c171:qwqz%I I I
	y!!!%ac!eT!VSA059>@ @ @ 	"-"7"7"9"9"1"9"9";";Q	H 	H 	H 	H 		z""" 1QQ#$49; ; ; 		z""" 1QQ#$49; ; ; 	"("2"2"4"4h6F6F6H6HIII #6%888AFF
	z"""'1cQ27;@B B B NBIagaj!AGAJ,eLLLM3
AGAJuF F F~s29QWQZ171:U#S#S#SST c171:qwqz%I I I
	z"""%qs1ummfm&E&EtAv.1Q%9>@ @ @ 	"-"7"7"9"9"1"9"9";";Q	H 	H 	H 	H 	H 	Hr9   N)r   r   r   r8   rg   rp   r   r   r9   r7   r   r   r  s`        ! ! !2P P PP P PTH TH TH TH THr9   r   rQ   c                 L   t          j        |           }|j        |j        k    }|j        |         |_        |j        |         |_        |j        |         |_        t          j        |j        d                   }t          j        |j        j	                  j
        |dd<   |dk    rFt          |j        |j                  D ]+\  }}t          ||         t          |                    ||<   ,|dk    r:t          |j        |j                  D ]\  }}t          ||         |           ||<    |dk    r+t          j        |j                  |||j                 z  k    }|dk    r|j         |||j                 z  k    }|j        |         |_        |j        |         |_        |j        |         |_        t          j        |j        d         |j        d         d| j	                  }t          j        |                                           |j        dd<   |                                |z   }t          j        |j                  |_        t          j        |j        d         f|j	                  }	t'          |j        d                   D ]Y}t'          |j        |         |j        |dz                      D ]-}
t          |j        |
                   }||	|         k    r||	|<   .Zd	|	|	dk             z  |	|	dk    <   |                                }t+          ||	d
          }|S )aW  Construct reference implementation of classical SOC.

    This complex extension of the classic Ruge-Stuben
    strength-of-connection has some theoretical justification in
    "AMG Solvers for Complex-Valued Matrices", Scott MacClachlan,
    Cornelis Oosterlee

    A connection is strong if,
      | a_ij| >= theta * max_{k != i} |a_ik|
    r   NrQ   rR   r!   r#   r   r   rS   rE   Tr   )r   
coo_matrixrowcolr^   r,   emptyr}   finfor   rR   zipmaxrQ   eyer0   diagonalr2   r   ranger   r   )r*   r`   rN   Sr   max_offdiagivr   largest_row_entryjvals               r7   rV   rV     s    	!A 5AE>DE$KAEE$KAEVD\AF(171:&&KXafl++/KN u}}qv&& 	9 	9DAq QQ88KNNu}}qv&& 	5 	5DAq Q!44KNN u}}vaf~~%+ae*<"<=u}}w5;qu#556E$KAEE$KAEVD\AF 	
171:qwqz%qwGGGA!!$$--//AF111I			AA VAF^^AF !'!*ag>>>171: + +qx{AHQqSM22 	+ 	+AafQi..C&q)))'*!!$	+ 	 1Q 677 '1,-			A1'd333AHr9   c                    t          j        |                                           }t          j        |           }|j        |j        k    }t          j        ||j                 ||j                 z                                d          }|t          j	        |j
                  dz  t          j        |j
                  dz  z   ||z  |z  k    z  }|j        |         |_        |j        |         |_        |j
        |         |_
        t          j        |j        d         |j        d         d| j                  }t          j        |                                           |j
        d d <   |                                |z   }t          j        |j
                  |_
        t          j        |j        d         f|j                  }t%          |j        d                   D ]Y}t%          |j        |         |j        |dz                      D ]-}t          |j
        |                   }	|	||         k    r|	||<   .Zd||dk             z  ||dk    <   |                                }t)          ||d	
          }|S )Nr   r   r   r!   r   r   rS   rE   Tr   )r,   rQ   r   r   r   r   r   r[   r   realr^   imagr   r}   r   r0   r2   r   r   r   r   )
r*   r`   r   r   r   DDr   r   r   r   s
             r7   ro   ro   5  s"    	qzz||A!A5AE>D	!AE(QquX%	&	&	.	.r	3	3B 	bgafooq 2716??A#55%+b.HIDE$KAEE$KAEVD\AF 	
171:qwqz%qwGGGA!!$$--//AF111I			AA VAF^^AF !'!*ag>>>171: + +qx{AHQqSM22 	+ 	+AafQi..C&q)))'*!!$	+ 	 1Q 677 '1,-			A1'd333AHr9   rB   r   r   c                 b   t          j        |           }|rd}n!| j        d         }|                                 } t	          j        t                    j        }t	          j        t	          j        |                    }t	          j	        |          }	| 
                                 |                                  | j        d         }
|	j        d         }|                                 }t	          j        |          }|dk    }d||         z  ||<   d||dk    <   t          | |d          }t!          |          }t          j        |
|
d          d|z  |z  z
  }t          j        |
|
d          }t%          |          D ]}||z  }|j                                        }|                                 }|dk    rt	          j        |j                  }t	          j        t	          j        |
          |          }t	          j        ||          }d|j        t	          j        |j        |          |k    <   ~~|
                                 d|j        d	d	<   |                    |          }|
                                 |                                 ~t	          j        |dz   |dz   f| j        
          }t	          j        |dz   f| j        
          }t?          |j                  }t%          |
          D ]}|j        |         }|j        |dz            }||z
  }|j        ||         }t	          j        || j        
          }|dk    r%t%          |          D ]}|||                  |||f<   |                     |          } ||k    rd|j        ||<   |j        ||         }!|	|d	d	f         }"d|"!                                j        "                    |"                    |"                    z  |d|d|f<   || | f         |"| d	d	f         !                                j        z  |d||f<   |"| d	d	f         ||d|f<   d|"!                                j        "                    |"                    |!                    z  |d|<   |!|          ||<   tG          j$        |          "                    |          }#|""                    |#d	d                   }$t	          j%        t	          j&        |$                    |z  }%d|$j'        t	          j&        |$j'                  |%k     <   t	          j(        |$          r%d|$j)        t	          j&        |$j)                  |%k     <   t	          j'        t	          j*        |$                    t	          j'        t	          j*        |!                    z  t	          j)        t	          j*        |$                    t	          j)        t	          j*        |!                    z  z   }&|&dk     }&t	          j	        |&tV          
          }&|$|!z  }!d|!t	          j&        |!          dk    <   d|!|&<   t	          j&        d|!z
            }!d|!|!|k     <   d|!| <   t	          j,        |!          |z  }'d|!|!|'k    <   t	          j*        |!          |j        ||<   |
                                 t	          j	        t	          j'        |j                  t          
          |_        t          j        |
|
d          }(|(xj        |                                z  c_        ||(z   }|s|-                    ||f          }g })t%          |j        j        d                   D ]g}|j        |d	d	d	d	f         |j        |d	d	d	d	f         .                                         }*|)/                    |*,                                           ht          j0        t	          j	        |)          |j        |j        ftc          |j        d         |z            tc          |j        d         |z            f          }d|j        z  |_        t	          j        |j        d         f|j        
          }+t%          |j        d                   D ]Y}t%          |j        |         |j        |dz                      D ]-}tM          |j        |                   },|,|+|         k    r|,|+|<   .Zd|+|+dk             z  |+|+dk    <   |                                }t          ||+d          }|S )zAll python reference implementation for Evolution Strength of Connection.

    --> If doing imaginary test, both A and B should be imaginary type upon entry

    --> This does the "unsymmetrized" version of the ode measure
    rS   r   r<   rE   Tr   r!   r"   Nr   r   rt   r   g}Ô%ITg-C6?g     j@rI   r|   )2r   isspmatrix_csrrJ   r2   r,   r   r   epssqrtr[   r   r   r}   r   
zeros_liker   r   r   r   Tr   diffr   modr   repeatr^   r   r   r   r   r   searchsortedconjdotslapinvr   rQ   r   iscomplexobjr   ravelboolrR   r\   nonzeror/   r0   int)-r*   r   r   r   r   csrflagnumPDEs	near_zerosqrt_near_zeroBmatdimenNullDimr   r   r   Dinv_A	rho_DinvAr   Atilde_i
row_lengthmy_pdeLHSRHStolr   rowstartrowendlengthcolindxr   r   iInRowziBixzihattol_iangledrop_tolIdAtAtminr   r   s-                                                r7   r   r   e  s    #A&&G +a.GGII #IWRWY//00N8A;;DNNGAJEjmG 	


A=DHDqwDJDaL4d+++F+F33I 
E5	/	/	/3y=&2H	HAZuU333FAhh  V X^^F 6688D {{WT[))
	%(('226:..=@	"&w//69: DIaaaL__T""F

 (GAIwqy)
9
9
9C
(GAI<qw
/
/
/C &,

C5\\ L8 L8 =#qs#(".&1 fV17+++6]] * *gajMAqD		 %%a((W ,/FK(( Xf_-Bgqqqj!B ),BGGIIKOOCGGBKK,H,H(HC'	1W9$%&)&&.&92faaai=;M;M;O;O;Q&RC'	7"#&(mC7"# !=!==C'	Nf:CL !!#&&A
 FF1SbS6NNEF26%==))#-E58EJrvej))E12u%% =9<
26%*--56
 GBHUOO,,RWRXb\\-B-BB((")>)>>?ECKEHU$///E rB &+BrvbzzT!" BuI b!!B '+BrN"# BvJvbzz')H #BrH}+-8B<<FK(( (276;//u===FK 
E5	/	/	/BGGv   GGb[F  I'(:;; v~+A.// 	# 	#AK111aaa(Q111W)=)E)E)G)GHEIIeiikk"""""BHRLL&.&-#P*-fl1og.E*F*F*-fl1og.E*F*F*HI I I fk/FK &,q/!36<HHH6<?## + +v}Q'qs);<< 	+ 	+Afk!n%%C&q)))'*!!$	+ 	 1Q 677 '1,-\\^^F 1===FMr9   rt   Tc                    t          j        |           rqt          | j        d         | j        d         z            }t          j        t          j        | j        j        d         f          | j	        | j
        f||f          }nS|                                 } | j        d         }|                                 }t          j        |j                  |_        |j        d         dk    rd}n|j        d         dk    rd}t          |          D ]:}|j
        |         }|j
        |dz            }	||ddf         }
t          ||	          D ]}|j	        |         |k    r,t          j        t          j                  j        |j        |<   ?||j	        |         ddf         }|
d         |d         z
  dz  }||
d         |d         z
  dz  z  }|r||
d         |d         z
  dz  z  }t          j        |          |j        |<   |j        ||	         }|r!||                                z  }d	|||k    <   n	d	|||k    <   ||j        ||	<   <|                                 |d
t          j        |j        d         |j        d         d          z  z   }d|j        z  |_        t          j        |j        d         f|j                  }t          |j        d                   D ]Y}t          |j
        |         |j
        |dz                      D ]-}t1          |j        |                   }|||         k    r|||<   .Zd||dk             z  ||dk    <   |                                }t3          ||d          }|S )z:Construct reference distance based strength of connection.r   r|   rS   r   Fr   TNr<   rt   r!   r"   rE   r   r   )r   isspmatrix_bsrr   r}   rJ   r0   r,   r   r^   r   r   r2   r   r   r   r   float64r   r   rR   r   r   r   r   rQ   r   )r*   rx   r`   ru   r   r   three_dr   r  r  pt_ir   pt_jdistthis_rowr  r   r   s                     r7   rw   rw   (  sy    Q !AGAJq{1~-..rwQ'9::AIqxP%*EN4 4 4 GGII
FFHHwqzQ	
q5\\ + +8A;!A#AAAwx(( 	* 	*Ay|q  HRZ004q		 1qqq)Q$q')A-a47*Q.. 3T!WtAw.22DGDMMq		 6(6/* 	-(,,..(E),HX%&&),HX%&"*x	C
171:qwqz%@@@@@A ZAF !'!*ag>>>171: + +qx{AHQqSM22 	+ 	+AafQi..C&q)))'*!!$	+ 	 1Q 677 '1,-			A1'd333AHr9   )rQ   )rB   r   r   )rt   T)*__doc__numpyr,   numpy.testingr   r   r   r   r   scipyr   scipy.linalglinalgr   pyamg.galleryr	   r
   r   r   pyamg.strengthr   r   r   r   pyamg.amg_corer   pyamg.util.linalgr   pyamg.util.utilsr   pyamg.util.paramsr   rU   rn   r   rv   r   r   rV   ro   r   rw   r   r9   r7   <module>r)     s/   " "    ( ( ( ( ( ( ( ( ( ( ( ( ( (                       $ $ $ $ $ $ $ $ $ $ $ $ 3 2 2 2 2 2 9 9 9 9 9 9 ' ' ' ' ' ' % % % % % %000.VH VH VH VH VHx VH VH VHt
@H @H @H @H @Hh @H @H @HH< < < <~- - -`@ @ @ @FA A A A A Ar9   