ó
Ë[c           @`  sj   d  d l  m Z d  d l  m Z d  d l m Z d  d l m Z d  d l m Z	 d e f d     YZ
 d S(	   i    (   t   absolute_import(   t   division(   t	   InputSpec(   t   Dense(   t   backendt   DenseAfterRevcompConv1Dc           B`  s)   e  Z d  Z d   Z d   Z d   Z RS(   st   For dense layers that follow 1D Convolutional or Pooling layers that
    have reverse-complement weight sharing
    c         C`  s4  t  |  d k s t d   | d } | d } | d d k sX t d t |    | |  _ | |  _ |  j d t | | d  |  j f d	 |  j d
 d d |  j	 d |  j
  |  _ |  j r˙ |  j d |  j f d	 |  j d
 d d |  j d |  j  |  _ n	 d  |  _ t d d d i | d 6 |  _ t |  _ d  S(   Ni   s%   layer designed to follow 1D conv/pooli˙˙˙˙iţ˙˙˙i   i    s   num_chan should be even; is t   shapet   initializert   namet   kernelt   regularizert
   constraintt   biast   min_ndimt   axes(   t   lent   AssertionErrort   strt   num_chant   input_lengtht
   add_weightt   intt   unitst   kernel_initializert   kernel_regularizert   kernel_constraintR	   t   use_biast   bias_initializert   bias_regularizert   bias_constraintR   t   NoneR   t
   input_spect   Truet   built(   t   selft   input_shapeR   R   (    (    s   keras_genomics/layers/core.pyt   build   s,    

&										c      	   C`  s  t  j |  j |  j t |  j d  |  j f  } t  j t  j d | | d  d  d  d  d  d  d  d   f g d d  |  j |  j |  j f  } t  j | d |  j |  j f  } t  j | |  } |  j	 rč t  j
 | |  j  } n  |  j d  k	 r	|  j |  } n  | S(   Ni   t   tensorsi˙˙˙˙t   axisi   (   t   Kt   reshapeR	   R   R   R   R   t   concatenatet   dotR   t   bias_addR   t
   activationR   (   R"   t   inputsR	   t   concatenated_reshaped_kernelt   reshaped_inputst   output(    (    s   keras_genomics/layers/core.pyt   call(   s    7"			c         C`  sg   | r t  |  d k s t  | d d  k	 s4 t  | d d  k	 sJ t  | d |  j g } t |  S(   Ni   i˙˙˙˙iţ˙˙˙i    (   R   R   R   R   t   tuple(   R"   R#   t   output_shape(    (    s   keras_genomics/layers/core.pyt   compute_output_shape9   s
    (   t   __name__t
   __module__t   __doc__R$   R1   R4   (    (    (    s   keras_genomics/layers/core.pyR   	   s   		N(   t
   __future__R    R   t   keras.engineR   t   keras.layers.coreR   t   kerasR   R'   R   (    (    (    s   keras_genomics/layers/core.pyt   <module>   s
   