o
    ey                      @   sP   d dl Z d dlZd dlmZ d dlmZ d dlmZ dd ZG dd deZ	dS )	    N)analyse_model)Model)bfilec                 C   s   d| vr
d| vr
dS dS )a  Determine whether it is a VDL graph file according to the file name.

    File name of a VDL graph file must contain `vdlgraph`.

    Args:
        path: File name to determine.
    Returns:
        True if the file is a VDL graph file, otherwise false.
    vdlgraphpdmodelFT )pathr   r   LD:\Projects\ConvertPro\env\Lib\site-packages\visualdl/reader/graph_reader.pyis_VDLGraph_file   s   
r
   c                   @   s   e Zd ZdZd!ddZedd Zd"dd	Zd
d Zd"ddZ	d#ddZ
					d$ddZd%ddZdd Zdd Zdd Zdd Zd&dd ZdS )'GraphReaderzNGraph reader to read vdl graph files, support for frontend api in lib.py.
     c                 C   s<   t |tr
|g| _n|| _i | _i | _i | _i | _i | _dS )zInstance of GraphReader

        Args:
            logdir: The dir include vdl graph files, multiple subfolders allowed.
        N)
isinstancestrdirwalksdisplayname2runsruns2displaynamegraph_bufferwalks_buffer)selflogdirr   r   r	   __init__*   s   


zGraphReader.__init__c                 C   s   | j S N)r   r   r   r   r	   r   ;   s   zGraphReader.logdirFc                 C   s8   t  }| js|S |du r| j|d | jr|d |S )z1Get component tabs used by vdl frontend.
        TupdateZdynamic_graph)setr   runsr   add)r   r   component_tabsr   r   r	   r   ?   s   
zGraphReader.component_tabsc                 C   sD   i }| j D ]}tj|}t|D ]\}}}|||i qq|S r   )r   osr   realpathr   walkr   )r   flush_walksr   rootdirsfilesr   r   r	   get_all_walkK   s   
zGraphReader.get_all_walkc                 C   sp   | j r|du r5|  }i }| D ] \}}dd |D }|jdd t|dkr1|||d i q|| _ | j S )a
  Get graph files.

        Every dir(means `run` in vdl) has only one graph file(means `actual log file`).

        Returns:
            walks: A dict like {"exp1": "vdlgraph.1587375595.log",
                                "exp2": "vdlgraph.1587375685.log"}
        Tc                 S   s   g | ]}t |r|qS r   )r
   ).0filenamer   r   r	   
<listcomp>a   s    z&GraphReader.graphs.<locals>.<listcomp>)reverser   )r   r'   itemssortlenr   )r   r   r#   Z
walks_temprun	filenamesZ	tags_tempr   r   r	   graphsS   s   	zGraphReader.graphsTc                 C   s@   | j |d d| jvrt| j n	t| j dg }t|S )Nr   manual_input_model)r1   r   listr   keyssorted)r   r   Z
graph_runsr   r   r	   r   k   s   
zGraphReader.runsNc           	      C   s$  |dkr || j v r | j | }|d ur|||| |j||dS || jv r|| jv rK| j| | j| krK| j | }|d urD|||| |j||dS tt|| j| d }d| j| v rht	t
|}n	t	t| }|| j |< | j| | j|< |d ur|||| |j||dS d S )Nr2   refresh
expand_allrbr   )r   Zadjust_visible
make_graphr   r   r   BFilejoinreadr   r   jsonloadsdecode)	r   r/   nodeidexpand
keep_stater8   r7   graph_modeldatar   r   r	   	get_graphr   s8   




zGraphReader.get_graphc                 C   s  |dkr|| j v r| j | }|j|||d |jdddS || jv r|| jv rE| j| | j| krE| j | }|j|||d |jdddS tt|| j| d }d| j| v rbt	t
|}n	t	t| }|| j |< | j| | j|< |j|||d |jdddS d S )Nr2   )rC   is_nodeFr6   r9   r   )r   Zadjust_search_node_visibler:   r   r   r   r;   r<   r=   r   r   r>   r?   r@   )r   r/   rA   rC   rG   rD   rE   r   r   r	   search_graph_node   s6   




zGraphReader.search_graph_nodec                 C   s   |dkr|| j v r| j | }| S || jv rf|| jv r/| j| | j| kr/| j | }| S tt|| j| d }d| j| v rLtt	|}n	tt
| }|| j |< | j| | j|< | S d S )Nr2   r9   r   )r   Zget_all_leaf_nodesr   r   r   r;   r<   r=   r   r   r>   r?   r@   )r   r/   rD   rE   r   r   r	   get_all_nodes   s    




zGraphReader.get_all_nodesc                 C   s   |j | _|j| _d S r   )Z	name2tagsr   Z	tags2namer   )r   Z
log_readerr   r   r	   set_displayname   s   zGraphReader.set_displaynamec                 C   s   | S r   r   r   r   r   r	   	__enter__      zGraphReader.__enter__c                 C   s   d S r   r   )r   exc_typeexc_valexc_tbr   r   r	   __exit__   rL   zGraphReader.__exit__r   c                 C   s   t |trt|sd S d|v rd}nd}t|d }|dkr-t|}t|| jd< d S |dkr?tt	
| | jd< d S d S )Nr   r   r9   r2   )r   r   r
   r   r;   r=   r   r   r   r>   r?   r@   )r   content	file_typerE   r   r   r	   set_input_graph   s   
zGraphReader.set_input_graph)r   )F)T)NFFFF)FT)r   )__name__
__module____qualname____doc__r   propertyr   r   r'   r1   r   rF   rH   rI   rJ   rK   rP   rS   r   r   r   r	   r   &   s*    




	

"r   )
r>   r    Zvisualdl.component.graphr   r   Zvisualdl.ior   r
   objectr   r   r   r   r	   <module>   s   