a
    ==ic7                     @   sH   d dl Zd dlmZmZ d dlmZ d dlmZm	Z	 G dd deZ
dS )    N)coreschema)
ModelLayer)BoundedGradientProjection
LogBarrierc                       sf   e Zd Zd fdd	Zd	d
 Zdd Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Z  ZS )AdaptiveWeightadaptive_weightNFlog_stdlog_barrier皙?c
                    s`  t t j|||fi |
 ttj d _ j	
  _t j _| _|d urlt| jksJ n fddt jD }t|dksJ dt|tj _t|  _t|  _t|	 _| _t  jd  _t  jd  _t  jd  _    jr\ fd	dt jD  _t jD ]} j ! j|  qBd S )
Nr   c                    s   g | ]}d  j  qS )g      ?)num).0_self u/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/layers/adaptive_weight.py
<listcomp>(       z+AdaptiveWeight.__init__.<locals>.<listcomp>r   z initial weights must be positive_initZ_weightZ_regc                    s   g | ]}  d | qS )zadaptive_weight_%d)get_next_blob_referencer   ir   r   r   r   6   s   )"superr   __init__r   ZScalarnpfloat32r   output_schemainput_recordZfield_blobsdatalenr   	optimizerrangeminarrayZastypeweightsstrlowerestimation_methodpos_optim_methodfloat
reg_lambdaenable_diagnosegetattrZ	init_funcweight_funcreg_funcweight_imodelZadd_ad_hoc_plot_blob)r   r1   r   namer!   r%   r,   r(   r)   r+   kwargsr   	__class__r   r   r      s4    

zAdaptiveWeight.__init__c                    s|    fddt | jD }t | jD ]0} j| j| g||  d| gdgd q" d} j|| dgdd	 |S )
Nc                    s   g | ]}  d | qS )zreshaped_data_%d)NextScopedBlobr   netr   r   r   >   r   z.AdaptiveWeight.concat_data.<locals>.<listcomp>znew_shape_%d   )shapeZconcated_dataZconcated_new_shaper   )Zaxis)r"   r   ZReshaper   r6   ZConcat)r   r8   Zreshapedr   Zconcatedr   r7   r   concat_data=   s    

zAdaptiveWeight.concat_datac                 C   s@   t d| j }d|tjjdf}| jd| jg|| jd| _	dS )z}
        mu = 2 log sigma, sigma = standard variance
        per task objective:
        min 1 / 2 / e^mu X + mu / 2
              ?GivenTensorFillvaluesZdtypemu)
param_namer:   initializerr!   N)
r   logr%   r   DataTypeFLOATcreate_paramr   r!   r@   )r   r?   rB   r   r   r   log_std_initL   s    zAdaptiveWeight.log_std_initc                 C   sB   | d}|| j| | d}||| |j||dd dS )z-
        min 1 / 2 / e^mu X + mu / 2
        mu_neg
mu_neg_expr<   scaleN)r6   ZNegativer@   ZExpScale)r   xr8   weightrH   rI   r   r   r   log_std_weight^   s
    

zAdaptiveWeight.log_std_weightc                 C   s   |j | j|dd d S Nr<   rJ   )rL   r@   )r   r8   regr   r   r   log_std_regh   s    zAdaptiveWeight.log_std_regc                 C   s|   d| j  }d|tjjdf}| jdkr4t| jd}n(| jdkrLtddd	}ntd
	| j| j
d| jg|| j|d| _dS )zg
        k = 1 / variance
        per task objective:
        min 1 / 2 * k  X - 1 / 2 * log k
        g       @r=   r>   r
   )r+   Zpos_grad_projr   T)lbZ	left_openz*unknown positivity optimization method: {}k)rA   r:   rB   r!   regularizerN)r%   r   rD   rE   r)   r   r+   r   	TypeErrorformatrF   r   r!   rT   )r   r?   rB   rU   r   r   r   inv_var_initk   s(    


zAdaptiveWeight.inv_var_initc                 C   s   |j | j|dd d S rP   )rL   rT   )r   rM   r8   rN   r   r   r   inv_var_weight   s    zAdaptiveWeight.inv_var_weightc                 C   s,   | d}|| j| |j||dd d S )Nlog_kg      rJ   )r6   LogrT   rL   )r   r8   rQ   rZ   r   r   r   inv_var_reg   s    
zAdaptiveWeight.inv_var_regc           	      C   s   |  |}|d}|d}|d}|d}| ||| | || |||g| |||g| |||   |rt| j	D ]$}|j
|| j| |g|d gd qd S )NrN   rQ   
weighted_xweighted_x_add_regr9   )ZstartsZends)r;   r6   r.   r/   ZMulAddZSumElementsr   r"   r   Slicer0   )	r   r8   r,   rM   rN   rQ   r]   r^   r   r   r   r   _add_ops_impl   s    




zAdaptiveWeight._add_ops_implc                 C   s   |  || j d S )N)ra   r,   )r   r8   r   r   r   add_ops   s    zAdaptiveWeight.add_ops)r   NNFr	   r
   r   )__name__
__module____qualname__r   r;   rG   rO   rR   rX   rY   r\   ra   rb   __classcell__r   r   r4   r   r      s"          ,
r   )numpyr   Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   Zcaffe2.python.regularizerr   r   r   r   r   r   r   <module>   s   