Ë
    S²jTB  ã                   ó0  — d dl Z d dlZd dlmZm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mZmZ d dlZd dlZ ej                   e«      Zd„ Zd„ Z e«       Zd„ Zeee ed«      eefZdZd	„ Z G d
„ de«      Z dddœd„Z!d„ Z"d„ Z#d„ Z$d„ Z%dZ&dZ'd„ Z(d„ Z)d„ Z*y)é    N)ÚAnyÚ
NamedTuple)ÚNamedTemporaryFile)Ú_frames_fmtÚ_block_extrac                 óž   ‡ ‡‡— dŠdˆfd„}t        j                  |«       dˆˆ fd„Št        j                  j	                  ‰«       dˆfd„}|S )NTc                  ó
   •— dŠ y )NF© )Úenableds   €úV/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/utils/viz/_cycles.pyÚdisablez observe_garbage.<locals>.disable   s
   ø€ ð ‰ó    c                 óÚ   •‡‡‡— ‰sy | dk(  r$t        j                  t         j                  «       y | dk(  r6t        j                  «       ŠdgŠˆˆˆˆˆfd„}t        j
                  |«       y y )NÚstartÚstopFc                  ó  •— ‰d   sd‰d<   nít        j                  ‰«       dŠ	 ‰d   dk7  rt        j                  «         ‰t        j                  «       t        j                  j                  «        t        j                  d«       t        j                  j                  «       }t        j                  «        t        j                  j                  «       }||k7  rt        j                  d||z
  «       dŠ‰� ‰| i |¤ŽS y # dŠw xY w)Nr   TFÚ
generationé   z.CUDA Memory changed during GC, %d bytes freed.)ÚsysÚ
setprofileÚgcÚcollectÚgarbageÚclearÚ	set_debugÚtorchÚcudaÚmemory_allocatedÚloggerÚwarning)	ÚargsÚkwargsÚbeforeÚafterr   ÚinfoÚobserverÚ
orig_traceÚself_returns	       €€€€€r   Ú
do_collectz8observe_garbage.<locals>.gc_callback.<locals>.do_collect#   sÝ   ø€ à" 1’~Ø%)�K ’Nä—N‘N :Ô.Ø#�Gð'ð   Ñ-°Ò2ÜŸJ™JœLÙ ¤§¡Ô,ÜŸ
™
×(Ñ(Ô*ô Ÿ™ QœÜ!&§¡×!<Ñ!<Ó!>˜ÜŸ
™
œÜ %§
¡
× ;Ñ ;Ó =˜Ø! Uš?Ü"ŸN™NÐ+[Ð]cÐfkÑ]kÔlà"&˜ØÐ)Ù% tÐ6¨vÑ6Ð6ð *øð #'™ús   ¥CD ÄD	)r   r   ÚDEBUG_SAVEALLr   Ú
getprofiler   )Úphaser%   r)   r'   r(   r   r&   s    ` @@€€r   Úgc_callbackz$observe_garbage.<locals>.gc_callback   s[   û€ áØØ�GÒÜ�L‰Lœ×)Ñ)Õ*Ø�fŠ_ÜŸ™Ó)ˆJØ ˜'ˆK÷7ð 7ô: �N‰N˜:Õ&ðC r   c                  óD   •— t         j                  j                  ‰ «       y ©N)r   Ú	callbacksÚremove)r-   s   €r   r1   zobserve_garbage.<locals>.removeE   s   ø€ Ü
�‰×Ñ˜KÕ(r   ©ÚreturnN)ÚatexitÚregisterr   r0   Úappend)r&   r   r1   r   r-   s   `  @@r   Úobserve_garbager7      s?   ú€ Ø€Gõô
 ‡O�O�GÔö''ôR ‡L�L×Ñ˜Ô$õ)à€Mr   c                  óD   — dd„} t         | «       j                  d   «      S )Nc                 ó   ‡ — ˆ fd„S )Nc                  ó   •— ‰ S r/   r
   ©Úxs   €r   ú<lambda>z+_get_cell_type.<locals>.f.<locals>.<lambda>Z   s   ø€ �q€ r   r
   r;   s   `r   Úfz_get_cell_type.<locals>.fY   s	   ø€ ÛÐr   r   r/   )ÚtypeÚ__closure__)r>   s    r   Ú_get_cell_typerA   X   s   € óä‘“—‘ Ñ"Ó#Ð#r   c                 ó$  ‡ ‡‡‡— i Šdˆfd„Šdˆˆ fd„Šdˆfd„}dˆfd„}dˆˆ fd„}dˆˆ fd„}dˆˆ fd„}dˆfd„}dˆˆ fd	„}dˆˆˆ fd
„}dˆfd„}	t         |t        |t        |t        |t        |t
        j                  |t
        j                  |t        |t
        j                  |t        j                  |t
        j                  |	i}
t        ‰ «      j                  D ]  }||
v sŒ |
|   «        Œ  ‰dd«       t        ‰ t        «      r ‰d«       ‰S )a%  
    Return known information about references held by the given object.

    Returns a mapping from referents to lists of descriptions.  Note that there
    may be more than one edge leading to any particular referent; hence the
    need for a list.  Descriptions are currently strings.

    c                 óZ   •— ‰j                  t        |«      g «      j                  | «       y r/   )Ú
setdefaultÚidr6   )ÚnameÚobjÚ
referencess     €r   Úadd_referencez+annotated_references.<locals>.add_referencej   s"   ø€ Ø×Ñœb ›g rÓ*×1Ñ1°$Õ7r   c                  óT   •— | D ]"  }t        ‰|«      sŒ ‰|t        ‰|«      «       Œ$ y r/   )ÚhasattrÚgetattr)ÚattrsÚattrrI   rG   s     €€r   Ú	add_attrsz'annotated_references.<locals>.add_attrsm   s-   ø€ Øò 	8ˆDÜ�s˜DÕ!Ù˜d¤G¨C°Ó$6Õ7ñ	8r   c                  ó6   •— 	  ‰ d«       y # t         $ r Y y w xY w)NÚcell_contents)Ú
ValueError©rO   s   €r   Úadd_cell_referencesz1annotated_references.<locals>.add_cell_referencesr   s$   ø€ ð	Ù�oÕ&øÜò 	ñ
 ð	ús   ƒ Œ	—c                  ó&   •—  ‰ ddddddddd	«	       y )
NÚ__defaults__r@   Ú__globals__Ú__code__Ú__name__Ú
__module__Ú__doc____qualname__Ú__annotations__Ú__kwdefaults__r
   rS   s   €r   Úadd_function_referencesz5annotated_references.<locals>.add_function_references|   s'   ø€ Ù�.ØØØØØð!à#Ø"õ		$r   c                  óF   •— t        ‰«      D ]  \  } } ‰d| › d�|«       Œ y )Nú[ú])Ú	enumerate)ÚpositionÚitemrI   rG   s     €€r   Úadd_sequence_referencesz5annotated_references.<locals>.add_sequence_references‰   s,   ø€ Ü'¨›nò 	1‰NˆH�dÙ˜A˜h˜Z q˜/¨4Õ0ñ	1r   c                  ót   •— ‰j                  «       D ]$  \  } } ‰d| «        ‰dt        | «      › d�|«       Œ& y )NÚkeyr`   ra   )ÚitemsÚrepr)rg   ÚvaluerI   rG   s     €€r   Úadd_dict_referencesz1annotated_references.<locals>.add_dict_references�   s=   ø€ ØŸ)™)›+ò 	3‰JˆC�Ù˜% Ô%Ù˜Aœd 3›i˜[¨Ð*¨EÕ2ñ	3r   c                  ó&   •— ‰D ]  }  ‰d| «       Œ y )NÚelementr
   )ÚeltrI   rG   s    €€r   Úadd_set_referencesz0annotated_references.<locals>.add_set_references’   s   ø€ Øò 	*ˆCÙ˜) SÕ)ñ	*r   c                  ó   •—  ‰ ddd«       y )NÚ__self__Ú__func__Úim_classr
   rS   s   €r   Úadd_bound_method_referencesz9annotated_references.<locals>.add_bound_method_references–   s   ø€ Ù�*˜j¨*Õ5r   c                  ó¢   •— t        ‰«      t        j                  u r3t        j                  ‰«      } t        | «      dk(  r| d   } ‰d|«       y y y )Né   r   Ú__callback__)r?   ÚweakrefÚrefr   Úget_referentsÚlen)Ú	referentsÚtargetrI   rG   s     €€r   Úadd_weakref_referencesz4annotated_references.<locals>.add_weakref_references™   sN   ø€ ô �‹9œŸ™Ñ#Ü×(Ñ(¨Ó-ˆIÜ�9‹~ Ò"Ø" 1™�Ù˜n¨fÕ5ð #ð $r   c                  ó¸   •— ‰j                   }  ‰dddddd«       t        | «      t        u r/‰j                   j                  «       D ]  \  }} ‰d|› �|«       Œ y y )NÚf_backÚf_codeÚ
f_builtinsÚ	f_globalsÚf_traceÚf_localszlocal )r…   r?   Údictrh   )r…   rF   ÚlocalrO   rI   rG   s      €€€r   Úadd_frame_referencesz2annotated_references.<locals>.add_frame_references£   sa   ø€ Ø—<‘<ˆÙ�(˜H l°KÀÈJÔWô �‹>œTÑ!Ø"Ÿ|™|×1Ñ1Ó3ò 6‘��eÙ  t f˜o¨uÕ5ñ6ð "r   c                  ó   •—  ‰ ddd«       y )NÚ__objclass__rY   Ú__doc__r
   rS   s   €r   Ú add_getset_descriptor_referencesz>annotated_references.<locals>.add_getset_descriptor_references­   s   ø€ Ù�. *¨iÕ8r   Ú__dict__Ú	__class__Ú__mro__r2   )ÚtupleÚlistr†   ÚsetÚ	frozensetÚtypesÚFunctionTypeÚ	FrameTypeÚCellTypeÚ
MethodTyperx   ry   ÚGetSetDescriptorTyper?   r�   Ú
isinstance)rG   rT   r^   re   rk   ro   rt   r~   rˆ   rŒ   Útype_based_referencesÚtype_rO   rI   rH   s   `           @@@r   Úannotated_referencesr�   _   sý   û€ ð (*€Jõ8ö8õ
õ
$ö1ö3ö
*õ6ö6÷6õ9ô 	Ð&ÜÐ%ÜÐ!ÜÐÜÐ%Ü×ÑÐ3Ü�‰Ð-ÜÐ%Ü×ÑÐ5Ü�‰Ð+Ü×"Ñ"Ð$DðÐô �c“×"Ñ"ò +ˆØÐ)Ò)Ø(Ð! %Ñ(Õ*ð+ñ ˆj˜+Ô&Ü�#”tÔÙ�)ÔàÐr   é    c                 ór  — d„ }t        | t        «      rt        | «      S t        | «      j                  dk(  rd| j                  › �S t        | t
        j                  «      r	 | j                  j                  }d|› �S t        | t        «      rd || «      › d�S t        | t        «      rd || «      › d	�S t        | t        «      rd
t        | «      › d�S t        | t
        j                  «      rd| j                  › �S t        | t        «      rd| j                  › �S t        | t        j                   «      r | «       }|€ydt#        |«      d›�S t        | t
        j$                  «      rJ| j&                  j(                  }t        |«      t*        kD  rd|t*        dz
   d z   }d|› d| j,                  › �S t/        | «      r<dt        | «      j0                  › dt        | «      j                  › d| j2                  › d	�S dt        | «      j0                  › dt        | «      j                  › �S # t        $ r d}Y �Œ¾w xY w)zx
    Return a string to be used for Graphviz nodes.

    The string should be short but as informative as possible.
    c                 ó~   — dj                  d„ | d d D «       «      }t        | «      dkD  r|› dt        | «      dz
  › �}|S )Nú,c              3   ó|   K  — | ]4  }t        |t        «      rt        |«      nt        |«      j                  –— Œ6 y ­wr/   )rš   Ú
BASE_TYPESri   r?   rY   )Ú.0r<   s     r   ú	<genexpr>z=object_annotation.<locals>.format_sequence.<locals>.<genexpr>×   s-   è ø€ ÒdÐWX¤:¨a´Ô#<œ˜QœÄ$ÀqÃ'×BRÑBRÓRÑdùs   ‚:<é   z, ...)Újoinr{   )rG   Úbodys     r   Úformat_sequencez*object_annotation.<locals>.format_sequenceÖ   sH   € Ø�x‰xÑdÐ\_Ð`bÐabÐ\cÔdÓdˆÜˆs‹8�aŠ<Ø�V˜5¤ S£¨A¡ Ð/ˆDØˆr   Úfunctionz	function
z<anonymous>zinstancemethod
r`   ra   ú(ú)zdict[zmodule
ztype
Nzweakref (dead referent)zweakref to id 0xr<   z...é   zframe
ú:zobject
ú.z ()rš   r£   ri   r?   rY   r”   r˜   rr   Ú__qualname__ÚAttributeErrorr‘   r�   r†   r{   Ú
ModuleTyperx   ry   rE   r–   r�   Úco_filenameÚFRAME_FILENAME_LIMITÚf_linenoÚis_cuda_tensorrZ   Úshape)rG   r©   Ú	func_nameÚreferentÚfilenames        r   Úobject_annotationr»   Ï   s  € òô �#”zÔ"Ü�C‹yÐÜˆCƒy×Ñ˜ZÒ'Ø˜CŸL™L˜>Ð*Ð*Ü	�Cœ×)Ñ)Ô	*ð	&ØŸ™×1Ñ1ˆIð " ) Ð-Ð-Ü	�CœÔ	Ø‘? 3Ó'Ð(¨Ð*Ð*Ü	�CœÔ	Ø‘? 3Ó'Ð(¨Ð*Ð*Ü	�CœÔ	Ø”s˜3“x�j Ð"Ð"Ü	�Cœ×)Ñ)Ô	*Ø˜#Ÿ,™,˜Ð(Ð(Ü	�CœÔ	Ø˜Ÿ™�~Ð&Ð&Ü	�CœŸ™Ô	%Ù“5ˆØÐØ,à%¤b¨£l°1Ð%5Ð6Ð6Ü	�CœŸ™Ô	)Ø—:‘:×)Ñ)ˆÜˆx‹=Ô/Ò/Ø˜xÔ*>ÀÑ*BÐ(CÐ(DÐEÑEˆHØ˜˜
 ! C§L¡L >Ð2Ð2Ü	˜Ô	Øœ$˜s›)×.Ñ.Ð/¨q´°c³×1CÑ1CÐ0DÀBÀsÇyÁyÀkÐQRÐSÐSàœ$˜s›)×.Ñ.Ð/¨q´°c³×1CÑ1CÐ0DÐEÐEøô7 ò 	&Ø%‹Ið	&ús   Á!H' È'H6È5H6c                   óL   — e Zd ZU eed<   edz  ed<   eed<   eeeef      ed<   y)ÚNodeÚlabelNÚcontextÚrootÚ
referrents)	rY   rZ   r°   Ústrr\   Úboolr‘   r�   Úintr
   r   r   r½   r½     s)   … ØƒJØ�4‰ZÓØ
ƒJØ�U˜3 ˜8‘_Ñ%Ô%r   r½   )r¿   Úfilterc          
      óº  — |€
t        «       }|€t        }| D �cg c]  }t        |t        j                  «      rŒ|‘Œ! } }| D �cg c]%  }t        t        |«       ||«       ||«      g «      ‘Œ' }}| D �cg c]  }g ‘Œ }}t        | «      D ��ci c]  \  }}t        |«      |“Œ }}}| D ]¤  }|t        |«         }||   }	t        |«      }
t        j                  |«      D ]l  }t        |«      }|j                  |«      }|€Œ"|
j                  |dg«      }||   j                  |«       |D ]  }|	j                  j                  ||f«       Œ! Œn Œ¦ t        |«      D ��cg c]  \  }}|j                  sŒ|‘Œ }}}t!        «       }|r?|j#                  «       }||v rŒ|j%                  |«       ||   }|j'                  |«       |rŒ?i }g }t        |«      D ])  \  }}||v sŒt)        |«      ||<   |j                  |«       Œ+ |D ]7  }|j                  D ��cg c]  \  }}||v r|||   f‘Œ c}}|j                  d d  Œ9 |S c c}w c c}w c c}w c c}}w c c}}w c c}}w )Nú?)Úcuda_allocation_contextr¶   rš   rx   Ú
ProxyTypesr½   r»   rb   rE   r�   r   rz   Úgetr6   rÁ   rÀ   r’   ÚpopÚaddÚextendr{   )Úobjectsr¿   rÅ   rG   ÚnodesÚnode_referrersÚiÚ
id_to_nodeÚfidxr>   rH   Ú	referrentÚridÚtidxÚlabelsr¾   ÚnÚ	to_searchÚto_keepÚidxÚ	referrersÚid_to_filtered_idÚfiltereds                          r   Úcreate_graphrß   	  st  € Ø€Ü)Ó+ˆØ€~Üˆà%ÖQ�s¬Z¸¼W×=OÑ=OÕ-PŠsÐQ€GÐQØT[Ö\ÈSŒTÔ# CÓ(©'°#«,¹¸s»ÀRÕHÐ\€EÐ\Ø5<Ö&=¨c¢rÐ&=€NÐ&=ä+4°WÓ+=×>¡  C”"�S“'˜1‘*Ð>€JÑ>Øò 3ˆØœ"˜S›'Ñ"ˆØ�$‰KˆÜ)¨#Ó.ˆ
Ü×)Ñ)¨#Ó.ò 	3ˆIÜ�Y“-ˆCØ—>‘> #Ó&ˆDØˆ|ØØ—^‘^ C¨#¨Ó/ˆFØ˜4Ñ ×'Ñ'¨Ô-Øò 3�Ø—‘×#Ñ# U¨D MÕ2ñ3ñ	3ð	3ô  )¨Ó/×:‘t�q˜!°1·6³6’Ð:€IÑ:Ü‹e€GÙ
Ø�m‰m‹oˆØ�'‰>ØØ�‰�CÔØ" 3Ñ'ˆ	Ø×Ñ˜Ô#ò ð )+ÐØ€HÜ˜%Ó ò ‰ˆˆ1Ø�Š<Ü#&Ð'8Ó#9Ð˜aÑ Ø�O‰O˜AÕðð ò 8ˆà/0¯|©|÷8Ù+  sØ!Ð%6Ñ6ð "Ð#4°SÑ#9Ò:ó 8ˆ�‰‘Q‰ð8ð €OùòM RùÚ\ùÚ&=ùã>ùó ;ùó 8s.   ™H<¹H<Á*IÁ3	IÂIÅIÅ1IÈIc                 ó,   — t        j                  | «      S r/   )ÚjsonÚdumps)rØ   s    r   Úescaperã   7  s   € Ü�:‰:�a‹=Ðr   c                 óº   — t        | t        j                  «      xr@ | j                  j                  dk(  xr% t        | t        j
                  j                  «       S )Nr   )rš   r   ÚTensorÚdevicer?   Ú_subclassesÚ
FakeTensor)rG   s    r   r¶   r¶   ;  sH   € ä�3œŸ™Ó%ò 	:Ø�
‰
�‰˜6Ñ!ò	:ä�sœE×-Ñ-×8Ñ8Ó9Ð9ðr   c                  óÞ   ‡— t         j                  j                  j                  «       } i Š| d   D ]4  }|d   }|d   D ]%  }|d   dk(  rt	        |«      \  }}|‰|<   ||d   z  }Œ' Œ6 ˆfd„}|S )NÚsegmentsÚaddressÚblocksÚstateÚactive_allocatedÚsizec                 ó¶   •— t        | «      rM| j                  «       j                  «       }‰j                  |«      }|�dj	                  t        |d¬«      «      S y )Nú
T)Úfull_filename)r¶   Úuntyped_storageÚdata_ptrrÊ   r§   r   )rG   ÚaddrÚframesÚaddr_to_frames      €r   Úobject_contextz/cuda_allocation_context.<locals>.object_contextM  sQ   ø€ Ü˜#ÔØ×&Ñ&Ó(×1Ñ1Ó3ˆDØ"×&Ñ& tÓ,ˆFØÐ!Ø—y‘y¤¨VÀ4Ô!HÓIÐIØr   )r   r   ÚmemoryÚ	_snapshotr   )ÚsnapshotÚsegrõ   Úblkrö   Ú
_real_sizerø   r÷   s          @r   rÈ   rÈ   B  s‘   ø€ Ü�z‰z× Ñ ×*Ñ*Ó,€HØ€MØ˜
Ñ#ò  ˆØ�9‰~ˆØ�x‘=ò 	 ˆCØ�7‰|Ð1Ò1Ü%1°#Ó%6Ñ"�˜
Ø&,�˜dÑ#Ø�C˜‘KÑ‰Dñ		 ð ôð Ðr   c                 ó~  — g d¢}t        | «      D ]@  \  }}|j                  |› dt        |j                  «      › d|j                  rdnd› d�«       ŒB t        | «      D ]<  \  }}|j
                  D ](  \  }}|j                  |› d|› dt        |«      › d	�«       Œ* Œ> |j                  d
«       dj                  |«      S )N)zdigraph GraphName {znode [shape=rect];zrankdir=LR;z [label=z, color=ÚredÚblackz];z -> z
 [label = ra   z}
rñ   )rb   r6   rã   r¾   rÀ   rÁ   r§   )rÏ   ÚlinesrÑ   rØ   r>   r¾   Újs          r   Úto_dotr  V  sÉ   € ÚH€EÜ˜%Ó ò ^‰ˆˆ1Ø�‰˜�s˜(¤6¨!¯'©'£?Ð"3°8ÀQÇVÂV¹EÐQXÐ;YÐY[Ð\Õ]ð^ô ˜%Ó ò B‰ˆˆ1ØŸ™ò 	B‰HˆE�1Ø�L‰L˜A˜3˜d 1 # Z´°u³¨¸aÐ@ÕAñ	BðBð 
‡L�L�ÔØ�9‰9�UÓÐr   a  
<!DOCTYPE html>
<html>
<head>
  <style>
    body {
      margin: 0;
      padding: 0;
      overflow: hidden;
    }

    #container {
      display: flex;
      flex-direction: column;
      height: 100vh;
    }

    #main {
      flex: 2;
      height: 60vh;
      overflow: clip;
    }

    #preContainer {
      flex: 1;
      height: 40vh;
      overflow: auto;
    }

    pre {
      margin: 0;
      padding: 10px;
    }
  </style>
</head>
<body>
  <div id="container">
    <div id="main">
    </div>
    <div id="preContainer">
      <pre id="stacktrace">Mouse over tensor objects to see where they were allocated.</pre>
    </div>
  </div>
<script src='https://cdnjs.cloudflare.com/ajax/libs/viz.js/1.8.0/viz-lite.js'></script>
<script>
let dot = $DOT
let image = Viz(dot, {format: 'svg', 'totalMemory': 1024*1024*1024});
let main = document.getElementById('main')
main.innerHTML = image
let svg = main.firstElementChild
// Panning and zooming logic
let isPanning = false;
let startX, startY;
let viewBox = { x: 0, y: 0, width: parseFloat(svg.getAttribute('width')), height: parseFloat(svg.getAttribute('height')) };
svg.removeAttribute('width');
svg.removeAttribute('height');
function updateViewBox() {
    svg.setAttribute('viewBox', `${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}`);
}
updateViewBox()
svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
svg.addEventListener('mousedown', function(e) {
    isPanning = true;
    startX = e.clientX;
    startY = e.clientY;
});
svg.addEventListener('mousemove', function(e) {
    if (!isPanning) return;
    const dx = (e.clientX - startX) * (viewBox.width / svg.clientWidth);
    const dy = (e.clientY - startY) * (viewBox.height / svg.clientHeight);
    viewBox.x -= dx;
    viewBox.y -= dy;
    startX = e.clientX;
    startY = e.clientY;
    updateViewBox();
});
svg.addEventListener('mouseup', function() {
    isPanning = false;
});
svg.addEventListener('mouseleave', function() {
    isPanning = false;
});
svg.addEventListener('wheel', function(e) {
    e.preventDefault();
    const zoomFactor = 0.1;
    const zoomAmount = e.deltaY > 0 ? 1 + zoomFactor : 1 - zoomFactor;
    // Calculate mouse position relative to the SVG
    const rect = svg.getBoundingClientRect();
    const mouseX = e.clientX - rect.left;
    const mouseY = e.clientY - rect.top;
    const mouseXRel = mouseX / svg.clientWidth;
    const mouseYRel = mouseY / svg.clientHeight;
    // Adjust viewBox to zoom around the mouse position
    const newWidth = viewBox.width * zoomAmount;
    const newHeight = viewBox.height * zoomAmount;
    viewBox.x += (viewBox.width - newWidth) * mouseXRel;
    viewBox.y += (viewBox.height - newHeight) * mouseYRel;
    viewBox.width = newWidth;
    viewBox.height = newHeight;
    updateViewBox();
});
$LISTENERS
</script>
</body>
</html>
z˜
document.getElementById('node{id}').addEventListener('mouseover', function(event) {{
  document.getElementById("stacktrace").textContent = {stack}
}})
c           	      ó„  — g }t        | «      D ]h  \  }}|j                  €Œt        j                  t	        |dz   «      t        |j                  › d|j                  › �«      ¬«      }|j                  |«       Œj t        | «      }t        j                  dt        |«      «      j                  ddj                  |«      «      S )Nrv   z:
)rE   Ústackz$DOTz
$LISTENERSrñ   )rb   r¿   Ú_listener_templateÚformatrÂ   rã   r¾   r6   r  Ú	_templateÚreplaceri   r§   )rÏ   Ú	listenersrÑ   rØ   ÚsÚdots         r   Úto_htmlr  Ð  s¬   € Ø€IÜ˜%Ó ò ‰ˆˆ1Ø�9‰9ÐØÜ×%Ñ%¬¨Q°©U«¼6ÀQÇWÁWÀIÈSÐQR×QZÑQZÐP[ÐB\Ó;]Ð%Ó^ˆØ×Ñ˜Õð	ô
 �‹-€CÜ×Ñ˜V¤T¨#£YÓ/×7Ñ7¸ÀdÇiÁiÐPYÓFZÓ[Ð[r   c                 óz   ‡ — t         j                  j                  j                  d¬«       dˆ fd„}t	        |«      S )Ni † )Úmax_entriesc                 ó�   •— | rCt        d„ | D «       «      st        j                  d«       y  ‰t        t	        | «      «      «       y y )Nc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr/   )r¶   )r¤   rG   s     r   r¥   z:observe_tensor_cycles.<locals>.observer.<locals>.<genexpr>ß  s   è ø€ Ò>¨s”~ c×*Ñ>ùs   ‚z No CUDA Tensors found in garbage)Úanyr   r%   r  rß   )r   Úcallbacks    €r   r&   z'observe_tensor_cycles.<locals>.observerÝ  s;   ø€ ÙÜÑ>°gÔ>Ô>Ü—‘Ð>Ô?ØÙ”Wœ\¨'Ó2Ó3Õ4ð	 r   r2   )r   r   rù   Ú_record_memory_historyr7   )r  r&   s   ` r   Úobserve_tensor_cyclesr  Ú  s0   ø€ Ü	‡J�J×Ñ×,Ñ,¸Ð,Ô@õ5ô ˜8Ó$Ð$r   c                  óJ   — t         j                  d«       dd„} t        | «      S )aŠ  
    Install a warning that reports whenever a cycle that is holding CUDA memory is observed.

    The warning produces an .html file that visualizes the cycle,
    and links it to the stack frame that allocated the CUDA tensor.

    Reference cycles are freed by the cycle collector rather than being cleaned up
    when the objects in the cycle first become unreachable. If a cycle points to a tensor,
    the CUDA memory for that tensor will not be freed until garbage collection runs.
    Accumulation of CUDA allocations can lead to out of memory errors (OOMs), as well as
    non-deterministic allocation behavior which is harder to debug.
    z2Watching Python reference cycles for CUDA Tensors.c                 óª   — t        dd¬«      5 }|j                  | «       t        j                  d|j                  «       d d d «       y # 1 sw Y   y xY w)NÚwz.html)ÚsuffixzDReference cycle includes a CUDA Tensor see visualization of cycle %s)r   Úwriter   r    rF   )Úhtmlr>   s     r   Úwrite_and_logz)warn_tensor_cycles.<locals>.write_and_logõ  sH   € Ü ¨GÔ4ð 	k¸Ø�G‰G�DŒMÜ�N‰NÐaÐcd×ciÑciÔj÷	k÷ 	kñ 	kús   Ž2A	Á	Ar2   )r   r%   r  )r  s    r   Úwarn_tensor_cyclesr  æ  s$   € ô ‡K�KÐDÔEókô ! Ó/Ð/r   )+r   r   Útypingr   r   r”   rx   rá   Útempfiler   r   Útorch.cuda._memory_vizr   r   r4   ÚloggingÚ	getLoggerrY   r   r7   rA   r—   r�   rÄ   ÚfloatÚcomplexr?   rÂ   Úbytesr£   r´   r»   r½   rß   rã   r¶   rÈ   r  r	  r  r  r  r  r
   r   r   ú<module>r'     sÇ   ðã 	Û 
ß "Û Û Û Ý 'Û ß <Û Û Ø	ˆ×	Ñ	˜8Ó	$€ò8òR$ñ
 Ó€ògðZ �5˜'¡4¨£:¨s°EÐ:€
ØÐ ò0Fôh&ˆ:ô &ð &*°$ô ,ò\òòò(	ði€	ðTÐ ò
\ò	%ó0r   