
    ^jK                     X   d dl Z d dlmZ d dlmZmZmZmZmZ d dl	Z
d dlmZmZmZ e j                  dk\  rd dlmZ nd dlmZ  ededef   	      Zd
eee
j&                  ef   e
j&                  f   deee
j&                  ef   e
j&                  f   fdZd
eee
j&                  ef   e
j&                  f   deee
j&                  ef   e
j&                  f   fdZed   Zed   Zdeedf   dededefdZde
j&                  dee
j&                  eedf   f   fdZde
j&                  dee
j&                  eedf   f   fdZde
j&                  dee
j&                  eedf   f   fdZde
j&                  dee
j&                  eedf   f   fdZde
j&                  dee
j&                  eedf   f   fdZ de
j&                  deedf   de
j&                  fdZ!de
j&                  deedf   de
j&                  fdZ"de
j&                  deedf   de
j&                  fdZ#de
j&                  deedf   de
j&                  fdZ$de
j&                  deedf   de
j&                  fdZ%de
j&                  dee
j&                  eedf   f   fd Z&de
j&                  dee
j&                  eedf   f   fd!Z'de
j&                  dee
j&                  eedf   f   fd"Z(de
j&                  deedf   de
j&                  fd#Z)de
j&                  deedf   de
j&                  fd$Z*de
j&                  deedf   de
j&                  fd%Z+e&e&e'e'e(e(dZ,e)e)e*e*e+e+dZ-	 d-de
j&                  deded&edee
j&                  eedf   f   f
d'Z.	 d-de
j&                  deedf   deded&ede
j&                  fd(Z/eeeeeedZ0e!e!e"e"e#e#dZ1	 d-de
j&                  deded&edee
j&                  eedf   f   f
d)Z2	 d-de
j&                  deedf   deded&ede
j&                  fd*Z3	 	 	 d.d+ededed&edeegef   f
d,Z4y)/    N)wraps)AnyCallableLiteralTypeVarcast)MONO_CHANNEL_DIMENSIONSNUM_MULTI_CHANNEL_DIMENSIONSP)   
   )ConcatenateF.)boundfuncreturnc           	           t               dt        j                  dt        j                  dt        j
                  dt        j                  f fd       }|S )zLEnsure that input img is contiguous and the output array is also contiguous.imgargskwargsr   c                 |    t        j                  | dg      }  | g|i |}t        j                  |dg      S )NC_CONTIGUOUSrequirements)nprequire)r   r   r   resultr   s       ^/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/albucore/decorators.pywrapped_functionz$contiguous.<locals>.wrapped_function   s@     jjN+;<c+D+F+zz&/?@@    r   r   ndarrayr   r   r   r   r   s   ` r   
contiguousr$      sX    
 4[Abjj A A188 APRPZPZ A A r    c           	           t               dt        j                  dt        j                  dt        j
                  dt        j                  f fd       }|S )zPreserve dummy channel dim.r   r   r   r   c                 "   | j                   } | g|i |}t        |      t        k(  r2|d   dk(  r*|j                  t        k(  rt        j                  |d      S t        |      t        k(  r|j                  t        k(  r|d d d d df   S |S )N   )axisr   )shapelenr
   ndimr	   r   expand_dims)r   r   r   r*   r   r   s        r   r   z.preserve_channel_dim.<locals>.wrapped_function'   s    		c+D+F+u:55%)q.V[[\sMs>>&r22u:00V[[D`5`!Q'?"r    r!   r#   s   ` r   preserve_channel_dimr.   "   sR    
 4[bjj  188 PRPZPZ   r    )spatialchannelfull)DHWDHWCNHWNHWCNDHWNDHWCr*   has_batch_dimhas_depth_dimc                 t    t        |       }|r|r	|dk(  rdS dS |r	|dk(  rdS dS |r	|dk(  rdS dS t        d	      )
z7Determine the shape type based on dimensions and flags.   r7   r6      r5   r4   r3   r2   z,Either batch or depth dimension must be True)r+   
ValueError)r*   r8   r9   r,   s       r   get_shape_typer>   A   sW     u:D!)w//v--v--
C
DDr    datac                    | j                   dk(  rK| j                  \  }}}t        j                  t        j                  | dd      dg      }|| j                  fS | j                   dk(  r_| j                  \  }}}}t        j                  | dd      }t        j                  |j                  ||d      dg      }|| j                  fS | j                   dk(  rt| j                  \  }}}}}| j                  d|||      }t        j                  |dd      }t        j                  |j                  ||d      dg      }|| j                  fS t        d	| j                          )
z4Reshape (D,H,W) or (D,H,W,C) for spatial transforms.r   r   r'   r   r   r<   r;   "Unsupported number of dimensions: r,   r*   r   r   moveaxisreshaper=   r?   _heightwidthreshapedchannelsfinalflats           r   
reshape_3drN   R   9   yyA~::65::bkk$26nEUV##yyA~%)ZZ"65(;;tQ+

8++FE2>nM]^djj  yyA~(,

%1feX||Bx8;;tQ+

8++FE2>nM]^djj  
9$))E
FFr    c                    | j                   dk(  rK| j                  \  }}}t        j                  t        j                  | dd      dg      }|| j                  fS | j                   dk(  r_| j                  \  }}}}t        j                  | dd      }t        j                  |j                  ||d      dg      }|| j                  fS | j                   dk(  rt| j                  \  }}}}}| j                  d|||      }t        j                  |dd      }t        j                  |j                  ||d      dg      }|| j                  fS t        d	| j                          )
z4Reshape (N,H,W) or (N,H,W,C) for spatial transforms.r   r   r'   r   r   r<   rA   r;   rB   rC   rF   s           r   reshape_batchrQ   f   rO   r    c                 @   | j                   dk(  r_| j                  \  }}}}| j                  d||      }t        j                  t        j
                  |dd      dg      }|| j                  fS | j                   dk(  r| j                  \  }}}}}| j                  d|||      }t        j                  t        j
                  |dd      dg      }t        j                  |j                  ||d      dg      }|| j                  fS t        d| j                          )	z8Reshape (N,D,H,W) or (N,D,H,W,C) for spatial transforms.r<   r'   r   r   r   r;   rA   rB   )r,   r*   rE   r   r   rD   r=   )r?   rG   rH   rI   rM   rJ   rK   rL   s           r   reshape_batch_3drS   z   s    yyA~"jj1fe||B.::bkk$26nEUV##yyA~(,

%1feX||Bx8::bkk$26nEUV

8++FE2>nM]^djj  
9$))E
FFr    c                    | j                   dk(  rL| j                  \  }}}}t        j                  | dd      }t        j                  |dg      | j                  fS | j                   dk(  ra| j                  \  }}}}}t        j                  | dd      }t        j                  |j                  |||d      dg      }|| j                  fS t        d| j                          )	z<Reshape (N,D,H,W) or (N,D,H,W,C) preserving depth dimension.r<   r   r'   r   r   r;   rA   rB   )r,   r*   r   rD   r   rE   r=   )r?   rG   depthrH   rI   rJ   rL   s          r   reshape_batch_3d_keep_depthrV      s    yyA~"&**5&%;;tQ+zz(.1ABDJJNNyyA~%)ZZ"5&%;;tQ+

8++E65"EUcTdedjj  
9$))E
FFr    c                 j    | j                   dv r| | j                  fS t        d| j                          )z8Reshape (D,H,W) or (D,H,W,C) preserving depth dimension.>   r   r<   rB   )r,   r*   r=   )r?   s    r   reshape_3d_keep_depthrX      s4    yyFTZZ
9$))E
FFr    original_shapec                 P   | j                   dd \  }}t        |      dk(  rB|d   }| j                  |||      }t        j                  t        j
                  |dd            S |\  }}}}| j                  ||||      }t        j                  t        j
                  |dd            S )z:Restore (H,W,D) or (H,W,D*C) back to (D,H,W) or (D,H,W,C).N   r   r   r'   rA   )r*   r+   rE   r   ascontiguousarrayrD   )r?   rY   rH   rI   rU   rJ   rG   rK   s           r   
restore_3dr]      s    JJrNMFE
>aq!<<u5##BKK"a$@AA*E1a||FE5(;HHb! <==r    c                 \   | j                   dd \  }}t        |      dk(  rE|d   }| j                  |||      }t        j                  t        j
                  |dd      dg      S |\  }}}}| j                  ||||      }t        j                  t        j
                  |dd      dg      S )	z:Restore (H,W,N) or (H,W,N*C) back to (N,H,W) or (N,H,W,C).Nr[   r   r   r'   r   r   rA   )r*   r+   rE   r   r   rD   )r?   rY   rH   rI   
num_imagesrJ   rG   rK   s           r   restore_batchr`      s    JJrNMFE
>a#A&
<<z:zz"++hA6nEUVV!/J1h||FE:x@H::bkk(B2.AQRRr    c           	         | j                   dd \  }}t        |      dk(  rI|dd \  }}t        j                  | dd      }t        j                  |j                  ||||      dg      S |\  }}}}}| j                  ||d|      }t        j                  |dd      }	t        j                  |	j                  |||||      dg      S )	zBRestore (H,W,N*D) or (H,W,N*D*C) back to (N,D,H,W) or (N,D,H,W,C).Nr[   r<   r'   r   r   r   rA   )r*   r+   r   rD   r   rE   )
r?   rY   rH   rI   r_   rU   rJ   rG   rK   moveds
             r   restore_batch_3drc      s    JJrNMFE
>a*2A.
E;;tR+zz(**:ufeL\j[kll(6%Jq!X||FE2x8HKK"a(E::emmJvuhO_m^noor    c                     | j                   dd \  }}}t        |      dk(  rt        j                  | dd      S |d   }|d   }| j	                  |||||      }t        j                  |dd      S )a  Restore data that kept its depth dimension.

    For data that was reshaped with keep_depth_dim=True:
    - (D',H',W',N) => (N,D',H',W')
    - (D',H',W',N*C) => (N,D',H',W',C)

    Note: D',H',W' can be different from original D,H,W after transforms like RandomCrop3D
    Nr   r<   r'   r   rA   )r*   r+   r   rD   rE   )r?   rY   	new_depth
new_height	new_widthr_   rK   rJ   s           r   restore_batch_3d_keep_depthrh      sw     (,zz"1~$Iz9
>a{{4Q''"Jb!H||Iz9j(SH;;xQ''r    c                     | S )zRestore data that kept its depth dimension.

    For data that was reshaped with keep_depth_dim=True:
    - (D,H,W) => (D,H,W)
    - (D,H,W,C) => (D,H,W,C)
     )r?   rY   s     r   restore_3d_keep_depthrk      s	     Kr    c                    | j                   dk(  rI| j                  \  }}}t        j                  | j	                  ||z  |      dg      }|| j                  fS | j                   dk(  rK| j                  \  }}}}t        j                  | j	                  ||z  ||      dg      }|| j                  fS t        d| j                          )z4Reshape (D,H,W) or (D,H,W,C) for channel transforms.r   r   r   r<   rB   r,   r*   r   r   rE   r=   )r?   rU   rH   rI   rJ   rK   s         r   reshape_3d_channelrn      s    yyA~#zzvu::dll56>5AQ_P`a##yyA~)-&vuh::dll56>5(K[iZjk##
9$))E
FFr    c                    | j                   dk(  rI| j                  \  }}}t        j                  | j	                  ||z  |      dg      }|| j                  fS | j                   dk(  rK| j                  \  }}}}t        j                  | j	                  ||z  ||      dg      }|| j                  fS t        d| j                          )z4Reshape (N,H,W) or (N,H,W,C) for channel transforms.r   r   r   r<   rB   rm   )r?   r_   rH   rI   rJ   rK   s         r   reshape_batch_channelrp      s    yyA~$(JJ!
FE::dll:+>FVdUef##yyA~.2jj+
FE8::dll:+>xP`n_op##
9$))E
FFr    c                    | j                   dk(  rG| j                  \  }}}}t        j                  | j	                  d|      dg      }|| j                  fS | j                   dk(  rI| j                  \  }}}}}t        j                  | j	                  d||      dg      }|| j                  fS t        d| j                          )z8Reshape (N,D,H,W) or (N,D,H,W,C) for channel transforms.r<   r'   r   r   r;   rB   rm   )r?   rG   rI   rJ   rK   s        r   reshape_batch_3d_channelrr     s    yyA~1a::dll2u5^DTU##yyA~#':: 1a::dll2uh?~N^_##
9$))E
FFr    c                     t        |      dk(  r&|\  }}}| j                  ||| j                  d         S |\  }}}}| j                  ||| j                  d   |      S )zRestore (D*H,W) or (D*H,W,C) back to (D,H,W) or (D,H,W,C).

    Args:
        data: Array of shape (D*H,W') or (D*H,W',C)
        original_shape: Original shape (D,H,W) or (D,H,W,C)
    r   r(   r+   rE   r*   )r?   rY   rU   rH   rG   rK   s         r   restore_3d_channelru     sc     >a)vq||E64::a=99!/E61h<<vtzz!}h??r    c                     t        |      dk(  r&|\  }}}| j                  ||| j                  d         S |\  }}}}| j                  ||| j                  d   |      S )zRestore (N*H,W) or (N*H,W,C) back to (N,H,W) or (N,H,W,C).

    Args:
        data: Array of shape (N*H,W') or (N*H,W',C)
        original_shape: Original shape (N,H,W) or (N,H,W,C)
    r   r(   rt   )r?   rY   r_   rH   rG   rK   s         r   restore_batch_channelrw   %  sc     >a .
FA||J

1>>&4#J8<<
FDJJqM8DDr    c                     t        |      dk(  r*|\  }}}}| j                  d   }| j                  ||||      S |\  }}}}}| j                  d   }| j                  |||||      S )z~Restore (N*D*H,W') or (N*D*H,W',C) back to (N,D,H,W',C).

    Note: W' can be different from original W after transforms.
    r<   r(   )r+   r*   rE   )r?   rY   r_   rU   rH   rG   rg   rK   s           r   restore_batch_3d_channelry   4  sw    
 >a'5$
E61JJqM	||JvyAA .<*Jvq(

1I<<
E69hGGr    keep_depth_dimc                     | j                   dk(  rt        d      t        | j                  ||      }t        |   } ||       S )=Choose appropriate reshape function based on data dimensions.r   Empty arrays are not supported)sizer=   r>   r*   CHANNEL_RESHAPE_FUNCSr?   r8   r9   rz   
shape_typereshape_funcs         r   reshape_for_channelr   Y  sB     yyA~9::

M=IJ(4Lr    c                 p    t        |||      }t        |   } || |      }t        j                  |dg      S )=Choose appropriate restore function based on data dimensions.r   r   )r>   CHANNEL_RESTORE_FUNCSr   r   )r?   rY   r8   r9   rz   r   restore_funcr   s           r   restore_from_channelr   h  s<      }MJ(4L$/F::fN+;<<r    c                     | j                   dk(  rt        d      t        | j                  ||      }|r|dv rt	        |       S |dv rt        |       S t        |   } ||       S )r|   r   r}      r6   r7      r2   r3   )r~   r=   r>   r*   rV   rX   SPATIAL_RESHAPE_FUNCSr   s         r   reshape_for_spatialr     sl     yyA~9::

M=IJ**.t44((..(4Lr    c                     t        |||      }|r"|dv rt        | |      }n#|dv rt        | |      }nt        |   } || |      }t	        j
                  dg      S )r   r   r   r   r   )r>   rh   rk   SPATIAL_RESTORE_FUNCSr   r   )r?   rY   r8   r9   rz   r   r   r   s           r   restore_from_spatialr     sh      }MJ**0~FF?**4@F,Z8dN3::fN+;<<r    transform_typec                 8     dt         dt         f fd}|S )z*Decorator to handle batch transformations.r   r   c                      t               dt        dt        j                  dt        dt        dt        j                  f
 fd       }t	        t
        |      S )Nselfr?   r   paramsr   c                     t        j                  |dg      }dk(  r | |g|i |S t        t        d}t        t
        d}|   }|   } ||      \  }}	 | |g|i |}
 ||
|	      S )Nr   r   r1   )r/   r0   )r   r   r   r   r   r   )r   r?   r   r   reshape_funcsrestore_funcsr   r   rJ   rY   transformedr   r8   r9   rz   r   s              r   wrapperz3batch_transform.<locals>.decorator.<locals>.wrapper  s    ::d.1ABD'D$8888 /.[M 0/CM
 )8L(8L'3	($Hn tX???K r    )r   r   r   r"   r   r   )r   r   r8   r9   rz   r   s   ` r   	decoratorz"batch_transform.<locals>.decorator  sY    	t!	# !	RZZ !	 !	s !	rzz !	 !	 
!	F Awr    )r   )r   r8   r9   rz   r   s   ```` r   batch_transformr     s$    %  % a %  % N r    )F)TFF)5sys	functoolsr   typingr   r   r   r   r   numpyr   albucore.utilsr	   r
   r   version_infor   typing_extensionsr   r"   r$   r.   BatchTransformType	ShapeTypetupleintboolr>   rN   rQ   rS   rV   rX   r]   r`   rc   rh   rk   rn   rp   rr   ru   rw   ry   r   r   r   r   r   r   r   r   r   rj   r    r   <module>r      s   
  8 8  S Sw"-CxS)*
;rzz1}-rzz9
:k"**a-("**45"
;rzz1}-rzz9
:k"**a-("**45& 9: 	Ec?EE E 	E"GRZZ GE"**eCHo*E$F G(G

 GuRZZsCx-H'I G(G2:: G%

E#s(O0K*L G Gbjj GU2::uSRUX;V5W GG

 GuRZZsCx5P/Q G>RZZ >sCx >RZZ > S

 SE#s(O S

 Sp2:: puS#X p2:: p(bjj (%S/ (VXV`V` (,

 E#s(O PRPZPZ 
GRZZ 
GE"**eCHo2M,N 
G
G

 
GuRZZsCx5P/Q 
GG2:: G%

E#s(O8S2T G@RZZ @sCx @RZZ @E

 EE#s(O EPRPZPZ EH2:: HuS#X HSUS]S] H$  !$%   !$%  !	
**  	
 2::uS#X&'( !=
**=#s(O= = 	=
 = ZZ=      !	
**  	
 2::uS#X&'6 !=
**=#s(O= = 	=
 = ZZ=0  	/&// / 	/
 qc1f/r    