a
    ==ic                     @   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i |	 ttj| d| _| j	
 }
t|
dksLJ |
d | _|
d | _|d u| _| jrt|n|  | _||ksJ t|| | _| jd| j t|| _| ||\| _| _d S )Nr      r      z%s_offset_1dfloat)superr   __init__r   ZScalarnpfloat32Zget_next_blob_referenceoutput_schemainput_recordZfield_blobslen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__ u/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/layers/homotopy_weight.pyr      s.    



zHomotopyWeight.__init__c                 C   s   |dksJ |d| ksJ 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   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    Subr   Zglobal_constantsZScaler   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!   r;   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   numpyr   logging	getLoggerr>   r,   r   r(   r(   r(   r)   <module>	   s
   
