U
    ‰d¶  ã                   @   sH   d dl mZ d dlmZmZ dZG dd„ deejƒZG dd„ deƒZdS )	é    )Úcontext)ÚModifierContextÚUseModifierBaseÚDEFAULTc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚOptimizerContextzJ
    provide context to allow param_info to have different optimizers
    c                 C   s
   |   |¡S ©N)Z_has_modifier©ÚselfÚname© r   úC/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/optimizer_context.pyÚhas_optimizer   s    zOptimizerContext.has_optimizerc                 C   s"   |   |¡std |¡ƒ‚|  |¡S )Nz{} optimizer is not provided!)r   ÚAssertionErrorÚformatZ_get_modifierr   r   r   r   Úget_optimizer   s    ÿzOptimizerContext.get_optimizerN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd„ ZdS )ÚUseOptimizeraÔ  
    context class to allow setting the current context.
    Example usage with brew:
        - with UseOptimizer(optim):
            brew.func
        - with UseOptimizer({'WEIGHT': weight_optim}):
            brew.func
        - with UseOptimizer({'DEFAULT': optim, 'BIAS': bias_optim,
                                'WEIGHT': weight_optim}):
            brew.func
        - with UseOptimizer(optim1):
            brew.func
            with UseOptimizer(optim2):
                brew.func

    Example usage with layer:
        optimizers = {'optim1': optim1, 'optim2': optim2}
        with Optimizers(optimizers):
            optim = OptimizerContext.current().get_optimizer('optim1')
            layer(optim=optim)
    c                 C   s   t S r   )r   )r	   r   r   r   Ú_context_class4   s    zUseOptimizer._context_classN)r   r   r   r   r   r   r   r   r   r      s   r   N)	Zcaffe2.pythonr   Zcaffe2.python.modifier_contextr   r   ZDEFAULT_OPTIMZDefaultManagedr   r   r   r   r   r   Ú<module>   s   