o
    Xi                     @  sf   d Z ddlmZ ddlmZmZ ddlZeeegef Z	dd	d
Z
dddZedZG dd dZdS )zMerging metadata_props    )annotations)CallableIterableN_strnewreturnc                 C  s   |S N )r   r   r
   r
   T/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/utils/metadata_merger.py	overwrite   s   r   	separatorStringMergerc                   s   d fdd}|S )	a  Creates a StringMerger that joins two strings with the given separator.

    Args:
        separator (str): The separator to use when joining the strings.

    Returns:
        StringMerger: A function that joins two strings with the specified separator.
    firstr   secondr   c                   s   |    | S r	   r
   )r   r   r   r
   r   merger"   s   zjoin.<locals>.mergerN)r   r   r   r   r   r   r
   )r   r   r
   r   r   join   s   
r   z, c                   @  s2   e Zd ZdZ	ddd	d
ZdddZdddZdS )MetadataMergera|  Merges metadata properties using specified merging logic.

    Attributes:
        mergers: A mapping from metadata property keys to their corresponding merging functions.
        default: The default merging function to use when a specific key does not have a defined merger.
           If None, the first value is used. (Specify `overwrite` to always use the second value.)
    Nmergersdict[str, StringMerger]defaultStringMerger | Noner   Nonec                 C  s   || _ || _d S r	   )r   r   )selfr   r   r
   r
   r   __init__4   s   
zMetadataMerger.__init__updateddict[str, str]updatesc                 C  sh   |  D ]-\}}|dkrq||v r-||  }dkr-| j|| j}|dur,|||||< q|||< qdS )zUpdates the first metadata property dictionary with values from the second.

        Args:
            updated: The metadata dictionary to be updated.
            updates: The updates metadata dictionary.
         N)itemsr   getr   )r   r   r   key	new_valueupdated_valuer   r
   r
   r   update_dict:   s   
zMetadataMerger.update_dict
from_nodesIterable[ir.Node]toir.Node | Iterable[ir.Node]c                 C  s   t |tjr|j}|D ]	}| ||j qdS t|dkr4tt|}|j}|D ]	}| ||j q(dS i }|D ]	}| ||j q8|D ]	}| |j| qDdS )a   Merges metadata from multiple nodes and assigns it to one or more target nodes.

        Args:
            from_nodes: The source nodes from which to merge metadata.
            to: The target node(s) to which the merged metadata will be assigned.
           N)
isinstanceirNodemetadata_propsr%   lennextiter)r   r&   r(   r   nodetarget_nodemerged_metadatar
   r
   r   copy_merged_metadataK   s"   	z#MetadataMerger.copy_merged_metadatar	   )r   r   r   r   r   r   )r   r   r   r   r   r   )r&   r'   r(   r)   r   r   )__name__
__module____qualname____doc__r   r%   r5   r
   r
   r
   r   r   +   s    	
r   )r   r   r   r   r   r   )r   r   r   r   )r9   
__future__r   typingr   r   onnx_irr,   r   r   r   r   comma_separator_mergerr   r
   r
   r
   r   <module>   s   

