
     h;                         d dl Z d dlZd dlmZmZmZ d dlmZmZm	Z	m
Z
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 d dlmZ d dlmZmZ   G d d          Z! G d	 d
          Z" G d d          Z# G d d          Z$ G d d          Z%dS )    Ncossinpi)assert_equalassert_almost_equalassert_allcloseassert_suppress_warnings)
quadraturerombergrombnewton_cotescumulative_trapezoidcumtrapztrapz	trapezoidquadsimpsonsimps
fixed_quadAccuracyWarning)	_qmc_quad)statsspecialc                       e Zd Zd Zd ZdS )TestFixedQuadc                 r    dddz  z  }t          fddd          \  }}t          ||d           d S )	N         c                     | dz  dz
  z  S )Nr!   r     xns    a/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/scipy/integrate/tests/test_quadrature.py<lambda>z+TestFixedQuad.test_scalar.<locals>.<lambda>   s    a!A#'l     r   r&   -q=rtol)r   r	   )selfexpectedgot_r&   s       @r'   test_scalarzTestFixedQuad.test_scalar   sT    ac72222AqA>>>QXE222222r)   c                     d}t          j        dd|z            ddz   z  }t          fddd|          \  }}t          ||d           d S )	Nr   r    r!   c                 "    | d d d f         z  S Nr#   )r%   ps    r'   r(   z+TestFixedQuad.test_vector.<locals>.<lambda>   s    a111d7m r)   r   r*   r+   r,   )nparanger   r	   )r.   r&   r/   r0   r1   r6   s        @r'   test_vectorzTestFixedQuad.test_vector   si    Ia1a!e93333QQ???QXE222222r)   N)__name__
__module____qualname__r2   r9   r#   r)   r'   r   r      s2        3 3 33 3 3 3 3r)   r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zej                            dddg          d             Zd ZdS )TestQuadraturec                     t           r5   )NotImplementedError)r.   r%   abargss        r'   r   zTestQuadrature.quad   s    !!r)   c                 h    d }t          |dt          d          \  }}d}t          ||d           d S )Nc                 \    t          || z  |t          |           z  z
            t          z  S r5   r   r%   r&   zs      r'   myfuncz.TestQuadrature.test_quadrature.<locals>.myfunc$   '    qs1SVV8|$$R''r)   r   r!   ?ۗ?   decimal)r   r   r   r.   rH   valerr	table_vals        r'   test_quadraturezTestQuadrature.test_quadrature"   sH    	( 	( 	(faX66S*	CA666666r)   c                 l    d }t          |dt          dd          \  }}d}t          ||d           d S )Nc                 b    dt          || z  |t          |           z  z
            z  t          z  S )NY)	kRr   rF   s      r'   rH   z3TestQuadrature.test_quadrature_rtol.<locals>.myfunc+   s,    #ac!CFF(l+++B..r)   r   rJ   绽|=r,   .<Rr   r   r	   rP   s        r'   test_quadrature_rtolz#TestQuadrature.test_quadrature_rtol*   sM    	/ 	/ 	/faXEBBBS1	YU333333r)   c                     d }d}dD ]C}t          |dt          d|          \  }}t          ||d           t          |d	k                Dd S )
Nc                 \    t          || z  |t          |           z  z
            t          z  S r5   r   rF   s      r'   rH   z6TestQuadrature.test_quadrature_miniter.<locals>.myfunc3   rI   r)   rL   )   4   r   rJ   )miniterrM   rN         ?)r   r   r   r
   )r.   rH   rS   r`   rQ   rR   s         r'   test_quadrature_miniterz&TestQuadrature.test_quadrature_miniter1   su    	( 	( 	(*	 	 	G!&!R7KKKHCY::::C#I	 	r)   c                 l    d }t          |dt          dd          \  }}d}t          ||d           d S )Nc                 b    dt          || z  dt          |           z  z
            z  t          z  S )NrW   rK   r   r$   s     r'   rH   z:TestQuadrature.test_quadrature_single_args.<locals>.myfunc<   s,    #ac#c!ff*n---b00r)   r   r!   rX   rC   r-   rY   r,   rZ   rP   s        r'   test_quadrature_single_argsz*TestQuadrature.test_quadrature_single_args;   sM    	1 	1 	1fa!%@@@S1	YU333333r)   c                 d    d }t          |dt          d          }d}t          ||d           d S )Nc                 \    t          || z  |t          |           z  z
            t          z  S r5   r   rF   s      r'   rH   z+TestQuadrature.test_romberg.<locals>.myfuncD   rI   r)   r   rJ   )rC   rL   rM   rN   )r   r   r   r.   rH   rQ   rS   s       r'   test_rombergzTestQuadrature.test_rombergB   sG    	( 	( 	(fa(333*	CA666666r)   c                 f    d }t          |dt          dd          }d}t          ||d           d S )Nc                 b    dt          || z  |t          |           z  z
            z  t          z  S )Ng =`XCr   rF   s      r'   rH   z0TestQuadrature.test_romberg_rtol.<locals>.myfuncL   s,    AaC#a&&L)))",,r)   r   rJ   rX   re   g3>Cr,   )r   r   r	   ri   s       r'   test_romberg_rtolz TestQuadrature.test_romberg_rtolJ   sI    	- 	- 	-fa(???/	YU333333r)   c                 d    t          t          t          j        d                    d           d S )N      )r   r   r7   r8   )r.   s    r'   	test_rombzTestQuadrature.test_rombR   s(    T")B--((#.....r)   c                 *   t          j        d          }t          j        d|z            }t          |          }t	          d |                                |                                          \  }}t          ||dd           t                      5 }|	                    t          d           t          d |                                |                                d	
          }d d d            n# 1 swxY w Y   t          ||dd           d S )Nro   皙?c                 0    t          j        d| z            S Nrs   r7   r   r%   s    r'   r(   z2TestQuadrature.test_romb_gh_3731.<locals>.<lambda>Z   s    26#a%== r)   g:0yE>r   )r-   atolzdivmax .4. exceededc                 0    t          j        d| z            S ru   rv   rw   s    r'   r(   z2TestQuadrature.test_romb_gh_3731.<locals>.<lambda>`   s    RVCE]] r)   r   )divmaxr+   )r7   r8   r   r   r   minmaxr	   r   filterr   r   )r.   r%   yrQ   val2rR   supval3s           r'   test_romb_gh_3731z TestQuadrature.test_romb_gh_3731U   s;   IfF3q5MM1gg00!%%''15577CC	cT15555    	PCJJ(=>>>22AEEGGQUUWWQOOOD	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	TA666666s   AC55C9<C9c                 b    dd l }t          |j        dd          }d}t          ||d           d S )Nr   r    g?k?rM   rN   )mathr   r   r   )r.   r   valmathexpected_vals       r'   test_non_dtypezTestQuadrature.test_non_dtypec   s>    $(Aq))*G\1======r)   c                    d}t          |d          \  }}t          ||t          j        ddg          z             t	          ||dz   dz             d}t          |d          \  }}t	          ||t          j        g d          z  dz             t	          ||dz   d	z             d}t          |d          \  }}t	          ||t          j        g d
          z  dz             t	          ||dz   dz             d}t          |d          \  }}t	          ||t          j        g d          z  dz             t	          ||dz   dz             dS )z5Test the first few degrees, for evenly spaced points.r          ?         (@r!   )ra         @ra         @r^   g     @)ra         @r   ra          @g     P@r   )      @      @@r   r   r   g     V@rM   g     =AN)r   r   r7   arrayr   )r.   r&   wtserrcoffs       r'   test_newton_cotesz TestQuadrature.test_newton_cotesj   sq   #Aq))WS!BHc3Z000111GadU4Z000#Aq))WC28OOO#<#<!<S!@AAAGadU6\222#Aq))WC28,@,@,@#A#A!A#!EFFFGadU6\222#Aq))WC28,H,H,H#I#I!I$!NOOOGadU9_55555r)   c                 V   t          j        g d          }|dz  }t          |          \  }}d}t          j        ||          }t	          ||           t          j        g d          }|dz  }t          |          \  }}d}t          j        ||          }t	          ||           dS )z9Test newton_cotes with points that are not evenly spaced.)        g      ?       @r!   gUUUUUU@)r   gffffff?g @r         "@N)r7   r   r   dotr   )r.   r%   r~   r   r   exact_integralnumeric_integrals          r'   test_newton_cotes2z!TestQuadrature.test_newton_cotes2   s     H___%%qD#AW6#q>>,n===H)))**qD#AW6#q>>,n=====r)   c           
         t          j        d          }t          t          |          d           t          t          |d          d           t          t          |t          j        ddd                    d	           t          j        d          }d
|z  }t          t          ||d          d           t          t          ||d          d           t          t          ||d          d           t          j        dg          }t          j        |d
          }t          t          ||d          d           t          t          ||d          d           t          j        g d          }t          j        |d
          }t          t          ||d          d           t          t          ||d          d           t          j        g dg dg dg          }t          j        |d
          }g d}g d}t          t          ||d          |           t          t          ||d          |           t          j        g dg dg dg          }t          j        |d
          }g d}g d}t          t          ||d          |           t          t          ||d          |           d S )Nro   rp   r   dx@   r   r   rw       r!   avg)r%   eveng     +@firstg     +@last   r   )r%   axisr   )r   r   r   r   )r    r!   r      )r   r   r   r   )     e@r   r   )r    r      r   )r   g      a@g      @g      @)r   r   g     @)r7   r8   r   r   linspacer   power)r.   r~   r%   	zero_axisdefault_axiss        r'   test_simpsonzTestQuadrature.test_simpson   s   IbMMWQZZ%%%WQ3''',,,WQ"+aB"7"7888"===IaLLqDWQ!%000&999WQ!'222E:::WQ!&1112666 HaSMMHQNNWQ!!,,,c222WQ!"---s333H\\\""HQNNWQ!!,,,c222WQ!"---s333HlllLLL,,,?@@HQNN(((	///WQ!!,,,i888WQ!"---|<<<HlllLLL...ABBHQNN000	111WQ!!,,,i888WQ!"---|<<<<<r)   droplastFTc                     t          j        g dg dg          }|r|d d d df         }t          |d          }t          t          j        |t           j                  d          }t	          ||           d S )N)r!   r!   r   r   r   r   r^   )r   r   r!   r   
      r   r   )r   )dtype)r7   r   r   float64r   )r.   r   r~   resultr/   s        r'   test_simpson_2d_integer_no_xz+TestQuadrature.test_simpson_2d_integer_no_x   s     H///3335 6 6 	!!!SbS&	A$$$28ARZ888rBBBVX&&&&&r)   c           	          t          j        d          }d|z  }t          t          ||dd          t	          ||dd                     d S )Nr   r!   r   r   )r%   r   r   )r7   r8   r   r   r   r.   r~   r%   s      r'   
test_simpszTestQuadrature.test_simps   s[    IaLLqDWQ!':::1c888	: 	: 	: 	: 	:r)   N)r:   r;   r<   r   rT   r[   rb   rf   rj   rm   rq   r   r   r   r   r   pytestmarkparametrizer   r   r#   r)   r'   r>   r>      s       " " "7 7 74 4 4  4 4 47 7 74 4 4/ / /7 7 7> > >6 6 6,> > >"#= #= #=J [Z%77	' 	' 87	': : : : :r)   r>   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )TestCumulative_trapezoidc                     t          j        ddd          }|}t          ||d          }g d}t          ||           t          ||d           }t          ||dd                     d S )	Nr   r!   r^   numr   initial)r                r   r   r    r7   r   r   r	   )r.   r%   r~   y_int
y_expecteds        r'   test_1dz TestCumulative_trapezoid.test_1d   s~    KA1%%%$Q1555...
z***$Q4888z!""~.....r)   c                    t          j        d                              ddd          }|}t          ||d          }t          j        g dg dgg d	g d
gg dg dgg          }t          ||           g d}t          g d|          D ]U\  }}t          ||d|          }t          |j        d           t          ||d |          }t          |j        |           Vd S )N   r   r!   r   r   r   )r   r   r         @)r   r         $@     0@)r         !@      2@g     <@)r         )@g      :@g     @D@)r   r   g      A@g     @J@)r        4@g      E@g      P@))r!   r!   r   )r   r    r   )r   r!   r   r   r    r!   g@)r   r   )r   r!   r   )	r7   r8   reshaper   r   r	   zipr   shape)r.   r%   r~   r   r   shapesr   r   s           r'   test_y_nd_x_ndz'TestCumulative_trapezoid.test_y_nd_x_nd   s4   Ii  ((Aq11$Q1555X 2 2 2 4 4 4 6 4 4 4 5 5 5 7 5 5 5 5 5 5 7	8 9 9
 	z*** 322yyy&11 	- 	-KD%(At$GGGEi000(At$GGGEe,,,,		- 	-r)   c           	         t          j        d                              ddd          }t          j        d          dz  }t          j        g dg dgg dg dgg          t          j        g d	gg d
gg dgg          t          j        g dg dgg dg dgg dg dgg          f}t	          g d|          D ];\  }}t          ||d |j        |                  |d           }t          ||           <d S )Nr   r   r!   r   )r         @r   r   )r   r   r         &@)g      D@g      F@g      H@g      J@)g      L@g      N@g      P@g      Q@)r   r   r   r   )r   r   r   g      *@)r   g      3@g      4@      5@)r   r   g     1@)r   r   g     J@)r   g     B@g     `V@)r   g     J@g     `_@)r   g     @Q@g     0d@)r   g     @U@g     h@r   )r%   r   r   )r7   r8   r   r   r   r   r   r	   )r.   r~   r%   ys_expectedr   r   r   s          r'   test_y_nd_x_1dz'TestCumulative_trapezoid.test_y_nd_x_1d   s~   Ii  ((Aq11IaLL!O H''')))+++++++-. / / H'''(+++,+++,. / / H''')''')))+))))))+	, - -. !$III{ ; ; 	/ 	/D*(a.?d157 7 7EE:....	/ 	/r)   c                 Z   t          j        ddd          }t          |          }g d}t          ||           t          |d          }g d}t          ||           t          |d	
          }g d}t          ||           t          |d	d          }g d}t          ||           d S )Nr   r!   r^   r   )r   r   r   r   Gz?r   )r   r   r   r   r   r   r   )            r   r   )r   r   )r   r   r   r   r   r   )r.   r~   r   r   s       r'   test_x_nonez$TestCumulative_trapezoid.test_x_none  s    KA1%%%$Q''***
z***$Q555000
z***$Q1---***
z***$Q1d;;;000
z*****r)   c           
          t          j        d                              ddd          }|}t          t	          ||ddd          t          ||ddd          d	           d S )
Nr   r   r!   r   r   r   )r   r   r   g+=r,   )r7   r8   r   r	   r   r   )r.   r%   r~   s      r'   test_cumtrapzz&TestCumulative_trapezoid.test_cumtrapz  sx    Ii  ((Aq11,Qc1MMM A#AqAAA"	$ 	$ 	$ 	$ 	$ 	$r)   N)r:   r;   r<   r   r   r   r   r   r#   r)   r'   r   r      s_        / / /- - -*/ / /0+ + +&$ $ $ $ $r)   r   c                       e Zd ZdZd Zd ZdS )TestTrapezoidz[This function is tested in NumPy more extensive, just do some
    basic due diligence here.c           
      ~   t          j        d          }t          t          |          d           t          t          |d          d           t          t          |t          j        ddd                    d	           t          j        d          }d
|z  }t          t          ||d          d           d S )Nro   rp   r   r   r   r   r   rw   r   r!   g?)r%   r   g      +@)r7   r8   r   r   r   r   s      r'   test_trapezoidzTestTrapezoid.test_trapezoid!  s    IbMMYq\\3'''YqS)))2...YqBK1b$9$9:::B???IaLLqDYqA#...55555r)   c           	          t          j        d          }d|z  }t          t          ||dd          t	          ||dd                     d S )Nr   r!   r   r   )r%   r   r   )r7   r8   r   r   r   r   s      r'   
test_trapzzTestTrapezoid.test_trapz+  s[    IaLLqDYqA#A6661c222	4 	4 	4 	4 	4r)   N)r:   r;   r<   __doc__r   r   r#   r)   r'   r   r     s<        ! !6 6 64 4 4 4 4r)   r   c                      e Zd Zd Zdd ej        d          fdZej        	                    dddg          ej        	                    ddd	g          d
                         Z
ej        	                    dddgddgddgddgg          d             Zej        	                    dddg          d             Zd ZdS )TestQMCQuadc           	         d}t          j        t          |          5  t          dddgddg           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          d ddgddg           d d d            n# 1 swxY w Y   d }d	}t          j        t          |          5  t          |ddgddg           d d d            n# 1 swxY w Y   d
}t          j        t          |          5  t          d ddgddgd           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          d ddgddgd           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          d ddgddgd           d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          d ddgddgt          j        	                    d                     d d d            n# 1 swxY w Y   d}t          j        t          |          5  t          d ddgddgd           d d d            d S # 1 swxY w Y   d S )Nz`func` must be callable.matchza duckr   r    z/`func` must evaluate the integrand at points...c                      dS Nr    r#   r#   r)   r'   r(   z3TestQMCQuad.test_input_validation.<locals>.<lambda>;  s    Q r)   c                 D    | j         dk    sJ t          j        |           S r   )ndimr7   sumrw   s    r'   funcz/TestQMCQuad.test_input_validation.<locals>.func=  s    6Q;;;;6!99r)   z8Exception encountered when attempting vectorized call...z`n_points` must be an integer.c                     dS r   r#   rw   s    r'   r(   z3TestQMCQuad.test_input_validation.<locals>.<lambda>F      q r)   g     @)n_pointsz!`n_estimates` must be an integer.c                     dS r   r#   rw   s    r'   r(   z3TestQMCQuad.test_input_validation.<locals>.<lambda>J  r   r)   r   )n_estimatesz8`qrng` must be an instance of scipy.stats.qmc.QMCEngine.c                     dS r   r#   rw   s    r'   r(   z3TestQMCQuad.test_input_validation.<locals>.<lambda>N  r   r)   )qrngz8`qrng` must be initialized with dimensionality equal to c                     dS r   r#   rw   s    r'   r(   z3TestQMCQuad.test_input_validation.<locals>.<lambda>R  r   r)   z,`log` must be boolean \(`True` or `False`\).c                     dS r   r#   rw   s    r'   r(   z3TestQMCQuad.test_input_validation.<locals>.<lambda>V  r   r)   r   log)
r   raises	TypeErrorqmc_quad
ValueErrorwarnsUserWarningr   qmcSobol)r.   messager   s      r'   test_input_validationz!TestQMCQuad.test_input_validation4  s   ,]9G444 	/ 	/X1v1v...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ D]:W555 	0 	0YYAA///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0	 	 	 M\+W555 	+ 	+TAq6Aq6***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 3]9G444 	C 	C[[1a&1a&6BBBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 6]9G444 	C 	C[[1a&1a&cBBBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C M]9G444 	A 	A[[1a&1a&x@@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A M]:W555 	K 	K[[1a&1a&uyq7I7IJJJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K B]9G444 	: 	:[[1a&1a&b9999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:s   A  AA(BBB6CCC D%%D),D)E22E69E6F??GG'6H))H-0H-I77I;>I;   r   r!   c           
          d}t          j        |          t          j        |          fdt           j                            d          }t
          j                            ||          }t          j        |          }t          j        |          |z  }t          ||||f|          }	t
          j
                            ||          }
t          j        |dz
  d          |	j        z  }t          |	j        |
|	           t          j        |          |	j        z  d
k    sJ t           j                            d          }t
          j                            ||          }t          fd||||fd|          }t          t          j        |j                  |	j                   t          j        |j                  t          j        |          d
k     rt           j        nd
k    sJ d S )Nr!   c                 F    t           j                            |           S r5   )r   multivariate_normalpdf)r%   covmeans    r'   r   z$TestQMCQuad.basic_test.<locals>.func^  s    ,00D#>>>r)   l   ^^@E9? )seed)r   r  rC   r  )lower_limitr    gףp=
?)rx   r   c                  2    t          j         |            S r5   )r7   r  )rC   r   s    r'   r(   z(TestQMCQuad.basic_test.<locals>.<lambda>n  s    ttT{(;(; r)   T)r   r  rC   r  r  )r7   zeroseyerandomdefault_rngr   r  r  onesr
  r  cdfscstdtritstandard_errorr	   integralprodexpimagr   )r.   r   r  signsr   rngr  rA   rB   resrefrx   logresr  r   r  s                @@@r'   
basic_testzTestQMCQuad.basic_testX  s   x~~fTll	? 	? 	? 	? 	? 	? i##$788yt#..HTNNGDMME!tQH#.dC[tM M M'++AtSa+HHz+a-//#2DDc5555wu~~cl*Q....i##$788yt#..;;;;Q#+ $c{4A A A 	v//>>>wv''RWU^^a5G5GBEEQOOOOOOr)   r   i   r  r   c                 2    |                      ||           d S r5   r.  )r.   r   r  s      r'   
test_basiczTestQMCQuad.test_basict  s     	+.....r)   r)  r    r   c                 2    |                      |           d S )N)r)  r0  )r.   r)  s     r'   	test_signzTestQMCQuad.test_signy  s    e$$$$$r)   r  FTc                     d}t          j        t          |          5  t          d ddgddg|          }d d d            n# 1 swxY w Y   |j        |rt
          j         ndk    sJ |j        dk    sJ d S )Nz-A lower limit was equal to an upper limit, sor   c                     dS r   r#   rw   s    r'   r(   z'TestQMCQuad.test_zero.<locals>.<lambda>  s    Q r)   r   r    r  )r   r  r  r
  r%  r7   infr$  )r.   r  r  r+  s       r'   	test_zerozTestQMCQuad.test_zero}  s    A\+W555 	A 	A;;AAC@@@C	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A|3 5A6666!Q&&&&&&s   AA
Ac                     d }t          |dd          }t          j                            dd          t          j                            dd          z
  }t	          |j        |d           d S )Nc                 D    t           j                            | d          S )Nr!   scale)r   normr  rw   s    r'   r   z-TestQMCQuad.test_flexible_input.<locals>.func  s    :>>!1>---r)   r   r    r!   r:  g{Gz?)r
  r   r<  r!  r	   r%  )r.   r   r+  r,  s       r'   test_flexible_inputzTestQMCQuad.test_flexible_input  sl    	. 	. 	. tQ""jnnQan((5:>>!1>+E+EEc400000r)   N)r:   r;   r<   r  r7   r   r.  r   r   r   r1  r3  r7  r=  r#   r)   r'   r   r   3  s+       ": ": ":H #'AWRWQZZ P P P P8 [Z$77[]QG44/ / 54 87/ [W1vBx"a1b'&JKK% % LK% [UUDM22' ' 32'1 1 1 1 1r)   r   )&r   numpyr7   r   r   r   numpy.testingr   r   r	   r
   r   scipy.integrater   r   r   r   r   r   r   r   r   r   r   r   r   scipy.integrate._quadraturer   r
  scipyr   r   r"  r   r>   r   r   r   r#   r)   r'   <module>rC     sL                 7 7 7 7 7 7 7 7 7 7 7 7 7 7P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P > = = = = = & & & & & & & &3 3 3 3 3 3 3 3 i: i: i: i: i: i: i: i:XQ$ Q$ Q$ Q$ Q$ Q$ Q$ Q$h4 4 4 4 4 4 4 4*Z1 Z1 Z1 Z1 Z1 Z1 Z1 Z1 Z1 Z1r)   