
    AVh_                         d 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 Zd ZdZd Z edg       d        Zy)zWeight broadcasting operations.

In `tf.losses` and `tf.metrics`, we support limited weight broadcasting. This
file includes operations for those broadcasting rules.
    )ops)tensor_util)	array_ops)cond)control_flow_assert)control_flow_ops)math_ops)sets)	tf_exportc                    t        j                  d d| |f      5 }t        j                  |d      }t        j                  |t        j
                  |      fd      }t        j                  | d      }t        j                  ||      }t        j                  |j                  d      }t        j                  d||      cd d d        S # 1 sw Y   y xY w)Nhas_invalid_dims   )axisnum_invalid_dimsnamer   )r   
name_scoper   expand_dimsconcat	ones_liker
   set_differencesizevaluesr	   equal)weights_shapevalues_shapescopevalues_shape_2d
valid_dimsweights_shape_2dinvalid_dimsr   s           [/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/ops/weights_broadcast_ops.py_has_valid_dimsr$       s    
~~
 =? 	;BG++L"=O!!	)--o>?aIJ ,,]B?&&'7DL ~~"46>>!-E:	; 	; 	;s   B'CCc                     t        j                  d d| |f      5 }t        j                  || d      t	        j                  fdfd|      cd d d        S # 1 sw Y   y xY w)Nhas_valid_nonscalar_shapeis_same_rankr   c                      t               S N)r$   )r   r   s   r#   <lambda>z,_has_valid_nonscalar_shape.<locals>.<lambda>6   s    |<     c                       S r)    )r'   s   r#   r*   z,_has_valid_nonscalar_shape.<locals>.<lambda>7   s     r+   )r   r   r	   r   r   )weights_rankr   values_rankr   r   r'   s    ` ` @r#   _has_valid_nonscalar_shaper0   -   sg    
~~
']K>@ 	CH>>\8L99<		 	 	s   8A!!A*z'weights can not be broadcast to values.c                    t        j                  dd| |f      5 }t        j                  dd| f      5 }t        j                  | |      } t        j                  | d      t        j
                  | d      ddd       t        j                        }t        j                  dd|f      5 }t        j                  ||      }t        j                  |d      t        j
                  |d      ddd       t        j                        }|||dk(  rt        j                  d	      cddd       S ||k7  r7t        t         d
| d| d|j                   d| j                   d|  d|       t        j                        }t        j                        }|x|vt        |      }	|	t        |      k(  sJ t        |	      D ].  }
||
   d||
   fvst        t         d|
 d| d| d|  d|        t        j                  d      cddd       S t        j                  dd      t        d| j                   d|j                   df	}t#        j"                  fdfdd      }t%        j&                  |||      cddd       S # 1 sw Y   "xY w# 1 sw Y   xY w# 1 sw Y   yxY w)az  Asserts `weights` can be broadcast to `values`.

  In `tf.losses` and `tf.metrics`, we support limited weight broadcasting. We
  let weights be either scalar, or the same rank as the target values, with each
  dimension either 1, or the same as the corresponding values dimension.

  Args:
    weights: `Tensor` of weights.
    values: `Tensor` of values to which weights are applied.

  Returns:
    `Operation` raising `InvalidArgumentError` if `weights` has incorrect shape.
    `no_op` if static checks determine `weights` has correct shape.

  Raises:
    ValueError:  If static checks determine `weights` has incorrect shape.
  Nassert_broadcastableweightsr   shaperankr   r   static_scalar_check_successz values.rank=z. weights.rank=z. values.shape=z. weights.shape=z. Received weights=z	, values=r   z Mismatch at dim z, weights.shape=static_dims_check_success	is_scalarzweights.shape=zvalues.shape=z
is_scalar=c                       S r)   r-   )r8   s   r#   r*   z&assert_broadcastable.<locals>.<lambda>   s    	 r+   c                       t               S r)   )r0   )r/   r   r.   r   s   r#   r*   z&assert_broadcastable.<locals>.<lambda>   s    *-lD r+   is_valid_shape)r   r   convert_to_tensorr   r4   r5   r   constant_valuer   no_op
ValueError"_ASSERT_BROADCASTABLE_ERROR_PREFIXlenranger	   r   r   r   r   Assert)r3   r   r   weights_scopeweights_rank_staticvalues_scopevalues_rank_staticweights_shape_staticvalues_shape_staticndimsidatar;   r8   r/   r   r.   r   s                @@@@@r#   r2   r2   >   s   $ ~~d2Wf4EF 5H%	i'	4 :%%gMBgoogG<m^^G&9l: &44\B	h		2 8l$$V,?f__V':lNN67k8 %33K@ &+=+I		!%%+HI!5H 5H" 
 2	212-!"/2E1F G"LL>)9'-- I  'y	&;< 	<
 )77F'66|D		).A.M'(01111u 	$A!!$Q0CA0F,GG566Gs K  344D'((;G9 E #$ $	$  %%+FGK5H 5HP q,[AI*',,li	D YY	DN %%ndGk5H 5H: :8 85H 5HsP   J8AJ>5J83AJ+9=J8 BJ8 6J8 A4J8J(	#J8+J5	0J88Kz"__internal__.ops.broadcast_weights)v1c                    t        j                  dd| |f      5 }t        j                  |d      }t        j                  | |j                  j                  d      } | j                         }|j                         }|j                         r,|j                         r|j                  |      r| cddd       S t        j                         4t        j                  | t        j                  |      |      cddd       S t        j                  t        | |      f      5  t        j                  | t        j                  |      |      cddd       cddd       S # 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w)a  Broadcast `weights` to the same shape as `values`.

  This returns a version of `weights` following the same broadcast rules as
  `mul(weights, values)`, but limited to the weights shapes allowed by
  `assert_broadcastable`. When computing a weighted average, use this function
  to broadcast `weights` before summing them; e.g.,
  `reduce_sum(w * v) / reduce_sum(_broadcast_weights(w, v))`.

  Args:
    weights: `Tensor` whose shape is broadcastable to `values` according to the
      rules of `assert_broadcastable`.
    values: `Tensor` of any shape.

  Returns:
    `weights` broadcast to `values` shape according to the rules of
      `assert_broadcastable`.
  Nbroadcast_weightsr   r   r3   )dtyper   )r   r   r<   rP   
base_dtype	get_shapeis_fully_definedis_compatible_withr   get_enclosing_xla_contextr	   multiplyr   r   control_dependenciesr2   )r3   r   r   r   r   s        r#   rO   rO      sU   & ~~d/'61BC <u""69F##v||..Y@G %%'M##%L&&(%%'((6< <" 113?
9&&v.U<%< <( 
	!	!#7#H"J	K <
9&&v.U<< <)< <(< < <)< < <s0   BE6:>E6 E6"+E 	E6 E)	%E66E?N)__doc__tensorflow.python.frameworkr   r   tensorflow.python.opsr   r   r   r   r	   r
    tensorflow.python.util.tf_exportr   r$   r0   r@   r2   rO   r-   r+   r#   <module>r\      s^    , 3 + & 5 2 * & 6
; &O "GHT /B7(< 8(<r+   