
    ёi;L                    "   S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKJrJ	r	J
r
  S SKJr  S SKJr  S SKrS SKJr  S SKrS S	KJr  S
SKJrJr  S
SKJrJrJr  S
SKJr  \R>                  (       a  S SK J!r!J"r"  \
" S5      r#\
" S5      r$ " S S\%5      r&\'4S jr(S1S jr) " S S\5      r*\*" 5       r+S r,S r-S r.S r/S r0S r1S2S jr2S r3S r4S  r5      S3S! jr6S" r7S# r8S$ r9S4S% jr:S5S& jr;S' r<S( r=S6S) jr>S* r?S7S+ jr@S, rAS- rBS. rCS/ rDS8S0 jrEg)9    )annotationsN)defaultdict)Sequence)AnyCallableTypeVar)uuid4)WeakKeyDictionary)	TypeGuard)convert_np_dtype_to_dtype_   )check_dtypeconvert_dtype)BlockVariablein_dygraph_mode)Value)NestedStructure	ShapeLike_T_Uc                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )NotSupportedTensorArgumentError.   c                0   > [         TU ]  U5        X l        g N)super__init__name)selfmsgr   	__class__s      Y/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/utils/layers_utils.pyr   (NotSupportedTensorArgumentError.__init__/   s    	    )r   )r   str__name__
__module____qualname____firstlineno__r   __static_attributes____classcell__r"   s   @r#   r   r   .   s     r%   r   c                v   [        X5      (       a  U /U-  $ [        U [        [        R                  R                  45      (       a  [        SU SU S3U5      e [        U 5      n[        U5      U:w  a  [        SU SU SU  35      eU HN  n[        U[        [        R                  R                  45      (       a  [        SU SU S3U5      e U" U5        MP     U$ ! [         a    [        SU SU  35      ef = f! [        [        4 a+    [        SU SU S	U S
3SU  SU S[        U5       3-   5      ef = f)a1  
Converts a single numerical type or iterable of numerical
types into a numerical type list.

Arguments:
  value: The value to validate and convert. Could an int, or any iterable
    of ints.
  n: The size of the list to be returned.
  name: The name of the argument being validated, e.g. "stride" or
    "filter_size". This is only used to format error messages.
  dtype: the numerical type of the element of the list to be returned.

Returns:
  A list of n dtypes.

Raises:
  ValueError: If something else than an int/long or iterable thereof was
    passed.
`z ` required numerical type with `z`, but received Tensor.zThe z)'s type must be list or tuple. Received: z's length must be z. Received: z#'s type must be a list or tuple of  z. z
Received: z including element z	 of type )
isinstancer   paddlepirr   r   list	TypeError
ValueErrorlentype)valuenr   dtype
value_listsingle_values         r#   convert_to_listr?   4   s   ( %w{eh

(8(89::1D69%@WX 	eJ
 z?atf.qceWE  'L,6::3C3C(DEE5v=eWD[\ l# ' +  	tfEeWM 	  	*  4& CA3awbQ"5')<\N)TXYeTfSghi s   C C=C:=;D8c                    [        U [        5      (       a  g[        U [        5      =(       a    [        U [        5      (       + $ )z/
Whether `seq` is an entry or nested structure
T)r2   dictr   r&   )seqs    r#   is_sequencerC   j   s0     #tc8$AZS-A)AAr%   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )UniqueIdMaps   c                L   > [         TU ]  U 5        [        [        5      U l        g r   )r   r   r   r	   data)r    r"   s    r#   r   UniqueIdMap.__init__t   s    &	r%   )rH   r'   r.   s   @r#   rE   rE   s   s    ' 'r%   rE   c                    [        U [        5      (       a  [        U 5      4$ [        U [        5      (       a  [	        U 5      4$ [
        U    R                  4$ r   )r2   r&   hashr5   iduniqueidmapint)objs    r#   uniqueidrP   |   sH    #sS	|	C		3zC $$&&r%   c                 l    [        U 5      S:  d   eSnU  H  nU[        U5      -   nM     [        U5      $ )zE
Return int hash value calculated by id(arg) or tuple(id1,id2, ...).
r    )r8   rP   rK   )argsinfovs      r#   _hash_with_idrV      s;     t9q==Dhqk! :r%   c                h     [        U R                  5       5      $ ! [         a    [        S5      ef = f)zJ
Returns a sorted list of the dict keys, with error if keys not sortable.
z,nest only supports dicts with sortable keys.)sortedkeysr6   )dict_s    r#   _sortedr[      s6    Hejjl## HFGGHs    1c              #     #    [        U [        5      (       a  [        U 5       H	  nX   v   M     g U  S h  vN   g  N7fr   )r2   rA   r[   )iterablekeys     r#   _yield_valuer_      s4     (D!!8$C- % s   4><>c              #     #    [        U 5       H,  n[        U5      (       a  [        U5       S h  vN   M(  Uv   M.     g  N7fr   )r_   rC   _yield_flat_nest)nestr;   s     r#   ra   ra      s3     $q>>'***G	  *s   -A?Ac                ,    [        U 5      (       a  U $ U /$ r   rC   rb   s    r#   to_sequencerf      s    4vr%   c                P    [        U 5      (       a  [        [        U 5      5      $ U /$ )z
    :alias_main: paddle.flatten
    :alias: paddle.flatten,paddle.tensor.flatten,paddle.tensor.manipulation.flatten
    :old_api: paddle.base.layers.flatten

Traverse all entries in the nested structure and put them into an list.
)rC   r5   ra   re   s    r#   flattenrh      s'     4$T*++vr%   c                  ^ [        U [        5      (       aG  [        [        [        U 5      U5      5      m[	        U 5      " U4S jU R                  5        5       5      $ [        U [        5      (       a_  [        U S5      (       aN  [        U R                  [        5      (       a/  [        S U R                   5       5      (       a  [	        U 5      " U6 $ [	        U 5      " U5      $ )z=
Convert the sequence `args` to the same type as `instance`.
c              3  0   >#    U  H  oTU   4v   M     g 7fr   rR   ).0r^   results     r#   	<genexpr>!_sequence_like.<locals>.<genexpr>   s     LOSF3K0Os   _fieldsc              3  B   #    U  H  n[        U[        5      v   M     g 7fr   )r2   r&   )rk   fs     r#   rm   rn      s     =,<q
1c"",<s   )r2   rA   zipr[   r9   rY   tuplehasattrro   r   all)instancerS   rl   s     @r#   _sequence_likerw      s     (D!!c'(+T23H~LHMMOLLL8U##Hi((x''22=H,<,<=== H~t$$ H~d##r%   c                :   / n[        U 5       H  n[        U5      (       a,  [        XAU5      u  pVUR                  [	        XF5      5        UnM?  UR                  [        U[        5      (       d  X   O[        UR                  5       5      U   5        US-  nM     X#4$ )z'
Helper function for pack_sequence_as.
   )	r_   rC   _packed_nest_with_indicesappendrw   r2   rA   r5   values)	structureflatindexpackeds	new_indexchilds          r#   rz   rz      s     F)$q>>8%HIMM.23E MM!$-- $++-(/
 QJE % =r%   c                |   [        U5      (       d  [        S5      e[        U 5      (       d,  [        U5      S:w  a  [        S[        U5       S35      eUS   $ [	        U 5      n[        U5      [        U5      :w  a*  [        S[        U5       S[        U5       SU  S	U S
3	5      e[        XS5      u  p4[        X5      $ )z9
Pack a given flattened sequence into a given structure.
z flat_sequence must be a sequencery   z0Structure is a scalar but len(flat_sequence) == z > 1r   z'Could not pack sequence. Structure had z! elements, but flat_sequence had z elements. Structure: z, flat_sequence: .)rC   r6   r8   r7   rh   rz   rw   )r}   flat_sequenceflat_structure_r   s        r#   pack_sequence_asr      s     }%%:;;y!!}"B3}CUBVVZ[  QY'N
>c-005c.6I5J K}%&&<YKGXYfXgghj
 	
 *)AFIA),,r%   c           	         U Vs/ s H  n[        U5      PM     nn[        U6 n[        US   U Vs/ s H  oP" U6 PM	     sn5      $ s  snf s  snf )zG
Apply `func` to each entry in `structure` and return a new structure.
r   )rh   rr   r   )funcr}   r   r   entriesxs         r#   map_structurer      sR     +44)Qgaj)N4>"GIaLW*EW48W*EFF 5*Es
   AA
c                :    U  H  n[        U5      (       d  M    g   g)z<
Returns whether structure holds sequence like `list/dict`.
TFrd   )r}   r   s     r#   hold_mutable_varsr   	  s     q>>  r%   c                V    [         R                   " [        U 5      5      n[        X5      $ )z=
Returns vars copied from sequence without mutable property.
)copyrh   r   )r}   r   s     r#   copy_mutable_varsr     s"     YYwy12NI66r%   c           
        Ub  U" U 5      (       d  U" U5      (       a  g[        U 5      nU[        U5      :w  a  [        SU  SU S35      eU(       d  gU(       a  [        U 5      n[        U5      nXV:w  a  [        SU SU S35      e[	        U [
        5      (       aI  [        U R                  5       5      n[        UR                  5       5      nXx:w  a  [        SU SU S35      e[        [        U 5      5      n	[        [        U5      5      n
[        U	5      [        U
5      :w  a)  [        S	[        U	5       S
U  S[        U
5       S
U 35      e[        X5       H  u  p[        XX#5        M     g)z.
Helper function for `assert_same_structure`.
NzKThe two structures don't have the same nested structure.

First structure: z

Second structure: r   zOThe two structures don't have the same sequence type. First structure has type z", while second structure has type zOThe two dictionaries don't have the same set of keys. First structure has keys z", while second structure has keys MThe two structures don't have the same number of elements.

First structure ( elements): 

Second structure ()rC   r7   r9   r6   r2   rA   setrY   r5   r_   r8   rr    _recursive_assert_same_structure)nest1nest2check_typesskip_ifis_sequence_nest1
type_nest1
type_nest2keys1keys2nest1_as_sequencenest2_as_sequencen1n2s                r#   r   r     s    '%..#E*K..  %w&<UG1F
 	
 %[
%[
#&&0\1ST^S__`b  eT""

%E

%E~ **/0RSXRYYZ\  \%01\%01
%6!77  #$5 67|E7 K!!$%6!7 8UGM
 	

 ';(F <r%   c                .    S nU" X5      n U" X5      nX4$ )Nc           	        ^ U4S jn[        U 5      (       a-  [        U [        U 5       Vs/ s H
  o2" U5      PM     sn5      n U $ U" U 5      n U $ s  snf )Nc                   > U c  T$ U $ r   rR   )r   rO   s    r#   change_none_to_obj`padding_to_same_structure.<locals>._padding_to_same_structure_single.<locals>.change_none_to_objG  s    y
Hr%   )rC   r   rh   )r:   rO   r   items    `  r#   !_padding_to_same_structure_singleDpadding_to_same_structure.<locals>._padding_to_same_structure_singleF  s[    	
 u$WU^L^T*40^LE
  'u-E	 Ms   A
rR   )r   r   rO   r   s       r#   padding_to_same_structurer   E  s%     .e9E-e9E<r%   c           
     .   Ub  U" U 5      (       d  U" U5      (       a  g[        U 5      (       a  [        [        U 5      5      OSn[        U5      (       a  [        [        U5      5      OSnXE:w  a  Uc  [        SU SU  SU SU 35      e[	        XX#5        g)z8
Confirm two nested structures with the same structure.
Nry   r   r   r   )rC   r8   rh   r7   r   )r   r   r   r   	len_nest1	len_nest2s         r#   assert_same_structurer   Y  s     '%..'25'9'9GEN#qI'25'9'9GEN#qI'/--6K|E7 K!!*<w@
 	

 %U;Hr%   c                    [        U 5      US-  :X  d  [        U 5      U:X  d   eSn[        U 5      US-  :X  a)  [        U5       H  nXS-     XS-  S-      :w  d  M  SnM     U$ )z'
Check whether padding is symmetrical.
r   Try   F)r8   range)paddingdata_dimis_sysis       r#   _is_symmetric_paddingr   j  sm     w<8a<'3w<8+CCCF
7|x!|#xA1u~Q!33 ! Mr%   c                x    U  H4  n[        U[        [        R                  R                  45      (       d  M4    g   g)z8
Check whether list or tuple contains variable / Value.
TF)r2   r   r3   r4   r   )list_or_tupler   s     r#   _contain_varr   w  s2     dXvzz'7'7899  r%   c           	        / nU  H  n[        U[        R                  R                  5      (       an  SUl        [        UR                  5      U:w  a  [        R                  " X1S9nUR                  / :w  a  [        R                  " U/ 5      nUR                  U5        M  [        R                  R                  / [        [        R                  " U5      5      USS9nUR                  U5        M     U$ )NTr   r<   )shaper<   r:   	force_cpu)r2   r3   r4   r   stop_gradientr   r<   castr   reshaper{   tensorfill_constantr   np)ele_listdefault_dtypeint_tensor_listeletemp_outs        r#   get_int_tensor_listr     s    Oc6::++,, $CSYY'=8kkC=yyBnnS"-""3'}}220-1HI	 3 H ""8,   r%   c           	       ^^ SSK Jm  S nUU4S jn[        U[        5      (       a[  SUl        [        UR                  SSS/S	S
T S35        [        UR                  5      S:X  a  [        R                  " US5      nX S'   g [        U[        [        45      (       a(  U" U5      US'   [        U5      (       a  U" U5      U S'   g g [        S5      e)Nr   r   c                    / n[        U 5       H>  u  p#[        U[        5      (       a  UR                  S5        M-  UR                  U5        M@     U$ N)	enumerater2   r   r{   )
list_shape
attr_shapeidxdims       r#   _get_attr_shape0get_shape_tensor_inputs.<locals>._get_attr_shape  sI    
!*-HC#x((!!"%!!#&	 .
 r%   c           
     ~  > / n[        U 5       H  u  p#[        U[        5      (       av  SUl        [	        UR
                  S[        U5      -   S-   SS/TST S35        [        UR
                  5      S:X  a  [        R                  " USS9nUR                  U5        M  T" / SUSS	9nUR                  U5        M     U$ )
NTzshape[]int32int64(When type of shape in z is list or tuple.)r   r   )r   r2   r   r   r   r<   r&   r   r3   r   r{   )r   shape_tensor_listr   r   r   r   op_types        r#   _get_shape_tensor2get_shape_tensor_inputs.<locals>._get_shape_tensor  s    !*-HC#x(($(!IIs3x'#-g&-gY6IJ !+w6 ++7;C!((-(WcTJ!((2 .  ! r%   Tr   r   r   r   r   z is Variable.)ShapeTensorShapeTensorListz0Shape only supports Variable, or list, or tuple.)paddle.tensorr   r2   r   r   r   r<   r   r3   r   r5   rs   r   r6   )inputsattrsr   r   r   r   r   s      `  @r#   get_shape_tensor_inputsr     s    +!( %"""KKg%gYn=	
 %0KKw/E %}	ED%=	)	)(/g(9%(@F$%  JKKr%   c                   SSK Jn  [        U 5      (       a@  U  H:  n[        U[        R
                  R                  5      (       d  M.  UR                  nM<     / nU  H}  n[        U[        [        R
                  R                  45      (       a  SUl	        UR                  U5        ML  [        U[        5      (       d   eU" S/XSS9nUR                  U5        M     U$ )z6
Converts all elements of a list to Variable / Value.
r   r   Try   r   )r   r   r   r2   r3   r4   r   r<   r   r   r{   rN   )old_listr<   r   r   new_list_tensorr   s         r#   _convert_to_tensor_listr     s     ,HC#vzz//00		  OcHfjj&6&6788 $C""3'c3''''$aS%EH""8,  r%   c                r   [        U [        [        45      (       ai  / nU  H]  n[        U[        5      (       a4  UR                  S:  a"  UR                  UR                  S5      5        MJ  ML  UR                  U5        M_     Un U $ [        5       (       a#  U R                  [        5      R                  5       n U $ )zA
Convert shape(list, tuple, variable) to list in imperative mode
r   )r2   r5   rs   r   sizer{   r   r   astyperN   tolist)r   	shape_outr   s      r#   convert_shape_to_listr     s     %$''	A!X&&66A:$$QVVAY/    #   L LL%,,.ELr%   c                   [        U [        [        45      (       a  [        U R                  SSS/S5        g	[        U [
        [        45      (       ar  U  Hk  n[        U[        [        45      (       d3  US:  a  [        S5      e[        U[        5      (       d  [        S5      eMQ  [        UR                  SSS/S5        Mm     g	g	)
zM
Check shape type and shape elements type before passing it to fill_constant
r   r   r   r   r   zDAll elements in ``shape`` must be positive when it's a list or tuplezDAll elements in ``shape`` must be integers when it's a list or tuplezelement of shapeN)
r2   r   r   r   r<   r5   rs   r7   rN   r6   )r   r   s     r#   check_shaper     s     %(E*++EKK7G*<oN	ED%=	)	)CcHe#4557$^  "#s++#^  ,
 II&g&#	  
*r%   c                    [        5       (       d]   U R                  bN  U R                  nUR                  S:X  a2  U R                  R                  UR
                  S      nUR                  $ gg!    g= f)a*  Try to get shape from a tensor with constant value.

For example,

import paddle
paddle.enable_static()
data = paddle.static.data(name="x", shape=[-1, 2], dtype='float32')
shape = paddle.shape(data)  # shape should be [-1, 2] instead of [-1, -1]
x = paddle.uniform(shape)
print(x.shape)
# (-1, 2)

Nr   r   )r   opr9   blockvarsinput_arg_namesr   )shape_tensorgenerate_opvars      r#   "try_get_constant_shape_from_tensorr     sw     		**oo##w.&,,11#33A6C 99$  	s   AA. .A2c                   [        U [        5      (       d   S5       eU R                  S:w  d   S5       e[        5       n[        5       nU R                   H  nUR
                   HD  nUR                  U5       H,  nU R                  U5      (       a  M  UR                  U5        M.     MF     UR                   HD  nUR                  U5       H,  nU R                  U5      (       a  M  UR                  U5        M.     MF     M     X4$ )z[
Returns the inputs and outputs variable used in this block but not
created in this block.
z9input non-Block argument for get_inputs_outputs_in_block.r   z2input block should be a sub-block, not main block.)r2   r   
parent_idxr   opsinput_namesinputhas_varaddoutput_namesoutput)r   inner_inputsinner_outputsr   inamein_var_nameonameout_var_names           r#   get_inputs_outputs_in_blockr  ,  s    
 eU## C# r! <!
 5LEMii^^E!xx}}[11 $$[1  / $
 __E "		% 0}}\22!%%l3 !1 %  &&r%   c                *  ^ [         R                  " 5       (       a  X:H  $ S mU4S jnT" U 5      (       d  T" U5      (       a  g[        U 5      [        U5      :w  a  g[        X5       H(  u  p4U" U5      (       d  U" U5      (       a  M!  X4:w  d  M(    g   g)zE
Check whether two shapes are the same. Deal with the dynamic shape.
c                ~    [        U [        R                  R                  [        R                  R
                  45      $ r   )r2   r3   staticr   r4   r   )r   s    r#   	is_tensor is_same_shape.<locals>.is_tensorQ  s(    !fmm44fjj6F6FGHHr%   c                ,   > T" U 5      =(       d    U S:H  $ r   rR   )axisr  s    r#   is_dynamic_axis&is_same_shape.<locals>.is_dynamic_axisT  s    ,$"*,r%   TF)r3   in_dynamic_moder8   rr   )shape1shape2r  s1s2r  s        @r#   is_same_shaper  J  s     I- If--
6{c&k!f%2/""5"58	 &
 r%   )rB   r   returnz0TypeGuard[typing.Sequence[Any] | dict[str, Any]])rb   NestedStructure[_T]r  ztyping.Sequence[_T])r   zCallable[[_T], _U]r}   r  r  zNestedStructure[_U]r   )TN)r   )r   )r  r   r  r   r  bool)F
__future__r   r   typingcollectionsr   collections.abcr   r   r   r   uuidr	   weakrefr
   numpyr   typing_extensionsr   r3   paddle.pir.corer   base.data_feederr   r   base.frameworkr   r   r   r4   r   TYPE_CHECKINGpaddle._typingr   r   r   r   r6   r   rN   r?   rC   rE   rM   rP   rV   r[   r_   ra   rf   rh   rw   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rR   r%   r#   <module>r.     s5   #   # $ ) )  %  '  6 9 
 	9T]T]i  +. 3lB'# ' m'H$(*-,G
G*=GG7'GT(I"
*1Lh.(4:'<r%   