U
    Jc                     @   s   d dl mZ d dlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZ ddlmZ ejeejeeje	ejeejeejeejeejeiZdd ZedddZedddZdS )    )Type)optim   )_FunctionalAdagrad)_FunctionalAdam)_FunctionalAdamW)_FunctionalSGD)_FunctionalAdadelta)_FunctionalRMSprop)_FunctionalRprop)_FunctionalAdamaxc                 C   s   | t kr|t | < dS )a1  
    Interface to insert a new functional optimizer to functional_optim_map
    ``fn_optim_key`` and ``fn_optimizer`` are user defined. The optimizer and key
    need not be of :class:`torch.optim.Optimizer` (e.g. for custom optimizers)
    Example::
        >>> # import the new functional optimizer
        >>> # xdoctest: +SKIP
        >>> from xyz import fn_optimizer
        >>> from torch.distributed.optim.utils import register_functional_optim
        >>> fn_optim_key = "XYZ_optim"
        >>> register_functional_optim(fn_optim_key, fn_optimizer)
    N)functional_optim_map)keyr    r   A/tmp/pip-unpacked-wheel-gikjz4vx/torch/distributed/optim/utils.pyregister_functional_optim   s    r   )	optim_clsc                 O   sB   zt |  }W n$ tk
r0   td|  dY nX t|f||S )Nz
Optimizer z( does not have a functional counterpart!)r   KeyError
ValueError_create_functional_optim)r   argskwargsZfunctional_clsr   r   r   as_functional_optim,   s
    r   )functional_optim_clsc                 O   s   | g f||ddiS )NZ_allow_empty_param_listTr   )r   r   r   r   r   r   r   4   s    r   N) typingr   Ztorchr   Zfunctional_adagradr   Zfunctional_adamr   Zfunctional_adamwr   Zfunctional_sgdr   Zfunctional_adadeltar	   Zfunctional_rmspropr
   Zfunctional_rpropr   Zfunctional_adamaxr   ZAdagradZAdamZAdamWZSGDZAdadeltaZRMSpropZRpropZAdamaxr   r   r   r   r   r   r   r   <module>   s:           