U
    ZÊ¹j?  ã                   @   sd   d 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
 G dd„ deƒZG d	d
„ d
eƒZdS )z
Physical quantities.
é    )Ú
AtomicExpr)ÚSymbol)Úsympify)Ú_QuantityMapper)ÚPrefixc                   @   s¼   e Zd ZdZdZdZdZdZdZdZ	d$dd„Z
dd„ Z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dd„ Zd%dd„Ze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   st   t |tƒst|ƒ}|d kr |}nt |tƒr2t|ƒ}|| _t | ||¡}	||	_||	_||	_||	_	||	_
||	_||	_|	S ©N)Ú
isinstancer   ÚstrÚ_is_prefixedr   Ú__new__Ú_nameÚ_abbrevÚ_latex_reprZ_unicode_reprZ_ascii_reprZ_mathml_repr)
ÚclsÚnameÚabbrevZ
latex_reprZpretty_unicode_reprZpretty_ascii_reprZmathml_presentation_reprÚis_prefixedZassumptionsÚobj© r   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/physics/units/quantities.pyr      s     

zQuantity.__new__c                 C   s   |t j| < d S r   )r   Z_quantity_dimension_global)ÚselfÚ	dimensionr   r   r   Úset_global_dimension3   s    zQuantity.set_global_dimensionc                 C   s\   ddl m} t|ƒ}t|tƒr$d| _| dd„ dd„ ¡}t|ƒ}||f|j| < ||j| < dS )zN
        Setting a scale factor that is valid across all unit system.
        r   ©Ú
UnitSystemTc                 S   s
   t | tƒS r   )r	   r   ©Úxr   r   r   Ú<lambda>@   ó    z;Quantity.set_global_relative_scale_factor.<locals>.<lambda>c                 S   s   | j S r   )Úscale_factorr   r   r   r   r   A   r   N)	Úsympy.physics.unitsr   r   r	   r   r   ÚreplaceZ_quantity_scale_factors_globalZ,_quantity_dimensional_equivalence_map_global)r   r    Zreference_quantityr   r   r   r   Ú set_global_relative_scale_factor6   s    
þz)Quantity.set_global_relative_scale_factorc                 C   s   | j S r   )r   ©r   r   r   r   r   G   s    zQuantity.namec                 C   s   ddl m} | ¡ }| | ¡S )Nr   r   )r!   r   Úget_default_unit_systemZget_quantity_dimension©r   r   Úunit_systemr   r   r   r   K   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   Q   s    zQuantity.abbrevc                 C   s   ddl m} | ¡ }| | ¡S )zW
        Overall magnitude of the quantity as compared to the canonical units.
        r   r   )r!   r   r%   Zget_quantity_scale_factorr&   r   r   r   r    Z   s    zQuantity.scale_factorc                 C   s   dS ©NTr   r$   r   r   r   Ú_eval_is_positivec   s    zQuantity._eval_is_positivec                 C   s   dS r(   r   r$   r   r   r   Ú_eval_is_constantf   s    zQuantity._eval_is_constantc                 C   s   | S r   r   r$   r   r   r   Ú	_eval_Absi   s    zQuantity._eval_Absc                 C   s   t |tƒr| |kr| S d S r   )r	   r   )r   ÚoldÚnewr   r   r   Ú
_eval_subsl   s    zQuantity._eval_subsc                 C   s8   | j r| j S d t| jƒdkr(| jd n| jd ¡S d S )Nz\text{{{}}}é   é   r   )r   ÚformatÚlenÚargs)r   Úprinterr   r   r   Ú_latexp   s    ÿÿzQuantity._latexÚSIc                 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
        r0   )Ú
convert_to)Úutilr7   )r   Úotherr'   r7   r   r   r   r7   w   s    zQuantity.convert_toc                 C   s   t ƒ S )z"Return free symbols from quantity.)Úsetr$   r   r   r   Úfree_symbols‹   s    zQuantity.free_symbolsc                 C   s   | j S )zWWhether or not the quantity is prefixed. Eg. `kilogram` is prefixed, but `gram` is not.)r   r$   r   r   r   r   �   s    zQuantity.is_prefixed)NNNNNF)r6   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zis_commutativeZis_realZ	is_numberZ
is_nonzeroÚis_physical_constantZ	_diff_wrtr   r   r#   Úpropertyr   r   r   r    r)   r*   r+   r.   r5   r7   r;   r   r   r   r   r   r      sD           ý






r   c                   @   s   e Zd ZdZdZdS )ÚPhysicalConstantzLRepresents a physical constant, eg. `speed_of_light` or `avogadro_constant`.TN)r<   r=   r>   r?   r@   r   r   r   r   rB   •   s   rB   N)r?   Zsympy.core.exprr   Zsympy.core.symbolr   Zsympy.core.sympifyr   Zsympy.physics.units.dimensionsr   Zsympy.physics.units.prefixesr   r   rB   r   r   r   r   Ú<module>   s    
