ó
~9­\c           @   sí   d  Z  d d l m Z d d l m Z d d l m Z m Z m Z m	 Z	 m
 Z
 m Z m Z d d l m Z m Z m Z d d l m Z m Z d d l m Z d d l m Z d d	 l m Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d S(   sA   
Several methods to simplify expressions involving unit objects.
iÿÿÿÿ(   t   division(   t   SymPyDeprecationWarning(   t   Addt   Functiont   Mult   Powt   Rationalt   Tuplet   sympify(   t   reducet   Iterablet   ordered(   t	   Dimensiont   dimsys_default(   t   Quantity(   t   Prefix(   t   siftc      	   C   s>   t  d d d d d d d d ƒ j ƒ  t j |  ƒ \ } }  |  S(	   s¯  
    NOTE: this function could be deprecated in the future.

    Simplify expression by recursively evaluating the dimension arguments.

    This function proceeds to a very rough dimensional analysis. It tries to
    simplify expression with dimensions, and it deletes all what multiplies a
    dimension without being a dimension. This is necessary to avoid strange
    behavior when Add(L, L) be transformed into Mul(2, L).
    t   deprecated_since_versions   1.2t   features#   dimensional simplification functiont   issuei4  t
   useinsteads	   don't use(   R   t   warnR   t   _collect_factor_and_dimension(   t   exprt   _(    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyt   dim_simplify   s    c      	   C   s2  d d l  m } t t j |  ƒ ƒ } t j | d t ƒ} g  | D] } t t j | ƒ ƒ ^ qA } d „  | Dƒ } d „  | Dƒ } | j | ƒ s• d  St
 | ƒ } | g  | D]: }	 g  | D]' }
 t j |
 d t ƒj |	 d ƒ ^ q¸ ^ q« ƒ } | g  | D] } | j | d ƒ ^ qø ƒ } | j | d d  ƒ} | S(   Niÿÿÿÿ(   t   Matrixt   mark_dimensionlessc         S   s2   h  |  ]( } t  j | d  t ƒD] } | ’ q q S(   R   (   R   t   get_dimensional_dependenciest   True(   t   .0t   xt   i(    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pys	   <setcomp>.   s   	 c         S   s   h  |  ] } | ’ q S(    (    (   R   R    (    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pys	   <setcomp>/   s   	 i    t   method(   t   sympyR   R   R   t   get_dimensional_exprR   R   R   t   issubsett   Nonet   sortedt   gett   solve_least_squares(   R   t   target_unitsR   t   expr_dimt   dim_dependenciesR   t   target_dimst   canon_dim_unitst   canon_expr_unitst   jR    t   camatt   kt   exprmatt   res_exponents(    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyt   _get_conversion_matrix_for_expr(   s    (M+c            s   t  ˆ t t f ƒ s! ˆ g ‰ n  t  |  t ƒ rP t j ‡ f d †  |  j Dƒ ƒ St |  ƒ }  t  |  t ƒ rœ |  j t ƒ rœ |  j	 d „  ‡ f d †  ƒ }  n  ‡  f d †  ‰  t
 |  ˆ ƒ } | d k rÊ |  Sˆ  |  ƒ } | t j ‡  f d †  t ˆ | ƒ Dƒ ƒ S(   sÞ  
    Convert ``expr`` to the same expression with all of its units and quantities
    represented as factors of ``target_units``, whenever the dimension is compatible.

    ``target_units`` may be a single unit/quantity, or a collection of
    units/quantities.

    Examples
    ========

    >>> from sympy.physics.units import speed_of_light, meter, gram, second, day
    >>> from sympy.physics.units import mile, newton, kilogram, atomic_mass_constant
    >>> from sympy.physics.units import kilometer, centimeter
    >>> from sympy.physics.units import convert_to
    >>> convert_to(mile, kilometer)
    25146*kilometer/15625
    >>> convert_to(mile, kilometer).n()
    1.609344*kilometer
    >>> convert_to(speed_of_light, meter/second)
    299792458*meter/second
    >>> convert_to(day, second)
    86400*second
    >>> 3*newton
    3*newton
    >>> convert_to(3*newton, kilogram*meter/second**2)
    3*kilogram*meter/second**2
    >>> convert_to(atomic_mass_constant, gram)
    1.66053904e-24*gram

    Conversion to multiple units:

    >>> convert_to(speed_of_light, [meter, second])
    299792458*meter/second
    >>> convert_to(3*newton, [centimeter, gram, second])
    300000*centimeter*gram/second**2

    Conversion to Planck units:

    >>> from sympy.physics.units import gravitational_constant, hbar
    >>> convert_to(atomic_mass_constant, [gravitational_constant, speed_of_light, hbar]).n()
    7.62950196312651e-20*gravitational_constant**(-0.5)*hbar**0.5*speed_of_light**0.5

    c         3   s   |  ] } t  | ˆ  ƒ Vq d  S(   N(   t
   convert_to(   R   R    (   R)   (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pys	   <genexpr>m   s    c         S   s   t  |  t ƒ S(   N(   t
   isinstanceR   (   R   (    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyt   <lambda>r   t    c            s   |  j  ˆ  ƒ S(   N(   R5   (   R   (   R)   (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyR7   r   R8   c            sx   t  |  t ƒ r; t d „  g  |  j D] } ˆ  | ƒ ^ q" ƒ St  |  t ƒ r^ ˆ  |  j ƒ |  j St  |  t ƒ rt |  j S|  S(   Nc         S   s   |  | S(   N(    (   R   t   y(    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyR7   v   R8   (	   R6   R   R	   t   argsR   t   baset   expR   t   scale_factor(   R   R    (   t   get_total_scale_factor(    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyR>   t   s    ,c         3   s-   |  ]# \ } } d  ˆ  | ƒ | | Vq d S(   i   N(    (   R   t   ut   p(   R>   (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pys	   <genexpr>‚   s    N(   R6   R
   R   R   t   fromiterR:   R   R   t   hast   replaceR4   R%   R   t   zip(   R   R)   t   depmatt   expr_scale_factor(    (   R>   R)   s7   lib/python2.7/site-packages/sympy/physics/units/util.pyR5   =   s    , !	c            sâ   |  j  s |  j t t ƒ r  |  S|  j t ƒ } |  j d „  | Dƒ ƒ }  t |  j t ƒ d „  ƒ } xx | D]p } t | | ƒ d k rŒ qj n  t t	 | | ƒ ƒ } | d | d j
 ‰  |  j ‡  f d †  | d Dƒ ƒ }  qj W|  S(   sß  Return an equivalent expression in which prefixes are replaced
    with numerical values and all units of a given dimension are the
    unified in a canonical manner.

    Examples
    ========

    >>> from sympy.physics.units.util import quantity_simplify
    >>> from sympy.physics.units.prefixes import kilo
    >>> from sympy.physics.units import foot, inch
    >>> quantity_simplify(kilo*foot*inch)
    250*foot**2/3
    >>> quantity_simplify(foot - 6*inch)
    foot/2
    c         S   s   i  |  ] } | j  | “ q S(    (   R=   (   R   R@   (    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pys
   <dictcomp>›   s   	 c         S   s   |  j  S(   N(   t	   dimension(   R    (    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyR7   Ÿ   R8   i   i    c            s    i  |  ] } ˆ  | j  | “ q S(    (   R=   (   R   t   vi(   t   ref(    s7   lib/python2.7/site-packages/sympy/physics/units/util.pys
   <dictcomp>¥   s   	 (   t   is_AtomRB   R   R   t   atomst   xreplaceR   t   lent   listR   R=   (   R   R@   t   dR1   t   v(    (   RI   s7   lib/python2.7/site-packages/sympy/physics/units/util.pyt   quantity_simplify…   s    'c         C   s»  d d l  m } |  j t ƒ } t j } x| D]} t ƒ  } xû | j D]ð } | j rj | j	 d ƒ qH n  g  } t
 } x| t j | ƒ D]k }	 |	 j t ƒ r³ t t j |	 ƒ ƒ }	 n  |	 j t ƒ rÞ | j | |	 ƒ j ƒ  ƒ q† |	 j r† t } Pq† q† W| sH | j	 t t | ƒ ƒ ƒ t | ƒ d k r8t d ƒ ‚ q8qH qH Wq/ Wi  }
 xe |  j t ƒ D]T } t d „  | j Dƒ ƒ rV| j g  | j D] }	 |	 j s…|	 ^ q…Œ  |
 | <qVqVW|  j |
 ƒ S(   sj   Return expr if there are not unitless values added to
    dimensional quantities, else raise a ValueError.iÿÿÿÿ(   t   _term_factorsi   s$   addends have incompatible dimensionsc         s   s   |  ] } t  | t ƒ Vq d  S(   N(   R6   R   (   R   R    (    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pys	   <genexpr>Ð   s    (    (   t   sympy.solvers.solvesetRR   RK   R   R   R   t   setR:   t	   is_numbert   addt   FalseR   t	   make_argsRB   R   R   R#   t   extendt   itemst   free_symbolsR   t   tupleR&   RM   t
   ValueErrort   anyt   funcRL   (   R   RR   t   addst   DIM_OFt   at   desett   ait   dimst   skipR    t   repst   m(    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyt   check_dimensionsª   s<    				3N(   t   __doc__t
   __future__R    t   sympy.utilities.exceptionsR   R"   R   R   R   R   R   R   R   t   sympy.core.compatibilityR	   R
   R   t   sympy.physics.units.dimensionsR   R   t   sympy.physics.units.quantitiesR   t   sympy.physics.units.prefixesR   t   sympy.utilities.iterablesR   R   R4   R5   RQ   Ri   (    (    (    s7   lib/python2.7/site-packages/sympy/physics/units/util.pyt   <module>   s   4			H	%