
    ^j                         d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 dd	l
mZ erdd
lmZ 	 ddeddddfdZdedefdZ G d d      Z G d d      Zy)a)  
Hashability utilities for PyTorch Dynamo variable tracking.

This module provides the HashableTracker wrapper class and associated utilities
for making VariableTracker instances usable as dictionary keys and set elements
during symbolic execution. Used by both ConstDictVariable and SetVariable.
    )TYPE_CHECKINGN   )	variables)raise_observed_exception)specialize_symnode   )VariableTracker)InstructionTranslatorBaseargtxz InstructionTranslatorBase | Nonereturnc                 r   |ddl m} |j                         }	 | j                         }|A|j
                  5ddlm} ddlm	}  |dd|  d|j                   d	g |j                  
       ||j                  nt        |       j                  }t        t        |d| dg       y # t        $ r d }Y w xY w)Nr   InstructionTranslatorr   )graph_break_hints)unimplementedzHashability mismatchzraise_unhashable zDynamo thinks zr is unhashable, but its __hash__ is not None. This likely indicates a missing or incorrect is_hashable() override.)gb_typecontextexplanationhintszunhashable type: '')args)torch._dynamo.symbolic_convertr   
current_txpython_type	Exception__hash__ r   excr   __name__
DYNAMO_BUGtyper   	TypeError)r   r   r   arg_typer   r   	type_names          k/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_dynamo/variables/hashable.pyraise_unhashabler'      s     
zH"--/??$  1 1 =('*'u-():):(; <3 4 2%001	
 &.%9!!tCy?Q?QI
 1-
)  s   B( (B65B6xc                     t        | t        j                        r!| j                         s| j	                         ry| j                         S )NT)
isinstancer   LazyVariableTrackeris_realizedis_hashable_lazyis_hashable)r(   s    r&   r.   r.   >   s8     	1i334 ==?    c                   @    e Zd ZdZdZdeddfdZdefdZdede	fd	Z
y)
RawHasha5  Wraps a pre-computed hash value to bypass int.__hash__'s modular reduction.

    When building a tuple/frozenset of per-item hashes, using bare ints would
    apply long_hash (mod sys.hash_info.modulus), corrupting the values.
    Wrapping in RawHash makes tuplehash/frozenset_hash see the original hash.
    hr3   r   Nc                     || _         y Nr2   )selfr3   s     r&   __init__zRawHash.__init__U   s	    r/   c                     | j                   S r5   r2   r6   s    r&   r   zRawHash.__hash__X   s    vvr/   otherc                 X    t        |t              xr | j                  |j                  k(  S r5   )r*   r1   r3   )r6   r:   s     r&   __eq__zRawHash.__eq__[   s!    %)?dff.??r/   )r    
__module____qualname____doc__	__slots__intr7   r   objectboolr<    r/   r&   r1   r1   K   sC     I# $ # @F @t @r/   r1   c                   d    e Zd ZdZ e       ZdeddfdZededefd       Z	de
fdZdedefd	Zy)
HashableTrackerz
    Class that wraps a VariableTracker and makes it hashable.
    Note that it's fine to put VTs into dictionaries and sets, but doing so
    does not take into account aliasing.
    vtr   Nc                 B   t        |      }t        |t        j                        rF|j	                         s6|j                         r&t        |j                               | _        || _	        y ddl
m} ddlm} |j                         } |||      \  | _        }|| _	        y )Nr   r   r   )generic_hash_impl)r   r*   r   r+   r,   r-   hashoriginal_value_hashrG   r   r   object_protocolrI   r   )r6   rG   r   rI   r   _s         r&   r7   zHashableTracker.__init__h   s    # r9889NN$##%b//12DJDG 	I6"--/)"b1
Ar/   c                 @   ddl m} ddlm} t	        |t
        j                        rH|j                         s8t	        |j                         t        j                        r|j                         S t	        ||      s| j                  S g }|j                  D ]  }|j                         r |j                  |j                                3t	        ||      rt!        |dd       }t!        |dd       }|t!        |dd       nd }t	        |t"              r|j%                  d      nd }	t!        |	dd       }
t	        |
t        j&                        r3|
j)                         dk(  r |j                  |
j+                                | j                  c S  t        j                  |      S )	Nr   )SizeVariable)TensorVariableproxynodemetaexample_valueconstant)listsrP   tensorrQ   r*   r   r+   r,   rK   torchSize_MISSINGitemsis_python_constantappendas_python_constantgetattrdictgetTensornumelitem)clsrG   rP   rQ   r\   re   rR   rS   rT   rU   rV   s              r&   _maybe_constant_torch_sizez*HashableTracker._maybe_constant_torch_size   sM   '* r9889NN$2,,.

;$$&&"l+<<HH 	 D&&(T4467$/gt4ufd36:6FwtVT2D1;D$1GDHH_-T  #=*dCh5(..:Ja:OLL1<<%	 ( zz%  r/   c                     | j                   S r5   )rL   r9   s    r&   r   zHashableTracker.__hash__   s    zzr/   r:   c                 N   t        |t              sy| j                  |j                  u ry| j                  | j                        }| j                  |j                        }|| j                  ur|| j                  ur||k(  S | j                  j                  |j                        S )a  
        Checks equality between two HashableTracker instances.

        Delegates to the VariableTracker's is_python_equal method to compare
        the underlying variable trackers for Python-level equality.

        Args:
            other: Another HashableTracker instance to compare with

        Returns:
            True if the underlying variable trackers are Python-equal, False otherwise
        FT)r*   rF   rG   rg   r[   is_python_equal)r6   r:   self_constantother_constants       r&   r<   zHashableTracker.__eq__   s     %177ehh77@88B-.2U N22ww&&uxx00r/   )r    r=   r>   r?   rB   r[   r	   r7   classmethodrg   rA   r   rC   r<   rD   r/   r&   rF   rF   _   se     xH? t 4 #!O #! #! #!J# 1F 1t 1r/   rF   r5   )r?   typingr   rY   r   r   r   r   utilsr   baser	   r   r
   r'   rC   r.   r1   rF   rD   r/   r&   <module>rq      sv    !   * & ! H DH$	$@$	$N
? 
t 
@ @(c1 c1r/   