o
    2hv                     @   s   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 G d
d dejZdd Zdd Zdd Zdd ZG dd dejZG dd dejZdS )    )
namedtuple)lossesmetrics)ops)tree)KerasTensorloss)get_object_name)Trackerc                       sL   e Zd Zd fdd	ZdddZdd Zd	d
 Zdd Zedd Z	  Z
S )MetricsListmetrics_listNc                    s   t  j|d || _|| _d S )Nname)super__init__r   output_name)selfr   r   r   	__class__ [/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/trainers/compile_utils.pyr      s   
zMetricsList.__init__c                 C   s    | j D ]
}|j|||d qd S )Nsample_weight)r   update_state)r   y_truey_predr   mr   r   r   r      s   
zMetricsList.update_statec                 C   s   | j D ]}|  qd S N)r   reset_stater   r   r   r   r   r       s   

zMetricsList.reset_statec                 C   s   dd | j D S )Nc                 S   s   i | ]}|j | qS r   )r   result.0r   r   r   r   
<dictcomp>       z*MetricsList.get_result.<locals>.<dictcomp>r   r   r   r   r   
get_result   s   zMetricsList.get_resultc                 C      t r   NotImplementedErrorr'   r   r   r   
get_config      zMetricsList.get_configc                 C   r)   r   r*   clsconfigr   r   r   from_config!      zMetricsList.from_config)r   Nr   )__name__
__module____qualname__r   r   r    r(   r,   classmethodr1   __classcell__r   r   r   r   r      s    
r   c                 C   s*   | d u rdS t | trdS t| rdS dS )NTF)
isinstancestrcallable)valuer   r   r   is_function_like&   s   
r<   c                 C   sP   t | j}t |j}| jd }|jd }|dk}||k p#|dko#|dk}||fS )N   )lenshape)r   r   y_t_ranky_p_ranky_t_last_dimy_p_last_dim	is_binaryis_sparse_categoricalr   r   r   is_binary_or_sparse_categorical0   s   



rG   c                 C   s   | d u rd S t |  dvrt| }n%t||\}}|r&tjt | d}n|r1tjt | d}ntjt | d}t| t rA| }nt	|}t|tj
sPt|}||_|S )N)accuracyaccr   )r9   lowermetrics_modulegetrG   BinaryAccuracySparseCategoricalAccuracyCategoricalAccuracyr8   r   MetricMeanMetricWrapperr   )
identifierr   r   
metric_objrE   rF   metric_namer   r   r   
get_metric=   s.   

rU   c                 C   s   | d u rd S t |  dvrt| }nt||\}}|r!tj}n	|r'tj}ntj}t|tj	sCt| t r8| }nt
|}tj||d}|S )N)crossentropycer   )r9   rJ   losses_modulerL   rG   binary_crossentropysparse_categorical_crossentropycategorical_crossentropyr8   Lossr   LossFunctionWrapper)rR   r   r   loss_objrE   rF   	loss_namer   r   r   get_loss`   s$   
r`   c                       s   e Zd Z		d fdd	Zedd Zedd Zd	d
 Zdd Zdd Z	dddZ
dd Zdd Zdd Zedd Z  ZS )CompileMetricscompile_metricNc                    s   t  j|d |rt|tttfstd| dt| |r3t|tttfs3td| dt| || _|| _	d| _
d| _|| _d S )Nr   zTExpected `metrics` argument to be a list, tuple, or dict. Received instead: metrics=	 of type zfExpected `weighted_metrics` argument to be a list, tuple, or dict. Received instead: weighted_metrics=Fcompile_metrics)r   r   r8   listtupledict
ValueErrortype_user_metrics_user_weighted_metricsbuiltr   output_names)r   r   weighted_metricsr   rm   r   r   r   r   }   s0   

zCompileMetrics.__init__c                 C   sN   | j sg S g }| j| j D ]}t|tr||j q|d ur$|| q|S r   )rl   _flat_metrics_flat_weighted_metricsr8   r   extendr   append)r   r   r   r   r   r   r      s   

zCompileMetrics.metricsc                 C   s2   | j sg S g }| jD ]}|d ur||j q
|S r   )rl   r   rq   	variablesr   varsr   r   r   r   rs      s   
zCompileMetrics.variablesc                 C   s   d}| j r	| j }n/t|trtt| }n!t|ttfr6t|}tdd |D r3dd |D }nd }nd }|r>t|}| 	|}| 	|}| j
}| j}| j|||||dd| _| j|||||dd| _d	| _d S )
Nr>   c                 s   s    | ]}t |d V  qdS )_keras_historyN)hasattrr$   xr   r   r   	<genexpr>       z'CompileMetrics.build.<locals>.<genexpr>c                 S   s   g | ]}|j jjqS r   )rv   	operationr   rx   r   r   r   
<listcomp>       z(CompileMetrics.build.<locals>.<listcomp>r   )argument_namern   T)rm   r8   rg   sortedre   keysrf   r?   all
_flatten_yrj   rk   _build_metrics_setro   rp   rl   )r   r   r   num_outputsrm   r   rn   r   r   r   build   sD   



zCompileMetrics.buildc                    s  g }t |tr"| D ]}||vr!td| d| d| d| q|dkrh|s/|d  |S t |tr9t|}t |tsA|g}tdd |D sWtd| d	| d| |t	 fd
d|D  |S t |tt
frt|t krtd| d| d| dt| dt  dtt| D ];\}	\}
t |
ts|
g}
|r||	 nd }tdd |
D std| d|
 |t	fdd|
D |d q|S t |trI|d u rtd| d| d| | D ],}t || ts|| g||< tdd || D std| d| d||  qt| D ]%\}||v rB|t	fdd|| D |d q#|d  q#|S )NzIn the dict argument `z`, key 'z5' does not correspond to any model output. Received:
=r>   c                 s       | ]}t |V  qd S r   r<   r#   r   r   r   rz          z4CompileMetrics._build_metrics_set.<locals>.<genexpr>zExpected all entries in the `z/` list to be metric objects. Received instead:
c                    s(   g | ]}|d urt |d  d qS )Nr   rU   r#   )r   r   r   r   r}      s
    z5CompileMetrics._build_metrics_set.<locals>.<listcomp>z7For a model with multiple outputs, when providing the `zY` argument as a list, it should have as many entries as the model has outputs. Received:
z
of length z whereas the model has z	 outputs.c                 s   r   r   r   r$   er   r   r   rz     r   z$All entries in the sublists of the `zQ` list should be metric objects. Found the following sublist with unknown types: c                        g | ]}|d urt | qS r   r   r#   ypytr   r   r}     
    
)r   z
Argument `zY` can only be provided as a dict when the model also returns a dict of outputs. Received c                 s   r   r   r   r   r   r   r   rz   '  r   z)` dict should be metric objects. At key 'z3', found the following sublist with unknown types: c                    r   r   r   r#   r   r   r   r}   2  r   )r8   rg   r   rh   rr   r   flattenre   r   r   rf   r?   	enumeratezip)r   r   r   rm   r   r   r   flat_metricsr   idxmlsr   )r   r   r   r   r   r      s   

V


J

)
z!CompileMetrics._build_metrics_setc                 C   sD   t |tr| jrg }| jD ]}||v r|||  q|S t|S r   )r8   rg   rm   rr   r   r   )r   yr"   r   r   r   r   r   >  s   

zCompileMetrics._flatten_yc                    s   | j s	| || | |}| |}t| j||D ]\}}}|r'||| q d urG|   t t|k rF fddtt|D  ndd tt|D  t| j|| D ]\}}}}|ri|||| qZd S )Nc                    s   g | ]} d  qS )r   r   r$   _r   r   r   r}   S      z/CompileMetrics.update_state.<locals>.<listcomp>c                 S   s   g | ]}d qS r   r   r   r   r   r   r}   U  s    )	rl   r   r   r   ro   r   r?   rangerp   )r   r   r   r   r   y_ty_ps_wr   r   r   r   G  s*   



zCompileMetrics.update_statec                 C   s>   | j sd S | jD ]}|r|  q| jD ]}|r|  qd S r   )rl   ro   r    rp   r!   r   r   r   r    \  s   

zCompileMetrics.reset_statec                 C   sb  | j stdi }i }| jD ]A}|sq|jD ]8}|j}|jr&|j d| }||vr5| ||< d||< q|| }||  d7  < | d| }| ||< qq| jD ][}|sXqS|jD ]R}|j}|jrk|j d| }||vrz| ||< d||< q[d|j }|jr|j d| }||vrd||< n|| }||  d7  < | d| }| ||< q[qS|S )Nz<Cannot get result() since the metric has not yet been built.r   r>   	weighted_)rl   rh   ro   r   r   r   r"   rp   )r   resultsunique_name_countersr   r   r   indexr   r   r   r"   f  sT   






zCompileMetrics.resultc                 C   r)   r   r*   r'   r   r   r   r,     r-   zCompileMetrics.get_configc                 C   r)   r   r*   r.   r   r   r   r1     r2   zCompileMetrics.from_config)rb   Nr   )r3   r4   r5   r   propertyr   rs   r   r   r   r   r    r"   r,   r6   r1   r7   r   r   r   r   ra   |   s"    

(f
	
.ra   c                       s   e Zd Zedg dZ			d fdd	Zedd Zed	d
 Zdd Z	dd Z
dd ZdddZdddZdd Zedd Z  ZS )CompileLossr\   )pathr
   loss_weightsr   Nsum_over_batch_sizec                    s   |rt |ttttfstd| dt| || _|| _d| _	|| _
t jd|d g | _tddd | jfi| _d | _d | _d | _d S )	NzExpected `loss_weights` argument to be a float (single output case) or a list, tuple, or dict (multiple output case). Received instead: loss_weights=rc   Fcompile_loss)r   	reductionr   c                 S   s   t | tjS r   )r8   rK   rP   ry   r   r   r   <lambda>  s    z&CompileLoss.__init__.<locals>.<lambda>)r8   re   rf   rg   floatrh   ri   
_user_loss_user_loss_weightsrl   rm   r   r   _metricsr   _tracker_flat_losses_y_pred_build_structure_y_true_build_structure)r   r
   r   r   rm   r   r   r   r     s4   
zCompileLoss.__init__c                 C   s   | j S r   )r   r'   r   r   r   r     s   zCompileLoss.metricsc                 C   s    g }| j D ]}||j q|S r   )r   rq   rs   rt   r   r   r   rs     s   
zCompileLoss.variablesc              	   C   sn  t |}t |sy|j}|d u rd S |j}t|||}	|}
t |sG|d ur*|}n|	j}t|
dkr7|f}
nt|
d t	rG|
d d |f }
d
dd |
D }|dkrkt|trat| }nt |}d
|}| jt||	|| d S tt|ttfrtdd |D rt|t|krt ||}n tt|ttfrt|t|s|D ]}| ||||| qd S t |s| |||||S t|t|std	| d
t|tr| }dd }ntt|ttfrt|}dd }n
tdt| d|D ]1\}}|d u rq||||fs!td	||f  d| || || ||| ||f  qd S )Nr   r=   /c                 S   s   g | ]}t |qS r   )r9   )r$   r   r   r   r   r}     r   z-CompileLoss._build_nested.<locals>.<listcomp> r   c                 S   s   g | ]}t | qS r   )r   	is_nested)r$   _lossr   r   r   r}     r&   z
The path: zI in the `loss` argument, can't be found in the model's output (`y_pred`).c                       t  fdd|D S )Nc                    s   g | ]}t |to |v qS r   )r8   rg   r$   objkeyr   r   r}     s    CCompileLoss._build_nested.<locals>.key_check_fn.<locals>.<listcomp>r   r   objsr   r   r   key_check_fn  s   z/CompileLoss._build_nested.<locals>.key_check_fnc                    r   )Nc                    s*   g | ]}t t|ttfo t|k qS r   )
issubclassri   re   rf   r?   r   r   r   r   r}     s    r   r   r   r   r   r   r     s
   
zUnsupported type z in the `loss` configuration.zl in the `loss` argument, can't be found in either the model's output (`y_pred`) or in the labels (`y_true`).)r   r   r   r
   weightr`   r   r?   r8   intjoinrg   re   r   r   rr   r   r\   r   ri   rf   r   pack_sequence_as_build_nestedKeyErroritemsr   	TypeError)r   r   r   r
   rm   current_pathflat_y_predr   loss_weightresolved_loss	name_pathr   r   flat_output_namesiteratorr   r   r   r   r   r     s   











	
zCompileLoss._build_nestedc           
   	      s  j j}j}jrNtj trNt|tsNtjtj  kr>fddjD tjtr=fddjD }ntdj dtj   G dd d |d urzt	
| W n1 ty   t	|}tt	t|krtdtt	 d	t| d
t	|}Y nw t	 fdd|n
t	 fddg _ttrtt|ttfrt t|krt|t|krdd t||D }dd t||D }n4ttrt	|st t|krt|dkrdd t||gD }dd t||gD }zt	||}W n   |}t	||}Y t	s=t	fdd||||d tjdkrejD ]}|jd }	jdtj|	d qQt	dd |_t	dd |_d_d S )Nc                       g | ]} j | qS r   )r   r$   r   r'   r   r   r}   A  r~   z%CompileLoss.build.<locals>.<listcomp>c                    r   r   )r   r   r'   r   r   r}   C  s    zExpected keys z% in loss dict, but found loss.keys()=c                   @   s   e Zd Zdd Zdd ZdS )z'CompileLoss.build.<locals>.WeightedLossc                 S   s   |d u rd S t | S r   )object__new__)r/   r
   r   r   r   r   r   O  s   
z/CompileLoss.build.<locals>.WeightedLoss.__new__c                 S   s   || _ || _d S r   )r
   r   )r   r
   r   r   r   r   r   T  s   
z0CompileLoss.build.<locals>.WeightedLoss.__init__N)r3   r4   r5   r   r   r   r   r   r   WeightedLossN  s    r   z4`loss_weights` must match the number of losses, got z losses and z	 weights.c                    s
    | |S r   r   )r   _weightr   r   r   r   f     
 z#CompileLoss.build.<locals>.<lambda>c                    s
    | d S r   r   )r   r   r   r   r   l  r   c                 S      i | ]\}}||qS r   r   r$   r   r   r   r   r   r%   w  r~   z%CompileLoss.build.<locals>.<dictcomp>c                 S   r   r   r   r$   r   r   r   r   r   r%   x  r~   r>   c                 S   r   r   r   r   r   r   r   r%         
c                 S   r   r   r   r   r   r   r   r%     r   c                    s    S r   r   r   r	   r   r   r         r   r   r   r   c                 S      d S r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   T)r   r   rm   r8   rg   setr   rh   re   r   assert_same_structurer   r?   r   map_structurer   r   ri   rf   r   r   _get_y_pred_output_namesr   r   r   add_to_storerK   Meanr   r   rl   )
r   r   r   r   r   flat_loss_weightsrm   inferred_flat_output_namesr   r   r   )r   r
   r   r   r   7  s   



	






zCompileLoss.buildc                 C   sh   t |}tdd |D r+g }|D ]}t|dr"||jjj q||j q|S d gt| }|S )Nc                 s   s    | ]}t |tV  qd S r   )r8   r   rx   r   r   r   rz     r{   z7CompileLoss._get_y_pred_output_names.<locals>.<genexpr>rv   )	r   r   r   rw   rr   rv   r|   r   r?   )r   r   r   rm   tensorr   r   r   r     s   

z$CompileLoss._get_y_pred_output_namesc                 C   s>   t | j | |||W  d    S 1 sw   Y  d S r   )r   
name_scoper   call)r   r   r   r   r   r   r   __call__  s   $zCompileLoss.__call__c                    s~  t  s4t |s4| js|  | | jd \}}}}tj| ||| jd}|d ur2t||}|S zt 	|  W n t
y   t  sWt|drWt|dkrW g n!t|ttfrxt trxt| jt  krx fdd| jD  zt |  W nw   zt  | t |t   W na   z>t  }t | j}	dd t|	D }
t|t|
ksJ d gt|	  t||
D ]
\}\}}| |< qt | j  W n   t dd	  }t d
d	 |}t
d| d| dY Y Y nw | js|  | z	t 	| j| W n t
y"   t | jt |}Y nw z	t 	| j  W n t
y@   t | jt   Y nw t| jdkrLd gn| j}g }dd }t| j|D ]X\\}}}}}|| |||}}|d urt |r|||}n|}tj||||| jd}|r|jt |t |d j!d d |d urt||}|"| q[|rt#|}|S d S )Nr   )dtype__len__r>   c                    s   g | ]} | qS r   r   r   r   r   r   r}     r   z$CompileLoss.call.<locals>.<listcomp>c                 S   s    g | ]\}}|d ur||fqS r   r   )r$   ir
   r   r   r   r}     s
    c                 S      dS N*r   r   r   r   r   r     r   z"CompileLoss.call.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r     r   z5y_true and y_pred have different structures.
y_true: z	
y_pred: 
c                 S   s   | D ]}|| }q|S r   r   )r   r   _pathr   r   r   resolve_path  s   
z&CompileLoss.call.<locals>.resolve_pathr   )$r   r   rl   r   r   r   castr   multiplyr   rh   rw   r?   r8   re   rf   rg   r   rm   r   r   assert_same_pathsr   r   r   r   r   r   r   r   r   loss_moduleunscale_loss_for_distributionr@   rr   sum)r   r   r   r   r   loss_fnr   
loss_valueflat_y_true	flat_lossflat_loss_non_nonesr   r   r
   y_true_structy_pred_structr   loss_valuesr   r   metricr   _sample_weightr;   
total_lossr   r   r   r     s   

5
zCompileLoss.callc                 C   r)   r   r*   r'   r   r   r   r,   .  r-   zCompileLoss.get_configc                 C   r)   r   r*   r.   r   r   r   r1   1  r2   zCompileLoss.from_config)Nr   Nr   )r3   r4   r5   r   r\   r   r   r   rs   r   r   r   r   r   r,   r6   r1   r7   r   r   r   r   r     s$    %

hl

zr   N)collectionsr   	keras.srcr   rX   r   rK   r   r   %keras.src.backend.common.keras_tensorr   keras.src.lossesr
   r   keras.src.utils.namingr   keras.src.utils.trackingr   rP   r   r<   rG   rU   r`   ra   r\   r   r   r   r   r   <module>   s$    
#  "