a
    ;Za                     @   sd  d dl 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 d dlmZ d dl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' d dl(m)Z)m*Z* d dl+m,Z,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl3m7Z7 e78 Z9ej:;d Z<e<=e9j>j?Z@e9jAe@ e9_Ae9j>e@ e9_>dZBdd ZCdd ZDdd ZEdd  ZFd!d" ZGd#d$ ZHd%d& ZId'd( ZJd)d* ZKd+d, ZLd-d. ZMd/d0 ZNd1d2 ZOd3d4 ZPd5d6 ZQd7d8 ZRd9d: ZSd;d< ZTd=d> ZUeeVd?d@dA ZWeeVd?dBdC ZXdDdE ZYdFdG ZZdHdI Z[dJdK Z\dLdM Z]dNdO Z^dPdQ Z_dRdS Z`dTdU ZadVdW ZbdXdY ZcdZd[ Zdd\d] Zed^d_ Zfd`da Zgdbdc Zhddde Zidfdg Zjdhdi ZkeeVd?djdk Zlejmndleegdmdn Zoejmndleegdodp Zpejmndleegdqdr Zqejmndleegdsdt ZrdS )u    N)escape)assert_array_equal)assert_almost_equal)ignore_warnings)CheckingClassifier)OneVsRestClassifier)OneVsOneClassifier)OutputCodeClassifier)check_classification_targetstype_of_target)check_arrayshuffle)precision_score)recall_score)	LinearSVCSVC)MultinomialNB)LinearRegressionLasso
ElasticNetRidge
PerceptronLogisticRegressionSGDClassifier)DecisionTreeClassifierDecisionTreeRegressor)GridSearchCVcross_val_score)Pipelinemake_pipeline)SimpleImputer)svm)NotFittedError)datasets   c                  C   s$  t tdd} tt | g  W d    n1 s80    Y  d}tjt|dN tddgddgg}tddgddgg}t t	 
|| W d    n1 s0    Y  tjt|dN tddgddgg}tdd	gd
dgg}t t	 
|| W d    n1 s0    Y  d S )Nr   random_statez@Multioutput target data is not supported with label binarizationmatch      r$   g      ?g333333@g@皙?)r   r   pytestraisesr"   predict
ValueErrornparrayr   fit)ovrmsgXy r7   <lib/python3.9/site-packages/sklearn/tests/test_multiclass.pytest_ovr_exceptions2   s    (0r9   c                  C   sP   t g d} t| }tjt|d t|  W d    n1 sB0    Y  d S )N)        g?       @g      @r'   )r0   r1   r   r,   r-   r/   r
   )r6   r4   r7   r7   r8   !test_check_classification_targetsF   s    r<   c                  C   s   t tdd} | tjtjtj}t| jt	ks8J tdd}|tjtjtj}t
tj|kt
tj|kks~J t t } | tjtjtj}t
tj|kdksJ d S )Nr   r%   ?)r   r   r2   irisdatatargetr.   lenestimators_	n_classesr0   meanr   )r3   predclfpred2r7   r7   r8   test_ovr_fit_predictN   s    
$
rH   c                  C   s  t tjtjdd\} }tt }|| d d |d d t| || dd  |dd   |	| }tt }|
| |	| }t|| t|jtt|ksJ t||kdksJ ttjdd} g d}ttdd d	dd
}|| d d |d d t| || dd  |dd   |	| }ttdd d	dd
}|
| |	| }t||kt||kksJ tt }t|drJ d S )Nr   r%   d   r=      r*   r)   r)   r)   r)   r*   r$   r$   r   r   r*   r$   r)   r*   r$   r)   F)max_itertolr   r&      partial_fit)r   r>   r?   r@   r   r   rO   r0   uniquer.   r2   r   rA   rB   rD   absrandomrandnr   r   hasattr)r5   r6   r3   rE   Zovr2rG   Zovr1pred1r7   r7   r8   test_ovr_partial_fit^   s2    
$


$
"
rV   c                  C   s   t t } ttjdd}g d}| |d d |d d t| dg|dd  }d}tj	t
|d& | j|dd  |d	 W d    n1 s0    Y  d S )
NrJ   r*   rK   rN      zAMini-batch contains \[.+\] while classes must be subset of \[.+\]r'   )r5   r6   )r   r   r0   rQ   rR   rS   rO   rP   r,   r-   r/   )r3   r5   r6   Zy1r4   r7   r7   r8   test_ovr_partial_fit_exceptions   s    
$rY   c                  C   s   t t } | tjtjtj}t| jt	ks4J t
t|g d t|tjkdks`J tt } | tjtjtj}t| jt	t	d  d ksJ t
t|g d t|tjkdksJ d S )N)r   r)   r*   ?r)   r*   )r   r   r2   r>   r?   r@   r.   rA   rB   rC   r   r0   rP   rD   r   )r3   rE   r7   r7   r8   test_ovr_ovo_regressor   s    

r[   c               
   C   s2  t jt jt jt jt jfD ]} tdd}tjddddddd	d
\}}|d d |d d  }}|dd  }t	|
||}||}t	|
|| |}	|	|}
|jsJ t |
sJ t|
 | |	|}|dk}t||
  t }t	|
|| |}	|	|d	kt}t||	|  qd S )Nr)   ZalpharI      rW   r$   2   Tr   	n_samples
n_featuresrC   Zn_labelsZlengthZallow_unlabeledr&   P         ?)sp
csr_matrix
csc_matrixZ
coo_matrixZ
dok_matrixZ
lil_matrixr   r#   make_multilabel_classificationr   r2   r.   multilabel_issparser   Ztoarraypredict_probar!   r   decision_functionastypeint)sparsebase_clfr5   YX_trainY_trainX_testrF   Y_predZclf_sprsZY_pred_sprsY_probarE   Zdec_predr7   r7   r8   test_ovr_fit_predict_sparse   s@    







rv   c                  C   s  t d} d| d dd d f< t d}d|dd df< d|d d df< d|d d df< tt }d}tjt|d || | W d    n1 s0    Y  |	| }t
t |t | || }t |d d d	d f dksJ || }t
|d d d
f t | jd  t d}d|dd df< tt }d}tjt|d || | W d    n1 sr0    Y  || }t
|d d d
f t | jd  d S )N)
   r*   r   rW   )rw   r$   r)   r*   z,Label .+ is present in all training examplesr'   rX   z/Label not 1 is present in all training examples)r0   Zoneszerosr   r   r,   warnsUserWarningr2   r.   r   r1   rk   rP   rj   shape)r5   r6   r3   r4   y_predr7   r7   r8   test_ovr_always_present   s0    


*

"
"

,
r~   c                  C   s  t g dg dg dg dg dg} g d}t g dg dg d	g dg d	g}td
 }t tddt t t fD ]~}t	|
| |}t|j|ksJ |t g dgd }t|dg t	|
| |}|g dgd }t|g d qd S )Nr   r   rW   r   rW   r   r$   r   r   r   r      r   r   r   )eggsspamhamr   r   )r   r   r)   r   r)   r   r)   r   r   zham eggs spamr   r%   r   r      r   )r0   r1   setsplitr   r   r   r   r   r   r2   classes_r.   r   )r5   r6   rp   classesro   rF   r}   r7   r7   r8   test_ovr_multiclass   s"    ((r   c                     s   t g dg dg dg dg dg g dt g dgjtd d fd
d	} tddt t t fD ]}| | qzt	 t
ddt fD ]}| |dd qd S )Nr   r   r   r   r   )r   r   r   r   r   )r   r)   r)   r   r)   z	eggs spamFc                    s   t |  }t|jks"J |tg dgd }t|dg t| drj|	 }|j
dksjJ |rtg dg}||}dt|d ksJ |jtj|dd ||ksJ t |  }|g d	gd }|dksJ d S )
Nr   r   r   rk   )rW   r*   r)   Zaxisr   )r   r2   r   r   r.   r0   r1   r   rT   rk   r|   rj   rA   argmax)ro   test_predict_probarF   r}   Zdecrs   Zprobabilitiesr5   rp   r   r6   r7   r8   conduct_test  s    


"z%test_ovr_binary.<locals>.conduct_testr   r%   Tprobability)r   )F)r0   r1   Tr   r   r   r   r   r   r   r   r   )r   ro   r7   r   r8   test_ovr_binary  s    (
r   c                  C   s   t g dg dg dg dg dg} t g dg dg dg d	g d
g}t tddt t t tddfD ]@}t|	| |}|
g dgd }t|g d |jstJ qtd S )N)r   r   rW   r   )r$   r$   r$   )r   r   r   r   )r   r)   r)   r   )r)   r)   r)   )r)   r   r)   r   r   r%   rc   r\   )r   r   r   )r0   r1   r   r   r   r   r   r   r   r2   r.   r   rh   )r5   r6   ro   rF   r}   r7   r7   r8   test_ovr_multilabel7  s    ((r   c                  C   sJ   t t } | tjtj t| jdks.J | 	tjtjdksFJ d S )Nr$   rZ   )
r   r!   r   r2   r>   r?   r@   rA   rB   score)r3   r7   r7   r8   test_ovr_fit_predict_svcJ  s    r   c               
   C   s   t dd} tdddD ]\}}}tjdddd	d
|dd\}}|d d |d d  }}|dd  |dd   }}	t| ||}
|
|}|
jsJ tt	|	|dd|d	d tt
|	|dd|d	d qd S )Nr)   r\   )TF)RQ?gQ?)r   r+   rI   r]   rW   r*   r^   r   r_   rb   micro)Zaverage)Zdecimal)r   zipr#   rg   r   r2   r.   rh   r   r   r   )ro   auZprecZrecallr5   rp   rq   rr   rs   ZY_testrF   rt   r7   r7   r8   test_ovr_multilabel_datasetQ  s,    

	

r   c               
   C   sH  t dd} dD ]2}tjddddd|d	d
\}}|d d |d d  }}|dd  }t| ||}tt ||}t|drJ ttjdd}t|drJ ||| t|drJ t|dsJ t	tjddddgid}	t|	}
t|
dr J |
|| t|
dsJ |
|}||}|dk}t|| qd S )Nr)   r\   )FTrI   r]   rW   r$   r^   r   r_   rb   rj   Fr   rk   r   T)Z
param_gridrc   )r   r#   rg   r   r2   r!   SVRrT   r   r   r.   rj   r   )ro   r   r5   rp   rq   rr   rs   rF   decision_onlyZgsZproba_after_fitrt   ru   rE   r7   r7   r8   !test_ovr_multilabel_predict_probak  s@    


	

r   c                  C   s   t dd} tjtj }}|d d |d d  }}|dd  }t| ||}tt ||}t|drpJ |	|}|
|}	t|	jddd |	jdd}
|
|  rJ d S )Nr)   r\   rb   rj   r         ?)r   r>   r?   r@   r   r2   r!   r   rT   r.   rj   r   sumr   any)ro   r5   rp   rq   rr   rs   rF   r   rt   ru   rE   r7   r7   r8   #test_ovr_single_label_predict_proba  s    


r   c               	   C   sz   t jdddddddd\} }| d d	 |d d	  }}| d	d  }tt ||}t||dkt	|
| d S )
NrI   r]   rW   r$   r^   Tr   r_   rb   )r#   rg   r   r!   r   r2   r   rk   rl   rm   r.   r5   rp   rq   rr   rs   rF   r7   r7   r8   %test_ovr_multilabel_decision_function  s    
	r   c                  C   sp   t jdddd\} }| d d |d d  }}| dd  }tt ||}t|| dk|	| d S )NrI   r]   r   )r`   ra   r&   rb   )
r#   Zmake_classificationr   r!   r   r2   r   rk   Zravelr.   r   r7   r7   r8   'test_ovr_single_label_decision_function  s
    r   c                  C   sR   t tdd} g d}t| d|i}|tjtj |jjd j	}||v sNJ d S Nr   r%   )皙?rc   r+   Zestimator__C)
r   r   r   r2   r>   r?   r@   best_estimator_rB   C)r3   Cscvbest_Cr7   r7   r8   test_ovr_gridsearch  s    r   c                  C   s`   t dt fg} t| }|tjtj tt }|tjtj t|tj|tj d S )NZtree)	r   r   r   r2   r>   r?   r@   r   r.   )rF   Zovr_piper3   r7   r7   r8   test_ovr_pipeline  s    
r   )categoryc                  C   s   t dddtddfD ]} t| }tjttjfD ]d}||tj |j	j
}|d tks^J |d tjj
d ksvJ t|jd j	t|j	ks4J q4qd S )Nlinearr   )kernelr&   r%   r)   )r   r   r   r>   r?   rd   re   r2   r@   coef_r|   rC   ri   rB   )Zbase_classifierr3   r5   r|   r7   r7   r8   test_ovr_coef_  s    
r   c                  C   s   t tdd} tt | j W d    n1 s40    Y  t t } | tj	tj
 d}tjt|d | j W d    n1 s0    Y  d S )Nr   r%   z-Base estimator doesn't have a coef_ attributer'   )r   r   r,   r-   r"   r   r   r2   r>   r?   r@   AttributeError)r3   r4   r7   r7   r8   test_ovr_coef_exceptions  s    $
r   c               	   C   sn   t tdd} | tjtj} d}dD ]B}tjt|	|d t
| | W d    q&1 s^0    Y  q&d S )Nr   r   zAttribute `{0}` was deprecated in version 0.24 and will be removed in 1.1 \(renaming of 0.26\). If you observe this warning while using RFE or SelectFromModel, use the importance_getter parameter instead.)r   Z
intercept_r'   )r   r   r2   r>   r?   r@   r,   rz   FutureWarningformatgetattr)r3   r4   Zattr7   r7   r8   "test_ovr_deprecated_coef_intercept  s    r   c                  C   sF   t tdd} tt | g  W d    n1 s80    Y  d S Nr   r%   )r   r   r,   r-   r"   r.   ovor7   r7   r8   test_ovo_exceptions  s    r   c                  C   s\   t tdd} | tjtjtj}dd tjD }| |ttj|}t|| d S )Nr   r%   c                 S   s   g | ]}t |qS r7   )list).0ar7   r7   r8   
<listcomp>       z(test_ovo_fit_on_list.<locals>.<listcomp>)	r   r   r2   r>   r?   r@   r.   r   r   )r   Zprediction_from_arrayZiris_data_listZprediction_from_listr7   r7   r8   test_ovo_fit_on_list  s    r   c                  C   s   t tdd} | tjtjtj t| jt	t	d  d ksDJ t t
 } | tjtjtj t| jt	t	d  d ksJ d S )Nr   r%   r)   r*   )r   r   r2   r>   r?   r@   r.   rA   rB   rC   r   r   r7   r7   r8   test_ovo_fit_predict'  s    
r   c                  C   s  t  } | j| j }}tt }||d d |d d t| ||dd  |dd   |	|}tt }|
|| |	|}t|jttd  d ksJ t||kdksJ t|| tt }||d d |d d t| ||dd  |dd   |	|}tt }|
||	|}t|| t|jtt|ks`J t||kdksxJ tt }tjdd}g d}||d d |d d g d	 ||dd  |dd   |	|}tt }|
||	|}t|| tt }g d
}	tdt|	t|}
tjt|
d, ||d d |	t| W d    n1 sv0    Y  tt }t|drJ d S )NrI   r)   r*   r=   <   rJ   )r)   r)   r*   r$   r$   r   r   r   r   r   r   r   r*   r*   rN   )r   r)   r*   r$   r   )r   r)   r*   r$   r   rW   r*   z6Mini-batch contains {0} while it must be subset of {1}r'   rO   )r#   	load_irisr?   r@   r   r   rO   r0   rP   r.   r2   rA   rB   rC   rD   r   rR   Zrandr   r   r,   r-   r/   r   rT   )Ztempr5   r6   Zovo1rU   Zovo2rG   r   rE   Zerror_yZ
message_rer3   r7   r7   r8   test_ovo_partial_fit_predict3  sR    
$




$



"



<
r   c            	      C   s  t jjd } ttdd}|t jt jdk |t j}|j| fksJJ |t jt j |t j}|j| tfksxJ t	|j
dd|t j t| tf}d}ttD ]b}t|d tD ]N}|j| t j}||dk|f  d7  < ||dk|f  d7  < |d7 }qqt	|t| ttD ]R}t|d d |f tg dsTJ tt|d d |f dks(J q(d S )Nr   r%   r)   r   )r:   r   r;      )r>   r?   r|   r   r   r2   r@   rk   rC   r   r   r.   r0   ry   rangerB   roundr   issubsetrA   rP   )	r`   Zovo_clfZ	decisionsvoteskijrE   Z	class_idxr7   r7   r8   test_ovo_decision_functionh  s*    (r   c                  C   sR   t tdd} g d}t| d|i}|tjtj |jjd j	}||v sNJ d S r   )
r   r   r   r2   r>   r?   r@   r   rB   r   )r   r   r   r   r7   r7   r8   test_ovo_gridsearch  s    r   c                  C   s   t ddgddgddgddgg} t g d}ttddd d}|| || }|| }t |}|| }t|d	d d f d tt j	|dd  dd
|dd   |d	 |d	 	 ksJ d S )Nr)   r*   rx   rX   r*   r   r)   r*   Fr   r   rL   rM   r   r   )
r0   r1   r   r   r2   r.   rk   r   r   r   )r5   r6   	multi_clfovo_predictionZovo_decisionr   Znormalized_confidencesr7   r7   r8   test_ovo_ties  s    "

$r   c                  C   s   t ddgddgddgddgg} t g d}tdD ]H}|| d }ttddd d	}|| || }|d
 |d ks8J q8d S )Nr)   r*   rx   rX   r   r$   Fr   r   r   )r0   r1   r   r   r   r2   r.   )r5   Zy_refr   r6   r   r   r7   r7   r8   test_ovo_ties2  s    "r   c                  C   sB   t d} t g d}tt }|| | t|||  d S )Nr   )r   bcd)r0   eyer1   r   r   r2   r   r.   )r5   r6   r   r7   r7   r8   test_ovo_string_y  s
    

r   c                  C   sf   t d} t dgd }tt }d}tjt|d || | W d    n1 sX0    Y  d S )Nr   r   zwhen only one classr'   )	r0   r   r1   r   r   r,   r-   r/   r2   r5   r6   r   r4   r7   r7   r8   test_ovo_one_class  s    

r   c                  C   sd   t j} t jd d df }tt }d}tjt|d || | W d    n1 sV0    Y  d S )Nr   Unknown label typer'   )r>   r?   r   r   r,   r-   r/   r2   r   r7   r7   r8   test_ovo_float_y  s    
r   c                  C   sF   t tdd} tt | g  W d    n1 s80    Y  d S r   )r	   r   r,   r-   r"   r.   ecocr7   r7   r8   test_ecoc_exceptions  s    r   c                  C   s   t tddddd} | tjtjtj t| jt	d ksBJ t t
 ddd} | tjtjtj t| jt	d ksJ d S )Nr   r%   r*   )	code_sizer&   )r	   r   r2   r>   r?   r@   r.   rA   rB   rC   r   r   r7   r7   r8   test_ecoc_fit_predict  s    r   c                  C   sV   t tdddd} g d}t| d|i}|tjtj |jjd j	}||v sRJ d S r   )
r	   r   r   r2   r>   r?   r@   r   rB   r   )r   r   r   r   r7   r7   r8   test_ecoc_gridsearch  s    r   c                  C   s   t j} t jd d df }tt }d}tjt|d || | W d    n1 sV0    Y  tt dd}d}tjt|d || | W d    n1 s0    Y  d S )Nr   r   r'   rX   )r   z*code_size should be greater than 0, got -1)r>   r?   r	   r   r,   r-   r/   r2   r   r7   r7   r8   test_ecoc_float_y   s    
*r   c                  C   s   t jt j } }t| }ttdddd}t|dd}tj	t
dd ||| W d    n1 sf0    Y  || | tj	t
dd || W d    n1 s0    Y  ttdd}|||| t|jd	ksJ d S )
NTF)Z	ensure_2dZaccept_sparse)Zcheck_XZcheck_X_paramsr   r%   zA sparse matrix was passedr'   r   )r>   r?   r@   rd   rf   r   r   r	   r,   r-   	TypeErrorr2   r.   r   rA   rB   )r5   r6   ZX_spZbase_estimatorr   r7   r7   r8   (test_ecoc_delegate_sparse_base_estimator  s    
*(r   c                  C   s~   t jdd} tjtj }}t| }t||j}|	|| t
|j}|j}|D ](}|jd | |d  |jd ksPJ qPd S )Nprecomputedr   r   r)   )r!   r   r>   r?   r@   r   r0   dotr   r2   rA   rB   Zpairwise_indices_r|   )clf_precomputedr5   r6   	ovr_falselinear_kernelZn_estimatorsZprecomputed_indicesidxr7   r7   r8   test_pairwise_indices*  s    
r   c            
      C   s   t jt j } }|d dksJ | dd } |dd }| jdksDJ tjdd| |}|jdksfJ t|| |}|jdksJ |j	D ]}|jdksJ qt
|| |}|jdksJ |jdksJ t|j	dksJ |j	D ]}|jdksJ q| | j }|jd	ksJ tjd
d||}|jdks4J t|||}|jdksTJ |jdksdJ t|j	dksxJ |j	D ]}|jdks~J q~t
|||}	|	jdksJ |jdksJ t|j	dksJ |	j	d jdksJ |	j	d jdksJ |	j	d jdksJ dS )a  Check the n_features_in_ attributes of the meta and base estimators

    When the training data is a regular design matrix, everything is intuitive.
    However, when the training data is a precomputed kernel matrix, the
    multiclass strategy can resample the kernel matrix of the underlying base
    estimator both row-wise and column-wise and this has a non-trivial impact
    on the expected value for the n_features_in_ of both the meta and the base
    estimators.
    rX   r   N)   r   r   r   r   r$   )r   r   r   r   c   r)   r*   rI   )r>   r?   r@   r|   r!   r   r2   Zn_features_in_r   rB   r   Z
n_classes_rA   r   )
r5   r6   clf_notprecomputedZovr_notprecomputedZestZovo_notprecomputedKr   Zovr_precomputedZovo_precomputedr7   r7   r8   test_pairwise_n_features_in;  sD    




r   c                  C   sJ   t jdd} t  }ttfD ](}||}|jr2J || }|jsJ qd S )Nr   r   )r!   r   r   r   	_pairwise)r   r   MultiClassClassifierr   ovr_truer7   r7   r8   test_pairwise_attribute  s    
r   r   c                 C   sH   t jdd}t  }| |}| d r,J | |}| d sDJ d S )Nr   r   Zpairwise)r!   r   Z	_get_tags)r   r   r   r   r   r7   r7   r8   test_pairwise_tag  s    r  c                 C   sP   t jdd}| |}d}tjt|d |j W d    n1 sB0    Y  d S )Nr   r   z5Attribute `_pairwise` was deprecated in version 0\.24r'   )r!   r   r,   rz   r   r   )r   r   Zov_clfr4   r7   r7   r8   test_pairwise_deprecated  s
    r  c           
      C   sr   t jdd}t jdd}tjtj }}| |}| |}t||j}t|||dd}t|||dd}	t	|	| d S )Nr   r   r   raise)Zerror_score)
r!   r   r>   r?   r@   r0   r   r   r   r   )
r   r   r   r5   r6   Zmulticlass_clf_notprecomputedZmulticlass_clf_precomputedr   Zscore_not_precomputedZscore_precomputedr7   r7   r8   test_pairwise_cross_val_score  s    r  c                 C   s|   t jd}tjtj }}t |}|jddg|jddgd	t
}t j||< tt t|d}| ||||| d S )N*   r)   r   r   rZ   )pr%   )r0   rR   RandomStater>   r?   r@   copyZchoicer|   rl   boolnanr   r    r   r2   r   )r   rngr5   r6   maskZlrr7   r7   r8   test_support_missing_values  s    	
 
r  )sZnumpyr0   Zscipy.sparsern   rd   r,   rer   Zsklearn.utils._testingr   r   r   Zsklearn.utils._mockingr   Zsklearn.multiclassr   r   r	   Zsklearn.utils.multiclassr
   r   Zsklearn.utilsr   r   Zsklearn.metricsr   r   Zsklearn.svmr   r   Zsklearn.naive_bayesr   Zsklearn.linear_modelr   r   r   r   r   r   r   Zsklearn.treer   r   Zsklearn.model_selectionr   r   Zsklearn.pipeliner   r   Zsklearn.imputer    Zsklearnr!   Zsklearn.exceptionsr"   r#   r   r>   rR   r  r  Zpermutationr@   sizeZpermr?   rC   r9   r<   rH   rV   rY   r[   rv   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZmarkZparametrizer  r  r  r  r7   r7   r7   r8   <module>   s   $	$0$(-	

5/	
	E



