
    dafy_                        d Z ddlZddlZddlZddlZddlZddlmZ ddl	Z	ddl
Z
ej                  dk(  rdZndZ eej                        ZdgZej                   dd D ]-  Zej#                  d	      r		  ee      Zej)                  e       /  ee      D  ci c]  \  } }|| 
 c}} Z e eej3                                     Zd
Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d4dZ$d Z%d Z&d Z'd5dZ( G d d      Z)d Z*d Z+d Z,d Z-d Z.d  Z/d! Z0d" Z1d# Z2d$ Z3d% Z4d& Z5d' Z6d( Z7d) Z8d* Z9d+ Z:d, Z;d- Z<d. Z=d/ Z>d0 Z?d6d1Z@d2 ZAeBd3k(  r eA        yy# e$ r Y w xY wc c}} w )7zTPrint a summary of specialization stats for all files in the
default stats folders.
    N)datentzc:\temp\py_stats\z/tmp/py_stats/z<0>   <)specialization.hitspecialization.missexecution_countc                     |dk(  ry| |z  dS )zb
    Format a ratio as a percentage. When the denominator is 0, returns the empty
    string.
    r    z.01% )numdens     4/root/Python-3.12.4/Tools/scripts/summarize_stats.pyformat_ratior   %   s    
 axc'$     c                    t        |       dk(  rt        |      dk(  rg S t        |       r4t        t        d | D                    }t        |      dk7  rt        d      t        |      r4t        t        d |D                    }t        |      dk7  rt        d      t        |       r!t        |      rd   d   k7  rt        d      t        |       rd   }nd   }dg|dz
  z  }| D ci c]  }|d   |dd	  }}|D ci c]  }|d   |dd	  }}t        |      t        |       k7  st        |      t        |      k7  rt        d
      t        |j	                               |j	                         D 	cg c]	  }	|	|vs|	 c}	z   }
|
D 	cg c]*  }	|	g|j                  |	|      |j                  |	|      , c}	S c c}w c c}w c c}	w c c}	w )zf
    Joins two tables together, side-by-side, where the first column in each is a
    common key.
    r   c              3   2   K   | ]  }t        |        y wNlen.0xs     r   	<genexpr>zjoin_rows.<locals>.<genexpr>8        2a3q62   r   zTable a is raggedc              3   2   K   | ]  }t        |        y wr   r   r   s     r   r   zjoin_rows.<locals>.<genexpr>=   r   r   zTable b is raggedzTables have different widthsr   NzDuplicate keys)r   listset
ValueErrorkeysget)a_rowsb_rowsa_ncolsb_ncolsncolsdefaultr   a_datab_datakr!   s              r   	join_rowsr,   /   s   
 6{aCK1,	
6{s26223w<1011
6{s26223w<1011
6{s6{wqzWQZ'?788
6{

deai G#)*aadAabEk*F*#)*aadAabEk*F*
6{c&k!S[CK%?)** V[[]!Navo!!NNDKOPaQAAw'A&**Q*@APP +* "OPs   ,G G7	G
G
/Gc           	         g }t        |       D ]n  }|j                  d      r|dv r|t        d      d  }n|dk(  r.|dv r3|j                  d      rE|}|j                  |d| |   dt	        | |   |      f       p |S )Nzspecialization.failure_kinds)r   r   specialization.r	   )specialization.successspecialization.failurespecializablepairz>12)sorted
startswithr   appendr   )family_statstotalrowskeylabels        r   calculate_specialization_statsr;   U   s    Dl# j>>89??-./0E%%ZZ^^F#Ec{S(9#'>l[^N_afAghij Kr   c           	         d}dD ]  }|| j                  |d      z  } g }|r^dD ]Y  }|t        d      d  }|d   j                         |dd  z   }| j                  |d      }|j                  ||t	        ||      f       [ |S )Nr   )r/   r0   r.   r   )r"   r   upperr5   r   )r6   total_attemptsr9   r8   r:   vals         r   (calculate_specialization_success_failurer@   g   s    ND 3,**3223DH 	IC-./0E!HNN$uQRy0E""3*CKK\#~%FGH		I
 Kr   c           	         |j                  dd      }dgdz  }|D ]>  }|j                  d      s|d d j                  d      \  }}t        |      }||   ||<   @ t	        |      D cg c]	  \  }}||f }	}}|	j                  d       g }
|	D ]1  \  }}|s	|
j                  t        |||       |t        ||      f       3 |
S c c}}w )	Nr0   r   (   zspecialization.failure_kind[Treverse)	r"   r4   splitint	enumeratesortr5   kind_to_textr   )namer6   definestotal_failuresfailure_kindsr9   _indexvaluefailuresr8   s              r   &calculate_specialization_failure_kindsrT   t   s    !%%&>BNEBJM 1~~;<s8>>#&5E
+C0e1 6?}5MN>E5NHNMM$MD  fu\%$7UTb@cdef K Os   *Cc                 D   dvry t        fdt        D              }|dk(  ry t        | dd|  d      5  t        |      }t	        d|       t              }|r1t        dd	       t	        d
|       t        | |      }t	        d|       d d d        y # 1 sw Y   y xY w)Nr1   c              3   B   K   | ]  }j                  |d         ywr   Nr"   )r   kindr6   s     r   r   z-print_specialization_stats.<locals>.<genexpr>   s     <d  q)<   r      specialization stats for  family)KindCountRatioSpecialization attempts   r   Count:Ratio:)Failure kindrd   re   )sumTOTALSectionr;   
emit_tabler@   print_titlerT   )rL   r6   rM   r7   r8   s    `   r   print_specialization_statsrl      s    l*<e<<Ez	q5dV7C	D C-lEB-t47E115/69$gVD;TBC C Cs   ABBc                    dvry t        fdt        D              }t        fdt        D              }||z   dk(  ry t        | dd|  d      5  t        |      }t        |      }t	        dt        ||             t              }t              }t        ||      }|rHt        d	d
       t	        d|       t        | |      }t        | |      }t	        dt        ||             d d d        y # 1 sw Y   y xY w)Nr1   c              3   B   K   | ]  }j                  |d         ywrW   rX   )r   rY   base_family_statss     r   r   z9print_comparative_specialization_stats.<locals>.<genexpr>        F&**43FrZ   c              3   B   K   | ]  }j                  |d         ywrW   rX   )r   rY   head_family_statss     r   r   z9print_comparative_specialization_stats.<locals>.<genexpr>   rp   rZ   r   r[   r\   r]   )r^   z
Base Countz
Base Ratioz
Head Countz
Head Ratiora   rb   r   Base Count:Base Ratio:Head Count:Head Ratio:)rf   rt   ru   rv   rw   )	rg   rh   ri   r;   rj   r,   r@   rk   rT   )	rL   ro   rr   rM   
base_total
head_total	base_rows	head_rowsr8   s	    ``      r   &print_comparative_specialization_statsr|      s   //FFFJFFFJJ!#	q5dV7C	D 23DjQ	23DjQ	Li+	
 ==NO	<=NO	I.115WY]^>tEVX_`I>tEVX_`I\)Y/  s   BC66C?c           
         t         j                  j                  |       r+t        | d      5 }t	        j
                  |      cd d d        S t         j                  j                  |       rt        j                         }t        j                  |       D ]  }t        t         j                  j                  | |            5 }|D ]?  }	 |j                  d      \  }}|j                         }t#        |      }||xx   |z  cc<   A 	 d d d        |dxx   dz  cc<    |S t        | dd      # 1 sw Y   y xY w# t        $ r2 t        d|j                          d| t        j                          Y w xY w# 1 sw Y   sxY w)	Nr:zUnparsable line: 'z' in  )file
__nfiles__r   z  is not a file or directory path)ospathisfileopenjsonloadisdircollectionsCounterlistdirjoinrG   r    printstripsysstderrrH   )inputfdstatsfilenameliner9   rR   s          r   gather_statsr      sX    
ww~~e% 	!99R=	! 	!	u	##%

5) 	%Hbggll5(34 	( (D!%)ZZ_
U ))+CJE#J%'J(	( ,1$	% E!9$DEFF%	! 	! & ! 24::<.xjQX[XbXbc !		( 	(s;   D-?E7D9*E7-D698E4	1E73E4	4E77F 	c                    t        d      D cg c]  }i  }}| j                         D ]O  \  }}|j                  d      s|dd  j                  d      \  }}}||t	        |         |j                  d      <   Q |S c c}w )N   opcode   ].)rangeitemsr4   	partitionrH   r   )r   rP   opcode_statsr9   rR   nrests          r   extract_opcode_statsr      s    !&s-AR-L-kkm 6
U~~h'W&&s+
1d05SVTZZ_-	6
  .s   	A=c                 N   t        j                  t              }d|z   dz   }| D ]~  }|j                         }|j	                  |      s%|t        |      d  }|j                         \  }}|t        |j                                  j                  |j                                 |S )Nz#define rP   )	r   defaultdictr   r   r4   r   rG   rH   r5   )spec_srcprefixrM   startr   rL   r?   s          r   parse_kindsr      s    %%d+G#%E 7zz|u%CJK JJL	cCIIK !((67 Nr   c                 B    | j                  dd      j                         S )NrP    )replacelower)defnames    r   prettyr      s    ??3$**,,r   c                 $   | dk  rt        ||    d         S |dk(  rd}n.|j                  d      rd}n|dv rd}n|j                  d      rd}||    D ]/  }|j                  |      st        |t        |      d	z   d        c S  d
t	        |       z   S )N   r   LOAD_SUPER_ATTRSUPERATTR)FOR_ITERSENDITERSUBSCRr   zkind )r   endswithr4   r   str)rY   rM   opnamerL   s       r   rK   rK      s    qygdmA&''""		 	'	'		" 0??6"$s6{1}~.//0 SYr   c                    d}d}d}t         j                  D ch c]  }d|vr|
 }}t        |       D ]K  \  }}d|vr|d   }t        |   }	d|v r||z  }#|	|v r |j	                  dd      }
||
z  }|||
z
  z  }G||z  }M |||fS c c}w )Nr   __r	   r1   r   )r   _specialized_instructionsrI   r   r"   )r   basicspecializednot_specializedopspecialized_instructionsiopcode_statcountrL   misss              r   categorized_countsr      s    EKO55 r> 	    $L1 ;K/-.ayk)u$O--??#8!<Dt#O54<'KUNE /;..! s   Bc                 6    t        d|z  |        t                y )N#r   )rL   levels     r   rk   rk     s    	#e)T	Gr   c                        e Zd ZddZd Zd Zy)ri   Nc                 ^    || _         || _        ||j                         | _        y || _        y r   )titler   r   summary)selfr   r   r   s       r   __init__zSection.__init__  s)    

? ;;=DL"DLr   c                     t        | j                  | j                         t        d       t        d| j                  d       t                | S )Nz	<details>z	<summary>z
</summary>)rk   r   r   r   r   )r   s    r   	__enter__zSection.__enter__  s6    DJJ

+kk4<<6r   c                  B    t                t        d       t                y )Nz
</details>r   )argss    r   __exit__zSection.__exit__  s    lr   )   N)__name__
__module____qualname__r   r   r   r   r   r   ri   ri     s    #r   ri   c                 P    t        | t              rt        | d      S t        |       S )Nz,d)
isinstancerH   formatr   r   s    r   to_strr   "  s!    !Sa1vr   c                 r   t        |       }d}d}| D ]/  }d}|j                  d      r
|d d }|dz  }||dz   z  }||dz   z  }1 t        |       t        |       |D ]O  }|(t        |      |k7  rt        dt	        |      z   dz         t        ddj                  d |D              d       Q t                y )	N|---r   rC   z | z!Wrong number of elements in row ''c              3   2   K   | ]  }t        |        y wr   )r   )r   r   s     r   r   zemit_table.<locals>.<genexpr>8  s     5AfQi5r   )r   r   r   r    r   r   )headerr8   widthheader_line
under_lineitemunderrows           r   rj   rj   (  s    KEKJ "==9DSLEte|#eck!
" 
+	* <SU!2@3s8KcQRRc5::555s;< 
Gr   c           
      j   g }t        |       D ]A  \  }}d|v s|d   }d}d|vr|j                  d      }|j                  |t        |   |f       C |j	                  d       d}g }|D ]F  \  }}	}||z  }|rt        ||      }nd}|j                  |	|t        ||      t        ||      |f       H |S )Nr	   r   r1   r   TrE   r   )rI   r"   r5   r   rJ   r   )
r   r7   countsr   r   r   r   
cumulativer8   rL   s
             r   calculate_execution_countsr   ;  s    F#L1 4;+ 12EDk1"'<=MM5&)T234 KKKJD% =de
e,DDT5,ue"<!*e4d< 	== Kr   c                 x    t        dd      5  t        | |      }t        d|       d d d        y # 1 sw Y   y xY w)NExecution counts%execution counts for all instructionsr   )Namerd   Self:Cumulative:zMiss ratio:)ri   r   rj   )r   r7   r8   s      r   emit_execution_countsr   Q  s=    	#-T	U 
),>E	

 
 
s   09c           	      B   t        dd      5  t        | |      }t        ||      }t        d |D              }t        d |D              }t        |j	                               t        |j	                               z  }g }	g d}
|D ]d  }|j                  ||
      }|j                  ||
      }|d   dk(  rd}n|d   |d   z
  |d   z  }|	j                  ||d   |d   d	|z  d
df       f |	j                  d        t        d|	       d d d        y # 1 sw Y   y xY w)Nr   r   r   c              3   0   K   | ]  }|d    |dd f  ywr   r   Nr   r   s     r   r   z4emit_comparative_execution_counts.<locals>.<genexpr>_       :1!A$!":   c              3   0   K   | ]  }|d    |dd f  ywr   r   r   s     r   r   z4emit_comparative_execution_counts.<locals>.<genexpr>`  r   r   )r   0.0%r   r   r   r   d   z0.1f%c                 8    t        t        | d   d d              S NrC   )absfloatr   s    r   <lambda>z3emit_comparative_execution_counts.<locals>.<lambda>p  s    U1R5":%6!7 7 r   r9   )r   rt   rv   zChange:)	ri   r   dictr   r!   r"   r5   rJ   rj   )base_opcode_statsrx   head_opcode_statsry   rz   r{   	base_data	head_dataopcodesr8   r(   r   
base_entry
head_entrychanges                  r   !emit_comparative_execution_countsr  Y  s6    
#-T	U 
./@*M	./@*M	:	::	:	::	inn&'#inn.>*??( 		)F"vw7J"vw7J!}!$Q-*Q-7:a=HKKA
1Jt$A&()		) 			7	8=	
-
 
 
s   C>DDc                      t         j                  j                  t         j                  j                  t              d      } t        |       5 }t        |      }d d d        |S # 1 sw Y   S xY w)Nz../../Python/specialize.cr   r   r   dirname__file__r   r   )	spec_pathr   rM   s      r   get_definesr  w  sQ    RWW__X68STI	i (Hh'(N(Ns   A##A-c                     t               }t        dd      5  t        |       D ]  \  }}t        |   }t	        |||        	 d d d        y # 1 sw Y   y xY wNzSpecialization statszspecialization stats by familyr   )r  ri   rI   r   rl   )r   rM   r   r   rL   s        r   emit_specialization_statsr  }  s]    mG	'1Q	R C'5 	CNA{!9D&t['B	CC C Cs   *AAc                     t               }t        dd      5  t        t        | |            D ]  \  }\  }}t        |   }t        ||||       ! 	 d d d        y # 1 sw Y   y xY wr  )r  ri   rI   zipr   r|   )r	  r
  rM   r   base_opcode_stathead_opcode_statrL   s          r   %emit_comparative_specialization_statsr    ss    mG	'1Q	R f7@EVXiAj7k 	f3A3 "2!9D249IK[]de	ff f fs   8AA#c                 x    t        |       \  }}}d|t        ||      fd|t        ||      fd|t        ||      fgS )NBasiczNot specializedSpecialized)r   r   )r   r7   r   r   r   s        r   &calculate_specialization_effectivenessr#    sP    *<\*J'E?K	%eU34	O\/5-QR	\+u%EF r   c                    t        d      5  t        | |      }t        d|       dD ]  \  }}d}g }t        |       D ]@  \  }}|dk(  rd|v r|j	                  |d      }|j                  |t        |   f       ||z  }B |j                  d       |smt        | d	d
      5  |d d D 	
cg c]  \  }	}
|
|	t        |	|      f }}	}
t        d|       d d d         	 d d d        y c c}
}	w # 1 sw Y   xY w# 1 sw Y   y xY w)NSpecialization effectiveness)Instructionsrd   re   ))Deferredzspecialization.deferred)Missesr   r   r(  r1   TrE   z by instructionr[   
   )r   rd   re   )	ri   r#  rj   rI   r"   r5   r   rJ   r   )r   r7   r8   r   fieldr   r   r   rR   r   rL   s              r   emit_specialization_overviewr+    s;   	/	0 C5lEJ7>h 	CLE5EF"+L"9 ;H$K)G#q1ufQi01 KKK%wo6: C\bcfdf\gi=ESWdE<u+EFiDi;TBC C	CC C  jC CC Cs<   BC:C:#	C.,C(C.
C:(C..C73C::Dc                     t        d      5  t        | |      }t        ||      }t        dt        ||             d d d        y # 1 sw Y   y xY w)Nr%  )r&  rt   ru   rv   rw   )ri   r#  rj   r,   )r	  rx   r
  ry   rz   r{   s         r   (emit_comparative_specialization_overviewr-    sO    	/	0 
:;LjY	:;LjY	Xi+	

 
 
s   /AAc                      t         j                  j                  t         j                  j                  t              d      } t        |       5 }t        |d      }d d d        |S # 1 sw Y   S xY w)Nz../../Include/pystats.h	EVAL_CALL)r   r  )
stats_path	stats_srcrM   s      r   get_stats_definesr2    sT    bggooh79RSJ	j	 =Yi<=N=Ns   A%%A/c           	      D   t               }d}| j                         D ]  \  }}d|v s||z  }g } | j                         D ]  \  }}d|v rj                  ||t        ||      f       )|j	                  d      s;|d d j                  d      \  }}t        |      }|dz   t        ||   d         z   dz   }j                  ||t        ||      f        | j                         D ]5  \  }}|j	                  d      sj                  ||t        ||      f       7 S )	Nr   zCalls tozCalls rC   rD   z ()Frame)r2  r   r5   r   r4   rG   rH   r   )	r   rM   r7   r9   rR   r8   rL   rQ   r:   s	            r   calculate_call_statsr6    s/   !GEkkm 
UUNED kkm D
UKKe\%%?@A^^H%cr(..-KD%ZE4K&):";;cAEKK|E5'ABCD kkm B
U>>'"KKe\%%?@AB Kr   c                 v    t        dd      5  t        |       }t        d|       d d d        y # 1 sw Y   y xY w)N
Call statsInlined calls and frame statsr   rc   )ri   r6  rj   r   r8   s     r   emit_call_statsr;    s7    	'F	G 3#E*+T23 3 3   /8c                     t        dd      5  t        |       }t        |      }t        ||      }|j                  d        t	        d|       d d d        y # 1 sw Y   y xY w)Nr8  r9  r   c                 &    t        | d   d d        S r  )r  r   s    r   r  z-emit_comparative_call_stats.<locals>.<lambda>  s    quSbz!2 2 r   r  rs   )ri   r6  r,   rJ   rj   )
base_stats
head_statsrz   r{   r8   s        r   emit_comparative_call_statsrA    s_    	'F	G 
(4	(4	I.		2	3L	

 
 
s   AAA"c                 ^   | j                  d      }| j                  d      | j                  d      z   }| j                  d      | j                  d      z   }| j                  d      | j                  d      z   }g }| j                         D ]  \  }}|j                  d      sd	|v rt        ||      }n5d
|v rt        ||      }n$d|v rt        ||      }nd|v rt        ||      }nd}|dd  j	                         }	|	d   j                         |	dd  z   }	|j                  |	||f        |S )NzObject new valueszObject allocationsz Object allocations from freelistzObject interpreter increfszObject increfszObject interpreter decrefszObject decrefsObjectmaterializeallocationsincrefsdecrefsr      r   r   )r"   r   r4   r   r   r=   r5   )
r   total_materializationstotal_allocationstotal_increfstotal_decrefsr8   r9   rR   ratior:   s
             r   calculate_object_statsrN    s4   "YY':;		"67%))Df:ggII:;eiiHX>YYMII:;eiiHX>YYMDkkm /
U>>(##$U,BC#%$U,=>#%$UM:#%$UM:GMMOE!HNN$uQRy0EKKu-./ Kr   c                 v    t        dd      5  t        |       }t        d|       d d d        y # 1 sw Y   y xY w)NObject stats+allocations, frees and dict materializatonsr   rc   )ri   rN  rj   r:  s     r   emit_object_statsrR    s7    	)V	W 4%e,,d34 4 4r<  c                     t        dd      5  t        |       }t        |      }t        dt        ||             d d d        y # 1 sw Y   y xY w)NrP  rQ  r   rs   )ri   rN  rj   r,   )r?  r@  rz   r{   s       r   emit_comparative_object_statsrT    sO    	)V	W w*:6	*:6	TV_`iktVuvw w ws   -AAc                 2    d}| D ]  }d|v s||d   z  } |S )Nr   r	   r   )r   r7   r   s      r   	get_totalrV    s5    E# 4+[!233E4 Lr   c                    g }t        |       D ]n  \  }}|dk(  r|j                         D ]P  \  }}|j                  d      s|dd  j                  d      \  }}}|s3|j	                  ||t        |      ff       R p t        dd      5  |j                  d	       d}	g }
t        j                  |d
      D ]L  \  }}|\  }}|	|z  }	|
j	                  t        |   dz   t        |   z   |t        ||      t        |	|      f       N t        d|
       d d d        t        dd      5  t        j                  t        j                        }t        j                  t        j                        }t        j                         }t        j                         }|D ]5  \  }\  }}|s|||   |<   |||   |<   ||xx   |z  cc<   ||xx   |z  cc<   7 t         j                         D ]  \  }}||   }||   }|dk(  r|dk(  rdx}}|r5||   j#                  d      D cg c]  \  }}t        |   |||z  df }}}|r5||   j#                  d      D cg c]  \  }}t        |   |||z  df }}}t        |dd|       5  t        d|       t        d|       d d d         	 d d d        y # 1 sw Y   xY wc c}}w c c}}w # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   
pair_count   r   zPair countszPair counts for top 100 pairsr   TrE   r   r   )Pairrd   r   r   zPredecessor/Successor Pairsz0Top 5 predecessors and successors of each opcoder      z.1%r[   z Successors and predecessors for )Predecessorsrd   Percentage:)
Successorsrd   r]  )rI   r   r4   r   r5   rH   ri   rJ   	itertoolsislicer   r   rj   r   r   r   opmapmost_common)r   r7   pair_countsr   r   r9   rR   r   rP   r   r8   r   r2   jpredecessors
successorstotal_predecessorstotal_successorsfirstsecondrL   total1total2	pred_rows	succ_rowspredsuccs                              r   emit_pair_countsrq    sD   K#L1 =;6%++- 	=JC~~l+bc(,,S11a&&3q6{';<		== 
(G	H 
&
&--k3? 	;MUDDAq%JKKS6!94e\%QV=W%j%8: ;	;
 	=	

 
.8j	k "..{/B/BC ,,[-@-@A
(002&..0&1 	1"E?E6.3V$U+,1
5!&)"6*e3* '50'	1 {{} 	GD!'*F%a(F{v{$&&I	2>q/2M2Ma2PR!.$ %TlEeFl35GI R	 R2<Q-2K2KA2NP!.$ %TlEeFl35GI P	 Pq$DTF"KL D B	 	 
 
<RP / sW   BJ0)A<K&A8KJ=
9KK
0KK	
K0J:=K	KKKc                 "   t        |       }t        |      }t        ||       t        ||       t	        |       t        ||       t        |        t        |        t        dd      5  t        dd| d   fg       d d d        y # 1 sw Y   y xY w)Nz
Meta statszMeta statisticsr   )r   rd   zNumber of data filesr   )
r   rV  r   rq  r  r+  r;  rR  ri   rj   )r   r   r7   s      r   output_single_statsrs  8  s    '.Ll#E,.\5)l+ u5Ee	'8	9 T>%;U<=P$Q#RST T Ts   )BBc                     t        |       }t        |      }t        |      }t        |      }t        ||||       t        ||       t	        ||||       t        | |       t        | |       y r   )r   rV  r  r  r-  rA  rT  )r?  r@  r	  rx   r
  ry   s         r   output_comparative_statsru  E  sz    ,Z8,-J,Z8,-J%:'8* *, -:'8*  
J7!*j9r   c                 \   t        |       dk(  r2t        | d         }|t        j                  ||       t	        |       nCt        |       dk(  r5|t        d      t        | d         }t        | d         }t        ||       t        d       t        dt        j                                y )Nr   r   r   z5Can not output to JSON when there are multiple inputsr   zStats gathered on:)
r   r   r   dumprs  r    ru  r   r   today)inputsjson_outputr   r?  r@  s        r   output_statsr{  X  s    
6{aVAY'"IIe[)E"	V	"G  "&),
!&),
 Z8	%L	


-r   c            	      v   t        j                  d      } | j                  ddt        t        gdt         d       | j                  dd	t        j
                  d
      d       | j                         }t        |j                        dkD  rt        d      t        |j                  |j                         y )NzSummarize pystats results)descriptionry  *aU  
        Input source(s).
        For each entry, if a .json file, the output provided by --json-output from a previous run;
        if a directory, a directory containing raw pystats .txt files.
        If one source is provided, its stats are printed.
        If two sources are provided, comparative stats are printed.
        Default is z
.
        )nargstyper(   helpz--json-output?wz3Output complete raw results to the given JSON file.)r  r  r  r   z0-2 arguments may be provided.)rz  )argparseArgumentParseradd_argumentr   DEFAULT_DIRFileType
parse_argsr   ry  r    r{  rz  )parserr   s     r   mainr  k  s    $$1LMF
  = !	   s#B	   D
4;;!9::$*:*:;r   __main__)	SPEC_FAIL)r   r   )C__doc__r  r   r   os.pathr   r   datetimer   r_  r   rL   r  iterr   r   r   r4   nextStopIterationr5   rI   ra  r  r3   r   rh   r   r,   r;   r@   rT   rl   r|   r   r   r   r   rK   r   rk   ri   r   rj   r   r   r  r  r  r  r#  r+  r-  r2  r6  r;  rA  rN  rR  rT  rV  rq  rs  ru  r{  r  r   )r   rL   s   00r   <module>r     s          
77d?(K"K 6334
MM!" Ds	$D MM$ !*& 12WQq2VEKKM"#F!$QL$$C 8G0
- /, ,&,

<CfC(
(3
	
.4
w3j
T:&.&<@ zF c  		 	3s   2EEEE