
    9i                        S SK Jr  S SKJr  S SKrS SKJrJr  S SK	J
r
   S SKJrJrJrJr   " S S\R,                  R.                  5      r " S S\R,                  R.                  5      rS\R4                  S\R4                  S\R4                  S\R4                  4S jrS\R4                  S\R4                  S\R4                  4S jrg! \ as    \R"                  " \R$                  " \5      5      r\
" S\R*                  " \SS5      \R*                  " \SS	5      \R*                  " \SS
5      /SS9rS SKJrJrJrJr   GNf = f)    N)Tuple)
custom_bwd
custom_fwd)load)ailut_cbackwardailut_cforwardlut_cbackwardlut_cforwardcudaops_ailutAilutzcsrc/ailut_transform.cppzcsrc/ailut_transform_cpu.cppzcsrc/ailut_transform_cuda.cuT)namesourcesverbosec                       \ rS rSr\\" \R                  S9S\R                  S\R                  S\R                  4S j5       5       r	\\
S\R                  S\\R                     4S j5       5       rS	rg
)LUTTransformFunction   cast_inputsimglutreturnc                    UR                  5       nUR                  5       nUR                  5       S:X  d   S5       eUR                  5       S;   d   S5       eUR                  UR                  S5      UR                  S5      UR                  S5      UR                  S5      45      n[	        XU5        U R                  X5        U$ )	N   Conly support 2D image with batch and channel dimensions (4D tensor)   =only support 3D lookup table with batch dimension (5D tensor)r            )
contiguous
ndimension	new_zerossizer
   save_for_backward)ctxr   r   outputs       a/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/ops/ailut/pyinterfaces.pyforwardLUTTransformFunction.forward   s     nnnn~~1$ 	RQ	R$~~3& 	LK	L& XXa[#((1+sxx{CHHQK@BSv&c'    grad_outputc                     UR                  5       nU R                  u  p#[        R                  " U5      n[        R                  " U5      n[	        XX4U5        XE4$ N)r!   saved_tensorstorch
zeros_liker	   )r&   r,   r   r   grad_imggrad_luts         r(   backwardLUTTransformFunction.backward/   sT     ",,.$$##C(##C(kx@!!r+    N)__name__
__module____qualname____firstlineno__staticmethodr   r0   float32Tensorr)   r   r   r4   __static_attributes__r6   r+   r(   r   r      s}    EMM*%,, U\\ ell  + $ 
"5<< 
"E%,,4G 
"  
"r+   r   c            
          \ rS rSr\\" \R                  S9S\R                  S\R                  S\R                  S\R                  4S j5       5       r
\\S\R                  S\\R                     4S	 j5       5       rS
rg)AiLUTTransformFunction>   r   r   r   verticesr   c                    UR                  5       nUR                  5       nUR                  5       nUR                  5       S:X  d   S5       eUR                  5       S;   d   S5       eUR                  5       S:X  d   S5       eUR                  UR                  S5      UR                  S5      UR                  S	5      UR                  S5      45      n[	        XX45        U R                  XU5        U$ )
Nr   r   r   r   r    zKonly support 1D vertices list with batch and channel dimensions (3D tensor)r   r   r   )r!   r"   r#   r$   r   r%   )r&   r   r   rB   r'   s        r(   r)   AiLUTTransformFunction.forward@   s    
 nnnn&&(~~1$ 	RQ	R$~~3& 	LK	L&""$) 	ZY	Z) XXa[#((1+sxx{CHHQK@Bs2c1r+   r,   c           	          UR                  5       nU R                  u  p#n[        R                  " U5      n[        R                  " U5      n[        R                  " U5      n[	        XX4XVU5        XVU4$ r.   )r!   r/   r0   r1   r   )r&   r,   r   r   rB   r2   r3   grad_vers           r(   r4   AiLUTTransformFunction.backwardX   sp     ",,. ..(##C(##C(##H-# 	" 8++r+   r6   N)r7   r8   r9   r:   r;   r   r0   r<   r=   tensorr)   r   r   r4   r>   r6   r+   r(   r@   r@   >   s    EMM*%,, U\\ ,,+0<< + , ,5<< ,E%,,4G ,  ,r+   r@   r   r   rB   r   c                 .    [         R                  XU5      $ )a  Adaptive Interval 3D Lookup Table Transform (AiLUT-Transform).

Args:
    img (torch.Tensor): input image of shape (b, 3, h, w).
    lut (torch.Tensor): output values of the 3D LUT, shape (b, 3, d, d, d).
    vertices (torch.Tensor): sampling coordinates along each dimension of
        the 3D LUT, shape (b, 3, d).
Returns:
    torch.Tensor: transformed image of shape (b, 3, h, w).
)r@   apply)r   r   rB   s      r(   ailut_transformrK   j   s     "''(;;r+   c                 ,    [         R                  X5      $ )zStandard 3D Lookup Table Transform.

Args:
    img (torch.Tensor): input image of shape (b, 3, h, w).
    lut (torch.Tensor): output values of the 3D LUT, shape (b, 3, d, d, d).
Returns:
    torch.Tensor: transformed image of shape (b, 3, h, w).
)r   rJ   )r   r   s     r(   lut_transformrM   y   s      %%c//r+   )os.pathpathosptypingr   r0   torch.cuda.ampr   r   torch.utils.cpp_extensionr   r   r   r   r	   r
   ImportErrorabspathdirname__file__CUR_DIRjoinautogradFunctionr   r@   r=   rK   rM   r6   r+   r(   <module>r\      s'      1 *-- - ""5>>22 ""J),U^^44 ),X< <ELL <#ll</4||<	0u|| 	0%,, 	05<< 	0]  -kk#++h/0GHHWg'ABHHWg'EFHHWg'EF

 M- --s   C	 	A5EE