a
    ==icD                     @   sD  d dl Z d dlmZ d dlZd dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZ e eZee j e	ejZe	ejejZe	ejZe	ejejZd(dd	Zd
d Zdd Z dd Z!dd Z"G dd de#Z$i Z%dd Z&dd Z'dd Z(dd Z)edddgZ*G dd  d e#Z+d!d" Z,ed#d$d%gZ-G d&d' d'e#Z.dS ))    N)
namedtuple)
caffe2_pb2)coreschemascopeutils	workspace)
TagContextTFc                 C   sp   |t kr0tj| t |||dp.tj| t|||dS |tkr`tj| t|||dp^tj| t|||dS t| |S d S )N)check_field_namescheck_field_typescheck_field_metas)IdListr   Zequal_schemasIdListWithEvictedIdScoreListIdScoreListWithEvicted)recordZoriginal_schemar
   r   r    r   l/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/layers/layers.pyalmost_equal_schemas   sB    r   c                 C   s`   t | trd}n"t | tddr$d}ntd| | | jd usXJ dt| |  | | S )NvaluesF)r   zvalues:keyszNot implemented for {}zBlob {} doesn't have metadata)r   r   r   NotImplementedErrorformatmetadatastrr   keyr   r   r   get_key?   s    
r   c                 C   s   t | }|jjS N)r   r   categorical_limitr   r   r   r   get_categorical_limitN   s    r   c                 C   s   | d j jS )Nlengths)r   expected_value)r   r   r   r   get_avg_lengthS   s    r"   c                 C   s   |   D ]}d\}}|js(tjdd}nb|jjsN|jj}|jj}tjdd}n<|jj}|jj}tj|jjj|jjj|jjj	d|jjj
d}t| tjs|d u sJ d|tj|||d qd S )N)NNT)feature_is_request_only)feature_typefeature_namesfeature_idsr#   desired_hash_sizez7categorical_limit shouldn't be set for no-integer field)r   r!   feature_specs)all_scalarsr   r   ZFeatureSpecr(   r   r!   r$   r%   r&   r'   npZ
issubdtypeZ
field_typeintegerZset_metadataMetadata)fieldfr   r!   r(   r   r   r   set_request_onlyW   s:    	r/   c                   @   s    e Zd ZdZdZdZdZdZdS )InstantiationContextz=
    List of contexts where layer could be instantitated
    Zaccumulate_predevalZ
predictionZtrainingN)__name__
__module____qualname____doc__ACCUMULATE_PREDEVAL
PREDICTIONTRAININGr   r   r   r   r0   z   s
   r0   c                 C   s"   | t vsJ d| |t | < d S )Nz{0} already exists)_LAYER_REGISTRYr   )namelayerr   r   r   register_layer   s    r=   c                 C   s   | t v S r   r:   r;   r   r   r   layer_exists   s    r@   c                 C   s   t |  S r   r>   r?   r   r   r   get_layer_class   s    rA   c                 O   s   t |  |i |S r   r>   )Z
layer_nameargskwargsr   r   r   create_layer   s    rD   LayerPsParamZ
sparse_keyZaverage_lengthc                   @   sZ   e Zd ZdddZedd Zejdd Zedd Zejd	d Zd
d Zdd Z	dS )LayerParameterNc                 C   sF   t |tjsJ dt|d | _|| _|| _|| _|| _	|| _
d S )Nz!expect {0} to be a blob reference)
isinstancer   ZBlobReferencer   r   _shape	parameter	optimizerinitializerps_paramregularizer)selfrI   rJ   rK   rL   rM   r   r   r   __init__   s    zLayerParameter.__init__c                 C   s   | j S r   )_initializerrN   r   r   r   rK      s    zLayerParameter.initializerc                 C   sH   |d u s,t t|dd s,J dt||| _|d urD|  | _d S )Ntypez-initializer expects an operator, got type: {})r   Z
IsOperatorgetattrr   rR   rP   _infer_shape_from_initializershape)rN   opr   r   r   rK      s    
c                 C   s   | j S r   )rH   rQ   r   r   r   rU      s    zLayerParameter.shapec                 C   s2   | j d u s(| j |ks(J d| | j ||| _d S )NzBinconsistent shape for layer parameter: {}, expect: {}, but got {})rU   r   rH   )rN   rU   r   r   r   rU      s    c                 C   s  | j jD ]}|jdkrt|j  S qtd zptd}|j	j
| j g || jd }|| jg| t| t| }t  |W W  d    S  t y } z<td| j| j j| t  W Y d }~W d    d S d }~0 0 W d    n1 s0    Y  d S )NrU   Zmodel_init_by_loading_paramsZshape_checkerrH   z6Cannot infer the shape of blob {} from operator {}: {})rK   argr;   listintsr   ZWorkspaceGuardr   ZNet_netrV   extendNextScopedBlobrI   ZShapeZ
RunNetOnceZ	FetchBlobtolistZResetWorkspaceRuntimeErrorloggerwarningr   rR   )rN   rW   netZ
shape_blobrU   expr   r   r   rT      s*    


z,LayerParameter._infer_shape_from_initializerc                 C   s
   t | jS r   )r   rI   rQ   r   r   r   __str__   s    zLayerParameter.__str__)NNNNN)
r2   r3   r4   rO   propertyrK   setterrU   rT   rc   r   r   r   r   rF      s         




rF   c                 C   sD   t |  dkrdS |  D ]"}|r8|jr8t|jdds dS qdS )Nr   Fr#   T)lenZfield_metadatar(   rS   )scalarr   r   r   r   is_request_only_scalar   s    rh   AccessedFeaturesrR   Zidsc                   @   s   e Zd Zd0ddZdd Zdd Zedd	 Zed
d Zedd Z	e	j
dd Z	edd Zej
dd Zdd Zdd Zdd Zdd Zdd Zd1ddZdd Zdej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S )2
ModelLayerNc                 K   s   | || _|| _|| _|| _|r@t|ts2|g}| j| | _nd| _d| _t	|
 dkrbd| _|
 D ]}t|sjd| _ qqjd| _d| _d| _d| _d| _t|pg | _| jt j g | _d| _d| _dS )aw  
        Base class for model layers. Layer is an abstraction that allows to
        provide model description in terms of meta-operators, where each of the
        meta-operators can have different implementations for training,
        evaluation and prediction, that are instantiated later. As an example
        SampledSoftmax can do something related to sampling depending on
        supervision during the training and just apply softmax if it's used for
        prediction/evaluation.

        All inputs/outputs from layers are represented as a record (instance of
        schema bounded to blobs) and are accessible through input_record and
        output_schema. If Layer needs to have only a subset of inputs/provides
        subset of outputs during the inference - it should provide
        predict_input_record and predict_output_schema correspondingly (those
        records are expected to be a subset of input_record/output_schema).

        Each layer has a list of Tags associated with it, that depends on
        current context and arguments. It's possible to use those tags during
        the instantiation time.

        NTr   F)Znext_layer_namer;   modelrC   _input_recordrG   rX   _predict_input_recordrequest_onlyrf   r)   rh   Zprecomputation_request_onlyZprecomputation_object_only_output_schema_predict_output_schemaZeval_output_schemasettagsupdater	   currentparams_export_output_for_metrics_export_params_for_metrics)rN   rk   prefixinput_recordZpredict_input_record_fieldsrr   rC   rg   r   r   r   rO      s4    
zModelLayer.__init__c                 C   s   | j jS r   )	__class__r2   rQ   r   r   r   get_type9  s    zModelLayer.get_typec                 C   s8   | j d usJ d| jd u s4t| j| j s4J dd S )NzSchema is not initializedz:predict_output_schema is not a subset of the output_schema)ro   rp   r   Zis_schema_subsetrQ   r   r   r   _check_output_schema<  s    zModelLayer._check_output_schemac                 C   s   | j p
| jS r   )rm   rl   rQ   r   r   r   predict_input_recordB  s    zModelLayer.predict_input_recordc                 C   s   | j S r   )rl   rQ   r   r   r   ry   F  s    zModelLayer.input_recordc                 C   s   |    | jp| jS r   )r|   rp   ro   rQ   r   r   r   predict_output_schemaJ  s    z ModelLayer.predict_output_schemac                 C   s   | j d u sJ || _ d S r   )rp   rN   output_schemar   r   r   r~   O  s    c                 C   s   | j rt| j |   | jS r   )rn   r/   ro   r|   rQ   r   r   r   r   T  s    
zModelLayer.output_schemac                 C   s   | j d u sJ || _ d S r   )ro   r   r   r   r   r   [  s    c                 C   s   | j S r   )ru   rQ   r   r   r   get_parameters`  s    zModelLayer.get_parametersc                 C   s   g S )z<Return a subset of parameters which can be converted to fp16r   rQ   r   r   r   get_fp16_compatible_parametersc  s    z)ModelLayer.get_fp16_compatible_parametersc                 C   s   dS )Nr   r   rQ   r   r   r   get_memory_usageg  s    zModelLayer.get_memory_usagec                 C   s   i S )z
        Return a map from field to list of AccessedFeatures, the map should
        contain all features accessed in the model layer
        r   rQ   r   r   r   get_accessed_featuresj  s    z ModelLayer.get_accessed_featuresc                    s~   | j D ]r}|j t } sq dsL|rLt   |j  j| t	 fdd|j
jD rhq|j
j g qdS )zD
        Adds layer initialization operators to passed net.
        device_optionc                 3   s   | ]}t | d V  qdS )Z
debug_infoN)r   ZOpAlmostEqual).0rV   Zinit_opr   r   	<genexpr>  s   z-ModelLayer.add_init_params.<locals>.<genexpr>N)ru   rK   r   ZCurrentDeviceScopeZHasFieldr   ZOperatorDefZCopyFromr   anyrZ   rV   r[   )rN   init_netparamZcurrent_device_scoper   r   r   add_init_paramsq  s    
	zModelLayer.add_init_paramsc              	      sz   t j| jddV | jj||||||d t fdd| jD sFJ | j   jW  d    S 1 sl0    Y  d S )NTreset)
param_namerU   rK   rJ   rL   rM   c                 3   s   | ]} j |j kV  qd S r   )rI   )r   pr   r   r   r         z*ModelLayer.create_param.<locals>.<genexpr>)	r   	NameScoper;   rk   create_paramallru   appendrI   )rN   r   rU   rK   rJ   rL   rM   r   r   r   r     s    
zModelLayer.create_paramc                 C   sB   t j| jdd | jj|W  d    S 1 s40    Y  d S )NTr   )r   r   r;   rk   ra   r\   )rN   r;   r   r   r   get_next_blob_reference  s    z"ModelLayer.get_next_blob_referencec                 C   s   t | j |tjtjtjhvr.|s.J d|r<| | |tjkrR| 	| n6|tjkrh| 
| n |tjkr~| | n
| | |tjtjhv r| jr| | W d   n1 s0    Y  dS )z
        Adds layer trainig or initialization operators to the passed in net.
        init_net can be None and can be called independently from add_init_params
        z4Only prediction and eval context don't need init_netN)r   r   r;   r0   r8   r7   r6   r   r9   add_train_opsadd_eval_opsadd_ops_to_accumulate_predadd_opsrw   add_param_copy_operators)rN   ra   r   contextr   r   r   add_operators  s*    




zModelLayer.add_operatorsc                 C   s   t d S r   )r   rN   ra   r   r   r   r     s    zModelLayer.add_opsc                 C   s   |  | d S r   )r   r   r   r   r   r     s    zModelLayer.add_eval_opsc                 C   s   |  | d S r   r   r   r   r   r   r     s    zModelLayer.add_train_opsc                 C   s   |  | d S r   r   r   r   r   r   r     s    z%ModelLayer.add_ops_to_accumulate_predc                 C   s6   | j D ]*}| jjt|j }||jg|  qd S r   )ru   rk   Zmetrics_schemar   rI   ZCopyZfield_blobs)rN   ra   r   param_copy_refr   r   r   r     s    
z#ModelLayer.add_param_copy_operatorsc                 C   s$   d| _ | jd }| j|| j d S )NTz/output)rv   r;   rk   add_metric_fieldr   )rN   Zexport_namer   r   r   export_output_for_metrics  s    
z$ModelLayer.export_output_for_metricsc                 C   sF   d| _ | jD ]4}| t|dd d }| jt|j| qd S )NT/Z_copy)rw   ru   r   r   splitrk   r   rI   )rN   r   r   r   r   r   export_params_for_metrics  s    
z$ModelLayer.export_params_for_metrics)NN)NN)r2   r3   r4   rO   r{   r|   rd   r}   ry   r~   re   r   r   r   r   r   r   r   r   r0   r9   r   r   r   r   r   r   r   r   r   r   r   r   rj      sB     
=





! 
rj   )TTF)/loggingcollectionsr   numpyr*   Zcaffe2.protor   Zcaffe2.pythonr   r   r   r   r   Zcaffe2.python.layers.tagsr	   	getLoggerr2   r_   setLevelINFOListint64r   ZMapfloat32r   ZListWithEvictedr   ZMapWithEvictedr   r   r   r   r"   r/   objectr0   r:   r=   r@   rA   rD   rE   rF   rh   ri   rj   r   r   r   r   <module>   s<   
   
'#J