B
    [_#                 @   s   d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZ G d	d
 d
eZdS )z
Physical quantities.
    )division)AbsAdd
AtomicExprBasic
DerivativeFunctionMulPowSSymbolsympify)string_types)	Dimension
dimensions)dimsys_defaultDimensionSystem)Prefix)SymPyDeprecationWarningc               @   s   e Zd ZdZdZdZdZdZdZd$ddZ	i Z
i Zd%dd	Zd&d
dZedd Zedd Zedd Zedd Zdd Zdd Zdd Zdd Zedd Zedd Zd d! Zed"d# ZdS )'QuantityzX
    Physical quantity: can be a unit of measure, a constant or a generic quantity.
    TFNc             K   s   t |tst|}t |ts6t |ts6|||  }}}|d k	rRtddddd  |d k	rntddddd  |d kr||}nt |trt|}t| ||}||_||_|d k	r|	| |d k	r|
| |S )Nz1.3i7  zQuantity argumentsSI_quantity_dimension_map)Zdeprecated_since_versionZissueZfeatureZ
useinsteadSI_quantity_scale_factors)
isinstancer   r   r   warnr   __new___name_abbrevset_dimensionset_scale_factor)clsnameabbrev	dimensionscale_factorZassumptionsobj r%   =lib/python3.7/site-packages/sympy/physics/units/quantities.pyr      s:    





zQuantity.__new__SIc             C   s   ddl m}m} |dkr td|}t|tjsL|dkrBtd}qtdn6x4|j	tD ]$}|dd |j
D krZtd	| qZW |tj| < d S )
Nr   )r   r   r'   zCurrently only SI is supported   zexpected dimension or 1c             S   s   g | ]
}|j qS r%   )r    ).0ir%   r%   r&   
<listcomp>a   s    z*Quantity.set_dimension.<locals>.<listcomp>zBDimension %s is not registered in the dimensional dependency tree.)sympy.physics.units.dimensionsr   r   NotImplementedErrorr   r   r   
ValueErrorr    ZatomsZ_dimensional_dependenciesr   r   )selfr"   unit_systemr   r   Zdim_sysZdim_symr%   r%   r&   r   Q   s    

zQuantity.set_dimensionc             C   sN   |dkrt dt|}|dd dd }|dd dd }|tj| < d S )Nr'   zCurrently only SI is supportedc             S   s
   t | tS )N)r   r   )xr%   r%   r&   <lambda>m   s    z+Quantity.set_scale_factor.<locals>.<lambda>c             S   s   | j S )N)r#   )r1   r%   r%   r&   r2   m   s    c             S   s
   t | tS )N)r   r   )r1   r%   r%   r&   r2   o   s    c             S   s   | j S )N)r#   )r1   r%   r%   r&   r2   o   s    )r-   r   replacer   r   )r/   r#   r0   r%   r%   r&   r   f   s    zQuantity.set_scale_factorc             C   s   | j S )N)r   )r/   r%   r%   r&   r    r   s    zQuantity.namec             C   s
   t j|  S )N)r   r   )r/   r%   r%   r&   r"   v   s    zQuantity.dimensionc             C   s   | j S )z
        Symbol representing the unit name.

        Prepend the abbreviation with the prefix symbol if it is defines.
        )r   )r/   r%   r%   r&   r!   {   s    zQuantity.abbrevc             C   s   t j| tjS )zW
        Overall magnitude of the quantity as compared to the canonical units.
        )r   r   getr   One)r/   r%   r%   r&   r#      s    zQuantity.scale_factorc             C   s   | j jS )N)r#   Zis_positive)r/   r%   r%   r&   _eval_is_positive   s    zQuantity._eval_is_positivec             C   s
   | j  S )N)r#   Zis_constant)r/   r%   r%   r&   _eval_is_constant   s    zQuantity._eval_is_constantc             C   s   t | j}|| jkr| S d S )N)r   r#   funcr    r!   )r/   r#   qr%   r%   r&   	_eval_Abs   s
    

zQuantity._eval_Absc             C   s   t |tr| |kr| S d S )N)r   r   )r/   oldnewr%   r%   r&   
_eval_subs   s    zQuantity._eval_subsc             C   s   t | trtdd | jD  S t | tr:t| j| j S t | trTt| jd S t | t	rt| j
}x$| jD ]\}}|t||  }qrW |S t | trdd | jD }tdd |D rtjS | j| S t | tr| jjS tjS )Nc             S   s   g | ]}t |qS r%   )r   get_dimensional_expr)r)   r*   r%   r%   r&   r+      s    z1Quantity.get_dimensional_expr.<locals>.<listcomp>r   c             S   s   g | ]}t |qS r%   )r   r>   )r)   argr%   r%   r&   r+      s    c             s   s   | ]}|d kV  qdS )r(   Nr%   )r)   r*   r%   r%   r&   	<genexpr>   s    z0Quantity.get_dimensional_expr.<locals>.<genexpr>)r   r	   argsr
   r   r>   baseexpr   r   exprvariable_countr   allr   r5   r8   r"   r    )rD   dimindependentcountrA   r%   r%   r&   r>      s&    






zQuantity.get_dimensional_exprc             C   s  t | tr| j| jfS t | trbd}td}x,| jD ]"}t|\}}||9 }||9 }q4W ||fS t | trt| j	\}}t| j
\}}|jrd}|| |||  fS t | tr t| jd \}}xL| jdd D ]:}	t|	\}
}||krtd|	|j|j||
7 }qW ||fS t | trt| jd \}}x:| jD ]0\}}t|\}}|||  }|||  }qHW ||fS t | trdd | jD }| jdd |D  | jd	d |D  fS t | trd| fS | tdfS dS )
z=Return tuple with factor expression and dimension expression.r(   r   Nz/Dimension of "{0}" is {1}, but it should be {2}c             S   s   g | ]}t |qS r%   )r   _collect_factor_and_dimension)r)   r?   r%   r%   r&   r+      s   z:Quantity._collect_factor_and_dimension.<locals>.<listcomp>c             s   s   | ]}|d  V  qdS )r   Nr%   )r)   fr%   r%   r&   r@      s    z9Quantity._collect_factor_and_dimension.<locals>.<genexpr>c             s   s   | ]}|d  V  qdS )r(   Nr%   )r)   dr%   r%   r&   r@      s    )r   r   r#   r"   r	   r   rA   rJ   r
   rB   rC   Zis_dimensionlessr   r.   formatr    r   rE   r   r8   )rD   Zfactorr"   r?   Z
arg_factorZarg_dimrG   Z
exp_factorZexp_dimZaddendZaddend_factorZ
addend_dimrH   rI   ZifactorZidimZfdsr%   r%   r&   rJ      sR    




z&Quantity._collect_factor_and_dimensionc             C   s   ddl m} || |S )a  
        Convert the quantity to another quantity of same dimensions.

        Examples
        ========

        >>> from sympy.physics.units import speed_of_light, meter, second
        >>> speed_of_light
        speed_of_light
        >>> speed_of_light.convert_to(meter/second)
        299792458*meter/second

        >>> from sympy.physics.units import liter
        >>> liter.convert_to(meter**3)
        meter**3/1000
        r(   )
convert_to)utilrN   )r/   otherrN   r%   r%   r&   rN      s    zQuantity.convert_toc             C   s   | j jS )z"Return free symbols from quantity.)r#   free_symbols)r/   r%   r%   r&   rQ      s    zQuantity.free_symbols)NNN)r'   )r'   )__name__
__module____qualname____doc__Zis_commutativeZis_realZ	is_numberZ
is_nonzeroZ	_diff_wrtr   r   r   r   r   propertyr    r"   r!   r#   r6   r7   r:   r=   staticmethodr>   rJ   rN   rQ   r%   r%   r%   r&   r      s.   
0

	0r   N)rU   Z
__future__r   Zsympyr   r   r   r   r   r   r	   r
   r   r   r   Zsympy.core.compatibilityr   Zsympy.physics.unitsr   r   r,   r   r   Zsympy.physics.units.prefixesr   Zsympy.utilities.exceptionsr   r   r%   r%   r%   r&   <module>   s   4