ó
¡¼™\c           @  sw   d  d l  m Z m Z d  d l m Z d  d l Z d  d l m Z d d „ Z	 d „  Z
 e
 d e f d „  ƒ  Yƒ Z d S(	   iÿÿÿÿ(   t   print_functiont   division(   t   productN(   t   sympifyc         C  s   t  | ƒ } t | j |  ƒ ƒ S(   s  Users can add their own translation dictionary
    # Example
    In [1]: mathematica('Log3[9]', {'Log3[x]':'log(x,3)'})
    Out[1]: 2
    In [2]: mathematica('F[7,5,3]', {'F[*x]':'Max(*x)*Min(*x)'})
    Out[2]: 21
    variable-length argument needs '*' character (   t   MathematicaParserR   t   parse(   t   st   additional_translationst   parser(    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyt   mathematica   s    	c         C  s   |  j  ƒ  |  S(   N(   t   _initialize_class(   t   cls(    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyt   _deco   s    
R   c           B  s/  e  Z d  Z i	 d d 6d d 6d d 6d d 6d	 d
 6d d 6d d 6d d 6d d 6Z x~ e d> d? d@ ƒ D]j \ Z Z Z e e e d Z e r¦ d e j	 ƒ  e d Z
 n e j	 ƒ  e d Z
 e j i e
 e 6ƒ qd Wi d d 6d  d! 6d" d# 6d$ d% 6Z i e j d& e j ƒ d' f d( 6e j d) e j ƒ d' f d* 6e j d+ e j ƒ d, f d- 6e j d. e j ƒ d/ f d0 6Z e j d1 e j ƒ Z e j d2 e j ƒ Z d3 Z i  Z i  Z i  Z e d4 „  ƒ Z dA d5 „ Z e d6 „  ƒ Z d7 „  Z d8 „  Z e d9 „  ƒ Z e d: „  ƒ Z e d; „  ƒ Z  e d< „  ƒ Z! d= „  Z" RS(B   sx   An instance of this class converts a string of a basic Mathematica
    expression to SymPy style. Output is string type.s   sqrt(x)s   Sqrt[x]s   exp(x)s   Exp[x]s   log(x)s   Log[x]s   log(y,x)s   Log[x,y]s   log(x,2)s   Log2[x]s	   log(x,10)s   Log10[x]s   Mod(x,y)s   Mod[x,y]s   Max(*x)s   Max[*x]s   Min(*x)s   Min[*x]t    t   Arct   Sint   Cost   Tant   Cott   Sect   Csct   hs   [x]t   as   (x)t    s   **t   ^t   [t   {t   ]t   }sº   
                (?<=[a-zA-Z\d])     # a letter or a number
                \                   # a whitespace
                (?=[a-zA-Z\d])      # a letter or a number
                t   *t
   whitespaces¬   
                (?<=[])\d])         # ], ) or a number
                                    # ''
                (?=[(a-zA-Z])       # ( or a single letter
                s   add*_1s¬   
                (?<=[a-zA-Z])       # a letter
                \(                  # ( as a character
                (?=.)               # any characters
                s   *(s   add*_2s¿   
                (?:
                \A|(?<=[^a-zA-Z])
                )
                Pi                  # 'Pi' is 3.14159... in Mathematica
                (?=[^a-zA-Z])
                t   pit   PisÞ   
                (?:
                \A|(?<=[^a-zA-Z])   # at the top or a non-letter
                )
                [A-Z][a-zA-Z\d]*    # Function
                (?=\[)              # [ as a character
                s(   
                \{.*\}
                sº   
                (?:
                \A|(?<=[^a-zA-Z])
                )
                {arguments}         # model argument like x, y,...
                (?=[^a-zA-Z])
                c         C  s&   |  j  |  j ƒ } |  j j | ƒ d  S(   N(   t   _compile_dictionaryt   CORRESPONDENCESt   TRANSLATIONSt   update(   R   t   d(    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyR
   …   s    c         C  s¥   i  |  _  |  j  j |  j ƒ | d  k r1 i  } n  |  j j | k r‹ t | t ƒ sa t d ƒ ‚ n  |  j	 | ƒ } | |  j _ | |  j _
 n  |  j  j |  j j
 ƒ d  S(   Ns   The argument must be dict type(   t   translationsR$   R#   t   Nonet	   __class__t   cache_originalt
   isinstancet   dictt
   ValueErrorR!   t   cache_compiled(   t   selfR   R%   (    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyt   __init__‹   s    		c         C  s  i  } xþ| j  ƒ  D]ð\ } } |  j | ƒ |  j | ƒ |  j | d ƒ } |  j | d ƒ } |  j | d ƒ } |  j | d ƒ } |  j j | ƒ } | d  k rÀ d j d | ƒ } t | ƒ ‚ n  | j	 ƒ  } |  j
 | ƒ \ } }	 | j ƒ  d k s|	 t | ƒ k r&d j d | ƒ } t | ƒ ‚ n  | d d d k rCd }
 n t | ƒ }
 | |
 f } g  | D]& } | d d k r~| n d | ^ qb} d	 d
 j | ƒ d } |  j j d | ƒ } t j | t j ƒ } i  | | <| | | d <| | | d <| | | d <q W| S(   NR   R   s   '{f}' function form is invalid.t   fi    iÿÿÿÿR   s   \s   (?:(t   |s   ))t	   argumentst   fst   argst   pat(   t   itemst   _check_inputt   _apply_rulest   _replacet
   FM_PATTERNt   searchR'   t   formatR,   t   groupt	   _get_argst   startt   lent   joint   ARGS_PATTERN_TEMPLATEt   ret   compilet   VERBOSE(   R   t   dicR%   t   fmR3   t   mt   errt   fm_nameR4   t   endt   key_argt   keyt   xt   re_argst   xyzt   patStrR5   (    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyR!   £   s<    $	3
c   
      C  sµ   |  j  } d } d } x™ t r° | j | ƒ } | d k rG | | 7} Pn  | j ƒ  } |  j | ƒ \ } } | j ƒ  }	 |  j | | | |	 | ƒ } |	 } | | |  7} | | } q W| S(   s'   Parse Mathematica function to SymPy oneR   i    N(   R:   t   TrueR;   R'   R=   R>   R?   t   _convert_one_function(
   R.   R   R5   t   scannedt   curRH   RG   R4   RK   t   bgn(    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyt   _convert_functionã   s     		
c         C  sË  | t  | ƒ f |  j k rZ | t  | ƒ f } |  j | d } d „  t | | ƒ Dƒ } n¯ | d f |  j k rë | d f } |  j | d } i  } xt t | ƒ D]E \ }	 }
 |
 d d k rÖ d j | |	 ƒ | |
 <Pn  | |	 | |
 <qŸ Wn d j d | ƒ } t | ƒ ‚ |  j | d } |  j | d	 } d
 } d } xw t r°| j | ƒ } | d  k ri| | 7} Pn  | j
 ƒ  }
 | j ƒ  } | | |  | |
 7} | j ƒ  } | | } q:W| |  | | | } | S(   NR4   c         S  s   i  |  ] \ } } | | “ q S(    (    (   t   .0t   kt   v(    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pys
   <dictcomp>  s   	 R   i    t   ,s   '{f}' is out of the whitelist.R0   R3   R5   R   (   R@   R&   t   zipt	   enumerateRA   R<   R,   RR   R;   R'   R=   R?   RK   (   R.   R   RG   R4   RV   RK   RM   t   x_argsR%   t   iRN   RI   t   templateR5   RT   RU   RH   t   xbgn(    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyRS   
  s>    	
c         C  s-  | j  } | j ƒ  d } g  g  } } g  } | } xä t | | | ƒ D]Ï \ } }	 |	 d k r | r | r | j | | | !ƒ | d } n  |	 d k r© | j |	 ƒ n |	 d k rÂ | j ƒ  n  |	 d k rÞ | j |	 ƒ qF |	 d k rF | rý | j ƒ  q| j | | | !ƒ PqF qF W| d }
 | |
 f S(   s'   Get arguments of a Mathematica functioni   R[   R   R   R   R   (   t   stringRK   R]   t   appendt   pop(   R   RH   R   t   anct   squaret   curlyR4   RU   R_   t   ct   func_end(    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyR>   L  s,    	 
c         C  s#   |  j  | } | j | | ƒ } | S(   N(   t   REPLACEMENTSt   replace(   R   R   t   beft   aft(    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyR9   r  s    c         C  s#   |  j  | \ } } | j | | ƒ S(   N(   t   RULESt   sub(   R   R   Rl   R5   Rm   (    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyR8   x  s    c         C  s’   x^ d d d f D]M } | j  | d ƒ | j  | d ƒ k r d	 j d
 | ƒ } t | ƒ ‚ q q Wd | k rŽ d j d
 | ƒ } t | ƒ ‚ n  d  S(   NR   R   R   R   t   (t   )i    i   s   '{f}' function form is invalid.R0   s    Currently list is not supported.(   R   R   (   R   R   (   Rp   Rq   (   t   countR<   R,   (   R   R   t   bracketRI   (    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyR7   }  s    &c         C  sŒ   |  j  | ƒ |  j | d ƒ } |  j | d ƒ } |  j | d ƒ } |  j | d ƒ } |  j | ƒ } |  j | d ƒ } |  j | d ƒ } | S(   NR   R   s   add*_1s   add*_2R   R    (   R7   R8   R9   RW   (   R.   R   (    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyR   ˆ  s    (   R   R   (   R   R   R   R   R   R   (   R   R   N(#   t   __name__t
   __module__t   __doc__R"   R   t   arct   triR   RG   t   lowerR3   R$   Rj   RC   RD   RE   Rn   R:   t   ARG_MTRX_PATTERNRB   R#   R)   R-   t   classmethodR
   R'   R/   R!   RW   RS   R>   R9   R8   R7   R   (    (    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyR      sl   
	



	@	'	B&(   t
   __future__R    R   t	   itertoolsR   RC   t   sympyR   R'   R	   R   t   objectR   (    (    (    s8   lib/python2.7/site-packages/sympy/parsing/mathematica.pyt   <module>   s   	