a
    ==ic                     @   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i | |dks(J t|tjs8J || _| 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__
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__ q/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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   )numpyr   Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   r   r   r   r   r   <module>   s   