
    qi              
           d dl mZ d dlmZ d dlmZmZ deeef   dedeeef   fdZ	ded	ed
ee
dz  ee
dz  egef   defdZy)    )Callable)Any)ContextTreeSpecuser_kwargsspecreturnc                 Z   |j                   t        u sJ |j                  dk(  sJ |j                  d      }|j                   t        u sJ t        |       t        |j                        k7  r$t        dt        |        d|j                         i }|j                  D ]
  }| |   ||<    |S )aX  Reorder user-provided kwargs to match the order in `spec`. `spec` is
    expected to be the in_spec of an exported program, i.e. the spec that
    results from flattening `(args, kwargs)`.

    We need this to provide consistent input ordering, such so that users can
    pass in foo(a=a, b=b) OR foo(b=b, a=a) and receive the same result.
          z>Ran into a kwarg keyword mismatch: Got the following keywords z but expected )	typetuplenum_childrenchilddictsetcontext
ValueErrorlist)r   r   kwargs_specreordered_kwargskws        ^/home/ubuntu/crypto_trading_bot/.venv/lib/python3.12/site-packages/torch/export/_tree_utils.pyreorder_kwargsr      s     99!!!**Q-Kt###
;3{2233**.{*;)<N;K^K^J_a
 	

 !! /*2/     spec1spec2equivalence_fnNc                     || j                   | j                  |j                   |j                        sy| j                  |j                  k7  ryt        | j	                         |j	                               D ]  \  }}t        |||      r y y)a,  Customizable equivalence check for two TreeSpecs.

    Arguments:
        spec1: The first TreeSpec to compare
        spec2: The second TreeSpec to compare
        equivalence_fn: A function to determine the equivalence of two
            TreeSpecs by examining their types and contexts. It will be called like:

                equivalence_fn(spec1.type, spec1.context, spec2.type, spec2.context)

            This function will be applied recursively to all children.

    Returns:
        True if the two TreeSpecs are equivalent, False otherwise.
    FT)r   r   r   zipchildrenis_equivalent)r   r   r   child_spec1child_spec2s        r   r"   r"   "   s{    ( %**emmUZZO U///$'(8%..:J$K  [[+~F r   )collections.abcr   typingr   torch.utils._pytreer   r   r   strr   r   boolr"    r   r   <module>r+      s|    $  1S#X h 4S> 6 dTk7D4KI4OP 
	r   