
    iCP                         S SK r S SKrS SKrS SKJrJr  S SKJrJrJ	r	J
r
JrJr  S SKrS SKJr  S SKJrJrJrJrJrJrJrJrJrJr  S SKJr  S SKJr  S SKJ r    " S	 S
5      r!g)    N)CounterOrderedDict)AnyCallableDictListOptionalTuple)ErrorStatistics)
Export	PartitionQuantize	RunPasses	SerializeStage	StageTypeToEdgeToEdgeTransformAndLowerToExecutorch)get_memory_format)ExportedProgram)	FileCheckc                      \ rS rSrSr   S9S\R                  R                  S\\R                     S\
\\4   S-  S\\\      S\4
S	 jjr\S
\
\\4   4S j5       rS\S
\4S jrS rS rS rS:S jrS:S\\   4S jjrS:S\\   4S jjrS:S\\   4S jjr  S;S\\   S\4S jjr S:S\\!   4S jjr"S:S\\#   4S jjr$S:S\\%   4S  jjr&S:S!\\'   4S" jjr(S<S#\\)   S$\\)   4S% jjr*S:S$\\   4S& jjr+S'\,\)   4S( jr-S'\,\)   4S) jr.S'\
\\/4   4S* jr0S'\
\\/4   4S+ jr1 S=S,\S$\\   4S- jjr2         S>S$\\   S.\\\R                        S/\\3/S4   S-  S0\\)   S1\\)   4
S2 jjr4\S0\)S1\)S.\\R                     4S3 j5       r5\   S?S/\\3/S4   S-  4S4 jj5       r6\     S@S/\\3/S4   S-  4S5 jj5       r7\S6\8S
\\R                  \\9   4   4S7 j5       r:S8r;g)ATester!   z
Base class for a backend tester. This class is not intended to be used directly. Instead,
backends are expected to subclass it and provide implementations for backend-dependent
stages.
Nmoduleexample_inputsstage_classesdynamic_shapestrainingc                    U(       a  UR                  5         OUR                  5         U=(       d    [        R                  5       U l        Xl        X l        X@l        [        R                  " [        [        5      5      U l        [        R                  [        R                  /[        R                  [        R                  [        R                   [        R"                  /[        R"                  [        R                  [        R$                  /[        R                   [        R&                  [        R                  /[        R                  [        R&                  [        R"                  [        R$                  /[        R&                  [        R$                  /[        R$                  [        R(                  /[        R(                  / 0U l        S U l        S U l        S U l        S U l        g N)trainevalr   default_stage_classesr   original_moduler   r   r   fromkeyslistr   stagesQUANTIZEEXPORT
RUN_PASSESTO_EDGETO_EDGE_TRANSFORM_AND_LOWERTO_EXECUTORCH	PARTITION	SERIALIZEpipelinecurreference_outputquantization_scalestage_output)selfr   r   r   r   r    s         f/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/backends/test/harness/tester.py__init__Tester.__init__(   sh    LLNKKM*Lf.J.J.L%,,.9.B.B4	?.S!1!1 2$$!!55
 11$$''4 ##$$    ##55''# )"9"9!:##i&9&9%:/
6 )- !% 48 !    returnc                  F   [         R                  [        [         R                  [        [         R
                  [        [         R                  [        [         R                  [        [         R                  [        [         R                  [        [         R                  [         0$ )z=
Returns a map of StageType to default Stage implementation.
)r   r+   r   r*   r   r0   r   r,   r   r1   r   r-   r   r.   r   r/   r    r;   r8   r%   Tester.default_stage_classes`   sg     f  )v113J##\	
 		
r;   
stage_typec                 l    U R                   R                  U5      nUc  [        SU S35      eU" U0 UD6$ )Nz<Attempted to instantiate a default implementation for stage z% but no default class was registered.)r   getRuntimeError)r7   r@   argskwargsstage_classs        r8   _get_default_stageTester._get_default_stagep   sM    ((,,Z8NzlZ  A  D+F++r;   c              #     #    / nU R                   cQ  U R                   H?  n[        U[        R                  5      (       d   eUR                  UR                  5        MA     GO0 n[        [        U R                  5      5       GH  n[        U R                  U   [        R                  5      (       d   e[        U R                  U   R                  5      nU R                   U   nUR                  5        GH$  u  pxU[        U5      :  d   e[        U[        R                  R                   R                  5      (       a  UR                  nUR                  n	ON[        U[        R                  R                   R                  5      (       a  S n	O[!        S[#        U5       35      eUR$                  n
X;  aR  ['        UR(                  S5      nUR&                  S:  a  UR&                  OSnU	" [*        R,                  " X5      5      X:'   X8R$                     XW'   GM'     UR                  [        R.                  " U5      5        GM     / n[        [        U R                  5      5       H  n[1        [        U R                  U   R3                  5       5      5      nUR                  [        R4                  " X   5      R7                  U R                  U   R8                  S9R7                  US95        M     [;        U5      v   g 7f)Nc                     U $ r"   r>   )xs    r8   fn)Tester.generate_random_inputs.<locals>.fn   s    #$Hr;   z@Expected Dynamic Dims to be of type _DerivedDim or _Dim but got i        )dtype)memory_format)r   r   
isinstancetorchTensorappendshaperangelenr(   itemsexport_DerivedDimrootrL   _DimrC   type__name__minmaxrandomrandintSizer   	dim_orderrandntorP   tuple)r7   input_shapes
tensor_argdim_name_to_sizearg_idxex_shapedynamic_dim_specdim_idxdim_specrL   dim_nameupper_boundlower_boundrandom_inputs	memFormats                  r8   generate_random_inputsTester.generate_random_inputsx   s    &"11
!*ell;;;;##J$4$45 2
  " T%8%8!9:!$"5"5g">MMMM 3 3G < B BC#'#6#6w#? )9)?)?)A%G"S]222!(ELL,G,G,S,STT $,==%[[#Hell.I.I.N.NOO% +^_cdl_m^no   (00H7&)$LL$' -5LLA,=HLL1 $ 68"NN;D6(2 )99J9J(KH%9 *B: ##EJJx$89C ;F S!4!456G)T((1;;=>I   L12$--g6<<=),	 7 M""s   LLc                    UR                  5       nX R                  ;   a  U R                  U   (       a   eU R                  nU R                  (       af  U R                  U R                  ;   d   SU R                   35       eU R                  U R                     nX$;   d
   SU 35       eU R                  5       nX l        U$ )NzInvalid state: zInvalid next stage: )r@   r)   r&   r3   r2   get_artifact)r7   stager@   last_artifactallowed_next_stagess        r8   _preTester._pre   s    %%'
[[(Z1HHH,,8888t}},Jz.JJ,"&--"913%j\231 --/Mr;   c                 b    UR                  5       nX R                  ;   d   eXR                  U'   g r"   )r@   r)   )r7   rz   r@   s      r8   _postTester._post   s,    %%'
[[((("'Jr;   c                     [        U[        5      (       d   eU R                  U5      nUR                  " U/UQ7SU0UD6  U R	                  U5        U $ )Ninputs)rR   r   r}   runr   )r7   stage_instancer   rD   rE   prev_stage_artifacts         r8   
_run_stageTester._run_stage   sS    .%0000"ii7.OOvOO

>"r;   quantize_stagec                     U R                  U=(       d    U R                  [        R                  5      U R                  5      $ r"   )r   rG   r   r*   r   )r7   r   s     r8   quantizeTester.quantize   s5    Id55i6H6HI
 	
r;   export_stagec                     U R                  U=(       d(    U R                  [        R                  U R                  S9U R
                  5      $ )N)r   )r   rG   r   r+   r   r   )r7   r   s     r8   rZ   Tester.export   sJ     &&  1D1D '  
 	
r;   to_edge_stagec                 t    U(       d  U R                  [        R                  5      nU R                  U5      nU$ r"   )rG   r   r-   r   )r7   r   ress      r8   to_edgeTester.to_edge   s.     33I4E4EFMoom,
r;   to_edge_and_transform_stagegenerate_etrecordc                 n    U R                  U=(       d    U R                  [        R                  5      US9$ )N)r   )r   rG   r   r.   )r7   r   r   s      r8   to_edge_transform_and_lower"Tester.to_edge_transform_and_lower   s:    
 ' N&&y'L'LM/  
 	
r;   run_passes_stagec                 p    U R                  U=(       d    U R                  [        R                  5      5      $ r"   )r   rG   r   r,   )r7   r   s     r8   
run_passesTester.run_passes   s,    M 7 7	8L8L M
 	
r;   partition_stagec                 p    U R                  U=(       d    U R                  [        R                  5      5      $ r"   )r   rG   r   r0   )r7   r   s     r8   	partitionTester.partition   ,    Kt66y7J7JK
 	
r;   to_executorch_stagec                 p    U R                  U=(       d    U R                  [        R                  5      5      $ r"   )r   rG   r   r/   )r7   r   s     r8   to_executorchTester.to_executorch   s,    S4#:#:9;R;R#S
 	
r;   serialize_stagec                 p    U R                  U=(       d    U R                  [        R                  5      5      $ r"   )r   rG   r   r1   )r7   r   s     r8   	serializeTester.serialize   r   r;   pathrz   c                 l    U=(       d    U R                   nU R                  U   R                  U5        U $ r"   )r3   r)   dump_artifact)r7   r   rz   s      r8   r   Tester.dump_artifact  s,    !E((.r;   c                 ^    U=(       d    U R                   nU R                  U   R                  $ r"   )r3   r)   artifact)r7   rz   s     r8   ry   Tester.get_artifact  s%    !{{5!***r;   inputc                     U HV  n[        5       R                  U5      R                  U R                  U R                     R
                  R                  5        MX     U $ r"   )r   checkr   r)   r3   graph_modulecoder7   r   keys      r8   r   Tester.check  sE    CKc"&&t{{488'<'I'I'N'NO r;   c                     U HV  n[        5       R                  U5      R                  U R                  U R                     R
                  R                  5        MX     U $ r"   )r   	check_notr   r)   r3   r   r   r   s      r8   r   Tester.check_not  sE    CK!!#&**4;;txx+@+M+M+R+RS r;   c                     UR                  5        HW  u  p#[        5       R                  X#SS9R                  U R                  U R
                     R                  R                  5        MY     U $ )NT)exactly)rY   r   check_countr   r)   r3   r   r   )r7   r   r   counts       r8   r   Tester.check_count  sW    ++-JCK##C#=AADHH%2277 ( r;   c           
      x   U R                   U R                     R                  R                  R                   Vs/ s H!  nUR
                  S:X  d  M  UR                  PM#     nn[        U5      nUR                  5        H2  u  pVXdU   :w  d  M  [        SU 35        [        SU SU SXE    S35      e   U $ s  snf )Ncall_functionzNodes: z	Expected  z nodes but found .)r)   r3   r   graphnodesoptargetr   rY   printAssertionError)r7   r   node
target_ops	op_countsr   r   s          r8   check_node_countTester.check_node_count  s     DHH-::@@FF
Fww/) DKKF 	 

 J'	++-JC#&	{+,$wau,=in=MQO  ( 
s   B7B7reuse_serverc                 F    SSK Jn  U" U R                  U5      4SU0UD6  U $ )Nr   )	visualizer   )!executorch.devtools.visualizationr   ry   )r7   r   rz   rE   r   s        r8   r   Tester.visualize0  s*     	@$##E*PPPr;   r   statistics_callbackartifact_dirartifact_namec
           
      f   Ub  SOUn
U R                   [        R                     nU=(       d    U R                  nSn[	        U
5       H  nU(       a  UO[        U R                  5       5      nU R                  UR                  U5      u  nnU R                   U   R                  U5      nU R                  UUUUUUU5        U(       d  M  U	(       d  M  U(       a  M   U R                  UU	UU5        SnM     U $ ! [         a.    [        R                  " [        5      R!                  SU	 3SS9   N?f = f)NrO   Fz$Failed to dump golden artifacts for T)exc_info)r)   r   r+   r3   rW   nextrv   _calculate_reference_outputr   run_artifact_compare_outputs_dump_golden_artifacts	Exceptionlogging	getLoggerr_   warning)r7   rz   r   num_runsatolrtolqtolr   r   r   number_of_runsreference_stageartifacts_saved_inputs_to_runr4   r5   r6   s                     r8   run_method_and_compare_outputs%Tester.run_method_and_compare_outputs9  s;    %0h++i&6&67!~&A&,F$t7R7R7T2UM 00((- "  ;;u-::=IL!! "# |oo//$%%(	 #'I 'L  ! %%h/77>}oN!% 8 s   C885D0/D0c                     [         R                  " [        5      n[        R                  " U SS9  [        U5       H  u  pV[        U[        R                  5      (       d  M&  [        U5      S:X  a  SOSU 3n[        R                  R                  X SU S35      nUR                  5       R                  5       R                  5       R                  U5        UR!                  SU 35        M     [        U[        R                  5      (       a  U4nO.[        U["        5      (       a  [%        UR'                  5       5      n[        U5       H  u  pY[        U	[        R                  5      (       d  M&  [        U5      S:X  a  SOSU 3n[        R                  R                  X S	U S35      nU	R                  5       R                  5       R                  5       R                  U5        UR!                  S
U 35        M     g )NT)exist_okrO    r   _inputz.binzSaved golden input to _expected_outputzSaved golden output to )r   r   r_   osmakedirs	enumeraterR   rS   rT   rX   r   joindetach
contiguousnumpytofileinfor   rh   values)
r   r   r   r4   loggeriinpsuffixr   outs
             r8   r   Tester._dump_golden_artifactss  s    ""8,
L40'FA#u||,,"6{a/qWww||LO6&QU2VW

'')//188>4TF;< ( &55 02(+66$%5%<%<%>? 01FA#u||,,"#3491#www|| O3CF84"P 

'')//188>5dV<= 2r;   c                 *   [        U 5      [        U5      :X  d   e[        [        U 5      5       GH  nX   nX   n[        R                  " Xg5      nUb  U" U5        UR                  UR                  :X  d$   SU SUR                   SUR                   35       eUR
                  [        R                  :X  ag  [        R                  " Xg5      (       dJ   SU SUR                   SXg:g  R                  5       R                  5        SUR                  5        S3	5       eM  [        R                  " UUUUS	S
9(       a  GM   SR                  / SPU PSPU PSPU PSPUR                   PSPUR
                   PSP[        R                  " Xg-
  5       PSP[        R                  " [        R                  " Xg-
  5      5       PSP[        R                   " [        R                  " Xg-
  5      R#                  [        R$                  5      5       PSPUR                  5        PSPUR                  5        PSPUR'                  5        PSPUR'                  5        PSPUR#                  [        R$                  5      R!                  5        PSPUR#                  [        R$                  5      R!                  5        PSPUR                  5        PSPUR                  5        PSPUR)                  5        PSPUR)                  5        PSP5      5       e   g)a  
Helper testing function that asserts that the model output and the reference output
are equal with some tolerance. Due to numerical differences between eager mode and
the XNNPACK's backend, we relax the detal such that absolute tolerance is 1e-3. and
relative tolerance is 1e-3. In the event that the computation was quantized, we
further relax the tolerance to one quantized step (equal to the quantization scale).
This allows the quantized value to differ by 1 between the reference and model output.
NzOutput z shape z' does not match reference output shape z8 (bool tensor) does not match reference output.
	Shape: z
	Mismatched count: z / 
T)r   r   	equal_nanr   z/ does not match reference output.
	Given atol: z, rtol: z.
	Output tensor shape: z	, dtype: z
	Difference: max: z, abs: z, mean abs error: z&.
	-- Model vs. Reference --
	 Numel: z, z

	Median: z

	  Mean: z

	   Max: z

	   Min: )rX   rW   r   from_tensorsrV   rP   rS   boolequalsumitemnumelallcloser   ra   absmeanrg   doublemedianr`   )	model_output
ref_outputr   r   r   r   modelreferror_statss	            r8   _assert_outputs_equalTester._assert_outputs_equal  s   " < C
O333s<()A OE-C)66uBK".#K0 		U[[(c75;;-/VWZW`W`Vabc({{ejj({{5.. aS !  %} -+,1L+=+=+?+D+D+F*Gs5;;=/Y[]. ~~"  	> 	>g 	>aS 	> !% 	>%)F	>*2	>37&	>9.	>.3kk]	>:C	>DIKK=	>Q*	> +0))EI*>)?	> @G	> HMyyQVQZQZ[`[dQeGfFg	> hz	> {@  {E  {E  FK  FO  FO  PU  PY  FZ  F]  F]  ^c  ^j  ^j  Fk  {l  zm	>m!	>
 "'	>
 02	>
 36))+	>
?!	> "' 0	> 13	> 47::<.	>A!	> "'%,,!7!<!<!> ?	> @B	> CF&&BVB[B[B]A^	>_!	> "'	> .0	> 14	{	>;!	> "'	> .0	> 14	{	> ;=	> % *r;   c                 ,   [        U [        R                  5      (       a  U 4n O.[        U [        5      (       a  [	        U R                  5       5      n [        U[        R                  5      (       a  U4nUb  X2U-  -  n[        R                  UU UUUS9  g)a  
Compares the original of the original nn module with the output of the generated artifact.
This requres calling run_method before calling compare_outputs. As that runs the generated
artifact on the sample inputs and sets the stage output to be compared against the reference.
N)r   r   r   )rR   rS   rT   r   rh   r   r   r  )r4   r6   r5   r   r   r   r   s          r8   r   Tester._compare_outputs  s      &55 02(+66$%5%<%<%>?lELL11(?L )--D$$ 3 	% 	
r;   programc                 x  ^^ U R                   R                  5       nSnUR                  S    HU  nUR                  S:X  d  M  UR                  [
        R                  R                  R                  R                  :X  d  MS  Un  O   SmUb  UR                  mUU4S jnXSl        U R                  5       " U6 nUT4$ )z
Execute the reference program and return the output. If the output comes from a dequantize node,
return the quantization scale as well.
Nr   r   c                     > U S   mT" U 6 nU$ )NrO   r>   )rD   resultoriginal_targetscales     r8   dequant_shim8Tester._calculate_reference_output.<locals>.dequant_shim  s    Q($/r;   )r   output_noderD   r   r   rS   opsquantized_decomposeddequantize_per_tensordefaultr   )	r  r   r#  dequant_nodearg_noder!  outputr  r   s	          @@r8   r   "Tester._calculate_reference_output  s     mm//1 #((+H.OO9911GGOOP  ( , #*11O #/!6*u}r;   )
r3   r   r   r&   r2   r5   r4   r   r6   r)   )NNFr"   )NF)NN)TN)	NNrO   MbP?r,  r   NNN)r,  r,  N)Nr,  r,  r   N)<r_   
__module____qualname____firstlineno____doc__rS   nnModuler
   rT   r   r   r   r	   r   r  r9   staticmethodr%   r   rG   rv   r}   r   r   r   r   r   rZ   r   r   r   r   r   r   r   r   r   r   r   r   strr   ry   r   r   r   intr   r   r   r   r   r   r  r   r   floatr   __static_attributes__r>   r;   r8   r   r   !   s\    ;?/36!6! ell+6! Ix/047	6!
 !s,6! 6!p 
4	8(;#< 
 
,Y ,E ,8#t(

x'9 

8F#3 
Xf%5  JN"'	
%-.E%F	
  	

8I+> 


))< 


,1G 


))< 
(3- x} 
+(9"5 +49 
tCy 
c3h d38n & GK 080C &*04HL&*'+8	"8 u||,-8 &&7&=>E8 sm8  }8t >>> ell#> ><  HL5
 &&7&=>E5 5n   HL!
 &&7&=>E!
 !
F & &	u||Xe_,	-& &r;   r   )"r   r   rb   collectionsr   r   typingr   r   r   r   r	   r
   rS   1executorch.backends.test.harness.error_statisticsr   'executorch.backends.test.harness.stagesr   r   r   r   r   r   r   r   r   r   executorch.exir.dim_order_utilsr   torch.exportr   torch.testingr   r   r>   r;   r8   <module>r?     sE     	  , = =  M   > ( #t tr;   