
     h	                     @    d dl Zd dlZddZeZd Zd Zd Zd	dZd Z	y)
    Nc           	      T   |r ||       } t        | t              r.| j                         D ci c]  \  }}|t        |       c}}S t        | t        t
        f      r t        |       fd| D              S | }dk(  rHt        |t        j                        r,|j                         j                         j                         }|S |Wt        |t        j                        rt        j                  |      }t        j                  |      r|j!                  |      }|S c c}}w )z Transfer some variables to another device (i.e. GPU, CPU:torch, CPU:numpy).

    batch: list, tuple, dict of tensors or other things
    device: pytorch device or 'numpy'
    callback: function that would be called on every sub-elements.
    c              3   6   K   | ]  }t        |        y wNtodevice).0xdevices     A/home/cameronsmith/repos/controll3r/dust3r/dust3r/utils/device.py	<genexpr>ztodevice.<locals>.<genexpr>   s     >18Av.>s   numpy)non_blocking)
isinstancedictitemsr   tuplelisttypetorchTensordetachcpur   npndarray
from_numpy	is_tensorto)batchr
   callbackr   kvr	   s    `     r   r   r      s     %38;;=A41a8Av&&AA%%'tE{>>>>Aa&
 &&(A H 
a$  #A??1V,7AH Bs   D$c                     t        | d      S )Nr   r   r	   s    r   to_numpyr$   *   s    G,,    c                     t        | d      S )Nr   r   r#   s    r   to_cpur'   +   s    hq%((r%   c                     t        | d      S )Ncudar   r#   s    r   to_cudar*   ,   s    x6**r%   c                    t        | t              r/| j                         D ci c]  \  }}|t        |       c}}S t        | t        t
        f      rUt        |       dk(  r| S | d   }t        |       }|y t        |t        t        t        t        f      r| S t        |t              r |fdt        |  D              S t        |t              r/|D ci c]!  }|t        | D cg c]  }||   	 c}      # c}}S t        |t        j                        r"rt        |       S t        j                   |       S t        |t"        j$                        rCrt        |       S t        j                   | D cg c]  }t        j&                  |       c}      S t)        |  |             S y c c}}w c c}w c c}}w c c}w )Nlistsr   c              3   8   K   | ]  }t        |         yw)r,   N)collate_with_cat)r   r	   r-   s     r   r   z#collate_with_cat.<locals>.<genexpr>>   s     N!%au55Ns   )r   r   r   r/   r   r   lenr   boolfloatintstrzipr   r   listifycatr   r   r   sum)whateverr-   r    valselemTer	   s    `      r   r/   r/   /   ss   (D!FNnnFVW71d#D66WW	Hudm	,x=AO{N<dT5#s34OdE"NsH~NNNdD!X\]STA'x(@!1(@NN]]dELL)(-78$F599X3FFdBJJ'(-78$e599[c=dVWe>N>Nq>Q=d3ee 8QS!!+ 
- X )A]
 >es#   F.F9(F44F99F?4F9c                 @    | D cg c]  }|D ]  }|  c}}S c c}}w r    )elemsr=   r	   s      r   r6   r6   K   s"    (!a(A(A(((s   )NF)F)
r   r   r   r   	to_devicer$   r'   r*   r/   r6   r?   r%   r   <module>rB      s.     8 	 - ( *"8)r%   