U
    d                     @   sJ   d dl mZmZ d dlmZ d dlZd dlZee	Z
G dd deZdS )    )coreschema)
ModelLayerNc                       s>   e Zd Zd fdd	Zd	d
 Zdd Zdd Zdd Z  ZS )HomotopyWeighthomotopy_weight              ?    .A    `FANc	                    s   t t| j|||f|	 ttj| d| _| j	
 }
t|
dksHt|
d | _|
d | _|d k	| _| jrp|n|  | _||kstt|| | _| jd| j t|| _| ||\| _| _d S )Nr      r      z%s_offset_1dfloat)superr   __init__r   ZScalarnpZfloat32Zget_next_blob_referenceoutput_schemainput_recordZfield_blobslenAssertionErrorxyuse_external_itercreate_atomic_iteratomic_iterfloatscalemodelZadd_global_constantnameoffsetsolve_inv_lr_paramsgammapower)selfr   r   r   Z
min_weightZ
max_weight	half_life	quad_lifer   kwargsdata	__class__ H/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/homotopy_weight.pyr      s6       



 zHomotopyWeight.__init__c                 C   s   |dkst |d| kst t|t| }|dtd  d td }|d t| }tdt| }td||f  ||fS )Nr   r   r   g       @z6homotopy_weighting: found lr param: gamma=%g, power=%g)r   r   r   sqrtlogloggerinfo)r!   r"   r#   tr   r   r    r(   r(   r)   r   >   s     z"HomotopyWeight.solve_inv_lr_paramsc                 C   sR   | j d| j d d| jjd| _| j d| j dgddtjjdf| jjd| _| jS )	Nz%s_mutex)ZCreateMutex)
param_nameshapeZinitializerZ	optimizerz%s_atomic_iterr   ZConstantFillr   )valueZdtype)	Zcreate_paramr   r   ZNoOptimmutexr   ZDataTypeZINT64r   )r!   r(   r(   r)   r   M   s"    z!HomotopyWeight.create_atomic_iterc                 C   s   | d}| d}| d}| d}| d}| d}| jsZ|| j| jg| jg |j| jg|gd| j| jdd	 || j	j
d
 |g|g |j|g|g| jd |j|g|g| jd ||| jg|g ||| jg|g ||fS )NalphabetalrZcomplementary_lr	scaled_lrZscaled_complementary_lrinvr   )policyr   r    Zbase_lrZONE)r   )ZNextScopedBlobr   Z
AtomicIterr2   r   ZLearningRater   r    ZSubr   Zglobal_constantsZScaler   ZAddr   )r!   netr3   r4   r5   Zcomp_lrr6   Zscaled_comp_lrr(   r(   r)   update_weighta   s,    





zHomotopyWeight.update_weightc                 C   s.   |  |\}}|| j|| j|g|   d S )N)r:   ZWeightedSumr   r   r   )r!   r9   r3   r4   r(   r(   r)   add_opsy   s    zHomotopyWeight.add_ops)r   r   r   r	   r
   N)	__name__
__module____qualname__r   r   r   r:   r;   __classcell__r(   r(   r&   r)   r      s         #r   )Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   Znumpyr   logging	getLoggerr<   r,   r   r(   r(   r(   r)   <module>	   s
   
