
    AVh|9                     r   d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddl  ej$                  d        ej$                  d        ej$                  d        ej$                  d       	 	 d;dZd Zd<dZd<dZ	 	 d;dZd<dZ	 	 d;dZ	 	 	 d=dZ	 	 	 d>dZ	 	 d;dZd<dZ	 	 d?dZ ej>                  d      dej@                  fd        Z! ej>                  d!      dej@                  fd"       Z" ej>                  d#      d$ej@                  fd%       Z# ej>                  d&       ej>                  d'      dej@                  fd(              Z$ ej>                  d)      dej@                  fd*       Z% ej>                  d+      dej@                  fd,       Z& ej>                  d-      dej@                  fd.       Z' ej>                  d/      dej@                  fd0       Z( ej>                  d1      dej@                  fd2       Z) ej>                  d3      dej@                  fd4       Z* ej>                  d5       ej>                  d6      dej@                  fd7              Z+ ej>                  d8      dej@                  fd9       Z,d: Z-y)@z#Ops to manipulate lists of tensors.    N)full_type_pb2)cpp_shape_inference_pb2)dtypes)ops)tensor)tensor_shape)tensor_util)	array_ops)gen_list_ops)handle_data_util)*TensorListConcatListsTensorListElementShapeTensorListLengthTensorListPushBackBatchc                 N    |d}t        j                  t        |       |||      S )Nelement_shapeelement_dtypemax_num_elementsname)r   empty_tensor_list_build_element_shaper   s       N/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/ops/list_ops.pyr   r   *   s4     		'	'(7!'	
     c           	      0   t        | t        j                        rt        j                  |      rt        j                  d      }n/t        |t
        j                        st        j                  |      }t        j                  j                         }d|_
        |j                  j                  t        j                  j                  |j                         |j                  t!        j"                  t         j$                                     || _        yy)zCSets type information on `list_handle` for consistency with graphs.NT)type_id)shapedtypetype)
isinstancer   EagerTensorr	   
is_tf_typer   TensorShaper   CppShapeInferenceResult
HandleDatais_setshape_and_typeappendHandleShapeAndTypeas_protoas_datatype_enumr   FullTypeDef	TFT_ARRAY_handle_data)list_handler   r   handle_datas       r   _set_handle_datar3   8   s     S__-m,"..t4m|'?'?@"..}=m)AALLNKK%%77JJ((*00**=3J3JK 	K 	MN
  +K .r   c                 d    t        j                  t        |       |||      }t        || |       |S )N)r   num_elementsr   r   )r   tensor_list_reserver   r3   )r   r5   r   r   results        r   r6   r6   L   s6    ++(7!	& 6=-8	-r   c                     t        j                  |       } t        j                  | t	        |      |      }t        || j                  | j                         |S )N)r   r   r   )r   convert_to_tensorr   tensor_list_from_tensorr   r3   r   r    )r   r   r   r7   s       r   r:   r:   X   sK      (&//(7& 66<<6	-r   c                 H    t        j                  | |t        |      ||      S )N)input_handleindexr   r   r   )r   tensor_list_get_itemr   )r<   r=   r   r   r   s        r   r>   r>   b   s)    		*	*(7!
 r   c                 4    t        j                  | d||      S )Nr   )r<   r   r   r   )r   tensor_list_pop_back)r<   r   r   s      r   r@   r@   l   s!    		*	*!	
 r   c                 H    t        j                  | |t        |      ||      S )N)r<   indicesr   r   r   )r   tensor_list_gatherr   )r<   rB   r   r   r   s        r   rC   rC   t   s+    
 
	(	((7!
 r   c                 
   t        j                  |       } |1t        j                  || ||      }t	        j
                  ||       |S t        j                  | |t        |      d|      }t        ||| j                         |S )z?Returns a TensorList created or updated by scattering `tensor`.)r<   r   rB   r   r   )r   rB   r   r5   r   )
r   r9   r   &tensor_list_scatter_into_existing_listr   copy_handle_datatensor_list_scatter_v2r   r3   r    )r   rB   r   r<   r   output_handles         r   tensor_list_scatterrI      s       (& GG!&'NM%%lMB 77*=9M ]M6<<@r   c                 H    t        j                  | t        |      |||      S )N)r<   r   r   r5   r   )r   tensor_list_stackr   )r<   r   r5   r   r   s        r   rK   rK      s+    
 
	'	'(7!
 r   c           	          t        j                  | |t        |      t        j                  g t
        j                        |      d   S )Nr    )r<   r   r   leading_dimsr   r   )r   tensor_list_concat_v2r   r   r9   r   int64)r<   r   r   r   s       r   tensor_list_concatrQ      sF     
	+	+!(7((6<<@

 
 r   c                 F    t        j                  | t        |      ||      S )Nr   r   lengthsr   )r   tensor_list_splitr   rS   s       r   rU   rU      s&    		'	'(7	
 r   c                 f    t        j                  | ||||      }t        j                  | |       |S )z%Sets `item` at `index` in input list.)r<   r=   itemr   resize_if_index_out_of_bounds)r   tensor_list_set_itemr   rF   )r<   r=   rW   rX   r   rH   s         r   rY   rY      s;     33$A- ##L-@	r   TensorListPushBackopc                     t        j                  |t        j                  | j                  d         | j                  d            S )N   r   r   r   )r   r@   r
   r   inputsget_attr)r[   dresults     r   _PushBackGradrb      s8    		*	*OOBIIaL1KK0
2 2r   TensorListPopBackc                    |Gt        |j                  t        j                  | j                  d   t
        j                              }|"t        j                  | j                  d         }t        j                  ||      d fS )Nr   
shape_typer   r   r]   )
r   r    r   tensor_list_element_shapeoutputsr   int32r
   
zeros_liketensor_list_push_back)r[   dlistdelements      r   _PopBackGradro      so    
]nn"<<JJqMfll45E ##BJJqM2H		+	+E8	<d	BBr   TensorListStack	unused_opc                 :    t        ||j                  dd        d fS )Nr]   )r   )r:   r   )rq   dtensors     r   _TensorListStackGradrt      s    	 ab8I	JD	PPr   TensorListConcatTensorListConcatV2c                     t        |t        j                  | j                  d   t        j
                        | j                  d         }| j                  dk(  r|ddfS |S )z'Gradient function for TensorListConcat.r   re   r]   )r   rT   rv   N)rU   r   rh   r_   r   rj   ri   r!   )r[   rs   unused_dlengthsrm   s       r   _TensorListConcatGradry      s\      ::
))A,6<<1jjm	%
 WW$$$Lr   TensorListSplitc                    | j                   \  }}}t        j                  t        j                  |      dgdg      }t        j                  dg|gd      }t        j                  |||| j                   d   j                        d   d d fS )Nr]   r   r   )axis)r   rN   r   )r_   r
   slicer   concatr   rO   r    )r[   rm   r   _rT   r   s         r   _TensorListSplitGradr      s    yy&!W//)//&"9A3E-""RD-#8qA-		+	+!IIaL&&	
( )*	
+ -1$	
7 7r   TensorListFromTensorc                    | j                   d   }|j                  j                  rG|j                  j                  d   j                  $|j                  j                  d   j                  }nd}|Gt	        |j
                  t        j                  | j                  d   t        j                              }t        j                  |t        j                  t        j                  |      dgdg      |j
                  |      }d}||fS )z"Gradient for TensorListFromTensor.r   Nre   rg   r]   r   )r   r   r5   )r_   r   dimsvaluer   r    r   rh   ri   r   rj   rK   r
   r}   )r[   rm   tr5   tensor_grad
shape_grads         r   _TensorListFromTensorGradr      s     	iil!WW\\aggll1o++777<<?((LL
]gg"<<JJqMfll45E ..OOIOOA$6bTBGG	!+
 *	j	  r   TensorListGetItemc                 B   t        j                  | j                  d         }t        j                  t        j                  t        j
                  | j                  d   t        j                        ||j                        | j                  d   |      }d}d}|||fS )zGradient for TensorListGetItem.r   re   )r   r]   r=   rW   N)	r   tensor_list_lengthr_   rY   r6   rh   r   rj   r    )r[   ditem	list_size	list_grad
index_gradelement_shape_grads         r   _TensorListGetItemGradr     s     --biil;)//&&

0
01<BLLJ
5;;0 IIaL) *	J 2	22r   TensorListSetItemc                 V   | j                   \  }}}t        j                  ||t        j                  |            }d}t        ||t        j                  |      |j                        }| j                  d      r+t        j                  |      }t        j                  ||      }|||fS )z(Gradient function for TensorListSetItem.r   Nr^   rX   )r_   r   rY   r
   rk   r>   r   r    r`   r   tensor_list_resize)	r[   rm   
input_listr=   rW   r   r   element_gradinput_list_sizes	            r   _TensorListSetItemGradr   $  s     II*eT//5y33D9) *%OOD)JJ	, [[% #55jAO//	?KI	J	,,r   TensorListResizec                 z    | j                   \  }}t        j                  |      }t        j                  ||      d fS N)r_   r   r   r   )r[   rm   r   r   r   s        r   _TensorListResizeGradr   :  s7    ))-*a 33J?/		(	(	@$	FFr   TensorListGatherc                     | j                   \  }}}t        j                  |t        j                        }t        j
                  |      }t        |||j                        }t        |||      }|ddfS )z'Gradient function for TensorListGather.re   )r   rB   r<   N)	r_   r   rh   r   rj   r   r6   r    rI   )r[   rs   r   rB   r   r   r5   rm   s           r   _TensorListGatherGradr   A  sm     99*gq88V\\+-00<,
m\7==
I%
gE;%	d	r   TensorListScatterTensorListScatterV2c           	         | j                   d   }| j                   d   }t        j                  ||t        j                  t        j
                  |      dgdg      |j                        }| j                  dk(  r|dddfS |ddfS )z(Gradient function for TensorListScatter.r   r]   r   r^   r   N)r_   r   rC   r
   r}   r   r    r!   )r[   rm   r   rB   rs   s        r   _TensorListScatterGradr   N  s     99Q<&IIaL'++OOIOOF$;aS2$GLL	"'
 WW%%D$$$D$r   !TensorListScatterIntoExistingListc           	         | j                   \  }}}t        j                  ||t        j                  t        j
                  |      dgdg      |j                        }t        j                  |      }t        ||||      }||dfS )z8Gradient function for TensorListScatterIntoExistingList.r]   r   r^   )r<   N)	r_   r   rC   r
   r}   r   r    rk   rI   )r[   rm   r   r   rB   rs   zeross          r   &_TensorListScatterIntoExistingListGradr   _  s}     yy!VW++OOIOOF$;aS2$GLL	"'
 

v
&%
eWgE
J%		r   c                 z   t        | t        j                        r| S t        | t        j                        r| r| j                         nd} | yt        | t        j                  t        j                  f      s| s%t        j                  | t        j                        S d }| D cg c]
  } ||       c}S c c}w )a  Converts shape to a format understood by list_ops for element_shape.

  If `shape` is already a `Tensor` it is returned as-is. We do not perform a
  type check here.

  If shape is None or a TensorShape with unknown rank, -1 is returned.

  If shape is a scalar, an int32 tensor with empty list is returned. Note we
  do directly return an empty list since ops.convert_to_tensor would conver it
  to a float32 which is not a valid type for element_shape.

  If shape is a sequence of dims, None's in the list are replaced with -1. We
  do not check the dtype of the other dims.

  Args:
    shape: Could be None, Tensor, TensorShape or a list of dims (each dim could
      be a None, scalar or Tensor).

  Returns:
    A None-free shape that can be converted to a tensor.
  Nr   rM   c                     | yt        | t        j                        r| S t        | t        j                        r| j
                  | j
                  S dS | S )Nr   )r"   
tensor_libTensorr   	Dimensionr   )vals    r   convertz%_build_element_shape.<locals>.convert  sL    
{#z(()j#|--.))/SYY7R7Jr   )r"   r   r   r   r%   as_listnpndarraygenericr   r9   r   rj   )r   r   ds      r   r   r   m  s    , z(()L|//0$EMMO$E
]

BJJ/0  fll;; $	$'!*	$$	$s   &B8)NNr   )NNN)r   NN)FN).__doc__numpyr   tensorflow.core.frameworkr   tensorflow.python.frameworkr   r   r   r   r   r   r	   tensorflow.python.opsr
   r   r   "tensorflow.python.ops.gen_list_opsNotDifferentiabler   r3   r6   r:   r>   r@   rC   rI   rK   rQ   rU   rY   RegisterGradient	Operationrb   ro   rt   ry   r   r   r   r   r   r   r   r   r    r   r   <module>r      sL   *  3 ? . + < 4 3 + . 2 1   - .   . /   ( )   / 0
 (,+(	 LP" &* 	
 '+%)!	2 $&$(	
 CG 	 8="	" *+2cmm 2 ,2 )*CS]] C +C '(QCMM Q )Q ()*+
cmm 
 , *
 '(7S]] 7 )7 ,-!#-- ! .!* )*3s}} 3 +3 )*-s}} - +-* ()Gcmm G *G ()	cmm 	 *	 )*+,s}}  - + 9:
s}} 
 ;
+%r   