o
    bi                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dl	m
  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	d
dZdZd ddZh dZh dZdRddZdRddZdRddZdd Zdd Z							dSddZ 			 	dTd d!Z!		 	dUd"d#Z"d$d% Z#d&d' Z$d(d) Z%d*d+ d,d+ d-d+ e$e%d.Z&d/d0 Z'd1d2 Z(d3d4 Z)	dVd5d6Z*	dWd9d:Z+e, d;d< Z-	=	>		?			dXd@dAZ.dBdC Z/dDdE Z0dFdG Z1e/e0dHd+ dId+ dJZ2dKdL Z3dMdN Z4	OdYdPdQZ5dS )Z    N)backend)castconvert_to_tensor)
get_device)to_torch_dtype)	draw_seedbilinearznearest-exactbicubic)r	   nearestr
   )lanczos3lanczos5   )r   r	   >   wrapmirrorr   reflectconstant>   cubiclinearr
   r	   r   r   tricubic	trilinearc                 C   s   t | } t|}| jdvrtd| j |dkrdnd}| j| dvr-td| j | j| dkrU| j|d	\}}}d
| d|  d|  | j} | j	|d	} | S | 
 } | S )N      yInvalid images rank: expected rank 3 (single image) or rank 4 (batch of images). Received input with shape: images.shape=channels_first)r   r   zaInvalid channel size: expected 3 (RGB) or 1 (Grayscale). Received input with shape: images.shape=r   dimgŏ1w-!?gbX9?gv/?)r   r   standardize_data_formatndim
ValueErrorshapeunbindtodtype	unsqueezeclone)imagesdata_formatchannel_axisrgb r/   Q/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/backend/torch/image.pyrgb_to_grayscale1   s,   

 r1   c           	      C   s   t | } | j}t|}|dkrdnd}t| jdvr#td| j t|s2tdt| t	
|j}t	t	| |k d| } t	| g d|\}}}t	||}t	||}t	||}d	d
 }t	j|||||d} | S )Nchannels_lastr   r   r   r   CInvalid images dtype: expected float dtype. Received: images.dtype=        r   r   r   c                 S   s   t t | ||}t t | ||}|| }t |dk|d}t |dk|d}t |dk|| d}dd|  }	t ||k|	||   d |	| |  d }
t || k|	||  |
}
t |dk|
d|
dk |
j }
|
||fS )Nr         ?r4         @gUUUUUU?gUUUUUU?)torchmaximumminimumwherer%   r&   )r,   r-   r.   valuer:   range_
safe_value
safe_range
saturationnormhuer/   r/   r0   rgb_planes_to_hsv_planesd   s   "
z,rgb_to_hsv.<locals>.rgb_planes_to_hsv_planesaxis)r   r&   r   r    lenr#   r"   is_float_dtypestandardize_dtyper8   finfoepsr;   abssplitsqueezestack)	r)   r*   r&   channels_axisrJ   redgreenbluerC   r/   r/   r0   
rgb_to_hsvL   s6   

rS   c                 C   s   t | } | j}t|}|dkrdnd}t| jdvr#td| j t|s2tdt| t	
| g d|\}}}t	||}t	||}t	||}dd	 }t	j|||||d
} | S )Nr2   r   r   r   r   r3   r5   c                 S   s   t | dd }t t |d d dd}t dt |d  dd}t dt |d  dd}d| }||||   }||||   }	||||   }
||	|
fS )Nr6   r7         @r4          @      @)r8   	remaindercliprK   )rB   r@   r<   dhdrdgdbone_minus_srP   rQ   rR   r/   r/   r0   hsv_planes_to_rgb_planes   s   
z,hsv_to_rgb.<locals>.hsv_planes_to_rgb_planesrD   )r   r&   r   r    rF   r#   r"   rG   rH   r8   rL   rM   rN   )r)   r*   r&   rO   rB   r@   r<   r^   r/   r/   r0   
hsv_to_rgb~   s2   

r_   c                 C   sR   d}| j dk r| jdd} d}| j}d}||vr#d}|d }| |} | |||fS )NFr   r   r   T)r!   r'   r&   r%   )image
req_dtypesneed_squeeze	out_dtype	need_cast	req_dtyper/   r/   r0   _cast_squeeze_in   s   

rf   c                 C   sH   |r| j dd} |r"|tjtjtjtjtjfv rt| } | |} | S )Nr   r   )	rM   r8   uint8int8int16int32int64roundr%   )r`   rd   rb   rc   r/   r/   r0   _cast_squeeze_out   s   

rm   Fr   r4   c	                 C   sl  t |}|tv rtd| d|tvrtdt d| |dkr*td| |r2|r2tdt|dks?td	| t|}t| } | jd
vrTtd| j	 t
| tjtjg\} }	}
}|dkrj| d} |r| j	}|d |d }}|\}}tt|| | }tt||d}tt|| | }tt||d}tt|| d }tt|| d }| d d d d ||| ||| f } n|rq| j	}|d |d }}|\}}tt|| | }t||}tt|| | }t||}tt|| d }tt|| d }| j	d }| j	d }|dkrDtjtj||||f| j| jd| | tj||||f| j| jd| gdd}n| }|dkrotjtj||||f| j| jd|tj||||f| j| jd| gdd}|} |r{|dvr{d}|dv rdnd }tj| |t| ||d}|dkr|tjkr|jddd}|dkr|d}t||	|
|d}|S )NzeResizing with Lanczos interpolation is not supported by the PyTorch backend. Received: interpolation=.<Invalid value for argument `interpolation`. Expected of one . Received: interpolation=r   z\Invalid value for argument `fill_mode`. Only `'constant'` is supported. Received: fill_mode=zIOnly one of `pad_to_aspect_ratio` & `crop_to_aspect_ratio` can be `True`.   zPArgument `size` must be a tuple of two elements (height, width). Received: size=r   r   r2   r   r   r   rq   r   r   r   r&   devicerD   r   )r	   r
   F)sizemodealign_corners	antialiasr
      )minmaxr   rq   r   r   )rd   rb   rc   )r   r    UNSUPPORTED_INTERPOLATIONSr"   RESIZE_INTERPOLATIONSrF   tupler   r!   r#   rf   r8   float32float64permuteintfloatr|   r{   catonesr&   ru   Finterpolaterg   clamprm   )r)   rv   interpolationry   crop_to_aspect_ratiopad_to_aspect_ratio	fill_mode
fill_valuer*   rd   rb   rc   r#   heightwidthtarget_heighttarget_widthcrop_height
crop_widthcrop_box_hstartcrop_box_wstart
pad_height	pad_widthimg_box_hstartimg_box_wstart
batch_sizechannels
padded_imgrx   resizedr/   r/   r0   resize   s  
















r   c                    s  t |}t vrtdtt  d tvr'tdt d ttjdvr<tdj	 jdvrItdj	 d	}jd
krXj
ddd}jdkrcj
dd|dkrldj	d }tjfddj	dd  D ddi}tjdd |D dd}	t|	|ddddf}	d d df  }
d d df  }d d df  }d d df  }|d d df< |d d df< |
d d df< |d d df< tjjjg ddddt|d
d
fd d dddf  }tjjj|g dd}dd d dddf< td|	 tj ddd  tj|g |j	dddR d 7  t fd!dttD }|dkr]|d"}|rf|jdd}|S )#Nro   rp   8Invalid value for argument `fill_mode`. Expected of one . Received: fill_mode=r   r   )r   rq   zInvalid transform rank: expected rank 1 (single transform) or rank 2 (batch of transforms). Received input with shape: transform.shape=Fr   r   r   Tr   r   r}   c                    s    g | ]}t j| j jd qS )rt   )r8   aranger&   ru   ).0rv   )	transformr/   r0   
<listcomp>  s    z$affine_transform.<locals>.<listcomp>indexingijc                 S   s   g | ]	}t j|d dqS )r   r   )r8   r'   )r   xr/   r/   r0   r     s    r   rq   r      )r   r   r   r   r   )padrw   r<   )r   zBhwij, Bjk -> Bhwik)sourcedestination)r#   c              	      s*   g | ]}t |  | t d qS )orderr   r   map_coordinatesAFFINE_TRANSFORM_INTERPOLATIONS)r   i)coordinatesr   r   r)   r   r/   r0   r     s    rr   )r   r    r   keysr"   setAFFINE_TRANSFORM_FILL_MODESr   r!   r#   r'   r   r8   meshgridconcatenatetiler(   nn
functionalr   reshapeeinsummoveaxisrN   rangerF   rM   )r)   r   r   r   r   r*   rb   r   r   indicesa0a2b1b2offsetaffinedr/   )r   r   r   r)   r   r   r0   affine_transform`  s   








&


r   c           !   	   C   s  t |}t| } t | j}t||d}t||d}|t vr/tdtt  d| | j	dvr<td| j
 |j
dd  dksK| dvrStd	|j
 |j
dd  dksb| dvrjtd
|j
 |j
|j
kr|td|j
 d|j
 d}| j	dkr| jdd} d}|j	dkr|jdd}|j	dkr|jdd}|dkr| d} | j
\}}	}
}t||}| dkr|d}|j
d dkr|dkr||d}tjtj|
t|| jdtj|	t|| jddd\}}tj||	|
|gt|| jd}t|D ]q}|| \}}}}}}}}|| ||  d }|| ||  | | }|| ||  | | }tj| | gdd}g }t|D ]#}| |d d d d |f }t||t| d|d} || |	|
 qDtj|dd||< q|dkr}|d}|r|jdd}|S )Nr&   ro   rp   r   r   rs   )r   rq   )rq   r   zfInvalid start_points shape: expected (4,2) for a single image or (N,4,2) for a batch. Received shape: zdInvalid end_points shape: expected (4,2) for a single image or (N,4,2) for a batch. Received shape: zRstart_points and end_points must have the same shape. Received start_points.shape=z, end_points.shape=Fr   r   r   Trq   r   r}   r   rt   xyr   r6   r   r   r   rr   )r   r    r   rH   r&   r   r   r"   r   r!   r#   r   r'   r   compute_homography_matrixrepeatr8   r   r   r   ru   emptyr   rN   flattenr   appendr   rM   )!r)   start_points
end_pointsr   r   r*   r&   rb   r   r   r   r   
transformsgrid_xgrid_youtputr   r   a1r   a3a4a5a6a7denomx_iny_incoordsmapped_channelschannelchannel_imgmapped_channelr/   r/   r0   perspective_transform  s   












r   c                 C   s  t | } t |}t| j|jt}t|d}t| |} t||}| d d ddf | d d ddf }}| d d ddf | d d ddf }}| d d ddf | d d ddf }}	| d d ddf | d d ddf }
}|d d ddf |d d ddf }}|d d ddf |d d ddf }}|d d ddf |d d ddf }}|d d ddf |d d ddf }}tjtj||t|t	|t	|t	|| | | | gddtjt	|t	|t	|||t|| | | | gddtj||t|t	|t	|t	|| | | | gddtjt	|t	|t	|||t|| | | | gddtj||t|t	|t	|t	|| | | | gddtjt	|t	|t	|||t||	 | |	 | gddtj||t|t	|t	|t	||
 | |
 | gddtjt	|t	|t	|||t|| | | | gddgdd}tj||||||	|
|gdd
d}t||}t||}tj||}|dd}t||}|S )	Nr   r   r   rq   r   r   r      )r   r   result_typer&   r   r   r8   rN   	ones_like
zeros_liker'   linalgsolver   )r   r   r&   compute_dtypestart_x1start_y1start_x2start_y2start_x3start_y3start_x4start_y4end_x1end_y1end_x2end_y2end_x3end_y3end_x4end_y4coefficient_matrixtarget_vectorhomography_matrixr/   r/   r0   r   8  s  

&&&&&&&&







jn



r   c                 C   s"   |d }t | | d|  | S )Nr   rq   )r8   rK   )indexrv   sr/   r/   r0   _mirror_index_fixer  s   r  c                 C   s&   t td|  d d| d d dS )Nrq   r   )r8   floor_divider  r   rv   r/   r/   r0   _reflect_index_fixer  s   r  c                 C      t | d|d S Nr   r   r8   rX   r  r/   r/   r0   <lambda>      r	  c                 C   r  r  r  r  r/   r/   r0   r	    r
  c                 C   s   | | S Nr/   r  r/   r/   r0   r	    s    )r   r   r   r   r   c                 C   s   t | st | sdS dS )NTF)r8   is_floating_point
is_complex)ar/   r/   r0   _is_integer  s   r  c                 C   s,   t | r| nt| } | tj}|dfgS Nr   )r  r8   rl   r%   rj   )
coordinater   r/   r/   r0   _nearest_indices_and_weights  s   
r  c                 C   s:   t | }| | }d| }|t j}||f|d |fgS r  )r8   floorr%   rj   )r  lowerupper_weightlower_weightr   r/   r/   r0   _linear_indices_and_weights  s
   
r  c                 C   sH  t | }dd |D }t|t|jkr!td|j dt| t|d jdk r=t|}|f|d j }td| t|ttfrLt|rLt|}t|t|jkrdtdt| d	t|j t	|}	|	d u r{td
t
t  d| |dkrt}
n|dkrt}
ntd|dkrdd }ndd }g }t||jD ](\}}|
|}g }|D ]\}}|	||}|||}||||f q|| qg }tj| D ]3}t| \}}}tdd |D r|| }nttj|}t||| |}|ttj||  qttj|}t|rt|r|nt|}||jS )Nc                 S   s   g | ]}t |qS r/   r   )r   cr/   r/   r0   r     s    z#map_coordinates.<locals>.<listcomp>zaFirst dim of `coordinates` must be the same as the rank of `inputs`. Received inputs with shape: z and coordinate leading dim of r   r   zOInvalid coordinates rank: expected at least rank 2. Received input with shape: z;coordinates must be a sequence of length inputs.shape, but z != z8Invalid value for argument `fill_mode`. Expected one of r   z+map_coordinates currently requires order<=1r   c                 S   s   d| k| |k @ S )Nr   r/   r  r/   r/   r0   is_valid*  s   z!map_coordinates.<locals>.is_validc                 S   s   dS )NTr/   r  r/   r/   r0   r  /  s   c                 s   s    | ]}|d u V  qdS )TNr/   )r   validr/   r/   r0   	<genexpr>?  s    z"map_coordinates.<locals>.<genexpr>)r   rF   r#   r"   
isinstancer   r   r  _INDEX_FIXERSgetr   r   r  r  NotImplementedErrorzipr   	itertoolsproductall	functoolsreduceoperatorand_r8   r;   muladdrl   r%   r&   )inputsr   r   r   r   	input_arrcoordinate_arrsr   r#   index_fixer
interp_funr  valid_1d_interpolationsr  rv   interp_nodesvalid_interpr   weightfixed_indexr  outputsitemsr   
validitiesweightscontribution	all_validresultr/   r/   r0   r     s   







r   r   r   r6   r6   c           
      C   s   dd }t | } t |}t |}| j}t| jdvr"td| j d}| jdkr1| jdd} d	}|d
kr=| dddd} | jd }||||}||d|d |d }t	j
jj| |dt|d d |d}	|d
krr|	dddd}	|rz|	jdd}	|	S )Nc                    s>   fdd  fdd}|| |}| dd| d | d }|S )Nc                    sB   t j|  |jd| d d  }t d|| d  }|t | S )Nrt   r   rq         )r8   r   ru   expsum)rv   sigmar   kernel1dr   r/   r0   _get_gaussian_kernel1dR  s   
zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel1dc                    s0    | d |d } | d |d }t ||S r  )r8   outer)rv   r@  
kernel1d_x
kernel1d_y)rB  r/   r0   _get_gaussian_kernel2dZ  s   zNgaussian_blur.<locals>._create_gaussian_kernel.<locals>._get_gaussian_kernel2dr   r   )view)kernel_sizer@  r&   rF  kernelr/   )rB  r&   r0   _create_gaussian_kernelQ  s
   
z.gaussian_blur.<locals>._create_gaussian_kernelr   r   Fr   r   r   Tr2   r   rq   )stridepaddinggroups)r   r&   rF   r#   r"   r!   r'   r   expandr8   r   r   conv2dr   rM   )
r)   rH  r@  r*   rJ  r&   rb   num_channelsrI  blurred_imagesr/   r/   r0   gaussian_blurN  s@   

rR  c                 C   sB   t | \}}t }|dkrd S tjt d}|t||  |S )Nmeta)ru   )r   r   r8   	Generatormanual_seedr   )seed
first_seedsecond_seedru   	generatorr/   r/   r0   _torch_seed_generator  s   rZ        4@      @r   c              
      s  t |}t vrtdtt  d tvr'tdt d tjdvr6tdj t	t	|}t	|}j
}td| dB td| dB f}	d	}
jd
krdjddd}
|dkrrj\}}}}d}n	j\}}}}d}t dkrt|nd }tjdd|||f||jd| }tjdd|||f||jd| }t|j|d|	||f|d}t|j|d|	||f|d}| }| }tjt|t|dd\}}|dj|dj}}|||   |||  t}|dkr&t|D ]t fddt|D |df< q	n(t|D ]#t fddt|D |d d d d d d f< q*|
rV|d}||}|S )Nro   rp   r   r   r   r      r   Fr   r   r   Tr2   r   rS  r4   r6   )rv   rY  r&   ru   )rH  r@  r*   r   r   c              	      s8   g | ]}t |d f |  | gt dqS .r   r   r   r.   distorted_xdistorted_yr   r   r   r)   r   r/   r0   r         z%elastic_transform.<locals>.<listcomp>.c              	      s8   g | ]}t |d f |  | gt dqS r^  r   r_  r`  r/   r0   r     rc  )r   r    r   r   r"   r   r   rF   r#   r   r&   r   r!   r'   r   rZ  r8   normalru   rR  rM   r   r   r%   r   r   rN   )r)   alphar@  r   r   r   rV  r*   input_dtyperH  rb   r   r   r   r   r+   rY  dxdyr   ytransformed_imagesr/   r`  r0   elastic_transform  s   


 



&

 

rk  c                 C   s"   t t jd| jddt |  S )Nr   r   r   )r8   r9   tensorr&   rK   r   r/   r/   r0   _fill_triangle_kernel  s   "rn  c                 C   sT   d|  d |  |  d }t | dkd|  d |  d |  d |}t | dkd|S )Ng      ?g      @r6   r=  rV   rU   r4   )r8   r;   )r   outr/   r/   r0   _fill_keys_cubic_kernel#  s   *rp  c                 C   sp   | t tj|  t tj| |   }t |dkt |t |dktjd |d  dd}t || kd|S )NgMbP?r   rq   r   r4   )r8   sinnppir;   divide)radiusr   ri  ro  r/   r/   r0   _fill_lanczos_kernel)  s
   (.rv  c                 C   
   t d| S )NrT   rv  rm  r/   r/   r0   r	  4     
 c                 C   rw  )Nr\  rx  rm  r/   r/   r0   r	  5  ry  )r   r   r   r   c                 C   s.  t t|j|j}d| }|rt|tjd|j|jdnd}tj|||jdd | ||  d }	t	|	tj
d d f tj| ||	jdd d tj
f  | }
||
}tj|ddd}tt	|dtttjj kt|t|dk|dd}| d }tt|	d	k|	|ktj
d d f |dS )
Nr6   rt   g      ?r   T)r   keepdimsg     @@r   r=  )r   r   r   r&   r8   r9   rl  ru   r   rK   newaxisr?  r;   r   rr  rI   r   rJ   rt  logical_and)
input_sizeoutput_sizescaletranslationrI  ry   r&   	inv_scalekernel_scalesample_fr   r7  total_weight_suminput_size_minus_0_5r/   r/   r0   _compute_weight_mat9  sX   		r  c              	   C   s   t | } | j}t|dkr| S t| jrt| d}d}	nt| }d}	t	|D ]5\}
}|| j
 }|| || }}tt||||
 ||
 |||j}tj|||fdfd}t|d|}q(|	rvtt|t| t| }t|| j}|S )Nr   r   TF)r   )dimsr   )r   r#   rF   r   is_int_dtyper&   r   r8   r(   	enumerater!   r  	tensordotr   rX   rl   r{   r|   )r   output_shapespatial_dimsr  r  rI  ry   input_shaper   use_roundingr   dmnwr/   r/   r0   _scale_and_translateh  s0   


 r  Tc           	      C   s   |t vrtdt  d| |dv rd}n|dv rd}t| } t|}t|}t| }t|j|j}t||}t||}t| ||||||S )Nz5Invalid value for argument `method`. Expected of one z. Received: method=)r   r	   r   triangler   )r   r
   r   r   )	SCALE_AND_TRANSLATE_METHODSr"   r   _kernelsr   r   r&   r   r  )	r)   r  r  r  r  methodry   rI  r&   r/   r/   r0   scale_and_translate  s8   	

r  r  )r	   FFFr   r4   N)r	   r   r   N)r	   r   N)r   r4   )r;  r<  N)r[  r\  r	   r   r4   NN)T)6r$  r!  r&  numpyrr  r8   torch._dynamo_dynamodynamotorch.nn.functionalr   r   r   	keras.srcr   keras.src.backend.torch.corer   r   r   r   keras.src.random.seed_generatorr   r   r~   r   r   r  r1   rS   r_   rf   rm   r   r   r   r   r  r  r  r  r  r  r   rR  disablerZ  rk  rn  rp  rv  r  r  r  r  r/   r/   r/   r0   <module>   s    


2(
 
p
l 
	
T
@

 	/%