U
    d_                     @   sn   d dl mZmZ d dlmZ d dlmZ dd Zdd Zdd	d
Z	dddZ
dddZdddZdddZdS )    )coreschema)InstantiationContext)Tagsc                    s&    d kr| S t    fdd| D S )Nc                    s   g | ]}  |js|qS  )
isdisjointtags).0linclude_tagsr   J/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layer_model_instantiator.py
<listcomp>   s      z"_filter_layers.<locals>.<listcomp>)set)layersr   r   r   r   _filter_layers   s    r   c              
      s   t | dkr|S  fdd| D }tdd t|| D dd t|| D dd t|| D dd t|| D S )N   c                    s   g | ]}  |qS r   )ZBlobIsDefined)r	   Zblobnetr   r   r      s     z(shrink_output_schema.<locals>.<listcomp>c                 S   s   g | ]\}}|r|qS r   r   )r	   okZcol_namer   r   r   r      s   c                 S   s   g | ]\}}|r|qS r   r   )r	   r   Zcol_typer   r   r   r      s   c                 S   s   g | ]\}}|r|qS r   r   )r	   r   Zcol_blobr   r   r   r   !   s   c                 S   s   g | ]\}}|r|qS r   r   )r	   r   Zcol_metar   r   r   r   %   s   )lenfield_namesfield_blobsr   Zfrom_column_listzipZfield_typesZfield_metadata)r   Z
out_schemaexistsr   r   r   shrink_output_schema   s"    r   Nc                 C   sf   t d}t| j|D ] }tj|jkr|j|tj	d q|
| j  t|| j }|| |S )Npredict_netcontext)r   Netr   r   r   ZEXCLUDE_FROM_PREDICTIONr   add_operatorsr   Z
PREDICTIONset_input_recordinput_feature_schemacloner   output_schemaset_output_record)modelr   r   layerr$   r   r   r   generate_predict_net,   s    
  
r(   c                 C   sn   t d}t| j|D ] }tj|jkr|j|tj	d q| j
| j }|| t|| j| j }|| |S )Neval_netr   )r   r   r   r   r   ZEXCLUDE_FROM_EVALr   r    r   ZEVALr"   trainer_extra_schemar!   r   r$   metrics_schemar%   )r&   r   r)   r'   input_schemar$   r   r   r   generate_eval_net<   s    

 

r-   c                 C   sx   t d}| d}t| j|D ]}tj|jkr ||| q | j	| j
 }|| t|| j| j }|| ||fS )N	train_nettrain_init_net)r   r   Zcreate_init_netr   r   r   ZEXCLUDE_FROM_TRAINr   r    r"   r*   r!   r   r$   r+   r%   )r&   r   r.   r/   r'   r,   r$   r   r   r   _generate_training_net_onlyL   s    


 

r0   c                 C   s   t | |\}}||fS )N)r0   )r&   r   r/   r.   r   r   r   #generate_training_nets_forward_only]   s    r1   c                 C   s   t | |\}}| || |  s*||fS | j}|| }| j|||dd | ||| | ||| | j	|||dd ||fS )NT)Zmodify_output_record)
r0   Zapply_regularizers_on_lossZhas_losslossZAddGradientOperatorsr   Zapply_post_grad_net_modifiersZapply_optimizersZ"apply_regularizers_after_optimizerZapply_final_net_modifiers)r&   r   r/   r.   r2   Zgrad_mapr   r   r   generate_training_netsb   s    

r3   )N)N)N)N)N)Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   Zcaffe2.python.layers.tagsr   r   r   r(   r-   r0   r1   r3   r   r   r   r   <module>   s   



