U
    3d                  
   @   s  d dl Zd dlmZ d dlmZ d dlmZ d dlmZ d dl	Z	d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$Z$ d dlm%Z% d dlm&Z& d dl'm(Z(m)Z) dd Z*dd Z+d d! Z,d"d# Z-d$d% Z.e	j/0d&ej1ej2ej3ej4fd'd( Z5e	j/0d&ej1ej2ej3ej4fd)d* Z6e	j/0d+d,d-d. Z7e	j/0d/d0d1d2d3d4d5gd6d7 Z8e	j/0d&ej3ej4fd8d9 Z9d:d; Z:d<d= Z;d>d? Z<d@dA Z=dBdC Z>dDdE Z?dFdG Z@dHdI ZAe	j/0dJdKdLdMge	j/0dNdKdLdMge	j/0d+dOdPdKge	j/0dQeBdRdSdT ZCdUdV ZDe	j/0dWejEdXdYdZgej1d[ejEd\dRgej2d[geFej2fejEdXdYdZgej1d[ejEd\dRgej4d[geFej4fejEdXdYdZgej1d[ejEd]d^geGd[geFeGfgd_d` ZHdadb ZIe	J dcdd ZKe	j/0d&ej3ej4gdedf ZLe	j/0dgd dhdige	j/0djdXdkdlge	j/0dmdndodpdqdrgdsdt ZMe	j/0d&ej3ej4gdudv ZNdwdx ZOdydz ZPed{d| ZQd}d~ ZRdd ZSdd ZTdd ZUe	j/j0dejEejVgddgde	j/j0dejEejVgddgddd ZWdd ZXe	j/j0dejEejVgddgddd ZYe	j/0dddgdd ZZdS )    N)sparse)linalg)eigsh)expit)gen_batches)_init_arpack_v0)assert_almost_equal)assert_allclose)assert_allclose_dense_sparse)assert_array_equal)assert_array_almost_equal)skip_if_32bit)_mode_eigh)density_safe_accumulator_op)randomized_svd_randomized_eigsh)	row_norms)weighted_mode)	cartesian)log_logistic)svd_flip)_incremental_mean_and_var)_deterministic_vector_sign_flip)softmax)stable_cumsum)safe_sparse_dot)make_low_rank_matrixmake_sparse_spd_matrixc                  C   s|   t jd} | jddd}d|d< d|d< t|}t|}t|}t|}||||fD ]}t	|t	|ks^t
q^d S )Nr   
   r       size)      )r"      )nprandomRandomStaterandintr   
csr_matrixZ
csc_matrixZ
coo_matrix
lil_matrixr   AssertionError)rngXZX_csrZX_cscZX_cooZX_lilZX_ r1   D/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/utils/tests/test_extmath.pytest_density&   s    



r3   c               	   C   sD   t dddgdddgg} tjtdd t| dd	 W 5 Q R X d
S )zGCheck that future warning is raised when user enters keyword arguments.r%   r&   r'      r"      z^Additional keyword arguments are deprecated in version 1.2 and will be removed in version 1.4.match)aN)r(   arraypytestwarnsFutureWarningr   )Z
test_arrayr1   r1   r2   test_density_deprecated_kwargs5   s    r=   c                  C   sh   t jd} | jddd}t |j}dD ]8}t||\}}t|||d\}}t|| t|| q*d S )Nr   r    r!   r#   )Nr   r%   axis)	r(   r)   r*   r+   onesshaper   r   r   )r/   xweightsr?   modescoreZmode2Zscore2r1   r1   r2   test_uniform_weightsB   s    
rF   c                  C   s   d} t jd}|j| dd}||j}| |d d d df< |d d d df  d7  < t||dd\}}t||  t|	 |d d d df 
d d S )Nr5   r   d   r    r#   r"   r%   r>   )r(   r)   r*   r+   random_samplerA   r   r   r   Zravelsum)Zmode_resultr/   rB   wrD   rE   r1   r1   r2   test_random_weightsP   s    
rL   c              	   C   sh  d}d}d}d}| t jkrdnd}t | } t|||dddj| d	d
}|j||fksZttj|d	d\}}}	|j| d	d
}|j| d	d
}|	j| d	d
}	dD ]}
t	|||
dd\}}}| j
dkr|j| kst|j| kst|j| kstn4|jt jkst|jt jkst|jt jks"t|j||fks6t|j|fksHt|j||fks\tt|d | ||d tt |d d d |f |	d |d d f t |||d t|}t	|||
dd\}}}| j
dkr|j| kst|j| kst|j| ksDtn6|jj
dks t|jj
dks2t|jj
dksDtt|d | |d | |d qd S )NrH     r"   r               r   	n_samples
n_featureseffective_rankZtail_strengthrandom_stateFcopyZfull_matrices)autoLUQRpower_iteration_normalizerrT   fdecimal)r(   float32dtyper   astyperA   r.   r   svdr   kindfloat64r   dotr   r,   )ra   rQ   rR   rankkr_   r0   UsVt
normalizerZUasaZVar1   r1   r2   check_randomized_svd_low_rankb   sv    
 
   
* 
 
   rn   ra   c                 C   s   t |  d S N)rn   ra   r1   r1   r2   'test_randomized_svd_low_rank_all_dtypes   s    rq   c              	   C   s   t jd}t t jddddg| d}t j|j|jdd }|| |j	 }t
|d	d
d\}}|jdksptt|ddg |jdksttt t
|d	dd W 5 Q R X dS )z@Test that `_randomized_eigsh` returns the appropriate components*         ?g       rO   g      @rp   r#   r   r&   module)n_components	selection)r&   )r4   r&   valueN)r(   r)   r*   diagr9   r   ZqrnormalrA   Tr   r.   r   r:   ZraisesNotImplementedError)ra   r/   r0   Zrand_roteigvalseigvecsr1   r1   r2   test_randomized_eigsh   s    r~   rh   )r    2   rH         c              	   C   s  d}t |dd}t|| dddd\}}t|| dddddd	\}}t|||  |d
 fd\}}| ddd }	||	 }|dd|	f }|j| fkstt||dd t||dd |j|| fkstt|j	}
t
||
\}}t
||
\}}t
||
\}}t||dd t||dd | |k rt|dd}t|| ddd|d\}}| ddd }	||	 }t||dd |dd|	f }t
||
\}}t||dd dS )a&  Check that `_randomized_eigsh` is similar to other `eigsh`

    Tests that for a random PSD matrix, `_randomized_eigsh` provides results
    comparable to LAPACK (scipy.linalg.eigh) and ARPACK
    (scipy.sparse.linalg.eigsh).

    Note: some versions of ARPACK do not support k=n_features.
    r   r   )rT   rt      )ru   rv   n_iterrT      rZ   )ru   r   Zn_oversamplesrT   r\   rv   r%   )Zsubset_by_indexNr5   r^   r4   ZLA)whichtolmaxiterv0r       )r   r   r   ZargsortrA   r.   r   r(   Z
zeros_likerz   r   r   r   )rh   rR   r0   r|   r}   Z
eigvals_qrZ
eigvecs_qrZeigvals_lapackZeigvecs_lapackindicesZ
dummy_vecs_r   Zeigvals_arpackZeigvecs_arpackr1   r1   r2   (test_randomized_eigsh_compared_to_others   sf        

 

     
r   zn,rank)r    rN   rG   )rH   P   )rM   r    )rM      )rM   i  c                 C   s   || k st tjd}|| |}||j }t|||d\}}ttjj	|ddt
|j t|j| tt
|j |t| |j }t||dd dS )a  Check that randomized_eigsh is able to reconstruct a low rank psd matrix

    Tests that the decomposition provided by `_randomized_eigsh` leads to
    orthonormal eigenvectors, and that a low rank PSD matrix can be effectively
    reconstructed with good accuracy using it.
    E   )ru   rT   r   r>   r5   r^   N)r.   r(   r)   r*   randnrz   r   r   r   normr@   rA   rx   )nrg   r/   r0   ASVZA_reconstructr1   r1   r2   &test_randomized_eigsh_reconst_low_rank  s    
r   c                 C   s  t jddd}| t jkr$d}nd}|j| dd}|d jdd	}t|t|d
d| tt 	|t|| t j
t jfD ]}tj|| d}|t jkr|jj|dd|_|jj|dd|_|jj|kst|jj|kstt|t|d
d| tt 	|t|| q|d S )Nrr   rH   r4   r"   FrU   r&   r%   r>   T)Zsquaredrp   )r(   r)   r*   r   r`   rb   rJ   r   r   sqrtint32int64r   r,   Zindptrr   ra   r.   )ra   r0   Z	precisionZsq_normZcsr_index_dtypeZXcsrr1   r1   r2   test_row_norms9  s"    

r   c            
      C   s   d} d}d}d}t | ||ddd}|j| |fks4ttj|dd	\}}}d
D ]j}t||d|dd\}}}t|d | |  dkstt|||dd\}}	}t	|d | |	dd qLd S )NrH   rM   r"   r    皙?r   rP   FrW   rX   nonerY   rZ   r   r\   rT   g{Gz?r[   r'   r^   
r   rA   r.   r   rc   r   r(   absmaxr   
rQ   rR   rg   rh   r0   r   rj   rl   rm   Zsapr1   r1   r2   'test_randomized_svd_low_rank_with_noiseT  s:        "   r   c            
      C   s   d} d}d}d}t | ||ddd}|j| |fks4ttj|dd	\}}}d
D ]l}t||d|dd\}}}t|d | |  dkstt||d|dd\}}	}t	|d | |	dd qLd S )NrH   rM   r"   r    rs   r   rP   FrW   r   r   r   r'   r^   r   r   r1   r1   r2   !test_randomized_svd_infinite_rank}  s<        "    r   c               	   C   s\  d} d}d}d}t | ||ddd}|j| |fks4tt||dd	dd
\}}}t||dddd
\}}	}
t||dddd
\}}}tj|d	d\}}}t||d | dd t|	|d | dd t||d | dd tt||t|d d d |f |d |d d f dd tt||
t|d d d |f |d |d d f dd t|	| d S )NrH   rM   r4   r    g      ?r   rP   r'   F)r   	transposerT   TrX   rW   r^   r&   )	r   rA   r.   r   r   rc   r   r(   rf   )rQ   rR   rg   rh   r0   U1s1V1U2s2V2ZU3Zs3ZV3ZU4Zs4ZV4r1   r1   r2   )test_randomized_svd_transpose_consistency  s,    >>r   c               	   C   s  t jd} tddd| d}|d| jdd|jd	 7 }d}t||dd
dd\}}}||t || }t	j
|dd}t||dd
dd\}}}||t || }t	j
|dd}t || dkstdD ]}	t||d|	dd\}}}||t || }t	j
|dd}dD ]^}
t|||
|	dd\}}}||t || }t	j
|dd}dt || kstqqd S )Nrr   rH   rM   r   rS   rT   r'   r   r&   r#   r   r   Zfro)ordr   )rY   rZ   rX   )r"   r    r      )r(   r)   r*   r   r+   rA   r   rf   rx   r   r   r   r.   )r/   r0   ru   ri   rj   rk   r   Zerror_2Zerror_20rl   ierrorr1   r1   r2   .test_randomized_svd_power_iteration_normalizer  sX            r   c               
   C   sv   t jd} tddd| d}d}tjtjfD ]D}||}d|j}t	j
tj|d t||d	d
d W 5 Q R X q,d S )Nrr   r   r   r    r   r"   zCCalculating SVD of a {} is expensive. csr_matrix is more efficient.r6   r%   r   )r   r\   )r(   r)   r*   r   r   r-   Z
dok_matrixformat__name__r:   r;   ZSparseEfficiencyWarningr   )r/   r0   ru   clsZwarn_msgr1   r1   r2   #test_randomized_svd_sparse_warnings  s    r   c                  C   s  t jd} d}d}| ||}tj|dd\}}}t||dd\}}tt || ||dd |j	}	tj|	dd\}}}t||d	d\}
}tt |
| ||	dd t||d	d\}}tt || ||	dd t||dd\}}tt || ||	dd d S )
N  r   r    FrW   )Zu_based_decisionr5   r^   T)
r(   r)   r*   r   r   rc   r   r   rf   rz   )rsrQ   rR   r0   ri   r   rk   r   r   ZXTr   r   ZU_flip1ZV_flip1ZU_flip2ZV_flip2r1   r1   r2   test_svd_flip  s    r   c                  C   s   t ddgddgg} t| dddd\}}}tdD ]x}t| dd|d\}}}t|| t|| tt || ||  tt |j|t d tt |j|t d q4d S )	Ng       @rO   rs   r&   T)   	flip_signrT   r    )r(   r9   r   ranger   rf   rz   Zeye)r8   u1r   Zv1seedu2r   Zv2r1   r1   r2   test_randomized_svd_sign_flip  s    

r   c            	      C   s   dd } t ddd}t|dddd	\}}}| ||\}}|sFt|rNtt|ddddd
\}}}| ||\}}|s|t|rtd S )Nc                 S   sL   t | jdd| jddk }t |jdd|jddk }||fS )z
        returns bool tuple indicating if the values maximising np.abs
        are positive across all rows for u and across all columns for v.
        r   r>   r%   )r(   r   r   all)uvu_basedv_basedr1   r1   r2   max_loading_is_positive,  s    ""zMtest_randomized_svd_sign_flip_with_transpose.<locals>.max_loading_is_positiver   r    r   r'   Tr   r   )r   r   rT   )r(   arangereshaper   r.   )	r   matZ	u_flippedr   Z	v_flippedr   r   Zu_flipped_with_transposeZv_flipped_with_transposer1   r1   r2   ,test_randomized_svd_sign_flip_with_transpose'  s&    	     r   r   r   rH   ,  mr    r   r   r"   c                 C   s   t j|}|| |}t||ddd\}}}t||ddd\}	}
}|j|	jksTtt||	ddd |j|
jksttt||
ddd |j|jkstt||ddd d S )NZgesddr   )Zsvd_lapack_driverrT   ZgesvdgMbP?)atolrtol)r(   r)   r*   randr   rA   r.   r	   )r   r   rh   r   r/   r0   r   r   Zvt1r   r   Zvt2r1   r1   r2   !test_randomized_svd_lapack_driverH  s    r   c                  C   s   t dddgt ddgt ddgf} t dddgdddgdddgdddgdddgdddgdddgdddgdddgdddgdddgdddgg}t| }t|| t d}t|d d t jf t|f d S )Nr%   r&   r'   r4   r"   r5   rN   )r(   r9   r   r   r   newaxis)ZaxesZtrue_outoutrB   r1   r1   r2   test_cartesianb  s(    *

r   zarrays, output_dtyper%   r&   r'   rp   r4   rB   yc                 C   s   t | }|j|kstdS )z8Check that the cartesian product works with mixed types.N)r   ra   r.   )ZarraysZoutput_dtypeoutputr1   r1   r2   test_cartesian_mix_types  s    r   c                  C   sL   dd } t ddd}tt|| | t ddg}tt|dd	g d S )
Nc                 S   s   t t| S ro   )r(   logr   )rB   r1   r1   r2   naive_log_logistic  s    z1test_logistic_sigmoid.<locals>.naive_log_logisticr&   r   g      Yg      Y@ir   )r(   Zlinspacer   r   r9   )r   rB   Z	extreme_xr1   r1   r2   test_logistic_sigmoid  s
    r   c                   C   s   t jdS )Nrr   )r(   r)   r*   r1   r1   r1   r2   r/     s    r/   c           
      C   s   d}|  dd|| }|  |jd | }t|ddd|d\}}}tj||dd}tj|d |dd|d  }	t|| t||	 d S )Nr      r   r   sample_weightrC   r?   r&   )r   rb   rA   r   r(   averager   )
r/   ra   Zmultr0   r   meanvarr   expected_meanexpected_varr1   r1   r2   2test_incremental_weighted_mean_and_variance_simple  s    
r   r       cAg    cr   :0yE>g     j@zweight_loc, weight_scale)r   r%   )r   r   )r%   r   )r    r%   )r   r%   c                 C   s   dd }d}|j |||d d}|j | ||d}ttj||dd}	ttj||	 d |dd}
||||	|
 |j | ||d}t|d }ttj|dd}	ttj|dd}
||||	|
 d S )	Nc           
   	   S   s   | j d }d|d d |d d |d d |fD ]V}d\}}}t||D ]$}	t| |	 |||||	 d\}}}qHt|| t||dd	 q0d S )
Nr   r%   r    r4   r&   )r   r   r   r   ư>)r   )rA   r   r   r	   )
r0   r   r   r   r   
chunk_size	last_meanZlast_weight_sumZlast_varbatchr1   r1   r2   _assert  s    
*

z<test_incremental_weighted_mean_and_variance.<locals>._assert)rH   r   r   )locZscaler$   r   r&   r>   )ry   r   r(   r   r@   r   r   )r   r   Z
weight_locZweight_scaler/   r   r$   Zweightr0   r   r   Zones_weightr1   r1   r2   +test_incremental_weighted_mean_and_variance  s"    
 
  r   c              	   C   s  t ddddg}t ddddg}t jddddgt jd}t d}t d}t ddddgddddgd	d	d	d	gg| }t dt jddgt jdddgddt jd	gd	d	d	t jgg| }t|||||d
\}}	}
t|||||d
\}}}t|| t||	 t||
 d S )N     @     @r&   rp   r'   r4        r   r   )r(   r9   r   r@   rb   nanr   r	   )ra   	old_meansold_variancesZold_weight_sumZsample_weights_XZsample_weights_X_nanr0   X_nanX_meansX_variancesX_countX_nan_meansX_nan_variancesX_nan_countr1   r1   r2   6test_incremental_weighted_mean_and_variance_ignore_nan  sH    

 	    

r   c            
   
   C   s   t dddddgdddddgdddddgdddddggj} d}| d |d d f }| |d d d f }|jdd}|jdd}t j|jd	 |jd t jd
}t||||\}}}	t	|| jddd t	|| jddd t	|	| jd  d S )NiX  i  r   r   r   r&   r   r>   r%   rp   r5   )
r(   r9   rz   r   r   fullrA   r   r   r   )
r   idxZX1ZX2r   r   old_sample_countZfinal_meansZfinal_variancesZfinal_countr1   r1   r2   )test_incremental_variance_update_formulas	  s,       
r  c               	   C   s   t ddddg} t ddddg}t jddddgt jd}t ddddgddddgddddgg}t dt jddgt jdddgddt jdgdddt jgg}t|| ||\}}}t|| ||\}}	}
t|| t|	| t|
| d S )Nr   r   r&   rp   r   r   r   )r(   r9   r   r   r   r	   )r   r   r  r0   r   r   r   r   r   r   r   r1   r1   r2   -test_incremental_mean_and_variance_ignore_nan#  s4    (	   
   


r  c                  C   s   dd } dd }dd }dd }d	}d
}d}t jdt jd}t jdt jd}t j|d
 |f|t jd}	t j|d
 |f|t jd}
t |	|
f}t | |||  |kst|	dd d f t 	||d
   }}}t
|
jd D ]$}||
|d d f |||\}}}q||jd kstt |jdd|  dksBtt | ||  |ksbt|	dd d f t 	| }}t j||d
 t jd}t
|
jd D ]6}t|
|d d f d|
jd f|||\}}}qt||jd  t|jdd| |t | ||  kstd S )Nc                 S   s   | j ddS )Nr   r>   )r   )r   r1   r1   r2   np_varC  s    z=test_incremental_variance_numerical_stability.<locals>.np_varc                 S   s:   | j d }| d jdd| }| jdd| d }|| S )Nr   r&   r>   )rA   rJ   )r0   r   Zexp_x2Zexpx_2r1   r1   r2   one_pass_varH  s    
zCtest_incremental_variance_numerical_stability.<locals>.one_pass_varc                 S   s*   | j dd}|  }tj || d ddS )Nr   r>   r&   )r   rV   r(   )r0   r   Yr1   r1   r2   two_pass_varQ  s    zCtest_incremental_variance_numerical_stability.<locals>.two_pass_varc                 S   sJ   |d }|t | }| | ||  }|| | | | |  |  }|||fS )Nr%   )float)rB   r   Zlast_varianceZlast_sample_countZupdated_sample_countZsamples_ratioZupdated_meanZupdated_variancer1   r1   r2   naive_mean_variance_updateY  s    zQtest_incremental_variance_numerical_stability.<locals>.naive_mean_variance_updater   r&   i'  g    חArp   gh㈵>r   r>   r   r%   )r(   r9   re   r   r   Zvstackr   r   r.   zerosr   rA   r   r   r   r   r   r   )r  r  r  r	  r   rR   rQ   x1Zx2ZA0A1r   r   r   r   r   r1   r1   r2   -test_incremental_variance_numerical_stability?  s>    	"&"$    r  c                  C   s\  t jd} | dd}|j\}}dD ].}t d|jd |}|d |jd kr`t ||g}t|d d |dd  D ]\}}|||d d f }|dkr|jdd}	|j	dd}
|jd }t j
|jd |jd t jd	}n&t||	|
|}|\}	}
}||jd 7 }t j|d | dd}t j	|d | dd}t|	|d
 t|
|d
 t|| qzq&d S )Nr   r   r    )   r   %   r   r   r%   r>   rp   r5   )r(   r)   r*   r   rA   r   Zhstackzipr   r   r   r   r   r   r   )r/   r0   rQ   rR   Z
batch_sizeZstepsr   jr   Zincremental_meansZincremental_variancesZincremental_countZsample_countresultZcalculated_meansZcalculated_variancesr1   r1   r2   test_incremental_variance_ddof  s6    

"
    
r  c                  C   s   t jddd} t jt | dd}t| }t j|dd}t|| t | t	| j
d |f }t| ||d d t jf   d S )N$   r"   r%   r>   r   )r(   r)   r*   r   Zargmaxr   r   r   signr   rA   r   )dataZmax_abs_rowsZdata_flippedZmax_rowsZsignsr1   r1   r2   test_vector_sign_flip  s    
r  c                  C   sL   t jd} | dd}t |}t j|ddd}tt|||  d S )Nr   r'   r"   r%   r>   )r   r%   )	r(   r)   r*   r   exprJ   r   r   r   )r/   r0   Zexp_XZ	sum_exp_Xr1   r1   r2   test_softmax  s
    
r  c               	   C   s   t tdddgtdddg tjdd} tt	 t| ddd W 5 Q R X tjdj
dd	d
}t t|ddtj|dd t t|ddtj|dd t t|ddtj|dd d S )Nr%   r&   r'   r   i )r   r   r  r   )r"   r"   r"   r#   r>   )r   r   r(   Zcumsumr)   r*   r   r:   r;   RuntimeWarningr+   )rr   r1   r1   r2   test_stable_cumsum  s     r  A_array_constrZdenser   )idsB_array_constrc                 C   sX   t jd}|d}|d}t ||}| |}||}t||dd}t|| d S )Nr      r    )r    r   Tdense_outputr(   r)   r*   rI   rf   r   r	   )r  r  r/   r   Bexpectedactualr1   r1   r2   test_safe_sparse_dot_2d  s    

r(  c                  C   s   t jd} | d}| d}t ||}t|}t||}t|| | d}| d}t ||}t|}t||}t|| d S )Nr   )r&   r'   r4   r"   r5   )r5   rN   )r&   r'   )r4   r"   r'   r5   )	r(   r)   r*   rI   rf   r   r,   r   r	   )r/   r   r%  r&  r'  r1   r1   r2   test_safe_sparse_dot_nd  s    








r)  c                 C   s~   t jd}|d}|d}t ||}| |}t||}t|| |d}t ||}| |}t||}t|| d S )Nr   r    r   )r    r!  r$  )r  r/   r%  r   r&  r'  r1   r1   r2   test_safe_sparse_dot_2d_1d  s    





r*  r#  TFc                 C   sv   t jd}tjddd|d}tjddd|d}||}t||| d}t||  ks\t| rh| }t	|| d S )Nr   r!  r    r   )r   rT   r   r"  )
r(   r)   r*   r   rf   r   issparser.   Ztoarrayr
   )r#  r/   r   r%  r&  r'  r1   r1   r2   !test_safe_sparse_dot_dense_output  s    
r,  )[Znumpyr(   Zscipyr   r   Zscipy.sparse.linalgr   Zscipy.specialr   r:   Zsklearn.utilsr   Zsklearn.utils._arpackr   Zsklearn.utils._testingr   r	   r
   r   r   r   Zsklearn.utils.fixesr   r   Zsklearn.utils.extmathr   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsklearn.datasetsr   r   r3   r=   rF   rL   rn   markZparametrizer   r   r`   re   rq   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   ra   objectr   r   Zfixturer/   r   r   r   r  r  r  r  r  r  r  r,   r(  r)  r*  r,  r1   r1   r1   r2   <module>   s   N


G

)) -!(
(
&


 '
$
H  
  
  
 
