
    1-PhcT              	          d dl Zd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ d)dZd*dZ ej        d	ej        ej        ej        g          ej                            d
          d                         Zej                            d          ej                            d
          ej                            d           ej        d	ej        ej        ej        g          d                                                 Zej                            d          ej                            d
          ej                            d           ej        d	ej        ej        ej        g          d                                                 Z ej        d	ej        ej        ej        g          ej                            d
          d                         Zej                            d
          ej                            d          d                         Zej                            d
          d             Zej                            d
          d             Zej                            d
          d             Z ej        d	ej        ej        g          d             Zd Z  ej        dg d           ej        d	ej        ej        g          d                         Z! ej        d	ej        ej        g          d             Z"d Z# ee	oe
 d          d             Z$d  Z%ej                            d
          d!             Z&d" Z'd# Z(d$ Z)ej                            d
          d%             Z*d& Z+ej                            d
          d'             Z,ej                            d
          d(             Z-dS )+    N)testing)expected_warnings)xfailarch32is_wasm)random_walker)resizec                    || }t           j                            d           t          j        | |f          dt           j                            | |          z  z   }t          | dz            }d|| dz  |z
  | dz  |z   |dz  |z
  |dz  |z   f<   dt           j                            d|z  dz
  d|z  dz
            z  || dz  |z
  dz   | dz  |z   dz
  |dz  |z
  dz   |dz  |z   dz
  f<   d|| dz  |z
  |dz  |dz  z
  |dz  |dz  z   f<   t          j        |          }d|| dz  |dz  f<   d|| dz  |dz  z   |dz  |dz  z
  f<   ||fS 	Ni  皙?         r         )nprandomseedzerosrandnint
zeros_like)lxlydatasmall_lseedss        m/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/skimage/segmentation/tests/test_random_walker.pymake_2d_syntheticdatar      s   	zINN48RHbioob"&=&= ==D"'llG 	
 	
a'B!Gg--rQw/@27WCT/TT 	biooa'kAoq7{Q??? 	
a'Aa' 1A 55
a'Aa' 1A 55	7 PQDq7	B!Ggl2R1Ww!|5KK	KLM$EE"'27
<=E"'GqL
 "'GqL"8
89;    c                    || }|| }t           j                            d           t          j        | ||f          dt           j                            | ||          z  z   }t          | dz            }d|| dz  |z
  | dz  |z   |dz  |z
  |dz  |z   |dz  |z
  |dz  |z   f<   d|| dz  |z
  dz   | dz  |z   dz
  |dz  |z
  dz   |dz  |z   dz
  |dz  |z
  dz   |dz  |z   dz
  f<   t          j        d|dz  g          }d|| dz  |z
  |dz  |z
  |dz  |z   |dz  |z
  |dz  |z   f<   t          j        |          }d|| dz  |dz  |dz  f<   d|| dz  |dz  z   |dz  |dz  z
  |dz  |dz  z
  f<   ||fS r   )r   r   r   r   r   r   maxr   )r   r   lzr   r   	hole_sizer   s          r   make_3d_syntheticdatar%      s*   	z	zINN48RRL!!C")//"b"*E*E$EED"'llG
 	
	 	
a'B!Gg--
a'B!Gg--
a'B!Gg--	/ 	
	 	
a'Aa' 1A 55
a'Aa' 1A 55
a'Aa' 1A 55	7 7a<())I
 	
	 	
a'
a)bAg	11
a)bAg	11	3
 M$E'(E"'27B!G
#$TUE"'GqL
 "'GqL"8"'GqL:P
PQ;r    dtypezhignore:Changing the sparsity structure of a csr_matrix is expensive:scipy.sparse.SparseEfficiencyWarningc                    d}d}| t           j        k    rdnd}t          ||          \  }}|                    | d          }t	          |||d          }|dd	d
df         dk                                    sJ |j        |j        k    sJ t	          |||dd          }|ddd	d
df         |ddd	d
df         k                                    sJ |j        |j        k    sJ d|d<   t	          |||dd          }|ddd	d
df         |ddd	d
df         k                                    sJ t          |          dk    sJ |j        |j        k    sJ d S )NF   d   Z      Fcopybfbetamode-   (   <   r   Tr0   r1   return_full_probr   r      )7   P   )r   float64r   astyper   allshapelen)r&   r   r   r0   r   labels	labels_bffull_prob_bfs           r   
test_2d_bfrB   >   s   
 
B	B "*$$22"D(R00LD&;;u5;))DdFDAAAIbeRUl#q(--/////:%%%% f4dT  L BrE2b5)\!RUBrE/-JJOOQQQQQ:%%%%F6N f4dT  L BrE2b5)\!RUBrE/-JJOOQQQQQ|!!!!:%%%%%%r    z0ignore:"cg" mode may be slow:UserWarning:skimagezrignore:"cg_mg" not available, it requires pyamg to be installed. The "cg_j" mode will be used instead.:UserWarningc                    d}d}t          ||          \  }}|                    | d          }t          ||dd          }|dd	d
df         dk                                    sJ |j        |j        k    sJ t          ||ddd          }|ddd	d
df         |ddd	d
df         k                                    sJ |j        |j        k    sJ d S )Nr(   r)   Fr,   r*   cgr/   r+   r2   r3   r4   r   Tr5   r   r   r   r;   r   r<   r=   r&   r   r   r   r?   	labels_cg	full_probs          r   
test_2d_cgrI   ]   s    
B	B(R00LD&;;u5;))DdF$???IbeRUl#q(--/////:%%%%dF$QUVVVIaB2o&)Ar"ubeO*DDIIKKKKK:%%%%%%r    z-ignore:Implicit conversion of A to CSR::pyamgc                    d}d}t          ||          \  }}|                    | d          }t          ||dd          }|dd	d
df         dk                                    sJ |j        |j        k    sJ t          ||ddd          }|ddd	d
df         |ddd	d
df         k                                    sJ |j        |j        k    sJ d S )Nr(   r)   Fr,   r*   cg_mgr/   r+   r2   r3   r4   r   Tr5   r   r   rE   )r&   r   r   r   r?   labels_cg_mgrH   s          r   test_2d_cg_mgrM   t   s    
B	B(R00LD&;;u5;))D vBWEEELB2&!+0022222:%%%%f2Gd  I aB2o&)Ar"ubeO*DDIIKKKKK:%%%%%%r    c                    d}d}t          ||          \  }}|                    | d          }t          ||dd          }|dd	d
df         dk                                    sJ |j        |j        k    sJ t          ||ddd          }|ddd	d
df         |ddd	d
df         k                                    sJ |j        |j        k    sJ d S )Nr(   r)   Fr,   r*   cg_jr/   r+   r2   r3   r4   r   Tr5   r   r   rE   rF   s          r   test_2d_cg_jrP      s   
 
B	B(R00LD&;;u5;))DdF&AAAIbeRUl#q(--/////:%%%%dF&SWXXXIaB2o&)Ar"ubeO*DDIIKKKKK:%%%%%%r    c                     d} d}t          | |          \  }}d||                                z
  z  |                                |                                z
  z  }|                    t          j                  }t          ||dd          }|ddd	d
f         dk                                    sJ |j        |j        k    sJ d S )Nr(   r)      r*   rK   r/   r+   r2   r3   r4   r   )	r   minr"   r;   r   uint8r   r<   r=   )r   r   r   r?   rL   s        r   
test_typesrU      s     
B	B(R00LD&$#$dhhjj)@AD;;rx  D vBWEEELB2&!+0022222:%%%%%%r    c                      d} d}t          | |          \  }}d||dk    <   t          ||dd          }|dd	d
df         dk                                    sJ |j        |j        k    sJ d S )Nr(   r)   r   r   r*   r.   r/   r+   r2   r3   r4   )r   r   r<   r=   )r   r   r   r?   r@   s        r   test_reorder_labelsrW      s     
B	B(R00LD&F6Q;dF$???IbeRUl#q(--/////:%%%%%%r    c                     d} d}t          | |          \  }}d|ddddf<   d|ddd	d
f<   t          ||d          }|                    | |f          ddddf         dk                                    sJ |j        |j        k    sJ d S )Nr(   r)   
      .   2   !   &   r*   r0   r+   r2   r3   r4   r   )r   r   reshaper<   r=   )r   r   r   r?   s       r   test_2d_inactiverc      s     
B	B(R00LD&F2b5"R%<F2b5"R%<4b111FNNB8$$RUBrE\2a7<<>>>>>:%%%%%%r    c                     t          j        g dg dg dg          } t          j        g dg dg dg          }t          j        g dg dg dg          }t          | |d	
          }t           j                            ||           d S )N)i2  i1  i1  )iS2  iq4  i#/  )i.  i.  i0  )r   rY   r   )r   rY   r   )r   r   rY   )r   rY   r   )r   r   rY   rZ   ra   )r   asarrayr   r   assert_array_equal)r   markersexpected_labelsr?   s       r   test_2d_laplacian_sizeri      s     :			 5 5 57L7L7LM D j***jjj***=>>Gj***jjj***!EFFO4r222FJ!!&/:::::r    c                    d}|||}}}t          |||          \  }}|                    | d          }t          dg          5  t          ||d          }d d d            n# 1 swxY w Y   |                    |j                  ddddddf         d	k                                    sJ |j        |j        k    sJ d S )
N   Fr,   @Changing the sparsity structure|"cg" mode|scipy.sparse.linalg.cgrD   r1         r   )r%   r;   r   r   rb   r=   r<   )r&   nr   r   r#   r   r?   s          r   test_3drq      s   
AAqBB(R44LD&;;u5;))D		KL
 
 8 8 tV$7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 NN4:&&r"ubeRU':;q@EEGGGGG:%%%%%%s   A##A'*A'c                  t   d} | | | }}}t          |||          \  }}d|ddddddf<   t          dg          5  t          ||d	          }d d d            n# 1 swxY w Y   |                    |j                  d
dd
dd
df         dk                                    sJ |j        |j        k    sJ d S )Nrk   rY   r   r+         zMChanging the sparsity structure|"cg" mode|CObject type|scipy.sparse.linalg.cgrD   rm   rn   ro   r   )r%   r   r   rb   r=   r<   )rp   r   r   r#   r   r?   s         r   test_3d_inactiveru      s)   
AAqBB(R44LD&!#F1R4B2	[	

 
 8 8
 tV$7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 NN4:&&r"ubeRU':;q@EEGGGGG:%%%%%%s   AA!Achannel_axis)r   r   rY   c                    d\  }}t          ||          \  }}|                    | d          }|dt          j        f                             dd          }t          j        |d|          }t          dd	g          5  t          ||d
|          }d d d            n# 1 swxY w Y   t          j        ||d          }|d         j        |j        k    sJ t          dg          5  t          |d         |d
           d d d            n# 1 swxY w Y   |	                    |j                  ddddf         dk    
                                sJ |d         j        |j        k    sJ d S )N)r(   r)   Fr,   .r   rY   axisrl   z The probability range is outsiderD   r1   rv   .r   rm   r+   r2   r3   r4   )r   r;   r   newaxisrepeatmoveaxisr   r   r=   rb   r<   )r&   rv   r   r   r   r?   multi_labelss          r   test_multispectral_2dr      s    FB(R00LD&;;u5;))DRZ '''33D;tR..D	N.	

 
 Y Y %T6<XXXY Y Y Y Y Y Y Y Y Y Y Y Y Y Y ;t\2..D<----		KL
 
 7 7 	d6lF66667 7 7 7 7 7 7 7 7 7 7 7 7 7 7   ..r"ube|<AFFHHHHH<------s$    B  B$'B$)DDDc                    d}|||}}}t          |||          \  }}|                    | d          }|dt          j        f                             dd          }t          dg          5  t          ||d	d
          }d d d            n# 1 swxY w Y   |d         j        |j        k    sJ t          dg          5  t          |d         |d	          }d d d            n# 1 swxY w Y   |                    |j                  ddddddf         dk    	                                sJ |                    |j                  ddddddf         dk    	                                sJ |d         j        |j        k    sJ d S )Nrk   Fr,   .r   rY   rx   rl   rD   rz   r{   rm   rn   ro   )
r%   r;   r   r|   r}   r   r   r=   rb   r<   )	r&   rp   r   r   r#   r   r?   r   single_labelss	            r   test_multispectral_3dr     sS   
AAqBB(R44LD&;;u5;))DRZ '''33D		KL
 
 O O %T62NNNO O O O O O O O O O O O O O O <----		KL
 
 G G &d6lFFFFG G G G G G G G G G G G G G G   ..r"ubeRU/BCqHMMOOOOO!!&,//2r"ube0CDINNPPPPP<------s$   -BBB C%%C),C)c                  \   d} | | | }}}t          |||          \  }}t          j        | | | dz  f          }t          |          D ]'\  }}t	          || | dz  fdd          ||d d d d f<   (t          |dz            }	t          j        |          }
d|
|dz  |dz  |dz  f<   d|
|dz  |	dz  z   |dz  |	dz  z
  |dz  |	d	z  z
  f<   t          d
g          5  t          ||
dd          }
d d d            n# 1 swxY w Y   |
ddddddf         dk    	                                sJ d S )Nrk   r   constantFr1   anti_aliasingr   r   r   r   rl   rD   )      ?r   g      ?r1   spacingrn   ro      	   )
r%   r   r   	enumerater	   r   r   r   r   r<   )rp   r   r   r#   r   _
data_anisoiyzr   labels_anisos              r   test_spacing_0r   '  s   
AAqBB#BB//GD! 1aa.))J4 
 
2$AF*E
 
 

1aaa7
 "'llG=,,L./Lq"'27*+ 	
 
a'Q,a'Q, 6a'Q,8NN
 
	KL
 
 
 
 %4
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 B2qs*+q0557777777s   C88C<?C<zKnown test failure on 32-bit platforms. See links for details: https://github.com/scikit-image/scikit-image/issues/3091 https://github.com/scikit-image/scikit-image/issues/3092)	conditionreasonc                     d} | | | }}}t          |||          \  }}t          j        | | dz  | f          }t          |          D ]'\  }}t	          || dz  | fdd          ||d d d d f<   (t          |dz            }	t          j        |          }
d|
|dz  |dz  |dz  f<   d|
|dz  |	dz  z   ||	dz  z
  |dz  |	dz  z
  f<   t          d	g          5  t          ||
d
d          }
d d d            n# 1 swxY w Y   |
ddddddf         dk    	                                sJ t          j        | | dz  | f          }t          |j        d                   D ]1}t	          |d d dd d f         | dz  | fdd          ||d d d d f<   2t          |dz            }	t          j        |          }d||dz  |dz  |dz  f<   d|||	dz  z
  |dz  |	dz  z   |dz  |	dz  z
  f<   t          d	g          5  t          ||d
d          }d d d            n# 1 swxY w Y   |ddddddf         dk    	                                sJ d S )Nrk   r   r   Fr   r   r   r   rl   rD   )r          @r   r   rn   ro   rs   "   )r   r   r   )r%   r   r   r   r	   r   r   r   r   r<   ranger=   )rp   r   r   r#   r   r   r   r   r   r   r   labels_aniso2s               r   test_spacing_1r   G  s    	AAqBB#BB//GD! 1a!eQ-((J4 
 
2$Q
5
 
 

1aaa7
 "'llG=,,L./Lq"'27*+VWLq7a<'gl):B!GgQRl<RRS 
	KL
 
 
 
 %4
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 B2r"u,-27799999 1a!eQ-((J4:a=!! 
 
$AqqqMAE1:Je
 
 

1aaa7
 "'llGM*--M/0M"'27B!G+,WXM"w!|#R1Ww!|%;R1WwRS|=SST 
	KL
 
 
 
 &D/
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 "R%B2-.!388:::::::s$   C55C9<C96HHHc                     t          j        d          } t          j        d          }t          dg          5  t          | |          }d d d            n# 1 swxY w Y   t           j                            ||           d|d d d df<   t          j        |dk    dt           j        f         |dk    dt           j        f         fd          }t          dg          5  t          | |d	
          }d d d            n# 1 swxY w Y   t           j                            ||           t          j        dd          } t          j	        g d          }t          j	        g d          }t          j
        ||f          D ]\  }}d	| |         |<   t          j        dt           j                  }	|D ]\  }}d|	|         |<   d|	| dk    <   t          dg          5  t          | |	          }
d d d            n# 1 swxY w Y   t          j        |
|	dk             dk              sJ t          j        |
|	dk             dk              sJ t          dg          5  t          | |	d	
          }d d d            d S # 1 swxY w Y   d S )NrZ   rZ   zReturning provided labelsr7   r   r   .r   rx   Tr6   F))   r   r   r   r   r   )r   r   ))r7   r   )r   r   )r   r   )r7   r   )r   r   )r   r7   r7   r7   r&   rY   r   z!All unlabeled pixels are isolated)r   onesr   r   r   rf   concatenater|   fullarrayvstackr   int8r<   )imgr?   pass_throughexpectedtestobject_Aobject_Bxyrg   output_labelss              r   test_trivial_casesr     s   
'(

CWXF	78	9	9 2 2$S&112 2 2 2 2 2 2 2 2 2 2 2 2 2 2J!!,777 F111bqb5M~
A+sBJ	'&A+sBJ)GHq  H 
78	9	9 A AS&4@@@A A A A A A A A A A A A A A AJ!!$111 '(E
"
"Cx88899HxPPPQQH	8X.//  1Aq		hxrw///G  1
1GC1H	?@	A	A 4 4%c7334 4 4 4 4 4 4 4 4 4 4 4 4 4 46-1-2333336-1-344444	?@	A	A B BS'DAAAB B B B B B B B B B B B B B B B B BsG   AAA C??DDG;;G?G?I>>JJc                  ,   t           j                            d           t          j        d          dt           j                            d          z  z   } t          j        dt           j                  }d|d<   d|d	<   t          | |d
           d S )N*   r   g?sizer   r   r   r   r   r   )r   r   r   )r   r   r   r   normalr   rT   r   r   r?   s     r   test_length2_spacingr     s     INN2
'(

cBI$4$4($4$C$CC
CCXhbh///FF4LF4L#vz222222r    c                  .   t          j        d          } t          j        d          }t          j        t
                    5  t          | |           d d d            n# 1 swxY w Y   t          j        t
                    5  t          | |d           d d d            n# 1 swxY w Y   t           j                            d           t           j        	                    d          } t          j        d          
                    | j                  }t          j        t
                    5  t          | |           d d d            n# 1 swxY w Y   t          j        t
                    5  t          | |d           d d d            n# 1 swxY w Y   t           j        	                    d          } t          j        d          }d	|d
<   d|d<   t          j        t
                    5  t          | |d           d d d            n# 1 swxY w Y   t           j        	                    d          } t          j        d          }t          j        t
                    5  t          | |d           d d d            d S # 1 swxY w Y   d S )NrZ   rY   )rv   r   )r7   r7   r7   r7   r7   r      r   r   r   r   r   )r   r   badrm   )r   r   aranger   raises
ValueErrorr   r   r   r   rb   r=   r   r   s     r   test_bad_inputsr     s   
'"++CYr]]F	
	#	# # #c6"""# # # # # # # # # # # # # # #	
	#	# 4 4c633334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 INN2
)



0
0CYt__$$SY//F	
	#	# # #c6"""# # # # # # # # # # # # # # #	
	#	# 4 4c633334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 )



)
)CXhFF4LF4L	
	#	# 1 1c6400001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 )



)
)CXhF	
	#	# / /c6..../ / / / / / / / / / / / / / / / / /sl   AA#&A#B""B&)B&1EEE2FFF3HHH*J

JJc                  "   t           j                            d           t           j                            d          } t          j        | j                   }d|d<   d|dd dd f<   d|d<   d|d<   t          d	g          5  t          | |          }d d d            n# 1 swxY w Y   |d         dk    sJ t          d	g          5  t          | |d
          }d d d            n# 1 swxY w Y   |d         dk    sJ |d         dk    sJ d S )Nr   r   r   r   r   r7   r   r   r   r   r   WChanging the sparsity structure|The probability range is outside|scipy.sparse.linalg.cgTr   r   r   r   r   r   r   r   r   r   r   r=   r   r   amaskress      r   test_isolated_seedsr        INN1
	  AGAGDDJDQRRLDJDJ 
e	

 
 % %
 At$$% % % % % % % % % % % % % % % t9>>>>	e	

 
 < <
 Atd;;;< < < < < < < < < < < < < < < w<1w<1$   B  B$'B$	C((C,/C,c                  "   t           j                            d           t           j                            d          } t          j        | j                   }d|d<   d|dd dd f<   d|d<   d|d<   t          d	g          5  t          | |          }d d d            n# 1 swxY w Y   |d         dk    sJ t          d	g          5  t          | |d
          }d d d            n# 1 swxY w Y   |d         dk    sJ |d         dk    sJ d S )Nr   r   r   r7   r   r   r   r   r   Tr   r   r   r   r   s      r   test_isolated_arear     r   r   c                  x   t           j                            d           t           j                            d          } t          j        | j                   }d|d<   d|dd dd f<   d|d<   d|d<   t          d	g          5  t          | |d
          }d d d            n# 1 swxY w Y   t          | |d
d          }|d         dk    sJ |d         dk    sJ t          | |d
d          }|d         dk    sJ |d         dk    sJ t          | |d
d          }|d         dk    sJ |d         dk    sJ d S )Nr   r   r   r   r7   r   r   r   r   Tr   rZ   )r6   r0   r   r   r   )r6   prob_tolg&.>)r6   tolr   r   s      r   test_prob_tolr     s    INN1
	  AGAGDDJDQRRLDJDJ	e	

 
 < <
 Atd;;;< < < < < < < < < < < < < < < 4$R
@
@
@Cw<1w<1 4$
F
F
FCw<1w<1 4$D
A
A
ACw<1w<1s   B""B&)B&c                  \    ddl m}  | j        }	 dd l}|J d S # t          $ r |J Y d S w xY w)Nr   )random_walker_segmentation)skimage.segmentationr   UmfpackContextscikits.umfpackImportError)r   r   scikitss      r   test_umfpack_importr   =  so    ??????/>N&))))) & & &%%%%%%&s    ++c                     t           j                            d          } t          j        dt                    }t	          j        t          d          5  t          | |           d d d            n# 1 swxY w Y   d|d<   t	          j        t          d          5  t          | |           d d d            n# 1 swxY w Y   d|d<   t          | |           d S )	N)r   r   r   zNo seeds provided)matchrY   r   r   r   )r   r   r   r   r   r   r   r   )imager?   s     r   test_empty_labelsr   J  sO    IV$$EXfC(((F	
*=	>	>	> % %eV$$$% % % % % % % % % % % % % % % F4L	
*=	>	>	> % %eV$$$% % % % % % % % % % % % % % % F4L%     s$   A33A7:A7B;;B?B?c                  H   t          dd          \  } }|                     t          j        d          } t          j        dt          j                  }t          | ||dd	
          }|ddddf         dk                                    sJ | j        |j        k    sJ d S )Nr(   r)   )r   r   Fr,   r   r   r*   rO   )r   r0   r1   r+   r2   r3   r4   )r   r;   r   float16r   r   r<   r=   )r   r?   r   rG   s       r   test_float16_upcastingr   ]  s     )B3777LD&;;rz;..Dgarz***GdFG"6RRRIbeRUl#q(--/////:%%%%%%r    )N)NN).numpyr   pytestskimage._sharedr   skimage._shared._warningsr   skimage._shared.testingr   r   r   r   r   skimage.transformr	   r   r%   parametrizer   float32r:   markfilterwarningsrB   rI   rM   rP   rU   rW   rc   ri   rq   ru   r   r   r   r   r   r   r   r   r   r   r   r   r    r    r   <module>r      s        # # # # # # 7 7 7 7 7 7 : : : : : : : : : : . . . . . . $ $ $ $ $ $   (   > Wrz2:rzBCCn & &  DC&6 NOOn  x  Wrz2:rzBCC& & DC   PO& KLLn  x  Wrz2:rzBCC& & DC   ML&" Wrz2:rzBCCn 
& 
&  DC
& n  x & &  & n & & & n & & & n 
; 
; 
; Wrz2:677
& 
& 87
&& & & ^ZZZ00Wrz2:677. . 87 10.2 Wrz2:677. . 87.(8 8 8@ $W	C  2; 2; 2;j$B $B $BN n 3 3 3/ / /B  <  < n      F
& 
& 
& n ! ! !  n & & & & &r    