3
r\Z                 @   sP   d dl Z d dlZG dd de jjZG dd de jjZG dd de jjZdS )    Nc               @   s   e Zd Zdd ZdS )Identityc             C   s   |S )N )selfinputr   r   P/data/vision/torralba/deepscene/small-projects/TRN-pytorch-pose/ops/basic_ops.pyforward   s    zIdentity.forwardN)__name__
__module____qualname__r   r   r   r   r   r      s   r   c               @   s&   e Zd Zd	ddZdd Zdd ZdS )
SegmentConsensus   c             C   s   || _ || _d | _d S )N)consensus_typedimshape)r   r   r   r   r   r   __init__   s    zSegmentConsensus.__init__c             C   s>   |j  | _| jdkr&|j| jdd}n| jdkr6|}nd }|S )NavgT)r   keepdimidentity)sizer   r   meanr   )r   Zinput_tensoroutputr   r   r   r      s    


zSegmentConsensus.forwardc             C   s@   | j dkr(|j| jt| j| j  }n| j dkr8|}nd }|S )Nr   r   )r   expandr   floatr   )r   grad_outputZgrad_inr   r   r   backward   s    

zSegmentConsensus.backwardN)r   )r   r	   r
   r   r   r   r   r   r   r   r   
   s   
r   c                   s&   e Zd Zd fdd	Zdd Z  ZS )ConsensusModuler   c                s*   t t| j  |dkr|nd| _|| _d S )Nrnnr   )superr   r   r   r   )r   r   r   )	__class__r   r   r   )   s    zConsensusModule.__init__c             C   s   t | j| j|S )N)r   r   r   )r   r   r   r   r   r   .   s    zConsensusModule.forward)r   )r   r	   r
   r   r   __classcell__r   r   )r   r   r   '   s   r   )	torchmathnnModuler   autogradFunctionr   r   r   r   r   r   <module>   s   