
    _-Ph|                         d Z ddlZddlZddlmZmZmZ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 ddlmZ  G d d	e          ZdS )
zTest prolongation smoothing.    N)TestCaseassert_array_almost_equalassert_equalassert_almost_equal)sparse)poissonlinear_elasticityload_examplegauge_laplacian)smoothed_aggregation_solverrootnode_solver)incomplete_mat_mult_bsrc                   &    e Zd Zd Zd Zd Zd ZdS )TestEnergyMinc                 L1   d }g }t          j        t          j        dgg                                        d          }t          j        t          j        dgg                                        d          }t          j        t          j        dgg                                        d          }t          j        t          j        dgg                                        d          }t          j        t          j        dgg                                        d          }|                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           t          j        t          j        dgg                                        d          }t          j        t          j        ddgg                                        d          }t          j        t          j        dgg                                        d          }t          j        t          j        ddgg                                        d          }t          j        t          j        ddgg                                        d          }|                    |||f           |                    |||f           |                    |||f           |                    |||f           t          j        t          j        ddgg                                        d          }t          j        t          j        ddgg                                        d          }	t          j        t          j        ddgddgg                                        d          }t          j        t          j        ddgddgg                                        d          }
|                    |j                                        ||f           |                    |j                                        ||
f           |                    |j                                        |	|f           |                    |j                                        |	|
f           |                    d	          }|                    d	          }|	                    d	          }	t          j        t          j        ddgddgg                                        d
          }t          j        t          j        ddgddgg                                        d
          }|                    |j                                        ||f           |                    |j                                        ||f           |                    |j                                        |	|f           |                    |j                                        |	|f           |                    d          }|                    d          }|	                    d          }	t          j        t          j        dgg                                        d          }t          j        t          j        dgg                                        d          }|                    ||j                                        |f           |                    ||j                                        |f           |                    ||	j                                        |f           |                    ||	j                                        |f           |                    d	          }|                    d	          }|	                    d	          }	|                    ||j                                        |f           |                    ||j                                        |f           |                    ||	j                                        |f           |                    ||	j                                        |f           t          j        t          j        ddgddgg                                        d
          }t          j        t          j        ddgddgg                                        d
          }t          j        t          j        ddgddgg                                        d
          }t          j        t          j        ddgddgg                                        d          }t          j        t          j        g d          t          j        g d          t          j        g d          ffd
                              d
          }t          j        t          j        g d          t          j        g d          t          j        g d          ffd
                              d          }|                                 |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    d          }|                    d          }|                    d          }|                    d          }|                                }|                                }t          j        t          j	        dt                    t          j        ddg          t          j        ddg          ffd
                              d          }
|                    |||f           |                    |||f           |                    |||
f           |                    |||
f           t          j        t          j        dgdgg                                        d          }t          j        t          j        dgdgg                                        d          }t          j        t          j        dgdgg                                        d          }t          j        t          j        dgdgg                                        d          }|                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    d          }|                    d          }|                    d
          }|                    d          }|                    d          }|                    d          }|                    |||f           |                    |||f           t          j        t          j        g dg dg                    }|                    d          }t          j        t          j        g dg dg                    }|                    d          }t          j        t          j        g dg dg                    }|                    d          }|                    d          }t          j        t          j        g dg dg                    }
|
                    d          }
|                    |||f           |                    |||f           |                    |||
f           |                    |||f           |                    |||f           |                    |||
f           t          j        g dg d g d!g d"g          }|                                }|d d ddf         }d#|d$<   d%|d<   |                                }d|dd d f<   |                                }d|d d df<   t          j        |                              d
          }t          j        |                              d
          }t          j        |                              d
          }t          j        |                              d
          }t          j        |                              d          }|                                }|                                }|                                }
|                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||f           |                    |||
f           |                    |||
f           |                    |||
f           t          d&d'(          }|                    d&          }d)|z  }|                                }t          j        |d d dd*f                   }|                    d+          }d)|z  }|                    d,          }|                                 d)|z  }|                    d-          }	|	                                 d)|	z  }|                                }|                                }|	                                }
|                    |||                                f           |                    |||f           |                    |||f           |                    ||	|
f           |                    |||f           |                    |||f           |                    |||
f           |                    |||                                f           |D ]}|d                                         }|d                                         }|d                                         }|                                }t          j        |j        |j                  |_        d|j        d d <   t          |j        |j        t          j        |j                  |j        |j        t          j        |j                  |j        |j        t          j        |j                  t'          |j        d         |j        d         z            t'          |j        d         |j        d         z            |j        d         |j        d         |j        d                     ||||          }t-          |j        |j                   t-          |j        |j                   t-          |j        |j                   |j                                        }|j                                        }|j                                        }|                                }t          j        |j        |j                  |_        d|j        d d <   t          |j        |j        t          j        |j                  |j        |j        t          j        |j                  |j        |j        t          j        |j                  t'          |j        d         |j        d         z            t'          |j        d         |j        d         z            |j        d         |j        d         |j        d                     ||||          }t-          |j        |j                   t-          |j        |j                   t-          |j        |j                   d S ).Nc                 V   |                                 }d|j        dd<   | |z  }|                    |          }|                                }|                                }d|j        dd<   t	          j        t          j        |j        |j        f          t          j        |j        |j        f          t          j        |j	        |j	        f          ff|j
                  }|                    | j        d         |j        d         f          }|                                 |S )zCompute A*B --> S.

            Compute only at the existing sparsity structure of S
            A,B and S are assumed BSR
                  ?N        shaper      )copydatamultiplytocoor   
coo_matrixnphstackrowcolr   tobsr	blocksizesort_indices)ABSSSs       c/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pyamg/aggregation/tests/test_smooth.pyincomplete_mat_mult_bsr_goldzPTestEnergyMin.test_incomplete_mat_mult_bsr.<locals>.incomplete_mat_mult_bsr_gold   s    AAF111IQBQB 		ABAF111I"BIqvrw.?$@$@%'Yrv%?%?%'Yrv%?%?%A$B *+2 2 2B
 1;q>1;q>:;;BOOI    g?)r   r   r"   r   r   gffffff@g      @)r      r,   r,          @      @?ffffff@)r,   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   )r   r   r   r   r,   )dtyper   r   )r0   r.   r   )r1   r/   r   )r,      )r   r.   r   )r   r.   r   )r   r   r   )r   fffff0@皙@r   )r4   g+@@r   )r5   r6   g      (@ffffff@)r   r   r7   r   g@)r   r   g333333$@   r9   csrformat              ?   )r9   r>   )r9   r,   )r9   r   )r   
csr_matrixr   arrayr!   appendTr   eliminate_zerosonesfloatr   toarrayr   r2   r   indptrindicesravelintr   r"   r   )selfr)   casesr$   r%   A2maskmask2B2B3mask3A3AiBiB2iB3icaseresultexacts                      r(   test_incomplete_mat_mult_bsrz*TestEnergyMin.test_incomplete_mat_mult_bsr   s   	 	 	<  bhw//00666HHbhw//00666HHrx"//00666HH B4&!1!1228868JJ!"(RD6"2"23399F9KKaD\"""aE]###aD\"""aT]###aU^$$$b"d^$$$ bhw//00666HHbhc
|4455;;f;MMrx"//00666HH B8*!5!566<<v<NN!"(RH:"6"677===OOaD\"""b!T]###aE]###b!U^$$$rx#s5566<<v<NNrx#s5566<<v<NN B8,.8+5 "6 "6 7 77<uvu7N7N 	!"(RH-/H,6 #7 #7 8 88=8O8O 	achhjj"d+,,,achhjj"e,---achhjj"d+,,,achhjj"e,---GGfG%%XXX''XXX'' B8,.8+5 "6 "6 7 77<uvu7N7N 	!"(RH-/H,6 #7 #7 8 88=8O8O 	achhjj"d+,,,achhjj"e,---achhjj"d+,,,achhjj"e,---GGfG%%XXX''XXX'' B4&!1!1228868JJ!"(RD6"2"23399F9KKad+,,,ae,---ad+,,,ae,---GGfG%%XXX''XXX''ad+,,,ae,---ad+,,,ae,--- bhR2r(';<<==CCfCUUbhb	C9'=>>??EEPVEWWrx#rRH(=>>??EEPVEWWrx#rRH(=>>??EEPVEWW "(+;+;+;"<"<"$(<<<"8"8"(<<<:P:P!Q"S'-/ / //4uvu/F/F 	 !28,<,<,<#=#=#%8LLL#9#928LLL;Q;Q"R#T(.0 0 0050G0G 	 	aD\"""aD\"""b"d^$$$b"e_%%%aU^$$$GGfG%%GGfG%%XXX''XXX''vvxx		!271E#:#:#:#%8QF#3#3RXq!f5E5E"F#H(.0 0 0050G0G 	 	aD\"""b"e_%%%aE]###b"e_%%%bhu~6677===OOrx#7788>>>PP B4#-!8!899??&?QQ!"(RD3%="9"9::@@6@RRaD\"""aU^$$$b!T]###b"e_%%%GGfG%%GGfG%%XXX''XXX''zzFz++

V
,,aD\"""b"e_%%%bh'FGGHHGGfG%%rx(GHHIIXXX'' <<<*F!G!GHHzzFz++

6""!"(LLL,,,+G"H"HIIf--aD\"""b"e_%%%b"e_%%%aD\"""b"e_%%%b"e_%%% H***+++***(((* + + FFHHaaa1fI$$VVXX1aaa4WWYY111a4a  &&&88r""((6(::r""((6(::a  &&&88q!!''&'99vvxx		aE]###b!U^$$$b!U^$$$b"d^$$$aD\"""b"d^$$$aT]###b!T]###aU^$$$b"e_%%%b"e_%%% F5)))GGfG%%AXIIKKa1Q3i((GGfG%%AXWWvW&&
RiWWvW&&
Rivvxx				aAFFHH%&&&aD\"""aU^$$$aU^$$$b"d^$$$b#u%&&&b#u%&&&b"bggii())) (	C (	CDQAQA7==??D YY[[F(6;ag>>>FK FKN#AHai!&9I9I$%Hai!&9I9I$*M6>$&HV[$9$9$'
Q[^(C$D$D$'Q&:J1:M(M$N$N$%KNAKN$%KN4 4 4 10At<<E%fk5:>>>%fnemDDD%fmU\BBB 

A

A6;;==DYY[[F(6;ag>>>FK FKN#AHai!&9I9I$%Hai!&9I9I$*M6>$&HV[$9$9$'
Q[^(C$D$D$'Q&:J1:M(M$N$N$%KNAKN$%KN4 4 4 10At<<E%fk5:>>>%fnemDDD%fmU\BBBBQ(	C (	Cr*   c                    t          j        dt          d           t          j                            d           g }d}t          d          }|d                                         }|d         }|                    ||dd	d
df|f           |                    ||dd	ddf|f           |                    ||dddif|f           |                    ||ddddf|f           |                    ||ddddf|f           d}t          dd          }t          j
        |j        d         df          }|                    ||dd	ddf|f           |                    ||dd	d
df|f           |                    ||d|f           |                    ||dddif|f           |                    ||dddddf|f           |                    ||dddif|f           d}d |z  }d!t          j                            |j        d         d          z   d d!t          j                            |j        d         d          z   z  z   }|                    ||dd	ddf|f           |                    ||dd	ddf|f           |                    ||dd	d
df|f           |                    ||dd	ddf|f           |                    |                    d"#          |dd	ddf|f           |                    |                    d"#          |dd	ddf|f           |                    ||dddddf|f           |                    ||ddddf|f           |                    |                    d"#          |dddddd$d%id&f|f           |                    |                    d"#          |dddddd$d%id'f|f           |                    |                    d"#          |dddddd(f|f           |                    |                    d"#          |ddddf|f           |                    ||dddif|f           |                    ||ddddf|f           |                    |                    d"#          |ddddd)f|f           |                    |                    d"#          |dddif|f           d*}|d t          j        |j        d         |j        d                   z  z   }|                    ||dd	d
df|f           |                    ||dd	ddf|f           |                    ||dd	ddf|f           |                    ||dd	ddf|f           |                    |                    d+#          |dd	ddf|f           |                    ||ddddf|f           |                    |                    d+#          |ddddf|f           |                    ||dddif|f           |                    |                    d+#          |ddddd)f|f           |                    |                    d+#          |ddddd$d%id,f|f           |                    |                    d+#          |ddddd$d%id-f|f           d.}t!          d/d!d01          }t          j
        |j        d         df          }|                    ||dd	ddf|f           |                    ||dd	d
df|f           |                    ||ddd2if|f           |                    ||ddddf|f           |                    ||dddif|f           d3}|                    |                    d4#          |dddddd$d%id5f|f           |                    |                    d4#          |dddddd$d%id6f|f           |                    |                    d4#          |dddddd7f|f           |                    |                    d4#          |ddd2if|f           |                    |                    d4#          |ddddd)f|f           |                    |                    d4#          |ddddd$d%id,f|f           |                    |                    d4#          |ddddd$d%id-f|f           d8}t#          d          \  }}|                    ||dd	ddf|f           |                    ||dd	d
df|f           |                    ||dd	ddf|f           |                    ||dddif|f           |                    ||ddd$d%id9f|f           |                    ||ddd$d%id:f|f           |                    ||ddddf|f           |                    ||ddddf|f           |D ]d\  }}}}	t%          ||dd|;          }
|
j        d         j        }|
j        d         j        }|
j        d         j        }t-          ||z  |           ed< }d}|D ]\  }}}}	|dz  }t/          |t0                    r	|d         }n|}|dk    rV|j        d          ||          k    r;d=d>d?d@fdAg}t3          ||dd||d	dBC          }
|
j        d         j                                        }|
j        d         j        }|
j        d         j        }|
j        d         j        }|
j        d         j        }|
j        d         j                                        }|                                 |                                 |j        ddA         |j        dAdD         z
  |j        d         k    }t-          ||z  |dAdAf         ||dAdAf                    t-          ||z  |dAdAf         ||dAdAf                    t          j        |j        d         |j        d         d|j        E          }||dAdAf         }t-          |j         |j                    tC          |j        |j                   tC          |j"        |j"                   ||dAdAf         }t-          |j         |j                    tC          |j        |j                   tC          |j"        |j"                   dAS )FzCheck that P*R=B.ignorezHaving less target vectors)categorymessageiairfoilr$   r%   jacobiTlocal)filter_entries	weightingblockenergymaxiterr3   cgnrdiagonal)krylovrd   gmresr,   )rj   degreer   )
   rm   r:   r;   r   r   rl   )rj   rl   rd   rj   zrandom imaginaryr=   r   r8   r+   theta皙?)rj   rl   rg   rd   
postfilter)rj   rl   rg   rd   	prefilter)rj   rl   rd   rg   rj   rl   rg   zrandom imaginary + I)   rs   )rj   rl   rg   rp   )rj   rl   rg   rq   zgauge laplacianrm   gzG?)spacingbetacgzgauge laplacian bsrr-   )rj   rl   rd   rg   rp   )rj   rl   rd   rg   rq   )rj   rl   rg   rd   zlinear elasticity)rl   rp   )rl   rq   )r%   
max_coarse
max_levelssmoothc                 H    t          j        |           r| j        d         S dS )Nr   r   )r   isspmatrix_bsrr"   )r$   s    r(   _get_blocksizez0TestEnergyMin.test_range.<locals>._get_blocksize  s&    $Q'' &{1~%1r*   gauss_seidel_nr	symmetricrs   )sweep
iterationsNnonsymmetric)r%   rw   rx   ry   improve_candidateskeepsymmetry)r<   r2   )#warningsfilterwarningsUserWarningr   randomseedr
   tocsrrA   r   rD   r   randr!   r   eyer   r	   r   levelsPr%   r   
isinstancetupler   rB   CptsBHrC   rG   r2   r   r   rH   )rK   rL   nameXr$   r%   iAiBry   _namemlr   Rr|   countersmoothericrB   r   BfBf_HBcrN   I1I2s                            r(   
test_rangezTestEnergyMin.test_range  s   ;(D	F 	F 	F 	F
	x    ##cFLLNNcFaX047KKMNRT 	U 	U 	UaX047KKMNRT 	U 	U 	U 	aX	1~6=>>>aX&z'R'RSUYZ[[[aX'Q'G'GH$OPPPHU+++GQWQZO$$aX04:NNPQUW 	X 	X 	XaX047KKMNRT 	U 	U 	U 	aHd+,,,aX!}5t<===aX&A5?(A (A BCGI 	J 	J 	JaX'':;TBCCC "AX29>>"(1+q1113Q!?!??@A 	b!h15JOOQRVX 	Y 	Y 	Yb!h15GLLNOSU 	V 	V 	Vb"x26WMMOPTV 	W 	W 	Wb"x26WMMOPTV 	W 	W 	W 	bhhh00!Dw!O!OPRVX 	Y 	Y 	Ybhhh00"Dw!O!OPRVX 	Y 	Y 	Y 	b!h6Q6@)B )B CDHJ 	K 	K 	Kb"xF7A*C *C DEIK 	L 	L 	Lbhhh00!"(A!%/P PQRVX 	Y 	Y 	Y 	bhhh00!"(A!%/&-t_6 67 9=	> 	? 	? 	?
 	bhhh00!"(A%/A? ?@AEG 	H 	H 	H 	bhhh00"F!L!LMtU 	V 	V 	V 	b!h7(;<dCDDDb"xGq)I)IJDQRRRbhhh00!")Q1EEGHLN 	O 	O 	O 	bhhh00"(G!45t= 	> 	> 	> &
171:qwqz::::b!h15GLLNOSU 	V 	V 	Vb!h15GLLNOSU 	V 	V 	Vb"x26ZPPRSWY 	Z 	Z 	Zb"x26WMMOPTV 	W 	W 	Wbhhh00"Dw!O!OPRVX 	Y 	Y 	Y 	b!h6
(S(STVZ[\\\bhhh00"F!L!LMtU 	V 	V 	V 	b!h7(;<dCDDDbhhh00"")Q1EEGHLN 	O 	O 	O 	bhhh00"")Q1'.o7 789=? 	@ 	@ 	@ 	bhhh00"")Q1&-t_6 678<> 	? 	? 	?
 !B$777GQWQZO$$ah15JOOQRVX 	Y 	Y 	Yah15GLLNOSU 	V 	V 	V 	aX$'78$?@@@ah6
(S(STVZ[\\\ah7(;<dCDDD$aggg//Faj-.wo"O "O P 	 	 	 	aggg//Faj"#7D/"C "C D 	 	 	 	aggg//FaA/9"; "; < 	 	 	 	aggg//4 0149 	: 	: 	:aggg//GqQ!O!OP 	 	 	 	aggg//7a!"7D/!C !C D 	 	 	 	aggg//7a!"'4!B !B C 	 	 	 # **1aX04:NNPQUW 	X 	X 	XaX047KKMNRT 	U 	U 	UaX047KKMNRT 	U 	U 	UaX!}5t<===aX!GT?'S'STVZ[\\\aX!7D/'R'RSUYZ[[[aX&z'R'RSUYZ[[[aX'Q'G'GH$OPPP $) 	* 	*Aq&%,Q!89&J J JB	!A	!A	!AAq))))	 	 	 #( *	5 *	5Aq&%qLG&%(( "!!9!8##~~a7H7H)H)H(!,A>>@AEG$Q!a,28:*.I I I IaLN((**y|(Yq\^y|Yq\^IaLN((**!!###!!### !"""5!'!*D#QrT47ORaaa[AAA#QrT47OT$']CCC Z
AGAJuAGTTTtQQQwZ#BGRW555RY	222RZ444 tQQQwZ#BGRW555RY	222RZ444U*	5 *	5r*   c           
      >   t           j                            d           g }t          d          }|d                                         }|d         }|                    ||ddddd	fd
dif           |                    ||ddddd	fddif           |                    |                    d          t          j        |t           j                            |j	        d         d          f          ddddd	fd
dif           d|z  }dt           j                            |j	        d         d          z   ddt           j                            |j	        d         d          z   z  z   }|                    ||ddddd	fd
dif           |                    ||ddddd	fddif           |                    |                    d          t          j        |t           j                            |j	        d         d          f          ddddd	fd
dif           |D ]z\  }}}}t          ||dd|d          }	||d         d<   t          ||dd|d          }
t          |	j        d         j        j        |
j        d         j        j        k    d           {dS )z-Check that using postfilter reduces NNZ in P.l   eF} r`   r$   r%   rf   rv   r,   r3   rr   rn   ro   rk   kr-   r+   r   r   皙?r=   r   Tr%   rw   rx   ry   r   rp   Nr   r   r   r
   r   rA   r!   r   r   r   r   r   r   r   nnz)rK   rL   r   r$   r%   r   r   ry   rp   ml_nofilter	ml_filters              r(   test_postfilterzTestEnergyMin.test_postfilter  s)   
	z""" ##cFLLNNcFaDA!!L!LMo' 	( 	( 	( 	aGq-."0 "0 1Ah  	! 	! 	!
 	aggg//iBINN171:q$A$A BCCDA-."0 "0 1n	& 	' 	' 	' AX29>>"(1+q1113Q!?!??@A 	b!DA!!L!LMo' 	( 	( 	( 	b"Gq-."0 "0 1Ah  	! 	! 	!
 	aggg//iBINN171:q$A$A BCCDA!!L!LMn& 	' 	' 	'
 ). 	< 	<$Aq&*)!qQ117dD D DK&0F1Il#'Q1/5DB B BI+A.04$+A.0456:< < < <	< 	<r*   c           
      >   t           j                            d           g }t          d          }|d                                         }|d         }|                    ||ddddd	fd
dif           |                    ||ddddd	fddif           |                    |                    d          t          j        |t           j                            |j	        d         d          f          ddddd	fd
dif           d|z  }dt           j                            |j	        d         d          z   ddt           j                            |j	        d         d          z   z  z   }|                    ||ddddd	fd
dif           |                    ||ddddd	fddif           |                    |                    d          t          j        |t           j                            |j	        d         d          f          ddddd	fd
dif           |D ]z\  }}}}t          ||dd|d          }	||d         d<   t          ||dd|d          }
t          |	j        d         j        j        |
j        d         j        j        k    d           {dS )z,Check that using prefilter reduces NNZ in P.i1r`   r$   r%   rf   rv   r,   r3   rr   rn   ro   rk   r   r-   r+   r   r   r   r=   r   Tr   rq   Nr   )rK   rL   r   r$   r%   r   r   ry   rq   r   r   s              r(   test_prefilterzTestEnergyMin.test_prefilter9  s)   
	y!!! ##cFLLNNcFaDA!!L!LMo' 	( 	( 	( 	aGq-."0 "0 1Ah  	! 	! 	!
 	aggg//iBINN171:q$A$A BCCDA-."0 "0 1n	& 	' 	' 	' AX29>>"(1+q1113Q!?!??@A 	b!DA!!L!LMo' 	( 	( 	( 	b"Gq-."0 "0 1Ah  	! 	! 	!
 	aggg//iBINN171:q$A$A BCCDA!!L!LMn& 	' 	' 	'
 (- 	< 	<#Aq&))!qQ117dD D DK%.F1Ik"'Q1/5DB B BI+A.04$+A.0456:< < < <	< 	<r*   N)__name__
__module____qualname__r[   r   r   r    r*   r(   r   r      s\        JC JC JCXg5 g5 g5R3< 3< 3<j3< 3< 3< 3< 3<r*   r   )__doc__r   numpyr   numpy.testingr   r   r   r   scipyr   pyamg.galleryr   r	   r
   r   pyamg.aggregationr   r   pyamg.amg_corer   r   r   r*   r(   <module>r      s   " "     & & & & & & & & & & & &                  J J J J J J J J 2 2 2 2 2 2^	< ^	< ^	< ^	< ^	<H ^	< ^	< ^	< ^	< ^	<r*   