
    >qj                        d dl 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mZmZmZmZmZmZ d dlZd dlmZmZmZ d dlmZ 	 d dlmZ ej<                  ZdZ 	 d d
lm"Z# e#jH                  ZejJ                  ejL                  gZ'ejP                  ejR                  gZ*e'e*z   Z+d Z,d Z-d Z.d Z/d Z0d Z1d+dZ2 G d d      Z3 G d d      Z4 G d d      Z5 G d d      Z6 G d d      Z7 G d d      Z8 G d d      Z9 G d  d!      Z: e2d"d#      d$        Z;ejx                  j{                  d	d%&      d'        Z>ejx                  j{                  ed()      d*        Z?y# e!$ r dZd	Z Y w xY w# e!$ r dZ#Y w xY w),    N)assert_equalassert_almost_equalassert_array_almost_equalassert_allclose)raises)
arangetriutrilzerostril_indicesonesdiagappendeyenonzero)get_blas_funcstoeplitzsolve)	HAS_ILP64)_fblasTF)	_fblas_64c            	      0   t        dt        j                  dt        j                  d      t        j                  dt        j                  d      f      \  } }}t        | j                  d       t        |j                  d       t        d      } t        | j                  d       t        d	t        j                  
      } t        | j                  d       t        d	d
      } t        | j                  d       t        d	t        j                  
      } t        | j                  d       t        dt        j                  dt        j                  
      t        j                  dt        j                  
      f      } t        | j                  d       y )N)axpyr   r      r   F)dtypeorderCzrotgdgemmr   cr   )	r   npempty	complex64
complex128r   typecodeclongdoublefloat64)f1f2f3s      [/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/scipy/linalg/tests/test_blas.pytest_get_blas_funcsr1   '   s      	&C	8	&S	9	;
JBB c"c" 
	Bc" 
bll	3Bc"	c	*Bc" 
bnn	5Bc" 
&

;&=?
B c"    c                     t        dt        j                  d      fd      } t        r| j                  t        j
                  k(  sJ t        j                  sJ t        r| j                  dk(  sJ 	 t        dt        j                  d      f      } t        r| j                  t        j
                  k(  sJ t        j                  sJ t        r| j                  dk(  sJ y y )Nr#      	preferredilp64fblas_64)r   r&   r   r   	int_dtypeint64int32module_namer#   s    r0   !test_get_blas_funcs_ilp_preferredr>   K   s    &266!9,kBD)24>>RXX%@@@@-64z)CCG &266!9,/D)24>>RXX%@@@@-64z)CCG)r2   c                  V   t         rSt        dt        j                  d      fd      } | j                  t        j
                  k(  sJ | j                  dk(  sJ y t        j                  t              5  t        dt        j                  d      fd       d d d        y # 1 sw Y   y xY w)Nr#   r4   Tr6   r8   )
r   r   r&   r   r9   r:   r<   pytestr   RuntimeErrorr=   s    r0   test_get_blas_funcs_ilp_truerB   W   s~    frvvayl$?~~))):---]]<( 	=6BFF1I<t<	= 	= 	=   3#BB(c                  V   t         rSt        dt        j                  d      fd      } | j                  t        j
                  k(  sJ | j                  dk(  sJ y t        j                  t              5  t        dt        j                  d      fd       d d d        y # 1 sw Y   y xY w)Nr#   r4   Fr6   fblas)
HAS_LP64_FBLASr   r&   r   r9   r;   r<   r@   r   
ValueErrorr=   s    r0   test_get_blas_funcs_ilp_falserH   b   s~    frvvayl%@~~)))7***]]:& 	>6BFF1I<u=	> 	> 	>rC   c                      t        dt        j                        \  } }| j                  dk(  sJ |j                  dk(  sJ t        dt        j                        \  } }}| |u sJ | |u sJ y )N)nrm2dotr$   r%   )rK   dotcdotu)r   r&   r(   r*   r,   )fghs      r0   test_get_blas_funcs_aliasrQ   m   sg    />DAq::::4BJJGGAq!6M66M6r2   c                     | j                  d      r| dd } n| dv r| d   } n	| dv r| d   } t        j                  t        j                  t        j                  t        j
                  d}||    S )z%Array dtype from a blas-style prefix.i   N)scdzr   )cszd)r    r%   r"   s)
startswithr&   r)   r(   r,   float32)prefixdt_maps     r0   _dt_from_prefixr^   x   se    	<		<	==r||"**2::VF&>r2   c                    |t         dft        dfg}g }|D ]  \  }}|D ]  }t        |      }|Bt        j                  d|| d| |  t        j
                  j                  | d            }n.t        ||| z         }	t        j                  |	|| d| |        }|j                  |         t        j
                  j                  d	|      S )
a  Parametrize a test over BLAS prefixes, "sdcz", and over the BLAS modules,
    `fblas,fblas_64.

    Given a func_name "gemm", this generates a pytest parametrization over up to 8
    variants: sgemm, dgemm, cgemm, zgemm, each loaded from `fblas` (i.e. 32-bit LP64
    variants) and `fblas_64` (i.e. 64-bit ILP64 variants)..

    If a module is not available, the pytest parameter has a skip mark, so that the
    test is skipped with a descriptive message.

    Parameters
    ----------
    func_name : str
        The base name of a BLAS function, e.g. "gemm"
    prefixes : str or sequence
        BLAS prefixes to prepend to `func_name`.
        E.g. ``func_name='gemm', prefixes='cz'`` generates `cgemm` and `zgemm`.
    modules : sequence of ``(module, str)`` pairs
        BLAS modules to fetch functions from. By default, use `fblas` (LP64 variant)
        and fblas_64 (ILP64 variant).
    NrE   r8   . is not availablereason)idmarks)rd   zf, dtype)
rE   r8   r^   r@   parammarkskipgetattrr   parametrize)
	func_nameprefixesmodulesparamsmodmod_namer\   r   param_rN   s
             r0   parametrize_blasrr      s    , 7#h
%;<F  "X 	"F#F+E{%"1VHYK8 ++**XJ>O2P*Q C)!34ahZq3TUMM&!	""" ;;"":v66r2   c                   H   e Zd Z edd      d        Z edd      d        Z edg d      d        Z ed	d
      d        Z edd      d        Z edd      d        Z	 edg d      d        Z
 edg d      d        Z edd      d        Z edg d      d        Zy)TestFBLAS1Simpler   sdczc                     t         |g dg dd      g d       |t        v rt         |g dg dd      g d       y y )NrT   r   r4   )r   r4      a)   	      )rT                  @r4   )r|   y            $@r~   r   COMPLEX_DTYPESselfrN   r   s      r0   	test_axpyzTestFBLAS1Simple.test_axpy   s;    !!IzQ"?",	.N"%a
J!&D&46 #r2   copyc                     t         |g ddgdz        g d       |t        v rt         |g ddgdz        g d       y y )N)r4      ry      r4   )r4                 @y      @      @r   r   s      r0   	test_copyzTestFBLAS1Simple.test_copy   s=    !!Is1u"5yAN"%as1u&=}M #r2   asum)rY   r"   rU   rV   c                 f    t         |g d      d       |t        v rt         |g d      d       y y )Nr4   ry                    @r         @         )r   r   r   s      r0   	test_asumzTestFBLAS1Simple.test_asum   s,    AjM2.N". 126 #r2   rK   sdc                 2    t         |g dg d      d       y )Nr   )r   ry   rT   ir   r   s      r0   test_dotzTestFBLAS1Simple.test_dot   s    Aj)4b9r2   rM   czc                 2    t         |g dg d      d       y )Nr   r   r4   rT   y      "       @r   r   s      r0   	test_dotuzTestFBLAS1Simple.test_dotu   s    Ani8%@r2   rL   c                 2    t         |g dg d      d       y )Nr   r   r   rT   y      @      ,r   r   s      r0   	test_dotczTestFBLAS1Simple.test_dotc   s    Anj95Ar2   rJ   c                     t         |g d      t        j                  d             |t        v r(t         |g d      t        j                  d             y y )Nr   2   r   )r   mathsqrtr   r   s      r0   	test_nrm2zTestFBLAS1Simple.test_nrm2   s<    AjM499R=9N". 1499R=A #r2   scal)rY   r"   rW   rX   c                 r    t         |dg d      g d       |t        v rt         |dg d      g d       y y )Nr   r   )   i
   r4   r   )y              "@iy      "@      (r   r   s      r0   	test_scalzTestFBLAS1Simple.test_scal   s2    !!Az"2K@N"%a>&:<LM #r2   swapc                     g dg d}} |||      \  }}t        ||       t        ||       |t        v r-g dg d}} |||      \  }}t        ||       t        ||       y y )Nr   )r4   r|   r   )r   r4   y      @      r   )r   rN   r   xyx1y1s          r0   	test_swapzTestFBLAS1Simple.test_swap   sg    *11aB!"a(!"a(N"}qAq!WFB%b!,%b!,	 #r2   amax)isrd   icizc                 f    t         |g d      d       |t        v rt         |g d      d       y y )N)r   r   r4   rT   )y      @      @r   )r   r   r   s      r0   	test_amaxzTestFBLAS1Simple.test_amax   s,    Qz]A&N"=)1- #r2   N)__name__
__module____qualname__rr   r   r   r   r   r   r   r   r   r   r    r2   r0   rt   rt      s   ff%6 &6 ff%N &N
 f457 67
 eT": #: fd#A $A fd#B $B f45B 6B
 f45N 6N
 ff%
- &
- f67. 8.r2   rt   c                      e Zd Z edd      d        Z edd      d        Z edd      d	        Z ed
d      d        Z edd      d        Z edd      d        Z	 edd      d        Z
 edd      d        Z edd      d        Zej                  j                  dddg      ej                  j                  de      d               Zej                  j                  dddg      ej                  j                  dg eez   D  cg c]  }d|f c}} eD  cg c]  }d|f c}}       d               Zej                  j                  dddg      ej                  j                  dg eez   D  cg c]  }d|f c}} eD  cg c]  }d |f c}}       d!               Zej                  j                  dddg      ej                  j                  de      d"               Z ed#d      d$        Z ed%d      d&        Z ed'd      d(        Z ed)d      d*        Z ed+d      d,        Z ed-d      d.        Zy/c c}} w c c}} w c c}} w c c}} w )0TestFBLAS2Simplegemvru   c           	          t         |ddggdg      dg       t         |ddggdgddg      dg       |t        v r4t         |ddggdg      dg       t         |ddggdgdd	g      d
g       y y Nr4   r   iry   ir   r   y      H      By              @y      H      5r   r   s      r0   	test_gemvzTestFBLAS2Simple.test_gemv   s    !!Aurd"3cU;!!AurdAs";cUCN"%adVHrd&;gYG%adVHrdAt&D'.i1 #r2   gerr   c           
      ^   t         |dddgddg      ddgddgg       t         |dg dddg      ddgdd	gd
dgg       t         |dddgddgddgddgg      ddgddgg       |t        v r@t         |dddgddg      ddgddgg       t         |dg dddg      ddgdd	gd
dgg       y y )NrT   r   r4   r   r   r   rw   r      r~      rz   r}                 ?r   r   r   r   r   r   r   s      r0   test_gerzTestFBLAS2Simple.test_ger  s    !!A1v1v"6!Q!Q8HI!!Ay1a&"9$%q6B8b"X">	@!!A1v1v&'VaV$4#69:AB7H	JN"%aB7QF&;(*Bx!Q&8:%a<"b&B()1vBx"b&BD #r2   gerur   c                     t         |dddgddg      ddgdd	gg       t         |d
g dddg      dd	gddgddgg       y )NrT   r   r   r4   r   r   r   r   r   r   r   r   r   r~   r   r   r   s      r0   	test_geruzTestFBLAS2Simple.test_geru  s[    !!AAwA"7$&8aV"4	6!!Br2h"?$%q6B8b"X">	@r2   gercc                     t         |dddgddg      ddgdd	gg       t         |dg d
ddg      dd	gddgddgg       y )NrT   r   r   r4   r   r   r   r   r   r   r   r   r~   r   r   r   s      r0   	test_gerczTestFBLAS2Simple.test_gerc  s[    !!AAwA"7$&8aV"4	6!!A|b"X">$%q6B8b"X">	@r2   syrc                 J   t        j                  ddd      }t        j                  |d d t         j                  f   |z        }t        j                  |d d dt         j                  f   |d d d   z        }t        j                  dddd	
      }t        j                  ddd      j                  d      }t        j                  |d d t         j                  f   |z        }t        j                  |d d dt         j                  f   |d d d   z        }	t         j                  t        j                  d      |t        j                  d      f   j                         }
t        j                  |      j                  }t         |d|      ||       t         |d|d      |j                  |       t         |d|ddd      ||       t         |d|ddd      ||       |t        v rt         |d|      ||       t         |d|d      |j                  |       t         |d|
ddd      ||       t         |d|
ddd      |	|       t        j                  d|d      } |d||d      }t        |||        |d||      }||usJ t        |d|z  |       nSt        j                  d|d      } |d||d      }t        |||        |d||      }||usJ t        |d|z  |       t        t        |d|d       t        t        |d|d       t        t        |d|d       t        t        |d|d       t        t        |d|d       t        t        |d|d       t        t        |d|t        j                  ddd             y ) NrT   ry   r"   r$   rx   r         !@   Fendpointr}   Dr         ?rtolTlowerr   incxoffxnr   r4   r   r   r   r{   overwrite_a       @rz   r   r   r   r   )r&   r   r	   newaxislinspaceviewc_r   ravelfinfoepsr   Tr   assert_raises	Exception)r   rN   r   r   resxresx_reverser   r    reszresz_reversewr   r{   bs                 r0   test_syrzTestFBLAS2Simple.test_syr  s   IIa#&wwqBJJ'!+,wwq2rzz!12QttW<=KK3U3IIa#&++C0wwqBJJ'!+,wwq2rzz!12QttW<=EE"((1+q"((1+-.446xx""#q	4d3#q-tvvDA#qqqA64H#qrQ7$4	1 N"Ac1It$7Ac1D1466EAc111:DtLAc12A;(t5 ,A#qA40AAt$/#qAAA::AqvD1 ,A#qA40AAt$/#qAAA::AqvD1iC3iC3iC4iCb1iCa0iC!4iCbhhvsC.HIr2   herc                 "   t        j                  ddd      }t        j                  ddd      j                  d      }t        j                  |d d t         j                  f   |j                         z        }t        j                  |d d dt         j                  f   |d d d   j                         z        }t         j                  t        j                  d      |t        j                  d      f   j                         }t        j                  |      j                  }t         |d	|      ||
       t         |d	|d      |j                  j                         |
       t         |d	|ddd      ||
       t         |d	|ddd      ||
       t        j                  d|d      }	 |d	||	d      }
t        |	||
        |d||	      }
|	|
usJ t        |
d|z  |
       t        t        |d	|d       t        t        |d	|d       t        t        |d	|d       t        t        |d	|d       t        t        |d	|d       t        t        |d	|d       t        t        |d	|t        j                  ddd             y )NrT   ry   r"   r$   r}   r   rx   r   r   r   Tr   r4   r   r   r   r   r   r   rz   r   r   r   r   r   r   r   )r&   r   r   r	   r   conjr   r   r   r   r   r   r   r   r   )r   rN   r   r   r    rehzrehz_reverser   r   r{   r   s              r0   test_herzTestFBLAS2Simple.test_herO  s   IIa#&IIa#&++C0wwqBJJ'!&&(23wwq2rzz!12QttW\\^CDEE"((1+q"((1+-.446xx""#q	4d3#q-tvv{{}4H#qqqA64H#qrQ7$4	1 HHVUC(c1t,4d+c1Nzz1T6-iC3iC3iC4iCb1iCa0iC!4iCbhhvsC.HIr2   syr2c                    t        j                  ddd      }t        j                  ddd      }t        j                  |d d t         j                  f   |z  |d d t         j                  f   |z  z         }t        j                  |d d dt         j                  f   |d d d   z  |d d dt         j                  f   |d d d   z  z         }t        j                  ddd	d
      }t        j
                  |      j                  }t         |d||      ||       t         |d||d      |d dd df   |       t         |d||d      |j                  |       t         |d||dddd      ||       t         |d||ddddd      |d dd df   |       t         |d||dddd      ||       t        j                  d|d      }	 |d|||	d      }
t        |	||        |d|||	      }
|	|
usJ t        |
d|z  |       t        t        |d||d       t        t        |d||d       t        t        |d||d       t        t        |d||d       t        t        |d||d       t        t        |d||d       t        t        |d||d       t        t        |d||d       t        t        |d||d       t        t        |d||t        j                  d dd             y )!NrT   ry   r"   r$   r}   rx   r   r   r   Fr   r   r   r4   r   Tr   r   r   r   r   incyoffyr   r   r  r  r   r   r   r   r   r   rz   r   r   r  r  r   )r&   r   r	   r   r   r   r   r   r   r   r   r   )r   rN   r   r   r   resxyresxy_reverseqr   r{   r   s              r0   	test_syr2zTestFBLAS2Simple.test_syr2p  s   IIa#&IIa#&!RZZ-(1,qBJJ/?!/CCD$B$

"2 3a"g ="#DbD"**$4"5$B$"?!@ A KK3U3xx""#q!e$7#q!q)5!RaR=tD#q!40%''E#q!!!!"ED	*#q!!!!"Jbqb"1"fD	2 	#q!"12BG%D	2 HHVUC(c1a1$/5t,c1a1zz1U7.iCAA6iCAA6iCAB7iCAA6iCAA6iCAB7iCA4iCA3iCAQ7iCA&#s1KLr2   her2c                    t        j                  ddd      j                  d      }t        j                  ddd      j                  d      }|d d t         j                  f   |j	                         z  |d d t         j                  f   |j	                         z  z   }t        j
                  |      }|d d dt         j                  f   |d d d   j	                         z  }||d d dt         j                  f   |d d d   j	                         z  z  }t        j
                  |      }t         j                  t        j                  d      |t        j                  d      f   j                         }t         j                  t        j                  d      |t        j                  d      f   j                         }t        j                  |      j                  }	t         |d	||      ||	
       t         |d	||d      |d dd df   |	
       t         |d	||d      |j                  j	                         |	
       t         |d	||dddd      ||	
       t         |d	||ddddd      |d dd df   |	
       t         |d	||dddd      ||	
       t        j                  d|d      }
 |d	|||
d      }t        |
||	
        |d|||
      }|
|usJ t        |d|z  |	
       t        t        |d	||d       t        t        |d	||d       t        t        |d	||d       t        t        |d	||d       t        t        |d	||d       t        t        |d	||d       t        t        |d	||d       t        t        |d	||d       t        t        |d	||d       t        t        |d	||t        j                  ddd             y ) NrT   r}   r"   r$   r   r   rx   r   r   r   r4   r   Tr   r  r  r   r   r   r   r   rz   r   r   ry   r   r   r  r  r   r   )r&   r   r   r   r   r	   r   r   r   r   r   r   r   r   r   )r   rN   r   r   r   r  r	  uvr   r{   r   s               r0   	test_her2zTestFBLAS2Simple.test_her2  sP   IIa#&++C0IIa3',,S1!RZZ- 1668+a2::.>.II$B$

*+a"glln<4R4+,q2w||~==.EE"((1+q"((1+-.446EE"((1+q"((1+-.446xx""#q!e$7#q!q)5!RaR=tD#q!40%'',,.!	# 	#q!!!!!DD	*#q!!!!!qIbqb"1"fD	2 	#q!"12AF%D	2 HHVUC(c1a1$/5t,c1a1zz1U7.iCAA6iCAA6iCAB7iCAA6iCAA6iCAB7iCA4iCA3iCAQ7iCAc2	4r2   gbmvc                 X   t         j                  j                  d      }d}d}d}d}t        t	        |j                  |dz         t        ||z
  dz
              t	        |j                  |dz         t        ||z
  dz
                    }|j                  |      }t        ||z   dz   |f|      }	|d   |	dd df<   |d   |	ddd	f<   |d
   |	dddf<   |d   |	dd df<   |j                  |      j                  |      }
|j                  |      j                  |      } |d       |d      }}|} |||||||	|
||	      }||j                  |
      z  ||z  z   }t        ||        |||||||	||
|d
      }||j                  j                  |      z  ||
z  z   }t        ||       y )N  r|   ry   rT   r   r$   )r   r   )r   rT   r   )r   r   r   )rT   r   r4   r   r   )	mr   kuklalphar{   r   r   beta)
r  r   r  r  r  r{   r   r   r  trans)
r&   randomdefault_rngr   r   r   astyperK   r   r   )r   rN   r   rngr   r  r  r  AAbr   r   r  r  funcr   y2s                    r0   	test_gbmvzTestFBLAS2Simple.test_gbmv  s   ii##D)VCJJr!t,eAbDFm<CJJr!t,eAbDFm<>HHUOBrE!GQ<u- dG1bqb5	tW1ac6
tW1ac6
dG1bqb5	JJqM  'JJqM  'Ahb	tArb'QUU1Xq(!"b)ArbQ0QSSWWQZ$(*!"b)r2   r7   TFr   c                    |rt         nt        }||rdnd}t        j                  | d       t        j
                  j                  d      }d}d}t        ||f|      }t        |dz   |f|      }	|j                  |      |t        |      t        |      f<   t        d|dz         D ]?  }
|j                  ||
z
        }||t        ||
z
        t        |
|      f<   ||	d	|
z
  |
d f<   A |j                  |      }|t        v r.||j                         j                  z  }t        d
|d      \  }n||j                  z  }t        d|d      \  }t        |      |	d	d d f<   |j                  |      j                  |      }|j                  |      j                  |      } |d       |d      }} ||||	|||      }||j!                  |      z  ||z  z   }t#        ||       y )Nr8   rE   ra   r  r   r   r$   rT   rx   )hbmvr5   r   r7   )sbmv      ?r4   )kr  r{   r   r   r  )r8   rE   r@   rh   r&   r  r  r   r   ranger  r   r   r   r   r   rK   r   )r   r   r7   ro   rp   r  r   r(  r  r  ind2tempr   r   r   r  r  r   r!  s                      r0   test_sbmv_hbmvzTestFBLAS2Simple.test_sbmv_hbmv  s     hU;%*zHKK8*$567ii##D)1a&&AaC85) #&**Q-&)VAY
!QqSM 	&D::af%D15AfQtVnfT1o-.!%Br$w~	& HHUON"OA"9EMEDHA"9EMEDG2q5	JJqM  'JJqM  'Dk58tAUbA>QUU1Xq(!"b)r2   zfname,dtypespmvhpmvc                    |rt         nt        }||rdnd}t        j                  | d       t        j
                  j                  d      }d}|j                  ||f      j                  |      }|t        v r||j                  ||f      dz  z  }||dk(  r|j                  n|j                         j                  z  }t        |      \  }	}
||
|	f   }|j                  |      j                  |      }|j                  |      j                  |      }t        d|z        j                  |      }t        d|z        j                  |      } |d	       |d      }}t        |f|d
      \  } |||||||      }||j                  |      z  ||z  z   }t!        ||        ||dz
  |||||dd||
      }||d dd df   z  j                  |dd d         ||dd d   z  z   }t!        |dd d   |       t#        |d   |d          y )Nr8   rE   ra   r  r4   r   r-  r   r'  r5   r%  )r   r  apr   r   r  rT   )
r   r  r  r   r   r0  r   r  r   r  rx   r   )r8   rE   r@   rh   r&   r  r  r  r   r   r   r   r   r   r   rK   r   r   )r   fnamer   r7   ro   rp   r  r   r  r%   rApr   r   xlongylongr  r  r   r   r!  s                        r0   test_spmv_hpmvzTestFBLAS2Simple.test_spmv_hpmv  s     hU;%*zHKK8*$567ii##D)JJ1v%%e,N"QF#B&&A	EVOQSS3A1q!tWJJqM  'JJqM  'qs""5)QqS	  'Dk58txuKHAUrQ!$?QUU1Xq(!"b) AaCu45Ebqqq2aSbSk!&&uQTT{3dU14a4[6HH!"QTT(B/BqE58,r2   sprhprc                    |rt         nt        }||rdnd}t        j                  | d       t        j
                  j                  d      }d}|j                  ||f      j                  |      }|t        v r||j                  ||f      dz  z  }||dk(  r|j                  n|j                         j                  z  }t        |      \  }	}
||
|	f   }|j                  |      j                  |      }t	        j                  |      j                  j                  d      }|d	k(  rDt        d
|d      \  }||d d d f   j!                  |d d d f   j                               z  |z   }n5t        d|d      \  }||d d d f   j!                  |d d d f         z  |z   } |||||      }t#        d|      }|||
|	f<   |d	k(  r|j                         n|||	|
f<   t%        ||       y )Nr8   rE   ra   r  r4   r   r7  g      @r8  )r8  r5   r%  )r7  )r   r  r0  r   r4   r4   r$   )r8   rE   r@   rh   r&   r  r  r  r   r   r   r   r   r   typer   rK   r   r   )r   r1  r   r7   ro   rp   r  r   r  r%   r2  r3  r   r  r   r!  r   y1fs                     r0   test_spr_hprzTestFBLAS2Simple.test_spr_hpr7  s     hU;%*zHKK8*$567ii##D)JJ1v%%e,N"QF#B&&A	EUNQSS

2A1q!tWJJqM  '%%**3/E>"85LED1d7$'
(9::Q>B"85LED1d7$'
33a7BAUrQ/F%(AqD	!&%BGGIRAqD	!#r*r2   c                    |rt         nt        }||rdnd}t        j                  | d       t        j
                  j                  d      }d}|j                  ||f      j                  |      }|t        v rG||j                  ||f      dz  z  }||j                         j                  z  }t        d|d	      \  }n||j                  z  }t        d
|d	      \  }t        |      \  }	}
||
|	f   }|j                  |      j                  |      }|j                  |      j                  |      } |d      }|j                         |d d d f   j                  |d d d f   j                               z  }||z   |j                         j                  z   } ||||||      }t        d|      }|||
|	f<   |g d   j                         |g dg df<   t        ||       y )Nr8   rE   ra   r  r4   r   )hpr2r5   r%  )spr2r   )r   r  r   r   r0  r:  r$   )rT   r4   r   )rT   r   r   )r   r   rT   )r8   rE   r@   rh   r&   r  r  r  r   r   r   r   r   rK   r   r   )r   r   r7   ro   rp   r  r   r  r   r%   r2  r3  r   r   r  r  r!  r   r<  s                      r0   test_spr2_hpr2zTestFBLAS2Simple.test_spr2_hpr2Z  s     hU;%*zHKK8*$567ii##D)JJ1v%%e,N"QF#B&&AOA"9EMEDHA"9EMEDA1q!tWJJqM  'JJqM  'aJJL1QW:>>!D!G*//*;<<UQVVXZZAUa14F%(AqD	$&yM$6$6$8Iy !!#r*r2   tbmvc           
         t         j                  j                  d      }d}d}|j                  |      j                  |      }t	        ||f|      }t        |dz         D ]1  }|j                  ||z
        |t        ||z
        t        ||      f<   3 |t        v rI|t        |      xx   d|j                  |dz   |z  ||dz   z  dz  z
        j                  |      z  z  cc<   t	        |dz   |f|      }	t        |dz         D ]  }
t        ||
      |	|
 dz
  |
d f<    |} |||	|	      }|j                  |      }t        ||        |||	|d
      } |d      |t        |      t        |      f<   |j                  |      }t        ||        |||	|dd      }|j                  j                  |      }t        ||        |||	|dd      }|j                         j                  j                  |      }t        ||       y )Nr  r   r4   r$   rT   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   rK   r   r   r   r   rN   r   r  r   r(  r   r  supr  rowr   r   r!  s                 r0   	test_tbmvzTestFBLAS2Simple.test_tbmv{  s   ii##D)JJqM  '1a&&1: 	AC/2zz!C%/@AfQsUmVC^+,	A N"gajMR#**ac1Wa1gqj-A"B"I"I%"PPPM AaC85)1: 	.C#A~BtAvst|	.Aq!UU1X!"b)Aqq)"'(&)VAY
UU1X!"b)Aqq2SSWWQZ!"b)Aqq2VVXZZ^^A!"b)r2   tbsvc           
         t         j                  j                  d      }d}d}|j                  |      j                  |      }t	        ||f|      }t        |dz         D ]1  }|j                  ||z
        |t        ||z
        t        ||      f<   3 |t        v rI|t        |      xx   d|j                  |dz   |z  ||dz   z  dz  z
        j                  |      z  z  cc<   t	        |dz   |f|      }	t        |dz         D ]  }
t        ||
      |	|
 dz
  |
d f<    |} |||	|	      }t        ||      }t        ||        |||	|d
      } |d      |t        |      t        |      f<   t        ||      }t        ||        |||	|dd      }t        |j                  |      }t        ||        |||	|dd      }t        |j                         j                  |      }t        ||       y )Ni90  r   r4   r$   rT   r   r   rD  rE  rF  rG  )r&   r  r  r  r   r)  r   r   r   r   r   r   r   r   rH  s                 r0   	test_tbsvzTestFBLAS2Simple.test_tbsv  s   ii##E*JJqM  '1a&&1: 	AC/2zz!C%/@AfQsUmVC^+,	A N"gajMR#**ac1Wa1gqj-A"B"I"I%"PPPM AaC85)1: 	.C#A~BtAvst|	.Aq!1a[!"b)Aqq)"'(&)VAY
1a[!"b)Aqq2133]!"b)Aqq21668::q!!"b)r2   tpmvc                 0   t         j                  j                  d      }d}|j                  |      j                  |      }|t        v r4t        |j                  ||f      |j                  ||f      dz  z         }nt        |j                  ||f            }t        |      \  }}|||f   }	|}
 |
||	|      }|j                  |      }t        ||        |
||	|d      } |d      |t        |      t        |      f<   |j                  |      }t        ||        |
||	|dd      }|j                  j                  |      }t        ||        |
||	|dd      }|j                         j                  j                  |      }t        ||       y 	Nr  r   r   )r   r0  r   rT   )r   r0  r   r   )r   r0  r   r   r  r   )r&   r  r  r  r   r	   r   rK   r   r   r   r   r   rN   r   r  r   r   r  r%   r2  r3  r   r   r!  s                r0   	test_tpmvzTestFBLAS2Simple.test_tpmv  si   ii##D)JJqM  'N"SZZA'#**aV*<R*??@ASZZA'(A A1q!tWA""UU1X!"b)A"*"'(&)VAY
UU1X!"b)A"3SSWWQZ!"b)A"3VVXZZ^^A!"b)r2   tpsvc                 $   t         j                  j                  d      }d}|j                  |      j                  |      }|t        v r4t        |j                  ||f      |j                  ||f      dz  z         }nt        |j                  ||f            }|t        |      z  }t        |      \  }}|||f   }	|}
 |
||	|      }t        ||      }t        ||        |
||	|d      } |d      |t        |      t        |      f<   t        ||      }t        ||        |
||	|dd      }t        |j                  |      }t        ||        |
||	|dd      }t        |j                         j                  |      }t        ||       y rQ  )r&   r  r  r  r   r	   r   r   r   r   r   r   r   rR  s                r0   	test_tpsvzTestFBLAS2Simple.test_tpsv  sl   ii##D)JJqM  'N"SZZA'#**aV*<R*??@ASZZA'(A	SVA1q!tWA""1a[!"b)A"*"'(&)VAY
1a[!"b)A"3133]!"b)A"31668::q!!"b)r2   trmvc                    t         j                  j                  d      }d}|j                  ||f      t        |      z   j	                  |      }|j                  d      j	                  |      }|} |||      }t        |      j                  |      }	t        ||	        |||d      } |d      |t        |      t        |      f<   t        |      j                  |      }	t        ||	        |||dd      }t        |      j                  j                  |      }	t        ||	        |||dd      }t        |      j                         j                  j                  |      }	t        ||	       y )Nr  r4   r{   r   rT   r{   r   r   r{   r   r   r  r   )r&   r  r  r   r  r	   rK   r   r   r   r   
r   rN   r   r  r   r  r   r   r   r!  s
             r0   	test_trmvzTestFBLAS2Simple.test_trmv	  s2   ii##D)ZZAA&..u5JJqM  'A^!W[[^!"b)A#"'(&)VAY
!W[[^!"b)A!,!WYY]]1!"b)A!,!W\\^!!!$!"b)r2   trsvc                 "   t         j                  j                  d      }d}|j                  ||f      t        |      z   j	                  |      }|j                  |      j	                  |      }|} |||      }t        t        |      |      }	t        ||	        |||d      }t        t        |      |      }	t        ||	        |||d      } |d      |t        |      t        |      f<   t        t        |      |      }	t        ||	        |||dd      }t        t        |      j                  |      }	t        ||	        |||dd      }t        t        |      j                         j                  |      }	t        ||	       y )	Nr     rY  rT   )r{   r   r   rZ  r[  r   )r&   r  r  r   r  r   r	   r   r
   r   r   r   r\  s
             r0   	test_trsvzTestFBLAS2Simple.test_trsv"  sR   ii##D)ZZAA&..u5JJqM  'A^47A!"b)A!$47A!"b)A#"'(&)VAY
47A!"b)A!,4799a !"b)A!,47<<>##Q'!"b)r2   N)r   r   r   rr   r   r   r   r   r   r   r  r  r"  r@   rg   rj   DTYPESr,  REAL_DTYPESr   r6  r=  rA  rK  rN  rS  rV  r]  ra  ).0r   s   00r0   r   r      s8   ff%1 &1 eT"
D #
D fd#@ $@ fd#@ $@ eV$0J %0Jd eT"J #J@ fd#'M $'MR fd#.4 $.4` ff%* &*B [[WtUm4[[Wf-!* . 5!*F [[WtUm4[[] -'2^'C	De65/	D-'5	6e65/	6- -	 5
-@ [[WtUm4[[] -&1N&B	CU5%.	C-&4	5U5%.	5- +	 5
+< [[WtUm4[[Wf-+ . 5+> ff%#* &#*J ff%#* &#*J ff%* &*@ ff%* &*@ ff%* &*0 ff%* &*_ 
E	6H 
D	5s   I	I9IIr   c                   *    e Zd Z edd      d        Zy)TestFBLAS3Simpler#   ru   c           	          t         |ddgdg      dgg       t         |ddgdgddg      dg       |t        v r3t         |ddgdg      dgg       t         |ddgdgdd	g      d
g       y y r   r   r   s      r0   	test_gemmzTestFBLAS3Simple.test_gemmA  s    !!AsRD/SE7;!!AsRD!aS"9C5AN"%aTFRD&9WI;G%aTFRD!bT&BWIN #r2   N)r   r   r   rr   rh  r   r2   r0   rf  rf  @  s    ff%O &Or2   rf  c                   l    e Zd Zd Z edd      d        Z edd      d        Z edd      d        Zy)TestBLAS3Symmc                     t        j                  ddgddgg      | _        t        j                  g dg dg      | _        t        j                  d      | _        t        j                  g dg dg      | _        y )	Nr   r           )r   rl        @)rl        r   )r   r4   )r   rn  g       @)rm  rl  g      "@)r&   arrayr{   r   r   r%   tr   s    r0   setup_methodzTestBLAS3Symm.setup_methodL  sg    B88% &<(* +=') *r2   symmru   c                     || j                   | j                  | j                  dd      }t        || j                          || j                   j
                  | j                  d| j                  dd      }t        || j                          || j                   | j                  j
                  d| j                  j
                  dd      }t        || j                  j
                         y )Nr   r{   r   r%   r  r  rT   r{   r   r   r%   r  r  )r{   r   sider%   r  r  )r{   r   r%   r   rp  r   r   rN   r   ress       r0   	test_symmzTestBLAS3Symm.test_symmU  s    $&&DFFdffBR@!#tvv.$&&((dffArK!#tvv.$&&DFFHH1r#!#tvvxx0r2   c                     t        j                  t              5   || j                  | j                  dd       ddd       y# 1 sw Y   yxY w)z|`side=1` means C <- B*A, hence shapes of A and B are to be
        compatible. Otherwise, f2py exception is raised.
        rT   )r{   r   r  rw  N)r@   r   r   r{   r   r   s      r0   test_symm_wrong_sidez"TestBLAS3Symm.test_symm_wrong_sidea  s;     ]]9% 	3$&&2	3 	3 	3s   !AAc                 :    || j                   | j                  | j                  dd      }t        j                  || j
                        sJ  || j                   | j                  d| j                  dd      }t        j                  || j
                        rJ y)zSYMM only considers the upper/lower part of A. Hence setting
        wrong value for `lower` (default is lower=0, meaning upper triangle)
        gives a wrong result.
        r   ru  rT   rv  N)r{   r   r%   r&   allcloserp  rx  s       r0   test_symm_wrong_uploz"TestBLAS3Symm.test_symm_wrong_uploj  su     $&&DFFdffBR@{{3'''$&&DFF!tvvRbI;;sDFF++++r2   N)r   r   r   rr  rr   rz  r|  r  r   r2   r0   rj  rj  J  sX    * ff%	1 &	1 ff%3 &3 ff%, &,r2   rj  c                   N    e Zd Zd Z edd      d        Z edd      d        Zy)TestBLAS3Syrkc                     t        j                  ddgddgddgg      | _        t        j                  g dg dg dg      | _        t        j                  d	d
gd
dgg      | _        y )Nr   rl         r   rm  )r   rl  r   )rl        @      )r   r        *@      @      @r  )r&   ro  r{   rp  ttrq  s    r0   rr  zTestBLAS3Syrk.setup_methodw  sn    B898% & <()+ , ((RHI' (r2   syrkru   c                     || j                   d      }t        t        j                  |      t        j                  | j                                || j                   dd      }t        t        j
                  |      t        j
                  | j                               t        j                  | j                  j                        } || j                   dd|      }t        t        j                  |      t        j                  | j                  |z                 || j                   dd      }t        t        j                  |      t        j                  | j                               y )Nr   r{   r  rT   )r{   r  r   )r{   r  r  r%   )r{   r  r  )	r{   r   r&   r	   rp  r
   r   shaper  r   rN   r   r%   c0s        r0   	test_syrkzTestBLAS3Syrk.test_syrk  s    b!!"''!*bggdffo>b*!"''!*bggdffo>WWTVV\\"brR0!"''!*bggdffRi.@Ab*!"''!*bggdgg.>?r2   c                     t        j                  t              5   || j                  dt	        j
                  d             d d d        y # 1 sw Y   y xY w)Nr   )ry   r   )r{   r  r%   )r@   r   r   r{   r&   r   r   s      r0   test_syrk_wrong_czTestBLAS3Syrk.test_syrk_wrong_c  s=     ]]9% 	5bBGGFO4	5 	5 	5s   )AAN)r   r   r   rr  rr   r  r  r   r2   r0   r  r  v  s?    ( ff%@ &@  ff%5 &5r2   r  c                   N    e Zd Zd Z edd      d        Z edd      d        Zy)TestBLAS3Syr2kc                    t        j                  ddgddgddgg      | _        t        j                  ddgddgddgg      | _        t        j                  g dg dg d	g      | _        t        j                  ddgdd
gg      | _        y )Nr   rl  r  r   rm  r   )rl  rn  rm  )rn  rl  rl  )rm  rl  r  r   )r&   ro  r{   r   rp  r  rq  s    r0   rr  zTestBLAS3Syr2k.setup_method  s    B898% & B88r7$ % =(') * ((RHG% &r2   syr2kru   c                 <    || j                   | j                  d      }t        t        j                  |      t        j                  | j
                                || j                   | j                  dd      }t        t        j                  |      t        j                  | j
                               t        j                  | j
                  j                        } || j                   | j                  dd|      }t        t        j                  |      t        j                  | j
                  |z                 || j                   | j                  dd      }t        t        j                  |      t        j                  | j                               y )Nr   r{   r   r  rT   )r{   r   r  r   )r{   r   r  r  r%   )r{   r   r  r  )
r{   r   r   r&   r	   rp  r
   r   r  r  r  s        r0   
test_syr2kzTestBLAS3Syr2k.test_syr2k  s    $&&+!"''!*bggdffo>$&&!4!"''!*bggdffo>WWTVV\\"$&&r:!"''!*bggdffRi.@A$&&!4!"''!*bggdgg.>?r2   c           	          t        j                  t              5   || j                  | j                  dt        j                  d             d d d        y # 1 sw Y   y xY w)Nr   )r`  r   )r{   r   r  r%   )r@   r   r   r{   r   r&   r   r   s      r0   test_syr2k_wrong_cz!TestBLAS3Syr2k.test_syr2k_wrong_c  sF    ]]9% 	A$&&bhhw.?@	A 	A 	As   4AA N)r   r   r   rr  rr   r  r  r   r2   r0   r  r    sA    & gv&@ '@ gv&A 'Ar2   r  c                       e Zd ZdZd Z edd      d        Z edd      d        Z edd      d	        Z ed
d      d        Z	 edd      d        Z
 edd      d        Zy)TestSyHez2Quick and simple tests for (zc)-symm, syrk, syr2k.c                 D    t        j                  ddgddgg      | _        y )Nrl  y             r   )r&   ro  sigma_yrq  s    r0   rr  zTestSyHe.setup_method  s$    xx"d"%r!, -r2   rs  zcc                      || j                   | j                   d      }t        t        j                  |      t        j                  ddg             y )Nr   r  rT   rx   r  r   r&   r	   r   rx  s       r0   rz  zTestSyHe.test_symm  s9     $,,$,,b9!"''#,B0@Ar2   hemmc                      || j                   | j                   d      }t        t        j                  |      t        j                  ddg             y )Nr   r  rT   r  rx  s       r0   	test_hemmzTestSyHe.test_hemm  s8     $,,$,,b9!"''#,A@r2   r  c                      || j                   d      }t        t        j                  |      t        j                  ddg             y )Nr   r  rx   r  rx  s       r0   r  zTestSyHe.test_syrk  s1    $,,b)!"''#,R0ABr2   herkc                      || j                   d      }t        t        j                  |      t        j                  ddg             y )Nr   r  rT   r  rx  s       r0   	test_herkzTestSyHe.test_herk  s0    $,,b)!"''#,A@r2   r  c                      || j                   | j                   d      }t        t        j                  |      dt        j                  ddg      z         y )Nr   r  r   rx   r  rx  s       r0   test_syr2k_zrzTestSyHe.test_syr2k_zr  s<    $,,$,,b9!"''#,277B83D0DEr2   her2kc                      || j                   | j                   d      }t        t        j                  |      dt        j                  ddg      z         y )Nr   r  r   rT   r  rx  s       r0   test_her2k_zrzTestSyHe.test_her2k_zr  s;    $,,$,,b9!"''#,277Aq6?0BCr2   N)r   r   r   __doc__rr  rr   rz  r  r  r  r  r  r   r2   r0   r  r    s    <- fd#B $B
 fd#A $A
 fd#C $C fd#A $A gt$F %F gt$D %Dr2   r  c                       e Zd ZdZd Z edd      d        Z edd      d        Z edd      d        Z edd      d	        Z	y
)TestTRMMz!Quick and simple tests for *trmm.c                 *   t        j                  ddgddgg      | _        t        j                  g dg dg      | _        t        j                  g dg dg dg d	gd
      | _        t        j                  ddgddgddgddgddggd
      | _        y )Nr   r   r  rm  r  rn  r  r  r  )rT   rT   r   r4   )r   rT   r   ry   )r   r   rT   r   )r   r   r   rT   rN   )r   rT   r   r   ry   r4   r   r|   r   r}   r   )r&   ro  r{   r   a2b2rq  s    r0   rr  zTestTRMM.setup_method  s    B:9& '=(* + ((L(((* 256 ((QFQFQFQFQGD!$&r2   trmmsdzcc           	         |}t        t        |d| j                  | j                          |d| j                  j	                  |      | j                  j	                  |      d      }| j                  j
                  d   }t        || j                  | j                  d |d |f   z  ddt        j                  |      j                  z         y )Nr   rT   )rw  rl  d   )r   atol)
r   r   r  r  r  r  r   r&   r   r   )r   rN   r   r  ry  r(  s         r0   	test_sidezTestTRMM.test_side  s    isDGGTWW=3u-tww~~e/DGGMM!TWWtwwrr2A2v6R %!4!44	6r2   ru   c                      |d| j                   | j                        }t        j                  g dg dg      }t	        ||       y )Nr   )r  g      0@g      r  r{   r   r&   ro  r   r   rN   r   resultexpecteds        r0   test_abzTestTRMM.test_ab  s:    2tvvtvv&88_,. /!&(3r2   c                      |d| j                   | j                  d      }t        j                  g dg dg      }t	        ||       y )Nr   Tr   r  )rn  r  rl  r  r  s        r0   test_ab_lowerzTestTRMM.test_ab_lower
  s<    2tvvtvvT288_,. /!&(3r2   c                    | j                   j                  |      }dD ]d  }|j                         } |d| j                  ||      }|j                  j
                  rJ t        j                  ||      rJ t        ||       f t        j                  |j                               } |d| j                  |d      }|j                  j
                  sJ t        j                  ||      sJ t        ||       y )N)TFr   )overwrite_bT)r   r  r   r{   flagsf_contiguousr&   may_share_memoryr   asfortranarrayr   )r   rN   r   r   overwrbcopyr  s          r0   test_b_overwriteszTestTRMM.test_b_overwrites  s     FFMM% # 	#FFFHEr4665f=F{{////**5&999"	# !!!&&(+2tvvu$7{{''''""5&111!%0r2   N)
r   r   r   r  rr  rr   r  r  r  r  r   r2   r0   r  r    sv    +& ff%6 &6 ff%4 &4 ff%4 &4 ff%1 &1r2   r  trsmru   c                 4   t         j                  j                  d      }t        j                  |      j                  dz  }| }|j                  d      j                  |      }|j                  d      j                  |      } |d      }t        t        ||||       t        t        |||j                  |       d}d}	 |d      }|t        v r7|j                  |	|	f      |j                  |	|	f      d	z  z   t        |	      z   }n|j                  |	|	f      t        |	      z   }|j                  |      }t        |      }
t        |      }|j                  |	|f      j                  |      }|j                  ||	f      j                  |      } ||||
      }t        |j                  |j                         t        |
||z        }t!        |||        ||||d      }t        |
j                  ||z        }t!        |||        ||||d      }t        |
j#                         j                  ||z        }t!        |||        ||||d      } |d      |
t%        |	      t%        |	      f<   t        |
||z        }t!        |||        ||||dd      }t        |
j#                         j                  ||j#                         j                  z        }t!        ||j#                         j                  |        ||||ddd      } |d      |t%        |	      t%        |	      f<   t        |j#                         j                  ||j#                         j                  z        }t!        ||j#                         j                  |       y )Nr  i  )r   ry   r   rT   r   r|   g      r   )r  r{   r   )r  )r  r{   r   trans_ar   )r  r{   r   r   )r  r{   r   r   rw  )r  r{   r   r   rw  r   )r&   r  r  r   r   r  r   r   r   r   r   r	   r
   r   r  r   r   r   r   )rN   r   r  tolr   r  Br  r   r  AuAlB1B2r   x2s                   r0   	test_trsmr  %  s   
))


%C
((5/

d
"CD 	

6!!%(A

6!!%(A!HE)T5!Q/)T5!##q1	A	A$KEZZA#**aV"4R"773q6AJJ1vQ'	A	aB	aB	QF		"	"5	)B	QF		"	"5	)B	EQ"	%B288$	r58	BB%	EQ"a	0B	rttU2X	BB%	EQ"a	0B	rwwy{{E"H	%BB%	EQ"1	-B$QxBvay&)	r58	BB%	EQ"11	5B	rwwy{{E"'')++-	.BB	#.	EQ"11A	>B$QxBvay&)	rwwy{{E"'')++-	.BB	#.r2   zgh-16930)runrc   c                      t        j                  dd      } t        j                  j                  j                  | ddd      }t        j                  d      }t        ||       y )Nr   r}   ry   r4   rx   i  )	r&   repeatscipylinalgblasdnrm2r   r   r   )r   actualr  s      r0   test_gh_169309r  [  sK     			"aA\\$$Q1b1Fyy~HFH%r2   zdoes not fail with ILP64 MKLrb   c                      t        j                  dd      } d}t        j                  j                  j                  d| fd      }t        t              5   || dd|       d d d        y # 1 sw Y   y xY w)	Nr   r}   rx   rJ   r5   r6   ry   r4   )r&   r  r  r  r  r   r   FBLAS_ERROR)r   r   r  s      r0   test_dnrm2_neg_incxr  d  sg    
 			"aADLL,,VaT,ME	{	# aAt  s   A**A3)N)@r   r@   numpyr&   numpy.testingr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r  scipy.linalgr   r   r   scipy.linalg.blasr   r   rE   __fblas_errorr  rF   ImportErrorr   r8   __fblas_64_errorr[   r,   rc  r(   r)   r   rb  r1   r>   rB   rH   rQ   r^   rr   rt   r   rf  rj  r  r  r  r  r  rg   xfailr  r  r   r2   r0   <module>r     s  
   G G */ / /  8 8 ',%%KN
2++K
 zz2::&,,.	~	%!#H	D=>
+7\?. ?.HF	* F	*RO O), ),X 5  5H!A !AJ%D %DP;1 ;1| &&!2/ "2/j u$  &&&& 9%CD E]"  EN  Hs$   E$ !E4 $	E10E14E?>E?