+
    ˜°³j”,  ã                  ó&  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ]
'       d   ^ RIHt ]P                   ! R R4      4       tR R	 ltR
 R ltR R ltR R lt0 RmtR R lt0 RmtR R ltR R lt]]]]]].tR]R&   R R ltR# )a  
Validates Chrome traces emitted by ``torch.profiler`` against rules derived
from production issues.

Usage::

    from torch.profiler._trace_validator import validate_trace

    passed, violations = validate_trace("trace.pt.trace.json")
    for v in violations:
        print(v)
)ÚannotationsN)Údefaultdict)ÚTYPE_CHECKING)ÚCallablec                  ó<   € ] tR t^t$ RtR]R&   R]R&   R R ltRtR# )	Ú	Violationz)A single rule violation found in a trace.ÚstrÚ	rule_nameÚmessagec               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "Ú`/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/profiler/_trace_validator.pyÚ__annotate__ÚViolation.__annotate__#   s   € ÷ 3ñ 3˜ñ 3ó    c                	ó8   € V P                    R V P                   2# )z: ©r	   r
   )Úselfs   &r   Ú__str__ÚViolation.__str__#   s   € Ø—.‘.Ð!  D§L¡L >Ð2Ð2r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   Ú__static_attributes__r   r   r   r   r      s   ‡ á3àƒNØƒL÷3ñ 3r   r   c               ó    € V ^8„  d   QhRRRR/# )r   Úpathr   r   ú
list[dict]r   )r   s   "r   r   r   '   s   € ÷ 6ñ 6�sð 6˜zñ 6r   c                ó˜  € V P                  R 4      '       d   \        P                  M\        pV! V RRR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        X\        4      '       d   TMVP                  R. 4      pV Uu. uF  p\        V\        4      '       g   K  VNK  	  up#   + '       g   i     Ld; iu upi )z.gzÚrtzutf-8)ÚencodingNÚtraceEvents)	ÚendswithÚgzipÚopenÚjsonÚloadÚ
isinstanceÚlistÚgetÚdict)r!   ÚopenerÚfhÚdataÚeventsÚes   &     r   Ú_load_eventsr5   '   s‰   € ØŸ-™-¨×.Ò.ŒT�YŠY´D€FÙ	��d W×	-Õ	-°Ü�yŠy˜‹}ˆ÷ 
.ä ¤d×+Ò+‰T°·±¸-ÈÓ1L€FÙÓ5‘v�!¤¨A¬t×!4�AˆA‘vÑ5Ð5÷ 
.×	-üò 6s   ÁB4ÂCÂ+CÂ4C	c               ó    € V ^8„  d   QhRRRR/# ©r   r3   r"   r   zlist[Violation]r   )r   s   "r   r   r   /   s   € ÷ +ñ +¨
ð +°ñ +r   c                ó˜  € / p/ pV  EF  pVP                  R4      R8w  d   K  VP                  R/ 4      pVP                  R4      pVf   KE  \        V4      pVP                  RR4      VP                  RR4      \        VP                  R^ 4      4      r‡pVP                  R	4      p	VR
8X  d0   VR8X  d)   WQ9  g   W�V,          R,          8  d   RVRVRV	/W&   KÓ  KÕ  VR8X  g   KÞ  WR9  g   W‚V,          R,          8  g   Kú  RVRVRV	/W%&   EK  	  . p
VP                  4        F¤  w  r[VP                  V4      pVf   K  VR,          VR,          8  g   K3  VR,          VR,          ,
          pV
P	                  \        RRVR,           RV RVR,           RVR RV RVR,           RVR,          R RVR,          R 2R7      4       K¦  	  V
# )z€For each (cudaLaunchKernel, GPU kernel) pair matched by External id,
the GPU kernel must start at or after its cudaLaunchKernel.ÚphÚXÚargsúExternal idÚcatÚ ÚnameÚtsÚcorrelationÚcuda_runtimeÚcudaLaunchKernelÚcorrÚkernelÚ_check_gpu_kernel_causalityzGPU kernel 'z' (External id=z, correlation=z	) starts ú.1fz,us before its cudaLaunchKernel (External id=z
), gpu_ts=z	, cpu_ts=r   )r.   ÚintÚfloatÚitemsÚappendr   )r3   Úcpu_launchesÚgpu_kernelsÚevr;   Úext_idr=   r?   r@   rD   Ú
violationsÚgpuÚlaunchÚskews   &             r   rF   rF   /   sç  € ð %'€LØ#%€KäˆØ�6‰6�$‹<˜3ÔÙØ�v‰v�f˜bÓ!ˆØ—‘˜-Ó(ˆØŠ>ÙÜ�V“ˆØŸ™˜u bÓ)¨2¯6©6°&¸"Ó+=¼uÀRÇVÁVÈDÐRSÃ_Ó?U�2ˆØ�x‰x˜Ó&ˆà�.Ô  TÐ-?Ô%?ØÔ)¨R¸vÕ2FÀtÕ2LÔ-LØ(,¨b°&¸$ÀÈÐ'M�Ó$ñ .Mà�HŽ_ØÔ(¨B¸VÕ1DÀTÕ1JÖ,JØ'+¨R°¸¸vÀtÐ&L�Ô#ñ! ð$ €JØ"×(Ñ(Ö*‰ˆØ×!Ñ! &Ó)ˆØŠ>ÙØˆt�9�v˜d•|Ö#Ø˜$•< # d¥)Õ+ˆDØ×ÑÜØ;à& s¨6¥{ m°?À6À(ð K'Ø'*¨6¥{ m°9¸TÀ#¸Jð G=Ø=C¸Hð E'Ø'-¨f¥~Ð&6ð 7"Ø"% d¥)¨C °	¸&À½,ÀsÐ9Kð	Mô	öñ +ð$ Ðr   c               ó    € V ^8„  d   QhRRRR/# r7   r   )r   s   "r   r   r   ]   s   € ÷ ñ °ð Àñ r   c                óÄ  € RR0p. pV  FÓ  pVP                  R4      R8w  d   K  VP                  R/ 4      pVP                  R4      pWQ9  d   KF  VP                  R4      pVe   \        V4      ^ 8  g   Km  \        VP                  R^ 4      4      pVP                  \	        R	R
V RVR RVP                  R4       RVP                  R4       RV: 2
R7      4       KÕ  	  V# )zZStream Wait Events and Event Synchronize must have
wait_on_cuda_event_record_corr_id >= 0.úStream Wait Eventz
Event Syncr9   r:   r;   Úcuda_sync_kindÚ!wait_on_cuda_event_record_corr_idr@   Ú$_check_stream_wait_corr_id_populatedÚ'z' event at ts=rG   zus on device=Údeviceú stream=Ústreamz/ has invalid wait_on_cuda_event_record_corr_id=r   )r.   rH   rI   rK   r   )r3   ÚTARGET_KINDSrP   rN   r;   Ú	sync_kindÚraw_corrr@   s   &       r   rY   rY   ]   sò   € ð (¨Ð6€Là€JÛˆØ�6‰6�$‹<˜3ÔÙØ�v‰v�f˜bÓ!ˆØ—H‘HÐ-Ó.ˆ	ØÔ(ÙØ—8‘8Ð?Ó@ˆØÒœs 8›}¨qÖ0Ü�r—v‘v˜d A“Ó'ˆBØ×ÑÜØDà˜I˜; n°R¸°Hð ="Ø"&§(¡(¨8Ó"4Ð!5°X¸d¿h¹hÀxÓ>PÐ=Qð RIØIQÉðVôö	ñ ð( Ðr   c               ó    € V ^8„  d   QhRRRR/# r7   r   )r   s   "r   r   r   z   s   € ÷ 5ñ 5 zð 5°oñ 5r   c                ó6  € . pV  FÖ  pVP                  R4      R8X  g   K  VP                  R4      R8X  g   K3  VP                  R/ 4      P                  R4      R8X  g   K[  VP                  R/ 4      pVP                  R\        VP                  R^ 4      4      R	\        VP                  R	^ 4      4      R
VP                  R
4      RVP                  R4      /4       KØ  	  V'       g   . # \        \        4      pV  FÏ  pVP                  R4      R8X  g   K  VP                  R4      R8X  g   K3  VP                  R/ 4      pVP                  R4      VP                  R
4      3p\        VP                  R^ 4      4      pWE,          P                  RVRV\        VP                  R	^ 4      4      ,           RVP                  RR4      /4       KÑ  	  . pV FÄ  pVR,          VR
,          3pVP                  V. 4       F™  p	V	R,          VR,          u;8  d   V	R,          8  g   K)  M K-  V	R,          VR,          ,
          p
VP                  \        RRVR,           RVR
,           RVR,          R RV	R,           RV	R,          R RV
R R2R7      4       K›  	  KÆ  	  V# )zwFor each Stream Synchronize on (device, stream), no kernel on that
stream should still be running when the sync starts.r9   r:   r=   Ú	cuda_syncr;   rW   zStream Syncr@   Údurr]   r[   rE   Úendr?   r>   Ú_check_stream_sync_overlapzStreamSynchronize on device=r\   z at ts=rG   zus but kernel 'z' (ends zus) is still running (zus overlap)r   )r.   rK   rI   r   r-   r   )r3   Ústream_syncsrN   r;   Úkernels_by_streamÚkeyr@   rP   ÚsyncÚkÚoverlaps   &          r   rf   rf   z   s_  € ð €LÛˆà�F‰F�4‹L˜CÖØ—‘�u“ Ö,Ø—‘�v˜rÓ"×&Ñ&Ð'7Ó8¸MÖIà—6‘6˜& "Ó%ˆDØ×Ñàœ% §¡ t¨Q£Ó0Øœ5 §¡¨¨qÓ!1Ó2Ø˜dŸh™h xÓ0Ø˜dŸh™h xÓ0ð	öñ ÷ Øˆ	ä1<¼TÓ1BÐÛˆØ�6‰6�$‹<˜3Ö 2§6¡6¨%£=°HÖ#<Ø—6‘6˜& "Ó%ˆDØ—8‘8˜HÓ% t§x¡x°Ó'9Ð:ˆCÜ�r—v‘v˜d A“Ó'ˆBØÕ"×)Ñ)à˜"Ø˜2¤ b§f¡f¨U°AÓ&6Ó 7Õ7Ø˜BŸF™F 6¨2Ó.ðöñ ð €JÛˆØ�H�~˜t H�~Ð.ˆØ"×&Ñ& s¨BÖ/ˆAØ��w˜˜d�Ö. a¨¥h×.Ò.Ø˜E�( T¨$¥ZÕ/�Ø×!Ñ!ÜØ">à:¸4À½>Ð:Jð K&Ø&*¨8¥nÐ%5°W¸TÀ$½ZÈÐ<Lð M+Ø+,¨V­9¨+°X¸aÀ½hÀs¸^ð L1Ø18¸°¸[ðJôö
ó 0ñ ð  Ðr   c               ó    € V ^8„  d   QhRRRR/# r7   r   )r   s   "r   r   r   º   s   € ÷ 7ñ 7¨zð 7¸oñ 7r   c                ó¼  € / pV  FÀ  pVP                  R4      R8X  g   K  VP                  R4      R9   g   K3  VP                  R4      \        9   g   KO  VP                  R/ 4      p\        VP                  R^ 4      4      pR F>  pVP                  V4      pVf   K  \        V4      pWa9  g   WAV,          8  g   K:  WAV&   K@  	  KÂ  	  . pV  EF
  pVP                  R4      R8w  d   K  VP                  R/ 4      pVP                  R4      R8w  d   KF  VP                  R	4      pVe   \        V4      ^ 8  d   Km  \        V4      p\        VP                  R^ 4      4      p	VP                  V4      p
V
f'   VP	                  \        R
RV	R RV R2R7      4       KÎ  W©8”  g   KÖ  W©,
          pVP	                  \        R
RV	R RV RVR RV
R R2	R7      4       EK  	  V# )zlwait_on_cuda_event_record_corr_id must point to a cudaEventRecord
with cudaEventRecord.ts <= stream_wait.ts.r9   r:   r=   r?   r;   r@   rW   rV   rX   Ú"_check_stream_wait_corr_id_in_pastzStream Wait Event at ts=rG   zus references corr_id=z) but no matching cudaEventRecord in tracer   z'us references cudaEventRecord (corr_id=z) z"us in the future (event_record_ts=Ú))rB   Úcuda_driver)r<   rA   )r.   Ú_CUDA_EVENT_RECORD_NAMESrI   rH   rK   r   )r3   Úevent_record_tsrN   r;   r@   ÚfieldÚcidrP   ÚrefÚsw_tsÚ	record_tsÚlags   &           r   ro   ro   º   sÚ  € ð )+€OÛˆà�F‰F�4‹L˜CÖØ—‘�u“Ð!@Ö@Ø—‘�v“Ô":Ö:à—6‘6˜& "Ó%ˆDÜ�r—v‘v˜d A“Ó'ˆBÛ7�Ø—h‘h˜u“o�Ø”?Ü˜c›(�CØÔ1°RÈ#Õ:NÖ5NØ/1¨Ó,ó 8ñ ð €JÜˆØ�6‰6�$‹<˜3ÔÙØ�v‰v�f˜bÓ!ˆØ�8‰8Ð$Ó%Ð)<Ô<ÙØ�h‰hÐ:Ó;ˆØŠ;œ#˜c›( Qœ,ÙÜ�#‹hˆÜ�b—f‘f˜T 1“oÓ&ˆØ#×'Ñ'¨Ó,ˆ	àÒØ×ÑÜØBà2°5¸°+ð >#Ø#& %Ð'PðRôöð ÖØÕ#ˆCØ×ÑÜØBà2°5¸°+ð >4Ø47°5¸¸3¸s¸)ð D,Ø,5°c¨?¸!ð=ô÷	ñ3 ðF Ðr   c               ó    € V ^8„  d   QhRRRR/# r7   r   )r   s   "r   r   r   ý   s   € ÷ ñ  ð °ñ r   c                ó‚  € . pV  F¶  pVP                  R4      R8w  g   VP                  R4      R8w  d   K1  VP                  R/ 4      p\        \        VP                  4       4      ,
          pV'       g   Kq  VP	                  \        RR\        VP                  R^ 4      4      R	 R
\        V4       2R7      4       K¸  	  V# )zhrecord_param_comms events must carry: Collective name, dtype,
In msg nelems, Out msg nelems, Group size.r9   r:   r?   Úrecord_param_commsr;   Ú_check_nccl_metadataz'record_param_comms' at ts=r@   rG   zus missing metadata: r   )r.   Ú_NCCL_REQUIRED_FIELDSÚsetÚkeysrK   r   rI   Úsorted)r3   rP   rN   r;   Úmissings   &    r   r}   r}   ý   s¯   € ð €JÛˆØ�6‰6�$‹<˜3Ô "§&¡&¨£.Ð4HÔ"HÙØ�v‰v�f˜bÓ!ˆÜ'¬#¨d¯i©i«kÓ*:Õ:ˆß‰7Ø×ÑÜØ4à5´e¸B¿F¹FÀ4È»OÓ6LÈSÐ5Qð R-Ü-3°G«_Ð,=ð?ôöñ ð Ðr   c               ó    € V ^8„  d   QhRRRR/# r7   r   )r   s   "r   r   r     s   € ÷ ñ ¨jð ¸_ñ r   c                ó˜  € \        \        4      pV  FÙ  pVP                  R4      R8w  d   K  VP                  RR4      pRV9  d   K6  VP                  R/ 4      pVP                  R4      ;'       g    VP                  R4      pVf   Kx  \        V4      pR	V9   d(   VP	                  R	^4      R,          P                  4       MTpWaV,          9  g   KÂ  W,          P                  V4       KÛ  	  . pVP                  4        FE  w  rX\        V4      ^8”  g   K  VP                  \        R
RV R\        V4       RV 2R7      4       KG  	  V# )z;Per Sequence number, at most one distinct backward op name.r9   r:   r?   r>   z$autograd::engine::evaluate_function:r;   zSequence numberÚseq_numÚ:Ú!_check_backward_seq_id_uniquenesszSequence number z shared by z backward ops: r   éÿÿÿÿ)
r   r-   r.   rH   ÚsplitÚstriprK   rJ   Úlenr   )	r3   Ú
seq_to_opsrN   r?   r;   ÚseqÚoprP   Úopss	   &        r   r‡   r‡     s.  € ä'2´4Ó'8€JÛˆØ�6‰6�$‹<˜3ÔÙØ�v‰v�f˜bÓ!ˆØ1¸Ô=ÙØ�v‰v�f˜bÓ!ˆØ�h‰hÐ(Ó)×@Ð@¨T¯X©X°iÓ-@ˆØŠ;ÙÜ�#‹hˆØ/2°d¬{ˆT�Z‰Z˜˜QÓ Õ#×)Ñ)Ô+ÀˆØ •_Ö$Ø�O×"Ñ" 2Ö&ñ ð €JØ×$Ñ$Ö&‰ˆÜˆs‹8�aŽ<Ø×ÑÜØAà*¨3¨%¨{¼3¸s»8¸*ð E Ø #˜uð&ôöñ 'ð Ðr   z-list[Callable[[list[dict]], list[Violation]]]Ú_RULESc               ó    € V ^8„  d   QhRRRR/# )r   Ú
trace_pathr   r   ztuple[bool, list[Violation]]r   )r   s   "r   r   r   >  s   € ÷ 4ñ 4˜sð 4Ð'Cñ 4r   c                ó„   € \        V 4      p. p\         F  pVP                  V! V4      4       K  	  \        V4      ^ 8H  V3# )zó
Run all validation rules against a Chrome trace JSON file.

Args:
    trace_path: Path to ``.pt.trace.json`` or ``.pt.trace.json.gz``.

Returns:
    A ``(passed, violations)`` tuple.  ``passed`` is ``True`` when no
    violations were found.
)r5   r�   Úextendr‹   )r’   r3   Úall_violationsÚrules   &   r   Úvalidate_tracer—   >  sD   € ô ˜*Ó%€FØ&(€NßˆØ×Ñ™d 6›lÖ+ñ äˆ~Ó !Ñ# ^Ð3Ð3r   >   ÚcudaEventRecordÚcudaEventRecord_ptszÚcudaEventRecordWithFlagsÚcudaEventRecordWithFlags_ptsz>   Údtypeú
Group sizeúIn msg nelemsúOut msg nelemsúCollective name)Ú__conditional_annotations__r   Ú
__future__r   Údataclassesr(   r*   Úcollectionsr   Útypingr   Úcollections.abcr   Ú	dataclassr   r5   rF   rY   rf   rr   ro   r~   r}   r‡   r�   r   r—   )r¡   s   @r   Ú<module>r¨      s¥   øðôõ #ã Û Û Ý #Ý  ÷ Ý(ð ×Ñ÷3ð 3ó ð3õ6õ+õ\õ:5òpÐ õ7òtÐ õõ,ðD  Ø(ØØ&ØØ%ð9€Ð5ó ÷4r   