o
    ziA                     @   st  d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZ deee	eef ef  de	eef fd	d
Zde	eef de	eef fddZddeeef dedede	eef fddZde	eef de	eef fddZde	eef de	eef fddZdedefddZde
eeeef f dedede
eeeef f fddZdS )     N)	Namespace)asdictis_dataclass)AnyDictMappingMutableMappingOptionalUnion)Tensor)_NUMPY_AVAILABLEparamsreturnc                 C   s"   t | tr	t| } | du ri } | S )zEnsure parameters are a dict or convert to dict if necessary.

    Args:
        params: Target to be converted to a dictionary

    Returns:
        params as a dictionary

    N)
isinstancer   varsr    r   U/home/ubuntu/.local/lib/python3.10/site-packages/lightning_fabric/utilities/logger.py_convert_params   s
   
r   c                    s(   dt dt fdd  fdd|  D S )zSanitize callable params dict, e.g. ``{'a': <function_**** at 0x****>} -> {'a': 'function_****'}``.

    Args:
        params: Dictionary containing the hyperparameters

    Returns:
        dictionary with all callables sanitized

    valr   c                 S   sX   t | r| jS t| r*z|  }t|r| jW S |W S  ty)   t| dd  Y S w | S )N__name__)inspectisclassr   callable	Exceptiongetattr)r   _valr   r   r   _sanitize_callable9   s   
z5_sanitize_callable_params.<locals>._sanitize_callablec                    s   i | ]	\}}| |qS r   r   ).0keyr   r   r   r   
<dictcomp>I   s    z-_sanitize_callable_params.<locals>.<dictcomp>)r   itemsr   r   r    r   _sanitize_callable_params.   s   r#   / 	delimiter
parent_keyc                 C   s   i }|   D ]>\}}|r|| t| nt|}t|r&t|ts&t|}n	t|tr/t|}t|tr@i |t	|||d}q|||< q|S )a  Flatten hierarchical dict, e.g. ``{'a': {'b': 'c'}} -> {'a/b': 'c'}``.

    Args:
        params: Dictionary containing the hyperparameters
        delimiter: Delimiter to express the hierarchy. Defaults to ``'/'``.

    Returns:
        Flattened dict.

    Examples:
        >>> _flatten_dict({'a': {'b': 'c'}})
        {'a/b': 'c'}
        >>> _flatten_dict({'a': {'b': 123}})
        {'a/b': 123}
        >>> _flatten_dict({5: {'a': 123}})
        {'5/a': 123}

    )r'   r&   )
r"   strr   r   typer   r   r   r   _flatten_dict)r   r&   r'   resultkvnew_keyr   r   r   r*   L   s   



r*   c                 C   sn   | D ]2}t rddl}t| | |j|j|jfr| |  | |< t| | tt	t
ttfvr4t| | | |< q| S )a  Returns params with non-primitvies converted to strings for logging.

    >>> import torch
    >>> params = {"float": 0.3,
    ...           "int": 1,
    ...           "string": "abc",
    ...           "bool": True,
    ...           "list": [1, 2, 3],
    ...           "namespace": Namespace(foo=3),
    ...           "layer": torch.nn.BatchNorm1d}
    >>> import pprint
    >>> pprint.pprint(_sanitize_params(params))  # doctest: +NORMALIZE_WHITESPACE
    {'bool': True,
        'float': 0.3,
        'int': 1,
        'layer': "<class 'torch.nn.modules.batchnorm.BatchNorm1d'>",
        'list': '[1, 2, 3]',
        'namespace': 'Namespace(foo=3)',
        'string': 'abc'}

    r   N)r   numpyr   bool_integerfloatingitemr)   boolintfloatr(   r   )r   r,   npr   r   r   _sanitize_paramsn   s   r8   c                 C   s   dd |   D S )z5Convert non-serializable objects in params to string.c                 S   s&   i | ]\}}|t |st|n|qS r   )_is_json_serializabler(   r   r,   r-   r   r   r   r!      s   & z._convert_json_serializable.<locals>.<dictcomp>r"   r   r   r   r   _convert_json_serializable   s   r<   valuec              	   C   sL   | du st | ttttttfrdS zt|  W dS  t	t
fy%   Y dS w )z/Test whether a variable can be encoded as json.NTF)r   r4   r5   r6   r(   listdictjsondumps	TypeErrorOverflowError)r=   r   r   r   r9      s   
r9   metricsprefix	separatorc                    s     s| S  fdd|   D S )al  Insert prefix before each key in a dict, separated by the separator.

    Args:
        metrics: Dictionary with metric names as keys and measured quantities as values
        prefix: Prefix to insert before each key
        separator: Separates prefix and original key name

    Returns:
        Dictionary with prefix and separator inserted before each key

    c                    s"   i | ]\}}   | |qS r   r   r:   rE   rF   r   r   r!      s   " z_add_prefix.<locals>.<dictcomp>r;   )rD   rE   rF   r   rG   r   _add_prefix   s   rH   )r$   r%   )r   r@   argparser   dataclassesr   r   typingr   r   r   r   r	   r
   torchr   "lightning_fabric.utilities.importsr   r(   r   r#   r*   r8   r<   r4   r9   r6   rH   r   r   r   r   <module>   s,    .","""!