U
    d                     @   s8   d dl Zd dlmZmZ d dlmZ G dd deZdS )    N)coreschema)
ModelLayerc                       s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )
MapToRangez
    This layer aims to build a mapping from raw keys to indices within [0, max_index).
    The mapping is continuously built during training. The mapping will be frozen during
    evaluation and prediction. Unseen keys will be assigned to index 0.
    map_to_rangec              	      s   t t| j|||f| |dks$tt|tjs4t|| _| jdg dd| jif|j	d| _
tdttj| dfdttj| j
f| _d S )Nr   handlerZLongIndexCreateZmax_elements)
param_nameshapeZinitializerZ	optimizerindices)superr   __init__AssertionError
isinstancer   ZScalar	max_indexZcreate_paramZNoOptimr   Structnpint64Zget_next_blob_referencevoidoutput_schema)selfmodelinput_recordr   namekwargs	__class__ D/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/build_index.pyr      s(      zMapToRange.__init__c                 C   sb   | j  jtjkr2|j|   |dtjj	d}n|   }|
| j|g| j }||| d S )NZindices_before_mapping)to)r   Z
field_typebaser   r   ZCastZNextScopedBlobr   ZDataTypeZINT64ZIndexGetr   r   r
   ZStopGradient)r   netkeysr
   r   r   r   add_train_ops1   s    zMapToRange.add_train_opsc                 C   s   | | j| j | | d S N)ZIndexFreezer   r"   r   r    r   r   r   add_eval_opsA   s    zMapToRange.add_eval_opsc                 C   s   |  | d S r#   )r%   r$   r   r   r   add_opsE   s    zMapToRange.add_ops)r   )	__name__
__module____qualname____doc__r   r"   r%   r&   __classcell__r   r   r   r   r      s   
 r   )Znumpyr   Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   r   r   r   r   r   <module>   s   