
    ^j^                       U d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
Z
ddlmZmZ erddlmZmZ ddlmZ g dZd	ZdZdad
ed<    ej0                         Zd#dZ G d de      Zd$dZ G d de      Z G d d      Z G d d      Z G d d      Z  G d d      Z!eez  e"z  dz  Z#ded<   e#ez  Z$ded<   e$ez  e z  e!z  Z%ded<   e%e&e%   z  e'e(e%f   z  Z)ded<    G d d       Z* G d! d"      Z+y)%zxSpec types for controlling what is dynamic in compiled/exported code.
Currently only supports unbacked dynamic shapes.

    )annotationsN)AnycastTYPE_CHECKING	TypeAlias)SymBoolSymInt)IteratorSequenceShapeEnv)ShapeVarIntVarSTATIC
TensorSpec
ObjectSpecDictSpecSeqSpec
ParamsSpec
ShapesSpecLeafSpecLeafIntSpecIntermediateSpecz  zShapeEnv | None_SPEC_SHAPE_ENVc                     t         t         S t        5  t         t         cddd       S ddlm}   G d d|       } |       a t         cddd       S # 1 sw Y   yxY w)z7Lazily build the singleton spec ShapeEnv (thread-safe).Nr   r   c                  P     e Zd ZU dZ eh d      Zded<   d fdZd fdZ xZ	S )	*_get_spec_shape_env.<locals>._SpecShapeEnvu  Special ShapeEnv used only at spec-definition time.

            Attribute access is blocked by default via ``__getattribute__``;
            only private (``_``-prefix) names and the explicit allowlist in
            ``_ALLOWED_PUBLIC`` pass through. SymInt arithmetic paths read
            a handful of public fields transparently (via the
            ``@record_shapeenv_event`` decorator and FX-cache machinery),
            so those are allowlisted. Everything else — evaluation, guard
            recording, deferred asserts, etc. — is blocked.

            During ``ShapeEnv.__init__`` itself, access is unrestricted
            because the base class touches its own public fields while
            bootstrapping.
            >   bound_sympyis_recordingvar_to_rangefx_node_cacheshould_record_eventszfrozenset[str]_ALLOWED_PUBLICc                ~    t         j                  | dd       t        |           t         j                  | dd       y )N
_init_doneFT)object__setattr__super__init__)self	__class__s    m/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/experimental/dynamic_spec.pyr)   z3_get_spec_shape_env.<locals>._SpecShapeEnv.__init__m   s2    ""4u= """4t<    c                    |j                  d      rt        | 	  |      S t        | 	  d      st        | 	  |      S |t        |       j                  v rt        | 	  |      S t        d| d      )N_r%   z_SpecShapeEnv: 'zd' is not allowed at spec-definition time. Use IntVar / ShapeVar only inside TensorSpec / ShapesSpec.)
startswithr(   __getattribute__typer#   	TypeError)r*   namer+   s     r,   r1   z;_get_spec_shape_env.<locals>._SpecShapeEnv.__getattribute__s   s|    ??3' 73D99w/= 73D994:555 73D99&tf -6 7 r-   )returnNone)r4   strr5   r   )
__name__
__module____qualname____doc__	frozensetr#   __annotations__r)   r1   __classcell__r+   s   @r,   _SpecShapeEnvr   M   s/    " /8
/O^ = r-   r@   )r   _SPEC_SHAPE_ENV_LOCK%torch.fx.experimental.symbolic_shapesr   )r   r@   s     r,   _get_spec_shape_envrC   C   s[     "	 9&"9 9 	C1	H 1	f (/s9 9 9s   AAAc                  ~     e Zd ZdZ ej
                         Z	 ddddd	 	 	 	 	 	 	 	 	 d	 fdZd
dZddZ	ddZ
 xZS )r   a  Indicates that a scalar integer argument is dynamic (no implicit range).

    Unbacked dynamic shapes will represent the underlying value in the
    compiled graph.

    IntVar is a ``SymInt`` subclass backed by ``_SpecShapeEnv``,
    so arithmetic and comparisons compose naturally::

        A = IntVar("a")
        B = IntVar("b")
        A + 1  # SymInt expr=a#0 + 1
        A * B + 1  # SymInt expr=a#0*b#1 + 1
        A > 0  # SymBool

    Such derived ``SymInt`` values may be used directly as leaf specs in
    ``TensorSpec`` / ``ParamsSpec``

    Repr always includes a per-instance uid so two IntVars with the same name
    (or two anonymous ones) are distinguishable in logs::

        IntVar()           -> "IntVar(anon#0)"
        IntVar("offset")   -> "IntVar(offset#1)"

    Example::

        IntVar("num_heads")
        IntVar("offset", min=-100, max=100)
        IntVar("size", min=1, max=2048, optimization_hint=512)
    Nminmaxoptimization_hintc                  ddl m}m} ddlm} ddlm} ||nd| _        t        t        j                        | _        || _        || _        || _        t        j                   | j                   d| j                         | _        t%               }	 || j"                  |	t&        |      }
t(        | U  |
        |||n| ||n|      |	j,                  | j"                  <   y )Nr   )_NO_HINTSymNode)int_oo)ValueRangesanon#)	shape_envpytypehint)torch.fx.experimental.sym_noderJ   rK   torch.utils._sympy.numbersrL   torch.utils._sympy.value_rangesrM   r4   nextr   _uid_counter_uidrF   rG   rH   sympySymbol	sympy_symrC   intr(   r)   r    )r*   r4   rF   rG   rH   rJ   rK   rL   rM   envnoder+   s              r,   r)   zIntVar.__init__   s     	E5? ,D&	,,-	!21TYYK&@A!#NN	
 	 ,7?C?C,
(r-   c                   | j                    d| j                   g}| j                  |j                  d| j                          | j                  |j                  d| j                          | j
                  |j                  d| j
                          t        |       j                   ddj                  |       dS )NrO   zmin=zmax=zoptimization_hint=(z, ))	r4   rX   rF   appendrG   rH   r2   r8   join)r*   partss     r,   __repr__zIntVar.__repr__   s     II;a		{+,88LL4z*+88LL4z*+!!-LL-d.D.D-EFGt*%%&a		%(8'9;;r-   c                    t        |       S N)idr*   s    r,   __hash__zIntVar.__hash__   s    $xr-   c                    t        |       j                  | j                  | j                  | j                  | j
                  dS )N)r2   r4   rF   rG   rH   )r2   r8   r4   rF   rG   rH   ri   s    r,   to_jsonablezIntVar.to_jsonable   s7    J''II8888!%!7!7
 	
r-   rg   )
r4   
str | NonerF   
int | NonerG   rn   rH   rn   r5   r6   r5   r7   r5   r\   r5   zdict[str, Any])r8   r9   r:   r;   	itertoolscountrW   r)   re   rj   rl   r>   r?   s   @r,   r   r      sr    < #9??$L  
 (,

 	

 
 &
 

B
<
r-   r   c                   t        | t              rd}nt        | t              rd}ny| j                  j                  t               urt        | d| d| d      y)zXIf ``v`` is a SymInt or SymBool, validate it originates from the
    spec ShapeEnv.
    r	   r   N: z= spec values must originate from spec IntVar / ShapeVar; got z  backed by a different ShapeEnv.)
isinstancer	   r   r^   rP   rC   r3   )vwherekinds      r,   _validate_spec_symrz      sk     !V	Aw	vv244gRv E!AC
 	
 5r-   c                  D     e Zd ZdZ	 ddddd	 	 	 	 	 	 	 	 	 d fdZ xZS )r   zIndicates that a dimension size is dynamic and is >= 0.

    Subclass of `IntVar` with ``min=0`` by default.

    Example::

        ShapeVar("batch")
        ShapeVar("batch", max=64)
        ShapeVar("batch", max=64, optimization_hint=32)
    Nr   rE   c               T    |dk  rt        d| d      t        | 	  ||||       y )Nr   zBShapeVar requires min >= 0 (a shape dim is non-negative); got min=z+. Use IntVar(...) for unrestricted scalars.rE   )
ValueErrorr(   r)   )r*   r4   rF   rG   rH   r+   s        r,   r)   zShapeVar.__init__   sE     7%JL  	3CCTUr-   rg   )
r4   rm   rF   r\   rG   rn   rH   rn   r5   r6   )r8   r9   r:   r;   r)   r>   r?   s   @r,   r   r      s_    	  V (,VV 	V
 V &V 
V Vr-   r   c                  @    e Zd ZdZd	dZd
dZddZddZddZddZ	y)r   a~  Per-dimension shape specification for a tensor.

    A list-like container of ``LeafIntSpec`` with length
    equal to the tensor's dim.

    Example::

        B = ShapeVar("batch")
        TensorSpec([B, None])  # rank 2, dim 0 dynamic
        TensorSpec([B, 10])  # rank 2, dim 0 dynamic, dim 1 static=10
        TensorSpec([B * 2 + 1, None])  # rank 2, dim 0 derived from B
    c           	         t        |      D ]T  \  }}|=t        |t        t        f      s't	        d| dt        |      j                   d|      t        |d|        V t        |      | _	        y )NzTensorSpec dim z: expected LeafIntSpec, got ru   rx   )
	enumeraterv   r\   r	   r3   r2   r8   rz   list_specs)r*   dimsids       r,   r)   zTensorSpec.__init__  s}    dO 	?DAq}ZC=%A%aS(DAw''(1%1  q/!(=>	? *.dr-   c                     | j                   |   S rg   )r   )r*   indexs     r,   __getitem__zTensorSpec.__getitem__&  s    {{5!!r-   c                ,    t        | j                        S rg   )lenr   ri   s    r,   __len__zTensorSpec.__len__)  s    4;;r-   c                ,    t        | j                        S rg   )iterr   ri   s    r,   __iter__zTensorSpec.__iter__,  s    DKK  r-   c                    dg}t        | j                        D ]!  \  }}|j                  t         | d|       # dj	                  |      S )NzTensor:ru   
)r   r   rb   _INDENTrc   )r*   linesr   specs       r,   re   zTensorSpec.__repr__/  sO     - 	4GAtLLG9QCr$23	4yyr-   c                ~    d| j                   D cg c]   }t        |d      r|j                         n|" c}dS c c}w )Nr   rl   )r2   r   )r   hasattrrl   r*   r   s     r,   rl   zTensorSpec.to_jsonable5  sG      !KK '.dM&B  "L
 	
   %:N)r   zSequence[LeafIntSpec]r5   r6   )r   r\   r5   r   rp   )r5   zIterator[LeafIntSpec]ro   rq   )
r8   r9   r:   r;   r)   r   r   r   re   rl    r-   r,   r   r     s%    4" ! 
r-   r   c                  J    e Zd ZdZd
ddZddZddZddZddZddZ	dd	Z
y)r   a  Spec for any Python object's attributes.

    Constructor::

        ObjectSpec({name: IntermediateSpec, ...})

    Values may be leaves (``TensorSpec`` / ``IntVar`` / ``int`` /
    ``None``) or another ``ObjectSpec`` for recursion.

    Example::

        ObjectSpec({"weight": TensorSpec([ShapeVar("h"), None])})
        ObjectSpec({"inner": ObjectSpec({"weight": TensorSpec([ShapeVar("h")])})})
    Nc                8    |rt        |      | _        y i | _        y rg   )dict_fields)r*   fieldss     r,   r)   zObjectSpec.__init__O  s    DJDLPRr-   c                    || j                   v S rg   )r   )r*   r4   s     r,   __contains__zObjectSpec.__contains__R  s    t||##r-   c                ,    t        | j                        S rg   )r   r   ri   s    r,   r   zObjectSpec.__iter__U  s    DLL!!r-   c                ,    t        | j                        S rg   )r   r   ri   s    r,   r   zObjectSpec.__len__X  s    4<<  r-   c                6    | j                   j                         S rg   )r   itemsri   s    r,   r   zObjectSpec.items[  s    ||!!##r-   c                ^   dg}| j                   j                         D ]}  \  }}t        |      }d|v rL|j                  t         d| d       |j                         D ]  }|j                  t        dz  |z           a|j                  t         d| d|         dj                  |      S )Nzobject_spec:r   .:   ru   )r   r   reprrb   r   
splitlinesrc   )r*   r   r4   r   	spec_reprlines         r,   re   zObjectSpec.__repr__^  s     ,,,,. 	?JD$T
Iy y$q12%002 5DLL1t!345 y$r)=>	? yyr-   c           
         d| j                   j                         D ci c]$  \  }}|t        |d      r|j                         n|& c}}dS c c}}w )Nr   rl   )r2   r   )r   r   r   rl   )r*   r4   r   s      r,   rl   zObjectSpec.to_jsonablej  sV      #',,"4"4"6D$ GD-,Hd&&(dR
 	
s   )Arg   )r   z"dict[str, IntermediateSpec] | Noner5   r6   )r4   r&   r5   bool)r5   zIterator[str]rp   r5   r   ro   rq   r8   r9   r:   r;   r)   r   r   r   r   re   rl   r   r-   r,   r   r   ?  s+    S$"!$
 
r-   r   c                  R    e Zd ZdZ	 d
	 	 	 ddZddZddZddZddZddZ	dd	Z
y)r   aT  Spec for a Python ``dict``-typed value.

    Constructor::

        DictSpec({key: IntermediateSpec, ...})

    Keys may be ``str`` or ``int``.

    Example::

        DictSpec({"x": TensorSpec([ShapeVar("h"), None])})
        DictSpec({"config": DictSpec({"batch": IntVar()})})
        DictSpec({0: TensorSpec([ShapeVar("h"), None])})
    Nc                    |rt        |      ni | _        | j                  D ]<  }t        |t        t        f      rt        dt        |      j                   d|       y )Nz0DictSpec entries must have str or int keys, got ru   )r   _entriesrv   r7   r\   r3   r2   r8   )r*   entriesks      r,   r)   zDictSpec.__init__  sd     %DM" 	  	Aa#s,FtAwGWGWFXXZ[\Z_` 	r-   c                    || j                   v S rg   )r   )r*   keys     r,   r   zDictSpec.__contains__  s    dmm##r-   c                ,    t        | j                        S rg   )r   r   ri   s    r,   r   zDictSpec.__iter__  s    DMM""r-   c                ,    t        | j                        S rg   r   r   ri   s    r,   r   zDictSpec.__len__      4==!!r-   c                6    | j                   j                         S rg   )r   r   ri   s    r,   r   zDictSpec.items  s    }}""$$r-   c                ^   dg}| j                   j                         D ]}  \  }}t        |      }d|v rL|j                  t         d|d       |j                         D ]  }|j                  t        dz  |z           a|j                  t         d|d|         dj                  |      S )Nz
dict_spec:r   []:r   ]: )r   r   r   rb   r   r   rc   )r*   r   r   r   r   r   s         r,   re   zDictSpec.__repr__  s    ,,. 	AICT
Iy y#34%002 5DLL1t!345 y#I;?@	A yyr-   c           
         d| j                   j                         D ci c]-  \  }}t        |      t        |d      r|j	                         n|/ c}}dS c c}}w )Nr   rl   r2   r   )r   r   r7   r   rl   )r*   r   r   s      r,   rl   zDictSpec.to_jsonable  s[     "&!4!4!6C Cm0L$**,RVV
 	
s   2Arg   )r   z(dict[str | int, IntermediateSpec] | Noner5   r6   )r   r&   r5   r   )r5   zIterator[str | int]rp   r   ro   rq   r   r   r-   r,   r   r   t  sA      CG
?
	
$#"%
 
r-   r   c                  0    e Zd ZdZddZddZd	dZd
dZy)r   a  Spec for a Python ``list``- or ``tuple``-typed value.

    Per-position. The spec list may be shorter than the runtime sequence;
    any positions beyond ``len(self)`` are treated as fully static (i.e.
    equivalent to an unspecified slot).

    Constructor::

        SeqSpec([IntermediateSpec, ...])

    Example::

        SeqSpec([TensorSpec([ShapeVar("h"), 10]), 1])
        SeqSpec((TensorSpec([ShapeVar("a")]), TensorSpec([ShapeVar("b")])))
    c                $    t        |      | _        y rg   )r   r   )r*   r   s     r,   r)   zSeqSpec.__init__  s    04Wr-   c                ,    t        | j                        S rg   r   ri   s    r,   r   zSeqSpec.__len__  r   r-   c                T   dg}t        | j                        D ]}  \  }}t        |      }d|v rL|j                  t         d| d       |j                         D ]  }|j                  t        dz  |z           a|j                  t         d| d|         dj                  |      S )Nz	seq_spec:r   r   r   r   r   )r   r   r   rb   r   r   rc   )r*   r   r   r   r   r   s         r,   re   zSeqSpec.__repr__  s     / 	=GAtT
Iy y!B/0%002 5DLL1t!345 y!C	{;<	= yyr-   c                ~    d| j                   D cg c]   }t        |d      r|j                         n|" c}dS c c}w )Nr   rl   r   )r   r   rl   r   s     r,   rl   zSeqSpec.to_jsonable  sG     !MM '.dM&B  "L
 	
r   N)r   zSequence[IntermediateSpec]r5   r6   rp   ro   rq   )r8   r9   r:   r;   r)   r   re   rl   r   r-   r,   r   r     s     >"
 
r-   r   r   r   r   r   ParamsSpecValuec                  :    e Zd ZdZdZdZ	 d	 	 	 d	dZd
dZddZy)r   a"  Specification for the arguments of a compiled function.

    Describes the dynamic shape behavior for named arguments, ``*args``,
    and ``**kwargs`` of a ``torch.compile``-wrapped function. Takes a
    single dict keyed by parameter name, with two reserved sentinel keys
    for the variadic slots::

        def func(x, n, *args, **kwargs): ...


        ParamsSpec(
            {
                "x": TensorSpec([ShapeVar("batch"), None]),
                "n": IntVar("seq"),
                "*args": [TensorSpec([ShapeVar("a")]), None],
                "**kwargs": {
                    "foo": TensorSpec([ShapeVar("b"), None]),
                    "bar": TensorSpec([ShapeVar("c"), None]),
                },
            }
        )

    Anything not expressed in ``ParamsSpec`` is STATIC.**
    z*argsz**kwargsNc           
     X   i | _         d | _        d | _        |y |j                         D ]~  \  }}|| j                  k(  rvt        |t              s.t        d| j                  dt        |      j                         t        |      D ]  \  }}t        |d| d| d        t        |      | _        || j                  k(  r|t        |t              s.t        d| j                  dt        |      j                         |j                         D ]  \  }}t        |d| d|d        t        |      | _        |j                  d      r)t        d	|d
| j                  d| j                  d      t        |d|d       t        t         |      | j                   |<    y )NzParamsSpec z) value must be a list of leaf specs, got zParamsSpec 'z'[]r   z) value must be a dict of leaf specs, got *zUnknown sentinel key z in ParamsSpec; only z and z are reservedzParamsSpec[)_named_args_varargs_varkwr   _VARARGS_KEYrv   r   r}   r2   r8   r   rz   
_VARKW_KEYr   r0   r   r   )r*   paramsr   valuer   rw   r   s          r,   r)   zParamsSpec.__init__  s    9;7;:>> ,,. 	FJCd'''!%.$%d&7&7%: ;..25k.B.B-CE  &e, LDAq&q,se2aS0JKL $U'!%.$%doo%8 9..25k.B.B-CE  "KKM NDAq&q,se2aU!0LMN"5k$ +C72G((+50C=R 
 #5+cWA0FG(,-=u(E  %5	Fr-   c                @   t         fdddfd| j                  j                         D cg c]  \  }} ||       }}}| j                  Sdj	                  fdt        | j                        D              }|j                  | j                   d |              | j                  Xdj	                  fd| j                  j                         D              }|j                  | j                   d |              dj	                  |      S c c}}w )	Nc                T    dj                  fd| j                         D              S )Nr   c              3  (   K   | ]	  }|z     y wrg   r   ).0r   prefixs     r,   	<genexpr>z=ParamsSpec.__repr__.<locals>._indent_lines.<locals>.<genexpr>>  s     ItVd]Is   )rc   r   )textr   s    `r,   _indent_linesz*ParamsSpec.__repr__.<locals>._indent_lines=  s    99It7HIIIr-   c                J    t        |      }d|v r|  d |       S |  d| S )Nr   :
ru   )r   )r   r   v_reprr   s      r,   _entry_reprz(ParamsSpec.__repr__.<locals>._entry_repr@  s;    %[Fv~c-"7!899U"VH%%r-   r   c              3  H   K   | ]  \  }} t        |      |        y wrg   )r7   )r   r   rw   r   s      r,   r   z&ParamsSpec.__repr__.<locals>.<genexpr>H  s%      +/1aCFA&s   "r   c              3  6   K   | ]  \  }} ||        y wrg   r   )r   r   rw   r   s      r,   r   z&ParamsSpec.__repr__.<locals>.<genexpr>M  s     PDAqk!Q/Ps   )r   r7   r   r7   r5   r7   )r   r7   r   r   r5   r7   )
r   r   r   r   rc   r   rb   r   r   r   )r*   r   rw   r   innerr   r   s        @@r,   re   zParamsSpec.__repr__<  s    3: 	J	& 04/?/?/E/E/GHtq!Q"HH==$II 3<T]]3K E LLD--.c-2F1GHI;;"IIPDKK<M<M<OPPELLDOO,Ce0D/EFGyy Is   Dc           	     $   | j                   j                         D ci c]$  \  }}|t        |d      r|j                         n|& }}}| j                  C| j                  D cg c]   }t        |d      r|j                         n|" c}|| j
                  <   | j                  W| j                  j                         D ci c]$  \  }}|t        |d      r|j                         n|& c}}|| j                  <   d|dS c c}}w c c}w c c}}w )Nrl   r   )r2   r   )r   r   r   rl   r   r   r   r   )r*   r4   r   r   rw   s        r,   rl   zParamsSpec.to_jsonableQ  s     $//557"
e )F%##%EQ"
 "
 ==$ ) $+1m#<!C)F4$$% ;;" $(;;#4#4#6'D% WUM-Je'')PUU'F4??#
 !
 	
"

)
's   )D$%D)Drg   )r   z!dict[str, ParamsSpecValue] | Noner5   r6   ro   rq   )	r8   r9   r:   r;   r   r   r)   re   rl   r   r-   r,   r   r     s=    2 LJ 59#F1#F 
#FJ *
r-   r   c                  T    e Zd ZdZ	 dddd	 	 	 	 	 	 	 d	dZed
d       ZddZddZy)r   uG  Top-level shape specification for a ``torch.compile`` call.

    ``params`` describes the arguments of the compiled callable — for a raw
    function this is the function's parameters, for an ``nn.Module`` this
    is the parameters of ``forward`` (excluding ``self``).

    ``assumptions`` is an optional list of ``SymBool`` expressions built
    from spec ``IntVar`` / ``ShapeVar`` values. Each assumption is wired
    into the shape env at compile time and asserted at runtime via the
    deferred-runtime-assert mechanism::

        A = ShapeVar("a")
        B = ShapeVar("b")
        ShapesSpec(
            params={"x": TensorSpec([A, None]), "y": TensorSpec([B, None])},
            assumptions=[A + B > 10, A * 2 == B],
        )

    ``globals`` is reserved for future use and will raise
    ``NotImplementedError`` if set.
    N)globalsassumptionsc          	        d | _         g | _        |t        d      t        |t              rt        |      }n3|1t        |t
              s!t        dt        |      j                         || _         |wt        |      D ]h  \  }}t        |t              s't        d| dt        |      j                   d|      t        |d| d       | j                  j                  |       j y y )Nz'ShapesSpec.globals is not supported yetz3shapes_spec must be ParamsSpec, dict, or None, got zShapesSpec.assumptions[z]: expected SymBool, got ru   r   r   )_params_assumptionsNotImplementedErrorrv   r   r   r3   r2   r8   r   r   rz   rb   )r*   r   r   r   r   as         r,   r)   zShapesSpec.__init__}  s    +/+-%&OPP fd#'F
6:(FF|,,-/  "!+. ,1!!W-#1! 5#Aw//01%9  #1.EaS,JK!!((+, #r-   c                ,    t        | j                        S rg   )r   r   ri   s    r,   r   zShapesSpec.assumptions  s    D%%&&r-   c                   dg}| j                   ]|j                  t         d       t        | j                         }|j	                         D ]  }|j                  t        dz  |z           | j
                  rM|j                  t         d       | j
                  D ]&  }|j                  t        dz  t        |      z          ( dj                  |      S )Nzshapes_spec:zparams:r   zassumptions:r   )r   rb   r   r   r   r   rc   )r*   r   
param_reprr   r   s        r,   re   zShapesSpec.__repr__  s     <<#LLG9G,-dll+J"--/ 1Wq[4/01LLG9L12&& 4Wq[47234yyr-   c                    d| j                   d n| j                   j                         | j                  D cg c]  }t        |       c}dS c c}w )Nr   )r2   r   r   )r   rl   r   r   )r*   r   s     r,   rl   zShapesSpec.to_jsonable  sH     "ll2d8P8P8R-1->->?DG?
 	
 @s   Arg   )r   z.ParamsSpec | dict[str, ParamsSpecValue] | Noner   r   r   zSequence[SymBool] | Noner5   r6   )r5   zlist[SymBool]ro   rq   )	r8   r9   r:   r;   r)   propertyr   re   rl   r   r-   r,   r   r   f  se    0 BF", 04",>", 	",
 .", 
",H ' ' 
r-   r   )r5   r   )rw   r   rx   r7   r5   r6   ),r;   
__future__r   rr   	threadingtypingr   r   r   r   rY   torchr   r	   collections.abcr
   r   rB   r   __all__r   r   r   r=   LockrA   rC   r   rz   r   r   r   r   r   r\   r   r   r   r   r   r7   r   r   r   r   r-   r,   <module>r      s<  
 #   6 6  ! 2>"  
 $( '
 &y~~' >BZ
V Z
z
"Vv V8.
 .
b2
 2
j;
 ;
|*
 *
p  &3.5Y 5!J.) . '3h>H ) H t,--S:J5J0KK  
i
 i
XQ
 Q
r-   