a
    Ad#                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ i Zi Z	dd Z
dd Zdd	 Zd
d ZG dd dZG dd dZdd Zdd Zdd ZedZdd Zdd Zdd ZdS )    N)defaultdict)errorsc                   C   s   t   t  d S N)extra_network_registryclearextra_network_aliases r   r   >/var/www/html/stable-diffusion-webui/modules/extra_networks.py
initialize   s    r
   c                 C   s   | t | j< d S r   )r   name)extra_networkr   r   r	   register_extra_network   s    r   c                 C   s   | t |< d S r   )r   )r   aliasr   r   r	   register_extra_network_alias   s    r   c                  C   s   ddl m}  t|   d S )Nr   ExtraNetworkHypernet)Zmodules.extra_networks_hypernetr   r   r   r   r   r	   register_default_extra_networks   s    r   c                   @   s   e Zd ZdddZdd ZdS )ExtraNetworkParamsNc                 C   sn   |pg | _ g | _i | _| j D ]L}t|tr6|ddn|g}t|dkr\|d | j|d < q| j| qd S )N=      r   )items
positionalnamed
isinstancestrsplitlenappend)selfr   itempartsr   r   r	   __init__    s    

zExtraNetworkParams.__init__c                 C   s   | j |j kS r   r   )r   otherr   r   r	   __eq__,   s    zExtraNetworkParams.__eq__)N)__name__
__module____qualname__r"   r%   r   r   r   r	   r      s   
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ExtraNetworkc                 C   s
   || _ d S r   )r   )r   r   r   r   r	   r"   1   s    zExtraNetwork.__init__c                 C   s   t dS )aB  
        Called by processing on every run. Whatever the extra network is meant to do should be activated here.
        Passes arguments related to this extra network in params_list.
        User passes arguments by specifying this in his prompt:

        <name:arg1:arg2:arg3>

        Where name matches the name of this ExtraNetwork object, and arg1:arg2:arg3 are any natural number of text arguments
        separated by colon.

        Even if the user does not mention this ExtraNetwork in his prompt, the call will stil be made, with empty params_list -
        in this case, all effects of this extra networks should be disabled.

        Can be called multiple times before deactivate() - each new call should override the previous call completely.

        For example, if this ExtraNetwork's name is 'hypernet' and user's prompt is:

        > "1girl, <hypernet:agm:1.1> <extrasupernet:master:12:13:14> <hypernet:ray>"

        params_list will be:

        [
            ExtraNetworkParams(items=["agm", "1.1"]),
            ExtraNetworkParams(items=["ray"])
        ]

        NNotImplementedError)r   pparams_listr   r   r	   activate4   s    zExtraNetwork.activatec                 C   s   t dS )z`
        Called at the end of processing for housekeeping. No need to do anything here.
        Nr*   )r   r,   r   r   r	   
deactivateR   s    zExtraNetwork.deactivateN)r&   r'   r(   r"   r.   r/   r   r   r   r	   r)   0   s   r)   c                 C   sv   i }t |  D ]`\}}t|d}t|d}|durD|du rD|}|du r^td|  q||g | q|S )aD  returns a dict mapping ExtraNetwork objects to lists of arguments for those extra networks.

    Example input:
    {
        'lora': [<modules.extra_networks.ExtraNetworkParams object at 0x0000020690D58310>],
        'lyco': [<modules.extra_networks.ExtraNetworkParams object at 0x0000020690D58F70>],
        'hypernet': [<modules.extra_networks.ExtraNetworkParams object at 0x0000020690D5A800>]
    }

    Example output:

    {
        <extra_networks_lora.ExtraNetworkLora object at 0x0000020581BEECE0>: [<modules.extra_networks.ExtraNetworkParams object at 0x0000020690D58310>, <modules.extra_networks.ExtraNetworkParams object at 0x0000020690D58F70>],
        <modules.extra_networks_hypernet.ExtraNetworkHypernet object at 0x0000020581BEEE60>: [<modules.extra_networks.ExtraNetworkParams object at 0x0000020690D5A800>]
    }
    Nz Skipping unknown extra network: )	listr   r   getr   logginginfo
setdefaultextend)extra_network_dataresextra_network_nameextra_network_argsr   r   r   r   r	   lookup_extra_networksZ   s    r:   c                 C   s  g }t | D ]b\}}z|| | || W q typ } z&t|d|j d|  W Y d}~qd}~0 0 qt D ]Z\}}||v rq|z|| g  W q| ty } zt|d|  W Y d}~q|d}~0 0 q|| j	dur| j	j
| | j| j| j| j|d dS )zcall activate for extra networks in extra_network_data in specified order, then call
    activate for all remaining registered networks with an empty argument listzactivating extra network z with arguments N)batch_numberpromptsseedssubseedsr6   )r:   r   r.   r   	Exceptionr   displayr   r   scriptsafter_extra_networks_activate	iterationr<   r=   r>   )r,   r6   Z	activatedr   r9   er8   r   r   r	   r.   ~   s     2*r.   c                 C   s   t |}|D ]L}z||  W q tyV } z t|d|j  W Y d}~qd}~0 0 qt D ]X\}}||v rtqbz||  W qb ty } zt|d|  W Y d}~qbd}~0 0 qbdS )zcall deactivate for extra networks in extra_network_data in specified order, then call
    deactivate for all remaining registered networkszdeactivating extra network Nz'deactivating unmentioned extra network )r:   r/   r?   r   r@   r   r   r   )r,   r6   datar   rD   r8   r   r   r	   r/      s    ,r/   z<(\w+):([^>]+)>c                    s*   t t  fdd}tt|| } |  fS )Nc                    s2   |  d}|  d} | t|dd dS )Nr   r   :r#    )groupr   r   r   )mr   argsr7   r   r	   found   s    

zparse_prompt.<locals>.found)r   r0   resubre_extra_net)promptrL   r   rK   r	   parse_prompt   s    rQ   c                 C   s<   g }d }| D ]&}t |\}}|d u r(|}|| q||fS r   )rQ   r   )r<   r7   
extra_datarP   Zupdated_promptZparsed_extra_datar   r   r	   parse_prompts   s    rS   c              
   C   s   | d u ri S t j| \}}|d }i }zHt j|rnt|ddd}t|}W d    n1 sd0    Y  W n6 ty } zt	|d|  W Y d }~n
d }~0 0 |S )Nz.jsonrutf8)encodingz)reading extra network user metadata from )
ospathsplitextisfileopenjsonloadr?   r   r@   )filenamebasenameextZmetadata_filenamemetadatafilerD   r   r   r	   get_user_metadata   s    ,(rc   )r\   rW   rM   r2   collectionsr   modulesr   r   r   r
   r   r   r   r   r)   r:   r.   r/   compilerO   rQ   rS   rc   r   r   r   r	   <module>   s(   *$
