a
    ==ic(  ã                   @   s¶   d dl m  mZ d dlmZ d dlZd dl	m
Z d dlmZmZmZ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mZ d dlmZ G dd	„ d	eƒZG d
d„ deƒZdS )é    N)ÚcoreÚlayer_model_instantiatorÚregularizerÚschemaÚ	workspace)ÚLayersTestCase)ÚSgdOptimizer)ÚL1NormÚRegularizationBy)ÚRegularizerContextÚUseRegularizer)Úgivenc                   @   s*   e Zd Zeejddgdddd„ ƒZdS )ÚTestRegularizerContexté   é   )Údims©ÚXc              	      sj  t dƒ}t dƒ}||dœ}d}|  t tjdf¡¡}t ||g¡ t|ƒ t 	¡  
d¡}t 	¡  
d¡}tdƒ}	||ks‚J d	ƒ‚||ks’J d
ƒ‚| jj|||	|	||d}
t d|
f¡| j_|  t tj|ff¡|
¡ t | j¡\}}| ¡ j‰ ‡ fdd„ttˆ ƒƒD ƒ}| d¡dksJ ‚| d¡dks2J ‚| d¡dksFJ ‚W d   ƒ n1 s\0    Y  d S )Ngš™™™™™É?r   )ÚWEIGHTÚBIASr   )r   r   r   g333333Ã?z+fail to get correct weight reg from contextz)fail to get correct bias reg from context)Zweight_optimZ
bias_optimÚ
weight_regÚbias_regÚ	fc_outputc                    s   g | ]}ˆ | j ‘qS © )Útype)Ú.0Úi©Úopsr   úo/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/regularizer_test.pyÚ
<listcomp>2   ó    zCTestRegularizerContext.test_regularizer_context.<locals>.<listcomp>ZLpNormZScaleé   ZLpNormGradient)r	   Z
new_recordr   ZScalarÚnpÚfloat32Z
FeedRecordr   r   ÚcurrentZget_regularizerr   ÚmodelÚFCÚStructZoutput_schemaÚassertEqualr   Zgenerate_training_netsZProtoÚopÚrangeÚlenÚcount)Úselfr   Zweight_reg_outZbias_reg_outZregularizersZoutput_dimsZinput_recordr   r   Zoptimr   Ú_Ú	train_netZops_type_listr   r   r   Útest_regularizer_context   s>    
ÿþú	
z/TestRegularizerContext.test_regularizer_contextN)Ú__name__Ú
__module__Ú__qualname__r   ÚhuÚarraysr1   r   r   r   r   r      s   r   c                   @   sZ  e Zd Zeejddgejddddddd	„ ƒZef ejddgejdddde 	¡ e 	¡ ejd
ddejdddejddddœej
¤Ždd„ ƒZee dd¡e dd¡e dd¡ddd„ ƒZee dd¡e dd¡e dd¡ddd„ ƒZee dd¡e dd¡e dd¡e dd¡ddd„ ƒZee dd¡ejddde ¡ dd d!„ ƒZd"S )#ÚTestRegularizerr   r   g      ð¿ç      ð?)Ú	min_valueÚ	max_value)r   Úelementsr   c           
      C   s¤   t  d¡}t ||¡ |  ¡ \}}t d¡}||||tjd}||||d tj	d t 
|¡ t 
|¡ dd„ }tt ||g¡||ƒƒD ]\}}	tj||	dd q†d S )	Nr   r8   ©Úby©Úgradr=   c                 S   s<   t  t  t  t  | dd ¡¡ ¡d ¡ t j¡t  | dd ¡fS )Ng•Ö&è.>g      à?)r#   ÚarrayÚsumÚlogÚclipÚastyper$   r   r   r   r   ÚrefJ   s
    &ÿüz-TestRegularizer.test_log_barrier.<locals>.refgü©ñÒMbP?)Zrtol)r   ÚBlobReferencer   ÚFeedBlobÚget_training_netsr   Z
LogBarrierr
   ÚON_LOSSÚAFTER_OPTIMIZERÚ
RunNetOnceÚzipZ
FetchBlobsÚnptÚassert_allclose)
r.   r   ÚparamÚtrain_init_netr0   ÚregÚoutputrE   ÚxÚyr   r   r   Útest_log_barrier9   s"    

û

 z TestRegularizer.test_log_barriergíµ ÷Æ°>g-Cëâ6?)r   Ú	left_openÚ
right_openÚepsÚubÚlbc	                    sÒ   ˆˆr
ˆ nd ˆˆrˆ nd k r$d S t  d¡}	t |	|¡ |  ¡ \}
}tjˆˆˆˆˆ d}|||
|	tjd}|||
|	d tj	d t 
|
¡ t 
|¡ ‡ ‡‡‡‡fdd„}|d u s´J ‚tjtj|	 ||ƒdd	 d S )
Nç        r   )rZ   rY   rV   rW   Úepsilonr<   r>   c                    s&   t  | ˆˆrˆ nd ˆˆrˆ nd ¡S )Nr[   )r#   rC   r   ©rX   rZ   rV   rW   rY   r   r   rE   r   s    ÿz3TestRegularizer.test_bounded_grad_proj.<locals>.refgH¯¼šò×z>)Zatol)r   rF   r   rG   rH   r   ZBoundedGradientProjectionr
   rI   rJ   rK   rM   rN   Úblobs)r.   r   rV   rW   rX   rY   rZ   ÚgcZdcrO   rP   r0   rQ   rR   rE   r   r]   r   Útest_bounded_grad_projU   s*    
 

ÿû

z&TestRegularizer.test_bounded_grad_projé   é
   é   é   r   )Ú
output_dimÚ	input_numÚ
reg_weightc              
   C   sì   dd„ }t j ||¡ t j¡}t jjd|d d}dg}t  |t  t jjt	d|d ƒ|dd¡¡}t  ||g¡}t  
|¡}t d¡}	t |	|¡ |  ¡ \}
}t |d	 | ¡ ¡}|||
|	tjd
}t |
¡ t |¡ ||||d	 |ƒ dS )zý
        1. create a weight blob
        2. create random group splits
        3. run group_l1_nrom with the weight blob
        4. run equivalent np operations to calculate group l1 norm
        5. compare if the results from 3 and 4 are equal
        c                 S   sp   t  | |dd… ¡}t  dd„ |D ƒ¡}t  |t  dd„ |D ƒ¡¡}t  t  |¡|¡}tj|tj	| dd d S )Nra   éÿÿÿÿc                 S   s   g | ]}t  t  |¡¡‘qS r   )r#   rA   Úsquare©r   Úgr   r   r   r    ‰   r!   zQTestRegularizer.test_group_l1_norm.<locals>.compare_reference.<locals>.<listcomp>c                 S   s   g | ]}t  |jd  ¡‘qS )ra   )r#   ÚsqrtÚshaperj   r   r   r   r    ‹   r!   r   ©Údecimal)
r#   Zhsplitrl   Úmultiplyr@   rA   rM   Úassert_almost_equalr   r^   )ÚweightÚgroup_boundariesZ
reg_lambdarR   Zgroup_splitsZl2_regZl2_normalizedÚresultr   r   r   Úcompare_reference‡   s    ÿz=TestRegularizer.test_group_l1_norm.<locals>.compare_referencera   )ÚlowÚhighr   F)ÚreplaceÚweight_blobçš™™™™™¹?r<   N)r#   ÚrandomÚrandrD   r$   ÚrandintÚappendÚsortÚchoicer+   Údiffr   rF   r   rG   rH   r   ZGroupL1NormÚtolistr
   rI   rK   )r.   re   rf   rg   ru   rr   Zfeature_numrs   Z
split_infory   rP   r0   rQ   rR   r   r   r   Útest_group_l1_normz   s,    ÿþ


ÿ

z"TestRegularizer.test_group_l1_normé	   )Ú	param_dimÚkrg   c                 C   s°   t j |¡ t j¡}t d¡}t ||¡ |  	¡ \}}t
 |d |¡}||||tjd}	t |¡ t |¡ t  t  t  |¡¡d || … ¡| d }
tj|
tj|	 dd d S ©Nry   rz   r<   r   rn   )r#   r{   r|   rD   r$   r   rF   r   rG   rH   r   ZL1NormTrimmedr
   rI   rK   rA   r   ÚabsoluterM   rq   r^   )r.   r…   r†   rg   rr   ry   rP   r0   rQ   rR   rt   r   r   r   Útest_l1_norm_trimmed©   s    

ÿ

*z$TestRegularizer.test_l1_norm_trimmed)r…   r†   Úl1Úl2c                 C   sÖ   t j |¡ t j¡}t d¡}t ||¡ |  	¡ \}}t
 |d |d |¡}	|	|||tjd}
t |¡ t |¡ t  t  t  |¡¡d || … ¡}t  t  |¡¡}|| d || d  }tj|tj|
 dd d S r‡   )r#   r{   r|   rD   r$   r   rF   r   rG   rH   r   ZElasticNetL1NormTrimmedr
   rI   rK   rA   r   rˆ   ri   rM   rq   r^   )r.   r…   r†   rŠ   r‹   rr   ry   rP   r0   rQ   rR   Zl1_normZl2_normrt   r   r   r   Útest_elastic_l1_norm_trimmed¾   s    

ÿ

"z,TestRegularizer.test_elastic_l1_norm_trimmedg      @)Úrow_dimÚnormÚdata_strategyc                 C   sb  t j |d¡ t j¡}t j |d¡ t j¡}| tjt jddt	 
t  |jd ¡¡d¡}t  |¡}| ¡ }d}t  t j||f d ddd¡}	t  |	d|¡}
||f  |
||	  9  < t d	¡}t ||¡ t d
¡}t ||¡ t d¡}t ||¡ tj||d}|  ¡ \}}tj|dd}|||||tjd t |¡ t |¡ tj|t d	¡dd d S )Nr   ra   r   )ÚdtypeZmin_dimZmax_dimr;   gê-™—q=r   T)ZaxisZkeepdimsry   Ú	grad_blobÚindices)r’   ÚvaluesZfp16)r   r<   rn   ) r#   r{   r|   rD   Úfloat16Zdrawr5   ZtensorÚint64ÚstZsampled_fromZarangerm   ÚuniqueÚcopyrl   rA   rC   r   rF   r   rG   ZGradientSlicerH   r   ZMaxNormr
   rJ   rK   rM   rq   Z	FetchBlob)r.   r   rŽ   r   rr   r?   r’   rt   rX   ZnormsZdesiredry   r‘   Zindices_blobZgrad_blob_slicerP   r0   rQ   r   r   r   Útest_fp16_max_normÖ   s>    üÿ
 


ÿ

z"TestRegularizer.test_fp16_max_normN)r2   r3   r4   r   r5   r6   ZfloatsrU   r–   ZbooleansZgcs_cpu_onlyr`   Zintegersrƒ   r‰   rŒ   Údatar™   r   r   r   r   r7   8   sL    
úù	



ý
*


ý




ü

ýr7   ) Z"caffe2.python.hypothesis_test_utilÚpythonZhypothesis_test_utilr5   Zhypothesis.strategiesÚ
strategiesr–   Únumpyr#   Znumpy.testingÚtestingrM   Zcaffe2.pythonr   r   r   r   r   Zcaffe2.python.layer_test_utilr   Zcaffe2.python.optimizerr   Zcaffe2.python.regularizerr	   r
   Z!caffe2.python.regularizer_contextr   r   Z
hypothesisr   r   r7   r   r   r   r   Ú<module>   s   )