U
    d
                     @   sL   d dl mZmZ d dlmZmZmZ d dlmZ d dl	Z
G dd deZdS )    )schemacore)
ModelLayerIdListIdScoreList)TagsNc                       s.   e Zd Zd fdd	Zdd	 Zd
d Z  ZS )SparseFeatureHashr   NTFsparse_feature_hashc	              	      s  t t| j|||f|	 || dk s,td|rn|dksFtd|| jddgddt|gif|jd| _	|| _
|| _|| _t|tr|p| |jj| _tj| j|jjr|jjjnd |jjr|jjjnd d	}
t| t|jt| _W 5 Q R X | jj|
 nt|tr|p.| |jj| _tj| j|jjj|jjjd	}
t| t|jt| _W 5 Q R X | jj|
 nd
std| jdkstd| j|jjr| jj|jj | j !t"j#g d S )N   zCuse_hashing and use_divide_mod cannot be set true at the same time.   zUnexpected divisor: {}divisorZGivenTensorInt64Fillvalues)
param_nameshapeZinitializerZ	optimizer)categorical_limitfeature_specsexpected_valueFz/Input type must be one of (IdList, IdScoreList)zUnexpected modulo: {})$superr   __init__AssertionErrorformatZcreate_paramnparrayZNoOptimr   seeduse_hashinguse_divide_modr   equal_schemasr   extract_hash_sizeitemsmetadatamoduloZMetadatar   r   r   Z	NameScopeZ	NewRecordnetoutput_schemaZset_metadatar   keyslengthstagsupdater   ZCPU_ONLY)selfmodelinput_recordr   r    r   r   r   namekwargsr   	__class__ L/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/sparse_feature_hash.pyr      sJ    
zSparseFeatureHash.__init__c                 C   s6   |j r|j jr|j jS |jd k	r&|jS ds2tdd S )NFz2desired_hash_size or categorical_limit must be set)r   Zdesired_hash_sizer   r   )r'   r   r.   r.   r/   r   K   s
    
z#SparseFeatureHash.extract_hash_sizec                 C   s   | | j | j  t| jtr<| j }| j }nBt| jtrx| j	 }| j	 }| | j
 | j
  nt | jr|j||| j| jd nJ| jr||| jg|dg}|j||| jdd n|j||| jdd d S )N)r   r    quotientT)r   Zsign_follow_divisor)ZCopyr)   r$   r"   r   r   r   r   r   r#   r   NotImplementedErrorr   Z	IndexHashr   r    r   ZDivr   ZNextScopedBlobZMod)r'   r!   Z
input_blobZoutput_blobr0   r.   r.   r/   add_opsS   sH    


         zSparseFeatureHash.add_ops)r   NTFNr	   )__name__
__module____qualname__r   r   r2   __classcell__r.   r.   r,   r/   r      s           4r   )Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   r   r   Zcaffe2.python.layers.tagsr   Znumpyr   r   r.   r.   r.   r/   <module>   s   