
\c           @   s   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  d l m Z d  d l Z d e f d	     YZ d
   Z d S(   i(   t   LooseVersion(   t   Mul(   t   Iterable(   t   import_module(   t
   PRECEDENCE(   t   AbstractPythonCodePrinterNt   TensorflowPrinterc           B   sv  e  Z d  Z d Z i+ d e j 6d e j 6d e j 6d e j 6d e j	 6d e j
 6d e j 6d	 e j 6d
 e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j  6d e j! 6d e j" 6d  e j# 6d! e j$ 6d" e j% 6d# e j& 6d$ e j' 6d% e j( 6d& e j) 6d' e j* 6d( e j+ 6d) e j, 6d* e j- 6d+ e j. 6d, e j/ 6Z0 d-   Z1 e1 Z2 e1 Z3 e1 Z4 e1 Z5 e1 Z6 e1 Z7 e1 Z8 e1 Z9 d.   Z: d/   Z; d0   Z< d1   Z= d2   Z> d3   Z? d4   Z@ d5   ZA d6   ZB d7   ZC d8   ZD d9   ZE d:   ZF RS(;   s   
    Tensorflow printer which handles vectorized piecewise functions,
    logical operators, max/min, and relational operators.
    t   _tensorflowcodes   tensorflow.abss   tensorflow.signs   tensorflow.ceils   tensorflow.floors   tensorflow.logs   tensorflow.exps   tensorflow.sqrts   tensorflow.coss   tensorflow.acoss   tensorflow.sins   tensorflow.asins   tensorflow.tans   tensorflow.atans   tensorflow.atan2s   tensorflow.coshs   tensorflow.acoshs   tensorflow.sinhs   tensorflow.asinhs   tensorflow.tanhs   tensorflow.atanhs   tensorflow.reals   tensorflow.imags   tensorflow.angles   tensorflow.erfs   tensorflow.gammalns   tensorflow.pows   tensorflow.equals   tensorflow.not_equals   tensorflow.greaters   tensorflow.lesss   tensorflow.less_equals   tensorflow.greater_equals   tensorflow.logical_ands   tensorflow.logical_ors   tensorflow.logical_nots   tensorflow.maximums   tensorflow.minimums   tensorflow.adds   tensorflow.multiplys   tensorflow.traces   tensorflow.matrix_determinants   tensorflow.matrix_inverses   tensorflow.matrix_transposec         C   s   |  j  j t |  d   } | d  k r= t t |   j |  Sg  | j D] } |  j |  ^ qG } t	 |  d k r d |  j
 |  | d f S|  j | |  Sd  S(   Ni   s   %s(%s)i    (   t   mappingt   gett   typet   Nonet   superR   t   _print_Basict   argst   _printt   lent   _module_formatt   _expand_fold_binary_op(   t   selft   exprt   opt   argt   children(    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_FunctionA   s    %c            sP   | j  } t d   | D  r. t d   n     f d     | j |  S(   Nc         s   s   |  ] } t  | t  Vq d  S(   N(   t
   isinstanceR   (   t   .0t   i(    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pys	   <genexpr>Z   s    s1   derivation by multiple variables is not supportedc            sG   | s   j  |   Sd   j d   |  | d     j  | d  f S(   Ns   %s(%s, %s)[0]s   tensorflow.gradientsi(   R   R   (   R   R   (   R   t   unfold(    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyR   \   s    (   t	   variablest   anyt   NotImplementedErrorR   (   R   R   R   (    (   R   R   s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_DerivativeX   s
    	c         C   s   t  d  } | r0 t | j  d k  r0 d } n d } d d l m } | j d j \ } } t | j  d k r d	 j | |  j |  |  j |  d  Sd	 j | |  j |  |  j |  |  j | | j d     S(
   Nt
   tensorflows   1.0t   selectt   wherei(   t	   Piecewisei    i   s   {0}({1}, {2}, {3})(	   R   t   Vt   __version__t   sympyR$   R   R   t   formatR   (   R   R   R!   t   tensorflow_piecewiseR$   t   et   cond(    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_Piecewisef   s"    	c      
   C   s   | j  r d n d } d d j g  | j   D]9 } d d j g  | D] } |  j |  ^ qA  d ^ q+  d } d |  j |  | f S(   Ns   tensorflow.Variables   tensorflow.constantt   [s   , t   ]s   %s(%s)(   t   free_symbolst   joint   tolistR   R   (   R   R   t   tensorflow_fR   t   jt   data(    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_MatrixBase|   s
    ]c         C   s   d d l  m } g  | j D] } t | |  r | ^ q } g  | j D] } | | k rE | ^ qE } | r d |  j t j |  t d  |  j d |  f S|  j d |  Sd  S(   Ni(   t
   MatrixExprs   %s*%sR   s   tensorflow.matmul(	   t   sympy.matrices.expressionsR6   R   R   t   parenthesizeR   t   fromiterR   R   (   R   R   R6   R   t   mat_argsR   (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_MatMul   s    +(c         C   s   |  j  d | j g | j  S(   Ns   tensorflow.matmul(   R   t   baset   exp(   R   R   (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_MatPow   s    c         C   s&   d |  j  | j  |  j  | j  f S(   Ns   %s = %s(   R   t   lhst   rhs(   R   R   (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_Assignment   s    c         C   s=   g  } x' | j  D] } | j |  j |   q Wd j |  S(   Ns   
(   R   t   appendR   R0   (   R   R   t   rett   subexpr(    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_CodeBlock   s    c         c   sZ   x" t  d d  D] } t |  Vq Wx" t  d d  D] } t |  Vq5 Wt d   d  S(   Nia   i{   iA   i[   s   out of letters(   t   ranget   chrt
   ValueError(   R   R   (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt    _get_letter_generator_for_einsum   s
    c         C   s   g  t  | j  D]D \ } } |  j |  d d | d | d f f D] } | ^ qE q } |  j   } d j g  | j D]4 } d j g  t |  D] } t |  ^ q  ^ qv  } d |  j d  | d j g  | j D] } |  j |  ^ q  f S(	   Ns   [%i, %i]i   i   t   ,t    s   %s("%s", %s)s   tensorflow.einsums   , (	   t	   enumerateR   R   RI   R0   t   subranksRF   t   nextR   (   R   R   R   R   R3   t
   array_listt   letterst   contraction_string(    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt    _print_CodegenArrayTensorProduct   s    >Mc   
      C   s   d d l  m } | j } | j } |  j | j |  \ } } } | sS |  j |  St | |  r g  | j D] } d |  j |  ^ ql }	 d |  j	 d  | d j
 |	  f St    d  S(   Ni(   t   CodegenArrayTensorProducts   %ss   %s("%s", %s)s   tensorflow.einsums   , (   t   sympy.codegen.array_utilsRS   R   t   contraction_indicest   _get_einsum_stringRM   R   R   R   R   R0   R   (
   R   R   RS   R<   RU   RQ   t   letters_freet   letters_dumR   t   elems(    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_CodegenArrayContraction   s    		)c   
      C   s  d d l  m } t | j  } t |  d k r: t  n  t | d  d k rY t  n  t | j |  r | j j } | j j	 } n | j } | j g } |  j
 | |  \ } } } g  | D] }	 |  j |	  ^ q } d |  j d  d j | d	 j |  d	 j |   d
 j |  f S(   Ni(   RS   i   i    i   s   %s("%s", %s)s   tensorflow.einsums   {0}->{1}{2}RK   s   , (   RT   RS   t   listt   diagonal_indicesR   R   R   R   RM   R   RV   R   R   R(   R0   (
   R   R   RS   R\   RM   RY   t   diagonal_stringRW   RX   R   (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_CodegenArrayDiagonal   s"    			"$c         C   s9   d |  j  d  |  j | j  |  j | j j d  f S(   Ns
   %s(%s, %s)s   tensorflow.transposei    (   R   R   R   t   permutationR   (   R   R   (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   _print_CodegenArrayPermuteDims   s    c         C   s   |  j  d | j  S(   Ns   tensorflow.add(   R   R   (   R   R   (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt!   _print_CodegenArrayElementwiseAdd   s    (G   t   __name__t
   __module__t   __doc__t   printmethodR'   t   Abst   signt   ceilingt   floort   logR=   t   sqrtt   cost   acost   sint   asint   tant   atant   atan2t   cosht   acosht   sinht   asinht   tanht   atanht   ret   imR   t   erft   loggammat   Powt   Eqt   Net   StrictGreaterThant   StrictLessThant   LessThant   GreaterThant   Andt   Ort   Nott   Maxt   Mint   MatAddt   HadamardProductt   Tracet   Determinantt   Inverset	   TransposeR   R   t   _print_Exprt   _print_Applicationt   _print_MatrixExprt
   _print_Nott
   _print_Andt	   _print_Ort   _print_Transposet   _print_TraceR    R,   R5   R;   R>   RA   RE   RI   RR   RZ   R^   R`   Ra   (    (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyR      s   









































													c         C   s   t    } | j |   S(   N(   R   t   doprint(   R   t   printer(    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   tensorflow_code   s    	(   t   distutils.versionR    R%   R'   R   t   sympy.core.compatibilityR   t   sympy.externalR   t   sympy.printing.precedenceR   t   sympy.printing.pycodeR   R   R   (    (    (    s8   lib/python2.7/site-packages/sympy/printing/tensorflow.pyt   <module>   s   