
    0	hP"              
       v   d dl  d dlZd dlmZ d dlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd Z G d d      Zd	eeef   d
eeedf   ddf   fdZd*d	eeef   deedf   defdZd	eeef   deedf   defdZded
eeef   fdZd*d	eeef   deedf   d
eeedf   ef   fdZd	eeef   d
eeef   fdZd Zdee   fdZdeeeedf   ef      fdZ d	e!eeef   deeef   fdZ" G d d      Z#dee   d
ee   fd Z$d*d!ee   d"e%fd#Z&d$ Z' G d% d&      Z(d'e!eejR                  f   d(efd)Z*y)+    )*N)Path)Numberwrapsc                 .     t                fd       }|S )Nc                      	  | i |S # t         $ rO}dd l}t        dj                   d       |j	                  d       t        j                  d       Y d }~y d }~ww xY w)Nr   zException in r)endF)chaing?)	Exception	tracebackprint__name__	print_exctimesleep)argskwargser   fns       </home/cameronsmith/repos/controll3r/MoGe/moge/utils/tools.pywrapperz catch_exception.<locals>.wrapper   s_    	t&v&& 	M"++/c:e,JJsO	s    	A#AAA#r   r   r   s   ` r   catch_exceptionr      s     
2Y	 	 N    c                   (    e Zd ZdedefdZd Zd Zy)CallbackOnExceptioncallback	exceptionc                      || _         || _        y N)r    r   )selfr   r    s      r   __init__zCallbackOnException.__init__   s    " r   c                     | S r"    r#   s    r   	__enter__zCallbackOnException.__enter__"   s    r   c                 R    t        || j                        r| j                          yyNTF)
isinstancer    r   r#   exc_typeexc_valexc_tbs       r   __exit__zCallbackOnException.__exit__%   s    gt~~.MMOr   N)r   
__module____qualname__Callabletyper$   r(   r0   r&   r   r   r   r      s    ! !d !r   r   dreturn.c              #      K   | j                         D ]3  \  }}t        |t              rt        |      D ]
  }|f|z     /|f 5 y wr"   )itemsr+   dicttraverse_nested_dict_keys)r5   kvsub_keys       r   r:   r:   +   sR     	 1a4Q7 &ego%& %Ks   AA
keysdefaultc                 B    |D ]  }| j                  ||      } |  | S  | S r"   )get)r5   r>   r?   r;   s       r   get_nested_dictrB   4   s5     EE!W9H	 Hr   valuec                 L    |d d D ]  }| j                  |i       }  || |d   <   y )N)
setdefault)r5   r>   rC   r;   s       r   set_nested_dictrG   ;   s4    #2Y  LLB Ad2hKr   list_of_dictsc                 d   t               }| D ]  }|j                  t        |              t        |      }i }|D ]r  }g }| D ]8  }t	        ||      }|t        j                  |      r(|j                  |       : |rt        |      t        |      z  n
t        d      }t        |||       t |S )zd
    Returns a dictionary with the average value of each key in the input list of dictionaries.
    nan)setupdater:   sortedrB   mathisnanappendsumlenfloatrG   )rH   _nested_dict_keysr5   resultr;   valuesr<   avgs           r   key_averagerX   A   s      ?  !:1!=>?01F ( 	!A1%A}TZZ]a 	! ,2c&kCK'uU|3'( Mr   
parent_keyc                     g }|d}| j                         D ]X  \  }}||fz   }t        |t              r*|j                  t	        ||      j                                F|j                  ||f       Z t        |      S )z[
    Flattens a nested dictionary into a single-level dictionary, with keys as tuples.
    r&   )r8   r+   MutableMappingextendflatten_nested_dictrP   r9   )r5   rY   r8   r;   r<   new_keys         r   r]   r]   U   s|     E
	 '1u$a(LL,Q8>>@ALL'1&' ;r   c                 ~    i }| j                         D ]'  \  }}|}|dd D ]  }||vri ||<   ||   } |||d   <   ) |S )z]
    Unflattens a single-level dictionary into a nested dictionary, with keys as tuples.
    NrE   )r8   )r5   rU   r;   r<   sub_dictk_s         r   unflatten_nested_dictrb   e   sl     F	 1CR& 	$B!!|H	$ 2 Mr   c                     dd l }t        | d      5 }|j                         }d d d        D cg c]  } |j                  |       c}S # 1 sw Y   )xY wc c}w )Nr   r
   )jsonopen	readlinesloads)filerd   fdatalines        r   
read_jsonlrl   t   sN    	dC A{{})-.JDJJt.. .s   A
A
Arj   c                     dd l }t        |d      5 }| D ]&  }|j                   |j                  |      dz          ( 	 d d d        y # 1 sw Y   y xY w)Nr   w
)rd   re   writedumps)rj   rh   rd   ri   items        r   write_jsonlrs   {   sP    	dC -A 	-DGGJDJJt$t+,	-- - -s   ,AAc                     dd l }| D cg c]  }t        |       } }|j                  |       }|j                  d      }|j                  j                  |j                        |_        |S c c}w )Nr      )axis)pandasr]   	DataFrame
sort_index
MultiIndexfrom_tuplescolumns)rj   pdr5   dfs       r   to_hierachical_dataframer      s`    ,01q"1D1	d	B	A	B**2::6BJI	 2s   A,mappingc                 T   t        | t              r,|j                         D ]  \  }}| j                  ||      }  | S t        | t              r$t        |       D ]  \  }}t        ||      | |<    | S t        | t              r'| j                         D ]  \  }}t        ||      | |<    | S r"   )r+   strr8   replacelist	enumeraterecursive_replacer9   )r5   r   oldnewirr   r;   r<   s           r   r   r      s    !S 	$HC		#s#A	$ H 
At	 | 	4GAt$T73AaD	4
 H 
At	GGI 	1DAq$Q0AaD	1Hr   c                       e Zd ZU i Zeeed    f   ed<   ddededefdZ	de
fdZd	 Zed
efd       Zed
efd       Zed
ed    fd       Zd Zy)timeit_historyNnameverboseaveragec                     || _         || _        d | _        d | _        || _        |r'|t
        j                  vrg t
        j                  |<   y y y r"   )r   r   startr   r   r   r   )r#   r   r   r   s       r   r$   ztimeit.__init__   sH    	
t6??2$&FOOD! 37r   funcc                 P     dd l }|j                        r fd}|S  fd}|S )Nr   c                     K   t        j                  xs j                        5   | i | d {   }d d d        |S 7 # 1 sw Y   S xY wwr"   r   r   r2   r   r   retr   r#   s      r   r   z timeit.__call__.<locals>.wrapper   sO     DII:):):; 6 $d 5f 55C6
 66
s+   $AAAA
AAA	Ac                      t        j                  xs j                        5   | i |}d d d        |S # 1 sw Y   S xY wr"   r   r   s      r   r   z timeit.__call__.<locals>.wrapper   sC    DII:):):; 0//C0
0
s	   	8A)inspectiscoroutinefunction)r#   r   r   r   s   ``  r   __call__ztimeit.__call__   s,    &&t, N Nr   c                 8    t        j                          | _        | S r"   )r   r   r'   s    r   r(   ztimeit.__enter__   s    YY[
r   r6   c                     | j                   J d       | j                  J d       | j                  | j                   z
  S )NzTime not yet started.zTime not yet ended.)r   r   r'   s    r   r   ztimeit.time   s;    zz%>'>>xx#:%::xx$**$$r   c                     | j                   sJ d       t        d t        j                  | j                     D              t        t        j                  | j                           z  S )NzAverage time not available.c              3   4   K   | ]  }|j                     y wr"   )r   ).0ts     r   	<genexpr>z&timeit.average_time.<locals>.<genexpr>   s     >a166>s   )r   rQ   r   r   r   rR   r'   s    r   average_timeztimeit.average_time   sJ    ||:::>6??499#=>>V__UYU^U^E_A```r   c                 V    t         j                  j                  | j                  g       S r"   )r   r   rA   r   r'   s    r   historyztimeit.history   s    ""499b11r   c                    t        j                          | _        | j                  r,t        j                  | j
                     j                  |        | j                  rd| j                  r-| j                  }t        | j
                  xs d d|dd       y t        | j
                  xs d d| j                   dd       y y )NItz took z.6fz seconds in average.z	 seconds.)
r   r   r   r   r   r   rP   r   r   r   )r#   r-   r.   r/   rW   s        r   r0   ztimeit.__exit__   s    99;<<OODII&--d3<<||''*d+6#c:NOP*d+6$))C	JK r   r*   )r   r1   r2   r   Dictr   List__annotations__boolr$   r3   r   r(   propertyrS   r   r   r   r0   r&   r   r   r   r      s    *,Hd3X&','S '$ ' 'X  %e % %
 ae a a 2h 2 2	Lr   r   stringsc                 2     d   t        t                    D ]  t         fd D              s n t        dt        d  D                    D ]  t        fd D              s n  D cg c]  }|t        |      z
  dz     c}S c c}w )Nr   c              3   :   K   | ]  }|   d       k7    yw)r   Nr&   )r   sr   r   s     r   r   z-strip_common_prefix_suffix.<locals>.<genexpr>   s#     >qx71:e,,>s   ru   c              3   2   K   | ]  }t        |        y wr"   )rR   )r   r   s     r   r   z-strip_common_prefix_suffix.<locals>.<genexpr>   s     4qCF4s   c              3   8   K   | ]  }|        k7    y wr"   r&   )r   r   r   firsts     r   r   z-strip_common_prefix_suffix.<locals>.<genexpr>   s"     7!q#w%+%7s   )rangerR   anymin)r   r   r   r   r   s   ` @@@r   strip_common_prefix_suffixr      s    AJEs5z" >g>> Q4G445 7w77 077!AeCFSL1$%777s   6Binputsnum_workersc                      ddl m ddlm} ddlm} t         d      rt               nd _        n  |t         d      rt               nd       dt        f fd}|S )	Nr   )ThreadPoolExecutor)nullcontext)tqdm__len__)totalr   c                 
           5 }5  j                          t        t         fd              }|j                  |       |j	                  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N)max_workersc                 8     |       }j                          |S r"   )rL   )inputr   r   pbars     r   _fnz2multithead_execute.<locals>.decorator.<locals>._fn   s     i
r   T)wait)refreshr   suppress_tracebackmapshutdown)r   executorr   r   r   r   r   s   `  r   	decoratorz%multithead_execute.<locals>.decorator   s    ;7	);C	) LLN    LLf%4(	) 	) 	) 	) 	) 	)s#   A9AA-A9-A6	2A99B)	concurrent.futuresr   
contextlibr   r   hasattrrR   r   r3   )r   r   r   r   r   r   r   s   ```   @r   multithead_executer      sZ    5&$+FI$>S[D
)C#f+N)h ) ) r   c                 .     t                fd       }|S )Nc                      	  | i |S # t         $ r+}|j                  j                  j                  |_         d }~ww xY wr"   )r   __traceback__tb_next)r   r   r   r   s      r   r   z#suppress_traceback.<locals>.wrapper   sB    	t&v&& 	oo55==AO	s    	?&:?r   r   s   ` r   r   r      s     
2Y  Nr   c                   ,    e Zd ZddefdZd Zd Zd Zy)no_warningsactionc                      || _         || _        y r"   )r   filter_kwargs)r#   r   r   s      r   r$   zno_warnings.__init__  s    #r   c                 2     t               fd       }|S )Nc                      t        j                         5  t        j                  j                  fi j                    | i |cd d d        S # 1 sw Y   y xY wr"   )warningscatch_warningssimplefilterr   r   )r   r   r   r#   s     r   r   z%no_warnings.__call__.<locals>.wrapper  sN    ((* +%%dkkHT5G5GH4*6*+ + +s   2AAr   )r#   r   r   s   `` r   r   zno_warnings.__call__  s     	r	+ 
	+ r   c                     t        j                         | _        | j                  j                          t        j                  | j
                  fi | j                   y r"   )r   r   warnings_managerr(   r   r   r   r'   s    r   r(   zno_warnings.__enter__  sB     ( 7 7 9'')dkk@T-?-?@r   c                 >    | j                   j                  |||       y r"   )r   r0   r,   s       r   r0   zno_warnings.__exit__  s    &&x&Ar   N)ignore)r   r1   r2   r   r$   r   r(   r0   r&   r   r   r   r     s    $s $A
Br   r   	file_pathmodule_namec                     t         j                  j                  ||       }t         j                  j                  |      }|j                  j                  |       |S r"   )	importlibutilspec_from_file_locationmodule_from_specloaderexec_module)r   r   specmodules       r   import_file_as_moduler     sC    >>11+yID^^,,T2FKKF#Mr   r"   )+typingr   pathlibr   numbersr   	functoolsr   r   rN   rd   osr   importlib.utilr   r   r   r   	GeneratorTupler:   AnyrB   rG   r   rX   r]   rb   rl   r   r9   rs   r   Unionr   r   r   intr   r   r   PathLiker   r&   r   r   <module>r      s
           	   c4i YuS#XPTVZ?Z5[ tCI eCHo  tCI eCHo c t S#X (4S> uS#X RVW\]`be]eWfhkWkRl  T#s(^ S#X /-d4j -4U38_c-A(B#C 
tT3/ 
$sCx. 
7L 7Lt8S	 8d3i 8tCy s 8B B,U3+;%< 3 r   