
    +h                     p    S r SSKJr  SSKJrJr  SSKJrJr  SSK	r
SSKJrJr  S\4S	 jr " S
 S\5      rg)z
Generic utilities
    )OrderedDict)fieldsis_dataclass)AnyTupleN   )is_torch_availableis_torch_versionreturnc                     [        5       (       a  SSKn[        XR                  5      (       a  g[        U [        R
                  5      $ )z3
Tests if `x` is a `torch.Tensor` or `np.ndarray`.
r   NT)r	   torch
isinstanceTensornpndarray)xr   s     Q/home/james-whalen/.local/lib/python3.13/site-packages/diffusers/utils/outputs.py	is_tensorr      s3     a&&a$$    c                      ^  \ rS rSrSrSS jrSS jrS rS rS	 r	S
 r
S\S\4S jrS\S\SS4U 4S jjrU 4S jrU 4S jrS\\S4   4S jrSrU =r$ )
BaseOutput(   a  
Base class for all model outputs as dataclass. Has a `__getitem__` that allows indexing by integer or slice (like a
tuple) or strings (like a dictionary) that will ignore the `None` attributes. Otherwise behaves like a regular
Python dictionary.

<Tip warning={true}>

You can't unpack a [`BaseOutput`] directly. Use the [`~utils.BaseOutput.to_tuple`] method to convert it to a tuple
first.

</Tip>
r   Nc                   ^ ^ [        5       (       a  SSKm[        SS5      (       aK  TR                  R                  R                  T TR                  R                  R                  U U4S j5        gTR                  R                  R                  T TR                  R                  R                  U U4S jT R                   ST R                   3S9  gg)	zRegister subclasses as pytree nodes.

This is necessary to synchronize gradients when using `torch.nn.parallel.DistributedDataParallel` with
`static_graph=True` with modules that output `ModelOutput` subclasses.
r   N<z2.2c                 Z   > T" S0 TR                   R                  R                  X5      D6$ N utils_pytree_dict_unflattenvaluescontextclsr   s     r   <lambda>.BaseOutput.__init_subclass__.<locals>.<lambda>C   #    C,g%++2E2E2U2UV\2f,gr   c                 Z   > T" S0 TR                   R                  R                  X5      D6$ r   r   r"   s     r   r&   r'   I   r(   r   .)serialized_type_name)
r	   torch.utils._pytreer
   r   r    _register_pytree_node_dict_flattenregister_pytree_node
__module____name__)r%   r   s   `@r   __init_subclass__BaseOutput.__init_subclass__6   s     &U++##99KK''55g ##88KK''55g,/NN+;1S\\N)K	 9   r   c                   ^  [        T 5      n[        U5      (       d"  [        T R                  R                   S35      e[        T US   R                  5      n[        U 4S jUSS   5       5      nU(       a4  [        U[        5      (       a  UR                  5        H
  u  pEUT U'   M     g U H-  n[        T UR                  5      nUc  M  UT UR                  '   M/     g )Nz has no fields.r   c              3   T   >#    U  H  n[        TUR                  5      S L v   M     g 7fNgetattrname.0fieldselfs     r   	<genexpr>+BaseOutput.__post_init__.<locals>.<genexpr>U   s#     #dSc%GD%**$=$EScs   %(r   )r   len
ValueError	__class__r1   r8   r9   allr   dictitems)r=   class_fieldsfirst_fieldother_fields_are_nonekeyvaluer<   vs   `       r   __post_init__BaseOutput.__post_init__M   s    d| <   7 78HIIdLO$8$89 ##dS_`a`bSc#d d ZT%B%B)//1
!S	 2 &D%**-='(D$ &r   c                 H    [        SU R                  R                   S35      e)Nz$You cannot use ``__delitem__`` on a 
 instance.	ExceptionrB   r1   r=   argskwargss      r   __delitem__BaseOutput.__delitem__`   s#    >t~~?V?V>WWabccr   c                 H    [        SU R                  R                   S35      e)Nz#You cannot use ``setdefault`` on a rO   rP   rR   s      r   
setdefaultBaseOutput.setdefaultc   s#    =dnn>U>U=VV`abbr   c                 H    [        SU R                  R                   S35      e)NzYou cannot use ``pop`` on a rO   rP   rR   s      r   popBaseOutput.popf   s"    6t~~7N7N6OzZ[[r   c                 H    [        SU R                  R                   S35      e)NzYou cannot use ``update`` on a rO   rP   rR   s      r   updateBaseOutput.updatei   s#    9$..:Q:Q9RR\]^^r   kc                     [        U[        5      (       a  [        U R                  5       5      nX!   $ U R	                  5       U   $ r6   )r   strrD   rE   to_tuple)r=   r`   
inner_dicts      r   __getitem__BaseOutput.__getitem__l   s8    adjjl+J= ==?1%%r   r9   rJ   c                 n   > XR                  5       ;   a  Ub  [        TU ]	  X5        [        TU ]  X5        g r6   )keyssuper__setitem____setattr__)r=   r9   rJ   rB   s      r   rk   BaseOutput.__setattr__s   s.    99;5#4G,D(r   c                 B   > [         TU ]  X5        [         TU ]	  X5        g r6   )ri   rj   rk   )r=   rI   rJ   rB   s      r   rj   BaseOutput.__setitem__y   s    C'C'r   c                    >^  [        T 5      (       d  [        TT ]	  5       $ [        TT ]	  5       tpn[        U 4S j[	        T 5       5       5      nX/UQ7$ )Nc              3   P   >#    U  H  n[        TUR                  5      v   M     g 7fr6   r7   r:   s     r   r>   (BaseOutput.__reduce__.<locals>.<genexpr>   s     IL5WT5::..Ls   #&)r   ri   
__reduce__tupler   )r=   callable_args	remainingrS   rB   s   `    r   rr   BaseOutput.__reduce__   sP    D!!7%''&+g&8&:#)IF4LII)	))r   .c                 J   ^  [        U 4S jT R                  5        5       5      $ )zQ
Convert self to a tuple containing all the attributes/keys that are not `None`.
c              3   .   >#    U  H
  nTU   v   M     g 7fr6   r   )r;   r`   r=   s     r   r>   &BaseOutput.to_tuple.<locals>.<genexpr>   s     2kT!Wks   )rs   rh   )r=   s   `r   rc   BaseOutput.to_tuple   s     2diik222r   r   )r   N)r1   r0   __qualname____firstlineno____doc__r2   rL   rU   rX   r[   r^   r   re   rk   rj   rr   r   rc   __static_attributes____classcell__)rB   s   @r   r   r   (   sz    .)&dc\_&S &S &) )C )D )(*3%S/ 3 3r   r   )r~   collectionsr   dataclassesr   r   typingr   r   numpyr   import_utilsr	   r
   boolr   r   r   r   r   <module>r      s5    $ ,   >
%D 
%b3 b3r   