
    Wjv                    d    d dl mZ d dlmZmZmZ erd dlmZ d dlZddl	m
Z
mZmZ dddZddZdS )    )annotations)AnyTYPE_CHECKINGUnion)SequenceN   )_match_levelsDimEntryndim_of_levelsTargr   	orig_ndimint
allow_noneboolreturnr
   c                    ddl m} | |rt                      S t          | |          rt          |           S t          | t                    r| dk     r| }n| |z
  }t          |          S t                      S )a&  
    Convert various dimension representations to DimEntry.

    Args:
        arg: The argument to convert (Dim, int, or other)
        orig_ndim: Original number of dimensions
        allow_none: Whether to allow None values

    Returns:
        DimEntry representation of the dimension
    r   )DimNr   ) r   r
   
isinstancer   )r   r   r   r   poss        Y/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/functorch/dim/_order.py	_wrap_dimr      s     
{z{zz	C		 	}}	C		 77CC	/C}}zz    tensor_or_dimUnion[torch.Tensor, Any]dimsUnion[Any, Sequence[Any]]torch.Tensorc                2	    ddl m}m}m} t	          | |          r| j        dd         }| j        }| j        }nFt	          | |          r't          |           g}| 	                                }d}nt          d          g g }|dd         t                     d fd
}	d}
|D ]}t          | d          }|                                s |	|           |
dz  }
9t	          ||          r(|j        D ]} |	t          |                     |
dz  }
 q|
dz  }
t          |d          st          d          t!          |          }|                    t%                    t%          |          f           |D ]A}t          | d          }|                                rt          d           |	|           Bd}g }D ]j}|                                r|                                r*|dk    r$t%          |          }|                               |                    |           k|dk    r$t%          |          }|                               |t+          d          t-          |||          }|rg }|                                }t1          |          D ]}|                    ||                    d}|D ]s\  }}||k     r)|                    |||z                       |dz  }||k     )d}t1          |          D ]}||||z   |z            z  }|                    |           ||z  }t|t%                    k     r6|                    |||z                       |dz  }|t%                    k     6t1          |t%                    z   t%                              D ]}|                    ||                    t%                    |
z
  }|dk    r|d|         |||z   d         z   }|                    |          }d}t1          t%          |          dz
  dd          D ]B}||                                         s||k    r |||
z   k     r|dz  }t          |          ||<   C|                    |||          }|S )a  
    Reorder the dimensions of a tensor or create a tensor from a dimension.

    It allows reordering tensor dimensions using first-class dimensions and
    positional indices.

    Args:
        tensor_or_dim: Input tensor with first-class dimensions, or a Dim object
        *dims: Dimensions or sequences of dimensions specifying the new order

    Returns:
        Tensor with reordered dimensions

    Examples:
        >>> import torch
        >>> from functorch.dim import dims
        >>> batch, channel, height, width = dims(4)
        >>> x = torch.randn(2, 3, 4, 5)[batch, channel, height, width]
        >>> # Reorder to [height, width, batch, channel]
        >>> y = order(x, height, width, batch, channel)
    r   )r   DimListTensorNFz-First argument must be a Tensor or Dim objectdr
   r   Nonec                r   	                      |           }n# t          $ r d}Y nw xY w|d|                                 r+t          d d|                                 z    d          t          d|                                  d          t                      |<                       |            dS )zEAdd a dimension to the reordering, removing it from available levels.Nztensor has z positional dimensions, but z% specified, or it was specified twiceztensor does not contain dim z or it was specified twice)index
ValueErroris_positionalpositiondimr
   append)r"   idxflat_positional_dimslevelsr   s     r   
append_dimzorder.<locals>.append_dimX   s    	,,q//CC 	 	 	CCC	;    1) 1 1XaIa 1 1 1  
 !V15577VVV   jjs##A&&&&&s    ((r   __iter__z+expected a Dim, List[Dim], or Sequence[Dim]zexpected a Dim or intzCannot reorder None tensor)r"   r
   r   r#   )r   r   r    r!   r   _levels_tensor_has_devicer
   
_get_ranger&   r   r   is_none_dimshasattrlistr*   lenr'   extendAssertionErrorr	   sizerangereshapefrom_positional)!r   r   r   r    r!   orig_levelsdata
has_device
to_flattenr.   n_new_positionalr   entryr)   seqiteminsert_point
new_levelslevelndata
view_shapesizesi	start_idxlengthnew_sizejn_to_removeseenresultr,   r-   r   s!                                 @@@r   orderrV   *   s   0 '&&&&&&&&& -(( J#+AAA.$".

	M3	'	' J../''))

HIIIJ^Fv&&I' ' ' ' ' ' ' '(   " "#y%00}} 	"Ju!W%% 	"y & &
8C==))) A%  &
 !3
++ P !NOOO s))Cs#788#c((CDDD " "!$	599==?? >$%<===
5!!!!	" L!#J  ! !==?? 	   	8r!!":!!"6777%     r:./// |9:::$Z88E  )*


 |$$ 	( 	(AeAh'''' !+ 	 	Ivi--!!%q(8"9:::Q i--
 H6]] 8 8E,"2Q"677h'''KAA #*++++eL1$45666FA #*++++
 |c*>&?&??VMM 	( 	(AeAh'''' .//2BB?? =L=)J|k7Q7S7S,TT  j)) D3z??Q&B// + +a=&&(( 	+!l5E&E"E"EAID$TNNJqM##E:zBBFMr   )T)r   r   r   r   r   r   r   r
   )r   r   r   r   r   r   )
__future__r   typingr   r   r   collections.abcr   torch
_dim_entryr	   r
   r   r   rV    r   r   <module>r]      s    " " " " " " , , , , , , , , , ,  )((((((  ? ? ? ? ? ? ? ? ? ?    8m m m m m mr   