
    _Mh!                         d Z ddlZddlmZ ddlmZ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mZmZmZmZmZmZmZmZmZ ddl m!Z" g d	Z#ddZ$ddZ% G d d          Z&d Z'dS )z)test sparse matrix construction functions    N)array)assert_equalassert_assert_array_equalassert_array_almost_equal_nulp)raises)check_free_memory)
csr_matrix
coo_matrix	csr_array	coo_array	csc_array	bsr_array	dia_array	dok_array	lil_array
csc_matrix
bsr_matrix
dia_matrix
lil_matrixsparrayspmatrix
_construct)rand)csrcsccoobsrdialildok{Gz?r   c           	          t           j                            |          }|j        }t	          j        | ||||||          S N)nprandomdefault_rngstandard_normal	construct)mndensityformatdtyperngdata_rvss          a/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/scipy/sparse/tests/test_construct.py_sprandnr2      s<    
)


$
$C"HAq'65#xHHH    c                     t           j                            |          }|j        }t	          j        | |f|||||          S )N)r,   r-   r.   r/   data_sampler)r%   r&   r'   r(   r)   random_array)r*   r+   r,   r-   r.   r/   r5   s          r1   _sprandn_arrayr7   !   sO    
)


$
$C&L!1a&'&PU&)F F F Fr3   c            
          e Zd Zej                            deeee	e
eeg          d             Zej                            deeeeeeg          d             Zd Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zej                            dej        ej         g          d             Z!ej                            dej"        ej         g          d             Z#ej                            dej"        ej         g          d             Z$d Z%d Z&d Z'd Z(d Z)d Z*ej                            deeg          d             Z+d Z,d Z-d Z.ej                            deeg          d             Z/d Z0ej                            dej1        ej2        f          d              Z3d! Z4d" Z5ej        j6        ej        j7        ej        8                    d#          d$                                     Z9d% Z:d& Z;d' Z<d( Z=d) Z>d* Z?d+ Z@ej                            d,d-d.eAjB        C                    d.          g          d/             ZDej                            d,d-d.eAjB        C                    d.          g          d0             ZEd1 ZFd2 ZGd3 ZHd4 ZId-S )5TestConstructUtilsclsc                     t          j        t          d          5   |d           d d d            d S # 1 swxY w Y   d S )NzEscipy sparse array classes do not support instantiation from a scalarmatchr   )pytestr   
ValueErrorselfr:   s     r1    test_singleton_array_constructorz3TestConstructUtils.test_singleton_array_constructor+   s    
 ].
 
 
 	 	 CFFF	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   599c                 2     |d          j         dk    sJ dS )a1  
        This test is for backwards compatibility post scipy 1.13.
        The behavior observed here is what is to be expected
        with the older matrix classes. This test comes with the
        exception of dok_matrix, which was not working pre scipy1.12
        (unlike the rest of these).
        r      rE   Nshaper@   s     r1   !test_singleton_matrix_constructorz4TestConstructUtils.test_singleton_matrix_constructor9   s%     s1vv|v%%%%%%r3   c                 p   t          g dg          }t          g dg dg          }t          g dg dg dg          }g }|                    |ddddggf           |                    |dgdddggf           |                    |dgdddgdggf           |                    |dgddddggf           |                    |dgddddggf           |                    |dgddddggf           |                    |dgddddgddggf           |                    |dgddddgddggf           |                    |dgddddgddggf           |                    |dgdd	g d
g dg dgf           |                    |dgdd	g dg dg dgf           |                    |dgddg dg dg dgf           |                    |ddgddg dg dg dgf           |                    |ddgdd	g dg dg dgf           |                    |ddgddg dg dg dg dg dg dgf           |                    |g d ddg d!g d"g d#g d$g d%g dgf           |                    |g d&ddg d'g d(g d)g d*g d+g d,gf           |                    |g d-t          |d                   t          |d                   g d.g d/g d0g d1g dgf           |D ]\  }}}}}	t          |d                   |k    r;||k    r5t          t	          j        ||                                          |	           t          t	          j        ||||                                          |	           t          t	          j        ||||f                                          |	           d S )2NrE                        	   
                  r   rE   rK   rL   rM   rE   r   r   r   r   rK   r   r   r   r   rL   r   )r   r   r   rM   rN   r   r   rL   r   r   )r   r   r   rM   r   )r   r   r   r   rN   )rE   r   rR   r   rK   r   r   r   rL   rP   r   r   r   rE   rQ   r   r   r   rK   rR   r   rP   )r   r   rL   r   r   r   )r   r   r   rM   r   r   )r   r   r   r   rN   r   )rP   r   r   r   r   r   r   rQ   r   r   r   r   r   r   rR   r   r   r   r[   r   rE   )rP   rW   r   r   r   r   )rE   rQ   rX   r   r   r   )r   rK   rR   rY   r   r   )r   r   rL   rS   rZ   r   )r   r   r   rM   rT   r   rK   r[   )r   r   rR   r   r   )rV   r   r   rS   r   )r   rW   r   r   rT   r   r   rX   r   r   rE   r   r   rY   r   r   rK   r   r   rZ   )r[   rE   rK   )r   rQ   rX   r   r   )rE   r   rR   rY   r   )r   rK   r   rS   rZ   )r   r   rL   r   rT   )r   appendlenr   r)   spdiagstoarray)
rA   diags1diags2diags3casesdor*   r+   results
             r1   test_spdiagszTestConstructUtils.test_spdiagsG   s   ())(* + +()))+ , , faAu-...fqc1a1#/000fqc1a1#qc3444fqc1a1Q%1222fqc1a1Q%1222fbT1a1Q%1222fqc1a1Q%17888fbT1a1Q%17888fqc1a1Q%17888fqc1a)))IIIiii)HIJJJfqc1a)))IIIiii)HIJJJfqc1a+++kkk+++)NOPPPfqeQGGGGGGGGG+DEFFFfr!faYYYyyy,KLMMMfqfa]]].;mm.;mm.;mm.;mm.;mm-= > 	? 	? 	? 	fhhh1/A/A/A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B/D E 	F 	F 	F 	fiiiA1A1A1A1@1@1@1@0B C 	D 	D 	D 	fjjj#fQi..#fQi..''''''''''''&	() 	* 	* 	* #( 	L 	LAq!Q1Q4yyA~~!q&&Y.q!44<<>>GGG*1aA66>>@@&III*1a!Q88@@BBFKKKK		L 	Lr3   c                    t          g d          }t          g d          }t          g d          }g }|                    |d d         dddggf           |                    |d d         gdgddggf           |                    |d d         gdgddgdggf           |                    |d d         gdgdddggf           |                    |d d         gdgdddggf           |                    |d d	         gdgd
ddgdd	ggf           |                    |d d         gdgd
ddgddggf           |                    |d d         gdgdg dg dg dgf           |                    |d d         gdgdg dg dg dgf           |                    |d d         gdgdg dg dg dgf           |                    |d d	         gdgdg dg dg dgf           |                    |d d         gdgdg dg dg dgf           |                    |d d         gdgdg dg dg dgf           |                    |d d         gd	gdg dg dg dgf           |                    |d d	         gdgdg d g d!g dgf           |                    |d d         gd"gdg d#g dg dgf           |                    |d d         gd$gd%g d&g d&g d&g d&g d'gf           |                    |d d	         gd(gd%g d&g d&g d&g d'g d)gf           |                    |d d         gdgd%g d&g d&g d'g d)g d*gf           |                    |d d         gdgd%g d&g d'g d)g d*g d&gf           |                    |d d         gdgd%g d'g d)g d*g d&g d&gf           |                    |d d	         gdgd%g d+g d,g d&g d&g d&gf           |                    |d d         gd	gd%g d-g d&g d&g d&g d&gf           |                    |d d         |d d         gdd	gd.g d/g d)g d*gf           |                    |d d	         |d d         gddgdg d0g d1g d2gf           |                    |d d"         |d d         gd	d(gd3g d4g d5g d6g d7g d8g d9gf           |                    |d d"         ||d d"         gg d:d;g d<g d=g d>g d?g d@gf           |                    |d d	         |d d         |gg dAdBg dCg dDg dEg dFg dGg dHgf           |                    |gdgddggf           |                    |d d         |gdd	gd.g d/g d)g d*gf           |                    t          j         g dIg dJg          ddgd.g d'g dKg dLgf           |                    g dMg dNd.g dOg dMg dPgf           |D ]\  }}}}|dQ|dQ|dQ|}	t          t	          j        |||R                                          ||	S           |d         |d         k    rtt          |d         dT          r^t          |d                   t          |          k    r8t          t	          j        ||U                                          ||	S           d S )VNrJ   rO   rU   rE   r   rD   rK   rE   rE   rK   rK   rK   rK   r[   rL   )rL   rM   r\   r]   r^   )r   rE   r   r   )r   r   rK   r   )r   r   r   rL   rL   rN   )r   r   r   r   r   )rE   r   r   r   r   )r   rK   r   r   r   r_   )r   rE   r   r   r   )r   r   rK   r   r   )r   r   r   rL   r   )r   r   rE   r   r   )r   r   r   rK   r   )r   r   r   r   rL   )r   r   r   rE   r   )r   r   r   r   rK   rM   )r   r   r   r   rE   rj   )rN   rL   r   r   r   rE   r   r   re   r`   ra   r   rE   r   )r   r   rK   r   r   rE   rL   rL   )rE   r   rP   rb   rc   rd   )rP   rP   )r   r   rE   r   r   r   )r   r   r   rK   r   r   )r   r   r   r   rL   r   )rP   r   r   r   r   rM   rf   rg   rh   rN   rN   )rP   rV   r   r   r   )rE   rQ   rW   r   r   )r   rK   rR   rX   r   )r   r   rL   rS   rY   )r   r   r   rM   rT   ri   rP   rN   )r   r   rP   r   r   )rV   r   r   rQ   r   )r   rW   r   r   rR   rk   rl   rm   rE   rK   rL   )rM   rN   rP   )rM   rK   r   )r   rN   rL   )rE   r~   rE   )rE   r   r[   )r~   rE   r   )r   rE   r~    offsetsrG   )err_msg__len__r   )
r   rn   r%   r   r)   diagsrq   hasattrro   max)
rA   abcru   rv   rw   rG   rx   r   s
             r1   
test_diagszTestConstructUtils.test_diags   sK	   ///"""""##&&&''aeQ!.///q!ugsFaSE2333q!ugsFaS!I6777q!ugsFaUG4555q!ugsFaUG4555q!ugsFaUAa5M:;;;q!ugrdFaUAa5M:;;;q!ugsFYYYyyy,KLMMMq!ugsFYYYyyy,KLMMMq!ugtVkkk+++kkk-RSTTTq!ugtVkkk+++kkk-RSTTTq!ugsF[[[[[[,QRSSSq!ugsF[[[[[[,QRSSSq!ugsF[[[[[[,QRSSSq!ugsF[[[[[[,QRSSSq!ugsF[[[[[[,QRSSSq!ugtVggggggggggggggg-VWXXXq!ugtVggggggggggggggg-VWXXXq!ugtVggggggggggggggg-VWXXXq!ugtVggggggggggggggg-VWXXXq!ugsFWWWWWWWWWWWWWWW,UVWWWq!ugsFWWWWWWWWWWWWWWW,UVWWWq!ugsFWWWWWWWWWWWWWWW,UVWWWq!uQrrUmaUFWWWWWWWWW4MNOOOq!uQrrUmbVViii			)))5TUVVVq!uQrrUmaVVmmm5B]]5B]]5B]]5B]]5B]]6D E 	F 	F 	F 	q!uQq!uoxxx///<KOO<KOO<KOO<KOO	:M N 	O 	O 	O
 	q!uQrrU1oyyy&???:J:J:J:I//:I//:I//:I//;K L 	M 	M 	M 	qcA3!.///q!uQi!AIIIyyy0QRSSSHiii+,,rFYY			999-	
 	 	 	 	hhh&:::4>JJ4>JJ3@ A 	B 	B 	B $) 
	. 
	.Aq%99q99U99v99GAUCCCKKMM2 2 2 2 aE!H$$AaD),, %!IIU++Y_Q:::BBDDf%,. . . .
	. 
	.r3   c                     t          g d          }t          t          j        |                                          t          j        |                     d S )NrJ   )r   r   r)   r   rq   r%   diagrA   r   s     r1   test_diags_defaultz%TestConstructUtils.test_diags_default   sG    ///""Y_Q''//11271::>>>>>r3   c                 p    t          g dg dg          }t          t          t          j        |           d S )NrJ   )rK   rL   rM   rN   rP   )r   assert_raisesr?   r)   r   r   s     r1   test_diags_default_badz)TestConstructUtils.test_diags_default_bad   s6    ???OOO455j)/155555r3   c                    t          g d          }t          g d          }t          g d          }g }|                    |d d         gddf           |                    |d d         ||d d         gg dd	f           |                    |d d
         ||d d         gg ddf           |                    |d d
         ||d d         gg dd f           |                    g g dd f           |                    dgdgdf           |                    |gdd f           |D ])\  }}}t          t          t          j        |||           *t          t          t          j        d ggdg           d S )NrJ   rO   rU   r   rD   rM   rL   rh   r   rK   ri   r   rE   rM   rM   r   r   )r   rn   r   r?   r)   r   	TypeError)rA   r   r   r   ru   rv   rw   rG   s           r1   test_diags_badz!TestConstructUtils.test_diags_bad   s   ///"""""##&&&''q!ugq&)***q!uQq!uoxxx8999q!uQq!uoyyy&9:::q!uQq!uoyyy$7888b)))T*+++qcB4()))qc1d^$$$  	R 	RKAq%*ioq!5QQQQQiD6(QCHHHHHHr3   c                    t           j                            d          dD ]C}d|dz  z                       dd          z   t          j         dz   dz
            }                    |           |d |         }fd|D             }t          j        ||          }t          d	 t          ||          D                       }t          |                                |           t          |          dk    ret          j        |d         |d                   }t          j        |d         |d                   }t          |                                |           Ed S )
Ni  )rE   rK   rL   rM   rN   rT   rE   rK   r   rT   c                 Z    g | ]'}                     t          |          z
            (S  )r   abs).0qr+   r/   s     r1   
<listcomp>z9TestConstructUtils.test_diags_vs_diag.<locals>.<listcomp>   s/    ???!!c!ff*--???r3   r   c                 >    g | ]\  }}t          j        ||          S r   )r%   r   )r   xjs      r1   r   z9TestConstructUtils.test_diags_vs_diag.<locals>.<listcomp>   s&    OOOtq!RWQ]]OOOr3   )r%   r&   RandomStaterandintarangeshuffler)   r   sumzipr   rq   ro   r   )rA   n_diagsr   	diagonalsmat	dense_matr+   r/   s         @@r1   test_diags_vs_diagz%TestConstructUtils.test_diags_vs_diag   s`    i##D))* 	I 	IGGQJQ!3!33Ai1ac**GKK   hwh'G?????w???I/)W===COOs9g7N7NOOOPPI*3;;==)DDD7||q  oilGAJGGGGIaL'!*==	.s{{}}iHHH#	I 	Ir3   c                     t          j        dgdgdt                    }t          |j        t                     t          |                                ddgddgg           d S )Ng@r   r}   )r   rG   r.   rK   )r)   r   intr   r.   rq   rA   r   s     r1   test_diags_dtypez#TestConstructUtils.test_diags_dtype  s[    OSEA3fCHHHQWc"""QYY[[Aq6Aq6"233333r3   c                     t          t          d                    }t          dd          D ]`}t          t          j        ||                                          t          j        |g|g                                                     ad S )NrN   r   rP   r   )listranger   r)   r   rq   )rA   rv   ks      r1   test_diags_one_diagonalz*TestConstructUtils.test_diags_one_diagonal  s    qNNr1 	F 	FAA666>>@@"!qc:::BBDDF F F F	F 	Fr3   c                 X    t          j        g           }t          |j        d           d S )Nr   r   )r)   r   r   rG   r   s     r1   test_diags_emptyz#TestConstructUtils.test_diags_empty  s)    OBQWf%%%%%r3   identityc                    t           |d                                          dgg           t           |d                                          ddgddgg            |ddd          }t          |j        t          j        d                     t          |j        d           t
          D ]O} |d|          }t          |j        |           t          |                                g d	g d
g dg           Pd S NrE   rK   r   rL   int8r   )r.   r-   r-   r   r   r   r   rq   r.   r%   r-   sparse_formats)rA   r   Ifmts       r1   test_identityz TestConstructUtils.test_identity  s   XXa[[((**aSE222XXa[[((**aUAa5M:::HQfU333QWbhv..///QXu%%%! 	A 	AC3'''A3'''wwwwwwwww&?@@@@	A 	Ar3   eyec                 &   t           |dd                                          dgg           t           |dd                                          g dg dg           t           |dd                                          ddgddgddgg           t           |dd                                          g dg dg dg           t           |ddd	          j        t          j        d                     d
D ]}d
D ]}t	          dd          D ]}|dk    r||k    s|dk     rUt          |          |k    rBt          j        t          d          5   ||||           d d d            n# 1 swxY w Y   it           ||||                                          t          j	        |||                     ||k    rBt           |||                                          t          j	        |||                     
d S )NrE   rK   rL   r   r   r   r   int16r.   r   r   rP   zOffset.*out of boundsr<   r   )
r   rq   r.   r%   r   r   r>   r   r?   r   )rA   r   r*   r+   r   s        r1   test_eyezTestConstructUtils.test_eye   s   SS1XX%%''1#///SS1XX%%''''''''):;;;SS1XX%%''1Q%1qe)<===SS1XX%%''''''''''')BCCCSS17+++128G3D3DEEE 	 	A  r!  A A!a%%QUUs1vvzz#]&.E   + +  C1NNNN+ + + + + + + + + + + + + + + %C1NNN2244F1a1---   66( #A 3 3 5 5 "q!q 1 1 1  )	 	s   E5	5E9<E9c                    t           |d                                          dgg           t           |d                                          ddgddgg            |ddd          }t          |j        t          j        d                     t          |j        d           t
          D ]O} |d|          }t          |j        |           t          |                                g d	g d
g dg           Pd S r   r   )rA   r   r   r   s       r1   test_eye_onezTestConstructUtils.test_eye_oneD  s   SSVV^^%%u---SSVV^^%%1qe}555C...QWbhv..///QXu%%%! 	A 	ACAc"""A3'''wwwwwwwww&?@@@@	A 	Ar3   c                     t          t          j        d          t                    sJ t          t          j        d          t                    rJ d S )NrL   )
isinstancer)   	eye_arrayr   r   rA   s    r1   test_eye_array_vs_matrixz+TestConstructUtils.test_eye_array_vs_matrixR  sI    )-a00':::::imA..8888888r3   c                    g }|                     t          dgg                     |                     t          dgg                     |                     t          dgg                     |                     t          dgg                     |                     t          dgdgg                     |                     t          ddgg                     |                     t          ddgddgg                     |                     t          ddgddgg                     |                     t          g d	g d
g                     |                     t          ddgddgddgg                     |                     t          g dg dg dg                     |                     t          g dg                     |                     t          g dg dg                     |D ]}t          |          }|D ]}t          |          }t          j        ||          }t
          dd         D ]g}t          j        |||          }t          |j        |           t          |
                                |           t          |t                    sJ h|d         }|d         }t          |          }t          |          }t          j        ||          }t
          D ]g}t          j        |||          }t          |j        |           t          |
                                |           t          |t                    sJ ht          j        t          |          t          |          |          }t          |j        |           t          |
                                |           t          |t                    sJ d S )Nr   r[   rM   rT   rE   rK   rL   rN   r   rK   irR   r   rY   rP   )rN   rM   rM   r   )rP   r   rR   )r   rE   r   rK   r   rN   rR   )      ?g      ?r   g      
@)r   g      @r   r   r   re   )rn   r   r   r%   kronr   r)   r   r-   r   rq   r   r   r
   r   )	rA   ru   r   car   cbexpectedr   rx   s	            r1   	test_kronzTestConstructUtils.test_kronV  s   UQC5\\"""URD6]]###UQC5\\"""URD6]]###UQC9%%&&&UQqE7^^$$$UQqE1Q%=))***UQqE1Q%=))***UHHHXXX.//000UQqE1Q%1.//000UGGGGGGGGG455666UOOO,--...U...{{{;<<===  		7 		7A1B 7 7q\\71a==)!A#. 7 7C&^B3???F 444&v~~'7'7BBB%fg666666	77 "I"Iq\\q\\71a==! 	/ 	/C^B3777F,,,v~~//:::fg...... 
1z!}}SIIIV]C(((6>>++X666&(+++++++r3   c                    t          j        t          d          5  t          j        dgdggt          ddg                     d d d            n# 1 swxY w Y   t          j        t          d          5  t          j        t          ddg          dgdgg           d d d            n# 1 swxY w Y   t          j        dgdggddg           d S )Nrequires 2D inputr<   r   rE   )r>   r   r?   r)   r   r   r   s    r1   test_kron_ndim_exceptionsz,TestConstructUtils.test_kron_ndim_exceptions  sJ   ]:-@AAA 	: 	:NQC!:y!Q'8'8999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:]:-@AAA 	: 	:N9aV,,sQCj999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	aSzAq6*****#   )AAA7)B,,B03B0c                     d}t          j        dgd|f|dz
            }t          j        dg|dfd|z
            }t          j        ||           t          j        ||           d S )Ni   rE   )rG   r   )r)   diags_arrayr   )rA   r+   r   r   s       r1   test_kron_largez"TestConstructUtils.test_kron_large  ss    !1#aVQqSAAA!1#aVQqSAAAq!q!r3   c           
         g }|                     t          dgg                     |                     t          dgg                     |                     t          dgg                     |                     t          dgg                     |                     t          ddgddgg                     |                     t          ddgddgg                     |                     t          g d	g d
g dg                     |                     t          g dg dg dg                     |D ]}|D ]}t          j        t	          |          t	          |                                                    }t          j        t          j        |j	        d                   |          t          j        |t          j        |j	        d                             z   }t          ||           t          j        t          |          t          |                                                    }t          ||           d S )Nr   r[   rM   rT   rE   rK   rL   rN   r   r   )r   rL   r   r   )r   rN   r[   )rM   r~   rR   )rn   r   r)   kronsumr   rq   r%   r   r   rG   r   r
   )rA   ru   r   r   rx   r   s         r1   test_kronsumzTestConstructUtils.test_kronsum  s   UQC5\\"""URD6]]###UQC5\\"""URD6]]###UQqE1Q%=))***UQqE1Q%=))***UHHHXXXggg677888UGGGHHHXXX677888  	5 	5A 5 5"*9Q<<1FFNNPPGBF171:$6$6:: ga
););<<="684444	5 ":a==*Q--@@HHJJ68,,,,,r3   c                    t          j        t          d          5  t          j        dgdggt          ddg                     d d d            n# 1 swxY w Y   t          j        t          d          5  t          j        t          ddg          dgdgg           d d d            n# 1 swxY w Y   t          j        ddgddggdg           d S )Nr   r<   r   rE   rK   )r>   r   r?   r)   r   r   r   s    r1   test_kronsum_ndim_exceptionsz/TestConstructUtils.test_kronsum_ndim_exceptions  sP   ]:-@AAA 	= 	=sQCj)QF*;*;<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=]:-@AAA 	= 	=iA//1#s<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	Aq6Aq6*QC00000r   coo_clsc                 2    |ddgddgg          } |ddgg          }t          ddgddgddgg          }t          t          j        ||g                                          |           t          t          j        ||gt
          j                  j        t
          j                   t          t          j        |                                |                                g                                          |           t          t          j        |	                                |	                                g                                          |           t          j        |	                                |	                                gdt
          j        	          }t          |j        t
          j                   t          |j
        j        t
          j                   t          |j        j        t
          j                   t          t          j        |                                |                                g                                          |           t          j        |                                |                                gd
t
          j        	          }t          |j        t
          j                   t          |j
        j        t
          j                   t          |j        j        t
          j                   d S )NrE   rK   rL   rM   rN   rP   r   r   )r-   r.   r   )r   r   r)   vstackrq   r%   float32r.   todoktocsrindicesint32indptrtocsc)rA   r   ABr   rx   s         r1   test_vstackzTestConstructUtils.test_vstack  sw   GaUAa5M""GaUG1a&a&a&" # # 	Y%q!f--5577BBBY%q!fBJ???EZ	! 	! 	! 	Y%qwwyy!''))&<==EEGGRRRY%qwwyy!''))&<==EEGG	 	 	!17799aggii"8).bjB B BV\2:...V^)28444V]("(333Y%qwwyy!''))&<==EEGG	 	 	!17799aggii"8).bjB B BV\2:...V^)28444V]("(33333r3   c                 |   t          g dg dg dg          }|j                            t          j                  |_        |j                            t          j                  |_        t          j        ||g          j        j        t          j        k    sJ t          j	        ||g          j        j        t          j        k    sJ t          g dg dg dg          }|j                            t          j                  |_        |j                            t          j                  |_        t          j        ||g          j        j        t          j        k    sJ t          j	        ||g          j        j        t          j        k    sJ t          g dg dg dg          }t          d |j        D                       |_        t          j        ||g          j        d         j        t          j        k    sJ t          j	        ||g          j        d         j        t          j        k    sJ d S )Nr   r   c              3   T   K   | ]#}|                     t          j                  V  $d S r$   astyper%   int64r   cos     r1   	<genexpr>zITestConstructUtils.test_vstack_maintain64bit_idx_dtype.<locals>.<genexpr>  0      @@28,,@@@@@@r3   r   )r   r   r   r%   r   r   r)   r   r.   hstackr   r   tuplecoordsrA   Xs     r1   #test_vstack_maintain64bit_idx_dtypez6TestConstructUtils.test_vstack_maintain64bit_idx_dtype  s   yyy)))YYY7888??28,,I$$RX..	A''.4@@@@A''.4@@@@yyy)))YYY7888??28,,I$$RX..	A''.4@@@@A''.4@@@@yyy)))YYY788@@qx@@@@@A''.q1728CCCCA''.q1728CCCCCCr3   c                 H   ddgddgg}ddgg}t          t          j        t          |          t          |          g          t                    sJ t          t          j        t          |          t          |          g          t                    sJ t          t          j        t          |          t          |          g          t                    sJ t          t          j        t          |          t          |          g          t                    sJ d S NrE   rK   rL   rM   rN   rP   )r   r)   r   r   r   r   r   rA   r   r   s      r1   test_vstack_matrix_or_arrayz.TestConstructUtils.test_vstack_matrix_or_array  s    UAa5MUG)*IaLL)A,,+GHH'RRRRR)*IaLL*Q--+HII7SSSSS)*JqMM9Q<<+HII7SSSSS)*JqMM:a==+IJJHUUUUUUUr3   c                    t          g dg dg          }t          g d          }t          g d          }t          j        |t	          j        g d          g          j        dk    sJ t          j        |t	          j        dgg          g          j        dk    sJ t          j        ||g          j        dk    sJ t          j        ||g          j        dk    sJ t          j        ||g          j        d	k    sJ t          j        ||g          j        dk    sJ t          j        ||g          j        dk    sJ t          j        ||g          j        dk    sJ t          j        ||g          j        dk    sJ t          j	        t          d
          5  t          j        |t	          j        ddg          g           d d d            n# 1 swxY w Y   t          j	        t          d          5  t          j        |t	          j        ddg          g           d d d            d S # 1 swxY w Y   d S )Nr   r   r   r   r   )rE   rM   )rE   rP   )rK   rL   )rK   rP   zincompatible row dimensionsr<   zincompatible column dimensions)r   r   r)   r   r%   r   rG   r  r>   r   r?   )rA   arrarr1darr1dcoos       r1   test_vstack_1d_with_2dz)TestConstructUtils.test_vstack_1d_with_2d  s   III.//)))$$YYY''bhyyy&9&9 :;;AVKKKK1# 899?6IIII//5????//5???? c
++1V;;;;//5???? 1228FBBBBh006&@@@@ 1228FBBBB]:-JKKK 	6 	6c28QF#3#34555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6]:-MNNN 	6 	6c28QF#3#34555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s$   $+GG"G+H99H= H=c                     |ddgddgg          } |dgdgg          }t          g dg dg          }t          t          j        ||g                                          |           t          t          j        ||gt
          j        	          j        t
          j                   t          t          j        |                                |                                g                                          |           t          t          j        |	                                |	                                g                                          |           t          t          j        |	                                |	                                gt
          j        	          j        t
          j                   t          t          j        |
                                |
                                g                                          |           t          t          j        |
                                |
                                gt
          j        	          j        t
          j                   d S )
NrE   rK   rL   rM   rN   rP   rE   rK   rN   rL   rM   rP   r   )r   r   r)   r  rq   r%   r   r.   r   r   r   )rA   r   r   r   r   s        r1   test_hstackzTestConstructUtils.test_hstack  s   GaUAa5M""GaS!I)))#))% & &Y%q!f--5577BBBY%q!fBJ???EZ	! 	! 	! 	Y%qwwyy!''))&<==EEGGRRRY%qwwyy!''))&<==EEGG	 	 	Y%qwwyy!''))&<,.J8 8 88=Z	! 	! 	! 	Y%qwwyy!''))&<==EEGG	 	 	Y%qwwyy!''))&<,.J8 8 88=Z	! 	! 	! 	! 	!r3   c                 J   ddgddgg}dgdgg}t          t          j        t          |          t          |          g          t                    sJ t          t          j        t          |          t          |          g          t                    sJ t          t          j        t          |          t          |          g          t                    sJ t          t          j        t          |          t          |          g          t                    sJ d S r  )r   r)   r  r   r   r   r   r  s      r1   test_hstack_matrix_or_arrayz.TestConstructUtils.test_hstack_matrix_or_array  s    UAa5MS!I)*IaLL)A,,+GHH'RRRRR)*IaLL*Q--+HII7SSSSS)*JqMM9Q<<+HII7SSSSS)*JqMM:a==+IJJHUUUUUUUr3   block_arrayc                 d   t          ddgddgg          }t          dgdgg          }t          dgg          }t          d          }t          g d	g d
g dg          }t           |||gd |gg                                          |           t	          dt
          j                  }t           ||                                |                                g||                                gg                                          |           t           ||                                |                                g|                                |                                gg                                          |           t          g dg dg dg          }t           ||d gd |gg                                          |           t           ||                                |j	                                        g||                                gg                                          |           t           ||                                |j	                                        g|                                |                                gg                                          |           t	          dt
          j                  }t          ddgddgddgg          }t           |d |g|d gg                                          |           t           ||j	                                        |                                g|                                |gg                                          |           t           ||j	                                        |                                g|                                |                                gg                                          |           t          j
        d          }t           |d d gg                                          |           t           |d |g|d gg                                          |           t          dgg          }t           |d |g|d gg                                          |           t          t                    5 }	 ||g|gg           d d d            n# 1 swxY w Y   |	                    d           t          t                    5 }	 ||                                g|                                gg           d d d            n# 1 swxY w Y   |	                    d           t          t                    5 }	 ||                                g|                                gg           d d d            n# 1 swxY w Y   |	                    d           t          t                    5 }	 |||gg           d d d            n# 1 swxY w Y   |	                    d           t          t                    5 }	 ||                                |                                gg           d d d            n# 1 swxY w Y   |	                    d           t          t                    5 }	 ||                                |                                gg           d d d            n# 1 swxY w Y   |	                    d           d S )NrE   rK   rL   rM   rN   rP   rQ   r   r  r  )r   r   rQ   r|   r   )rE   rK   r   )rL   rM   r   rD   r   z.Got blocks\[1,0\]\.shape\[1\] == 1, expected 2z"incompatible dimensions for axis 1z4Mismatching dimensions along axis 1: ({1, 2}|{2, 1})z.Got blocks\[0,1\]\.shape\[0\] == 1, expected 2z4Mismatching dimensions along axis 0: ({1, 2}|{2, 1})z"incompatible dimensions for axis 0)r   r   r   rq   r   r%   r   r   r   Temptyr   r?   r=   )
rA   r  r   r   CDr   EZexcinfos
             r1   test_block_creationz&TestConstructUtils.test_block_creation&  s    1v1v&''sA3i  sef)))#))#))% & & 	[[1a&4)!455==??JJJfBH---[[17799aggii"8#$aggii."2 3 33:799	 	 	 	[[17799aggii"8#$7799aggii"8": ; ;;B799	 	 	 )))#))#))% & & 	[[1d)dAY!788@@BBHMMM[[17799aciikk":#$aggii."2 3 33:799	 	 	 	[[17799aciikk":#$7799aggii"8": ; ;;B799	 	 	 fBH---1a&a&a&" # # 	[[4)aY!788@@BBHMMM[[1399;;		":#$7799a."2 3 33:799	 	 	 	[[1399;;		":#$7799aggii"8": ; ;;B799	 	 	 8F##[[4,0088::HEEE[[4)aY!788@@BB	 	 	 1#<<[[4)aY!788@@BB	 	 	 :&& 	$'K!qc
###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$GHHH:&& 	4'K!''))qwwyyk2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4;<<<:&& 	4'K!''))qwwyyk2333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4MNNN:&& 	"'K!Q!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"GHHH:&& 	2'K!''))QWWYY/0111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2MNNN:&& 	2'K!''))QWWYY/0111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2;<<<<<sl   S33S7:S7'4U''U+.U+4WW"WX**X.1X.3ZZ!$Z!3\\\c                 `   t           j        }ddgddggdgdgg}}t          |          t          |          }}t           |d |g|d ggd          t                    sJ t           |d |g|d ggd          t                    sJ t           |||ggd          t                    sJ d S )	NrE   rK   rL   rM   rQ   rN   r   r   )r)   r  r
   r   r   )rA   blockFlGlFmGms         r1   test_block_return_typez)TestConstructUtils.test_block_return_typet  s    %
 a&!QA3*BBBB%%$b$Z 8GGGQQQQQ%%$b$Z 8GGGQQQQQ%%"b
59997CCCCCCCr3   c                    t           j        }ddgddggdgdgg}}t          |          t          |          }}t          |          t          |          }}t	           |||ggd          t
                    sJ t	           |||ggd          t                    sJ t	           |d	|g|d	ggd          t
                    sJ t	           |d	|g|d	ggd          t
                    sJ t	           |d	|g|d	ggd          t                    sJ t	           |d	|g|d	ggd          t                    sJ t	           |||ggd          t
                    sJ t	           |||ggd          t
                    sJ t	           |||ggd          t
                    sJ t	           |||ggd          t                    sJ t	           |||ggd          t
                    sJ t	           |||ggd          t                    sJ t	           ||                                |                                ggd
          t
                    sJ t	           ||                                |                                ggd
          t                    sJ t	           ||                                |                                ggd          t
                    sJ t	           ||                                |                                ggd          t                    sJ t	           |||ggd          t
                    sJ t	           ||                                |ggd          t
                    sJ t	           ||                                |ggd          t                    sJ t	           |||ggd
          t                    sJ d	S )z2This can be removed after sparse matrix is removedrE   rK   rL   rM   rQ   rN   r   r   Nr   )r)   bmatr
   r   r   r   r   r   )rA   r+  r%  r&  r'  r(  FaGas           r1   test_bmat_return_typez(TestConstructUtils.test_bmat_return_type  s0   ~a&!QA3*BBBB2	"B$$Rz%888'BBBBB$$Rz%888(CCCCC$$r
RJ7FFFPPPPP$$r
RJ7FFFPPPPP$$r
RJ7FFFQQQQQ$$r
RJ7FFFQQQQQ $$Rz%888'BBBBB$$Rz%888'BBBBB$$Rz%888'BBBBB$$Rz%888(CCCCC$$Rz%888'BBBBB$$Rz%888(CCCCC $$RXXZZ 89%HHH'RRRRR$$RXXZZ 89%HHH(SSSSS$$RXXZZ 89%HHH'RRRRR$$RXXZZ 89%HHH(SSSSS $$Rz%888'BBBBB$$R 01%@@@'JJJJJ$$R 01%@@@(KKKKK$$Rz%888(CCCCCCCr3   z!Can't create large array for testc           	         t          d           d}t          t          j        ||ft                              }|                                }t          j        ||fdd          }t          t          j	        t          j
        t          j        |j                  |                               t          |j        j        t          j                   t          |j        j        t          j                   dS )z6 test for indptr overflow when concatenating matrices i0u  i  r   r   F)axisreturn_spmatrixN)r	   r   r%   onesboolcopyr)   _compressed_sparse_stackr   allequaldiffr   r   r   r.   r   )rA   r+   r   r   r  s        r1   test_concatenate_int32_overflowz2TestConstructUtils.test_concatenate_int32_overflow  s    
 	%   bgq!fD11122FFHH.1vA?DF F F 	rx 1 115566777QY_bh///QX^RX.....r3   c                 j   t          ddgddgg          }t          dgdgg          }t          dgg          }t          g dg d	g d
g dg dg          }t          j        |||f          }t	          |                                |           |j        d         j        t          j	        k    sJ dS )z basic test for block_diag rE   rK   rL   rM   rN   rP   rQ   )rE   rK   r   r   )rL   rM   r   r   )r   r   rN   r   )r   r   rP   r   )r   r   r   rQ   r   N)
r   r   r)   
block_diagr   rq   r  r.   r%   r   )rA   r   r   r  r   ABCs         r1   test_block_diag_basicz(TestConstructUtils.test_block_diag_basic  s    !uaUm$$sA3i  se,,,&,,&,,&,,&,,	( ) ) "Aq!9--S[[]]H---z!}"bh......r3   c                     t          g dg dg dg          }t          d |j        D                       |_        t          j        ||g          j        d         j        t          j        k    sJ d S )Nr   r   c              3   T   K   | ]#}|                     t          j                  V  $d S r$   r   r   s     r1   r  z?TestConstructUtils.test_block_diag_idx_dtype.<locals>.<genexpr>  r  r3   r   )r   r  r  r)   r;  r.   r%   r   r  s     r1   test_block_diag_idx_dtypez,TestConstructUtils.test_block_diag_idx_dtype  su    yyy)))YYY788@@qx@@@@@#QF++215;rxGGGGGGr3   c                 >   t          t          j        ddgdg                                          g dg dg           t	          g d          }t	          ddg          }t          t          j        ||g                                          g dg d	g           d
S )z) block_diag with scalar and 1d arguments rK   rL   rM   )rK   rL   r   )r   r   rM   )rE   r   rL   r   )rE   r   rL   r   r   )r   r   r   r   rM   N)r   r)   r;  rq   r   r  s      r1   test_block_diag_scalar_1d_argsz1TestConstructUtils.test_block_diag_scalar_1d_args  s     	9/!A
;;CCEE%IIyyy1	3 	3 	3 gggqe9/A77??AA+OO___=	? 	? 	? 	? 	?r3   c                 @   t          t          j        ddgg                                          t	          ddgg                     t          t          j        ddggg                                          t	          ddgg                     t          t          j        dgdggg                                          t	          dgdgg                     t          t          j        dg                                          t	          dgg                     dS )z block_diag with one matrix rE   r   N)r   r)   r;  rq   r   r   s    r1   test_block_diag_1z$TestConstructUtils.test_block_diag_1  s   Y)Aq6(33;;==QF8__	& 	& 	&Y)QF8*55==??QF8__	& 	& 	&Y)QC!:,77??AAQC!:&&	( 	( 	( 	Y)1#..6688QC5\\	# 	# 	# 	# 	#r3   c                    t          g dgd          }t          ddggd          }t          t          j        ||g                                          t          g dg dg                     t          d	gd
gdggd          }t          dgdggd          }t          t          j        ||g                                          t          d	dgd
dgddgddgddgg                     dS )z block_diag with sparse arrays r   )rE   rL   rF   rM   rN   r|   )rE   rK   rL   r   r   )r   r   r   rM   rN   rE   rK   rL   )rL   rE   r{   r   N)r   r   r)   r;  rq   r   r  s      r1   test_block_diag_sparse_arraysz0TestConstructUtils.test_block_diag_sparse_arrays  s     yyyk0001vhf---Y)1a&1199;;OOO___=>>	@ 	@ 	@ sQC!oV444sQCj///Y)1a&1199;;QFQFQFQFQFCDD	F 	F 	F 	F 	Fr3   c                    t          g dg          t          g dg          }}t          t          j        ||g          t
                    sJ t          t          j        ||g          t
                    sJ t          t          j        ||g          t
                    sJ t          t          j        ||g          t                    sJ d S )Nr   )rK   rL   rM   )r   r   r   r)   r;  r   r   r  s      r1   test_block_diag_return_typez.TestConstructUtils.test_block_diag_return_type  s    )))%%z999+'>'>1).1v66@@@@@).1v66@@@@@).1v66@@@@@).1v66AAAAAAAr3   c                    t           t          fD ]t          j        t          j        t          j        t          j        t          j        t          j        t          j	        fD ]P} ddd|          }t          |j        |           t          |j        d           t          |j        d           Q dddd          }t          |j        t          j                    dddt          j                            d                    }t!          |j        |j                   t!          |j        |j                   t!          |j        |j                   dD ]L} dd|	          }t          |j        t)          |t          j        |j                  z                       Md
D ]%} dd|          }t          |j        |           &t/          t0          fd           t/          t0          fd           d S )NrN   rT   皙?)r,   r.   )rN   rT     )r,   r/   )g        rJ  r   g      ?r,   )r   r   r   r    r   c                        ddd          S )NrN   rT   g?r   fs   r1   <lambda>z9TestConstructUtils.test_random_sampling.<locals>.<lambda>  s    aa2smm r3   c                        ddd          S )NrN   rT   gr   rN  s   r1   rP  z9TestConstructUtils.test_random_sampling.<locals>.<lambda>  s    aa2tnn r3   )sprandr2   r%   r   float64
longdoubler   r   	complex64
complex128r   r.   rG   nnzr&   r'   r   datarowcolr   prodr-   r   r?   )rA   tr   x1x2r,   r   rO  s          @r1   test_random_samplingz'TestConstructUtils.test_random_sampling  s   ! 	> 	>Aj"*bmh",G ' 'AaS222QWa(((QWg...QUA&&&&1b#4000B2:...1b#29+@+@+F+FGGGBrw000rvrv...rvrv.../ E EAaW---QUC"'!'2B2B(B$C$CDDDD3 , ,AaC(((QXs++++*&;&;&;&;<<<*&<&<&<&<====5	> 	>r3   r/   NrK  c                 &   t          dddt          j        |          }t          t          j        t          j        d|j                                       t          t          j        t          j        |j        d                               d S NrT      r   r,   r.   r/   r   rE   )rR  r%   rS  r   r6  
less_equalrX  rA   r/   r   s      r1   	test_randzTestConstructUtils.test_rand  sp     2r3bjcBBBr}Q//00111r}QVQ//0011111r3   c                 F   t          dddt          j        |          }t          t          j        t          j        |j        d                               t          t          j        t          j        d|j                                       t          dddt          j        |          }t          t          j        t          j        |j        d                               t          t          j        t          j        d|j                                       d S ra  )r2   r%   rS  r   anylessrX  r7   re  s      r1   
test_randnzTestConstructUtils.test_randn  s    
 RS
DDDrwqvq))**+++rwq!&))**+++2r3bjcJJJrwqvq))**+++rwq!&))**+++++r3   c                     t          j        ddd           t          j        dd           t          j        dd           t          j        dd           d S )NrT   rv   r   rT   rT   rT   rT   rT   rT   rT   rT   rT   rT   )r)   r&   r6   r   s    r1   test_random_accept_str_dtypez/TestConstructUtils.test_random_accept_str_dtype&  se     	Rs++++xs3333|3777733??????r3   c                    t          j        ddt          d          }|j        dk    sJ t          j        ddt          d          }|j        dk    sJ t          j        ddt          d          }|j        dk    sJ d S )N)r   rM   g333333?r   )r,   r.   random_staterm  rc  rn  )r)   r6   r   rG   )rA   r  s     r1   'test_random_array_maintains_array_shapez:TestConstructUtils.test_random_array_maintains_array_shape.  s    $VSRSTTTyF""""$\3cqQQQyL(((($%93c)*, , ,y0000000r3   c                 r    t          j        d          }|j        d         j        t          j        k    sJ d S )Nrl  r   )r)   r6   r  r.   r%   r   )rA   r   s     r1   test_random_array_idx_dtypez.TestConstructUtils.test_random_array_idx_dtype:  s4    "8,,x{ BH,,,,,,r3   c                    t          j        ddd          }t          |                                d           t          j        dd          }t          |                                d           t          |t                    sJ d}t          j        |d          }t          |                                d           t          j        d	d
          }t          |                                d           t          |t                    sJ d}t          j        |d          }t          |                                d           d S )NrT   gx&1?rL  rX   rl  )        rv  g(Rs?<i  )rT   rT   rT   rT   gk) 3?i  )rv  rv  rv  gAy5:   )r)   r&   r   count_nonzeror6   r   r   )rA   sparse_matrixsparse_arrayrG   s       r1   Etest_random_sparse_matrix_returns_correct_number_of_non_zero_elementszXTestConstructUtils.test_random_sparse_matrix_returns_correct_number_of_non_zero_elements>  s:    "(R@@@]00222666 -hGGG\//11"555,00000 -eZHHH\//11$777 !-.>PPP\//11$777,00000% -eZHHH\//11#66666r3   )J__name__
__module____qualname__r>   markparametrizer   r   r   r   r   r   r   rB   r   r
   r   r   r   r   rH   ry   r   r   r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  r  r  r+  r  r"  r)  r.  slowthread_unsafexfail_on_32bitr9  r=  r@  rB  rD  rF  rH  r_  r%   r&   r'   rf  rj  ro  rr  rt  r{  r   r3   r1   r9   r9   )   s       [U9i9i%   	  [UJ
J
%  & &	 &6L 6L 6LpL. L. L.\? ? ?6 6 6I I I&I I I64 4 4
F F F& & & [Z)*<i>Q)RSSA A TSA [UY]I4G$HII! ! JI!F [UY]I4G$HIIA A JIA9 9 9., ., .,`+ + +  - - -01 1 1 [YY(?@@4 4 A@4:D D D&V V V6 6 6. [YY(?@@! ! A@!.V V V []Y^Y=R,STTK= K= UTK=Z
D 
D 
D"D "D "DH [[[ CDD/ / ED  // / / H H H
	? 	? 	?
# 
# 
#F F FB B B> > >< [UT41F1Ft1L1L$MNN2 2 ON2 [UT41F1Ft1L1L$MNN	, 	, ON	,@ @ @
1 
1 
1- - -7 7 7 7 7r3   r9   c                     t          j        dd          } t          t          j        |                                           t          j        |                      t          t          j        | d                                          t          j        | d                     t          t          j        | dd                                          t          j        | d          dd	dd	f                    t          j        t          d
          5  t          j
        t          j        dd          dd           ddd           dS # 1 swxY w Y   dS )z7Tests of diags_array that do not rely on diags wrapper.rE   rN   rK   r   r   r   r   NrM   z.*out of boundsr<   rF   )r%   r   r   r)   r   rq   r   r>   r   r?   r   )r   s    r1   test_diags_arrayr  W  sw   9Q??Dy,T22::<<bgdmmLLLdA...6688"'$!:L:L:L   dAV<<<DDFF
2A2rr6"   
z):	;	;	; : :	!Q&9999: : : : : : : : : : : : : : : : : :s   +EEE)r"   r   NN)(__doc__numpyr%   r   numpy.testingr   r   r   r   r>   r   r   scipy._lib._testutilsr	   scipy.sparser
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   scipy.sparse._constructr   rR  r   r2   r7   r9   r  r   r3   r1   <module>r     s   / /          < < < < < < < < < < < <  * * * * * * 3 3 3 3 3 33 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2<<<
I I I IF F F Fk7 k7 k7 k7 k7 k7 k7 k7\: : : : :r3   