§
    OŠtj�&  ã                   óþ   — 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
 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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dl"m#Z# d„ Z$dd„Z%dde&fd„Z'dd„Z(dS )zA
Several methods to simplify expressions involving unit objects.
é    )Úreduce)ÚIterable)ÚOptional)Údefault_sort_key)ÚAdd)ÚTuple)ÚMul)ÚPow)Úordered)Úsympify)ÚFunction)ÚNonInvertibleMatrixError)Ú	DimensionÚDimensionSystem)ÚPrefix)ÚQuantity©Ú
UnitSystem)Úsiftc                 ó:  ‡‡
‡‡‡— ddl m} ‰                     ¦   «         Št          ‰                     | ¦  «        ¦  «        }‰                     |d¬¦  «        Š
ˆfd„|D ¦   «         Šˆfd„‰D ¦   «         }t          ‰
¦  «        }|                     t          |¦  «        ¦  «        sd S t          ¦   «         Šˆfd„|D ¦   «         } |ˆˆfd„|D ¦   «         ¦  «        } |ˆ
fd	„|D ¦   «         ¦  «        }	 |                     |¦  «        }	n# t          $ r Y d S w xY w|	S )
Nr   )ÚMatrixT©Úmark_dimensionlessc                 óT   •— g | ]$}t          ‰                     |¦  «        ¦  «        ‘Œ%S © )r   Úget_dimensional_expr)Ú.0ÚxÚunit_systems     €úV/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/physics/units/util.pyú
<listcomp>z3_get_conversion_matrix_for_expr.<locals>.<listcomp>   s/   ø€ ÐXÐXÐXÀa•9˜[×=Ò=¸aÑ@Ô@ÑAÔAÐXÐXÐXó    c                 óH   •— g | ]}‰                      |d ¬¦  «        D ]}|‘ŒŒS )Tr   )Úget_dimensional_dependencies)r   r   ÚiÚdimension_systems      €r    r!   z3_get_conversion_matrix_for_expr.<locals>.<listcomp>    s]   ø€ ð  Bð  Bð  B˜QÐ7G×7dÒ7dÐefÐ{Ð7dñ  8Aô  8Að  Bð  B°!�qð  Bð  Bð  Bð  Br"   c                 óF   •— g | ]}|‰v °‰                      |¦  «        °|‘ŒS r   )Úadd)r   r%   Úseens     €r    r!   z3_get_conversion_matrix_for_expr.<locals>.<listcomp>'   s-   ø€ ÐTÐTÐT˜Q¸!¸t¸)¸)ÀtÇxÂxÐPQÁ{Ä{¸)�q¸)¸)¸)r"   c                 ó0   •‡— g | ]Šˆˆfd „‰D ¦   «         ‘ŒS )c                 óf   •— g | ]-}‰                      |d ¬¦  «                             ‰d¦  «        ‘Œ.S )Tr   r   )r$   Úget)r   r%   r&   Újs     €€r    r!   z>_get_conversion_matrix_for_expr.<locals>.<listcomp>.<listcomp>)   sA   ø€ Ð~Ð~Ð~ÐmnÐ%×BÒBÀ1ÐY]ÐBÑ^Ô^×bÒbÐcdÐfgÑhÔhÐ~Ð~Ð~r"   r   )r   r-   r&   Útarget_dimss    @€€r    r!   z3_get_conversion_matrix_for_expr.<locals>.<listcomp>)   sJ   øø€ ð  Yð  Yð  Yð  DEÐ~Ð~Ð~Ð~Ð~Ðr}Ð~Ñ~Ô~ð  Yð  Yð  Yr"   c                 ó<   •— g | ]}‰                      |d ¦  «        ‘ŒS ©r   )r,   )r   ÚkÚdim_dependenciess     €r    r!   z3_get_conversion_matrix_for_expr.<locals>.<listcomp>*   s*   ø€ ÐJÐJÐJ°QÐ&×*Ò*¨1¨aÑ0Ô0ÐJÐJÐJr"   )
Úsympy.matrices.denser   Úget_dimension_systemr   r   r$   ÚsetÚissubsetÚsolver   )ÚexprÚtarget_unitsr   r   Úexpr_dimÚcanon_dim_unitsÚcanon_expr_unitsÚcamatÚexprmatÚres_exponentsr2   r&   r)   r.   s     `       @@@@r    Ú_get_conversion_matrix_for_exprr@      s«  øøøøø€ Ø+Ð+Ð+Ð+Ð+Ð+à"×7Ò7Ñ9Ô9Ðå˜×9Ò9¸$Ñ?Ô?Ñ@Ô@€HØ'×DÒDÀXÐbfÐDÑgÔgÐØXÐXÐXÐXÈ<ÐXÑXÔX€Kð Bð  Bð  Bð  B +ð  Bñ  Bô  B€OÝÐ+Ñ,Ô,Ðà×$Ò$¥S¨Ñ%9Ô%9Ñ:Ô:ð Øˆtå‰5Œ5€DØTÐTÐTÐT /ÐTÑTÔT€OàˆFð  Yð  Yð  Yð  Yð  Yð  IXð  Yñ  Yô  Yñ  Zô  Z€EØˆfÐJÐJÐJÐJ¸/ÐJÑJÔJÑKÔK€GðØŸš GÑ,Ô,ˆˆøÝ#ð ð ð Øˆtˆtðøøøð Ðs   Ã4D
 Ä

DÄDÚSIc                 ó  ‡‡‡— ddl m}  |j        ‰¦  «        Št          ‰t          t
          f¦  «        s‰gŠˆˆfd„}t          | t          ¦  «        r || ¦  «        S t          | t          ¦  «        r2t          | j        t          ¦  «        r || j        ¦  «        | j	        z  S t          | ¦  «        } t          ‰¦  «        Št          | t          ¦  «        r|                      ¦   «         } t          | t          ¦  «        s5|                      t          ¦  «        r|                      d„ ˆˆfd„¦  «        } ˆˆfd„Št!          | ‰‰¦  «        }|€| S  ‰| ¦  «        }|t#          j        ˆfd„t'          ‰|¦  «        D ¦   «         ¦  «        z  S )	aÜ  
    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 gravitational_constant, hbar
    >>> 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.660539060e-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:

    >>> convert_to(atomic_mass_constant, [gravitational_constant, speed_of_light, hbar]).n()
    7.62963087839509e-20*hbar**0.5*speed_of_light**0.5/gravitational_constant**0.5

    r   r   c                 óP   •— t          j        ˆˆfd„| j        D ¦   «         ¦  «        S )Nc              3   ó:   •K  — | ]}t          |‰‰¦  «        V — Œd S ©N©Ú
convert_to)r   r%   r9   r   s     €€r    ú	<genexpr>z2convert_to.<locals>.handle_Adds.<locals>.<genexpr>g   sC   øè è € ð  ð  Øõ ' q¨,¸ÑDÔDð  ð  ð  ð  ð  ð  r"   )r   ÚfromiterÚargs)r8   r9   r   s    €€r    Úhandle_Addszconvert_to.<locals>.handle_Addsf   sD   ø€ ÝŒ|ð  ð  ð  ð  ð  Ø”Yð ñ  ô  ñ  ô  ð 	 r"   c                 ó,   — t          | t          ¦  «        S rE   )Ú
isinstancer   )r   s    r    ú<lambda>zconvert_to.<locals>.<lambda>v   s   € ¥j°µHÑ&=Ô&=€ r"   c                 ó0   •— |                       ‰‰¦  «        S rE   rF   )r   r9   r   s    €€r    rN   zconvert_to.<locals>.<lambda>w   s   ø€ �a—l’l <°Ñ=Ô=€ r"   c                 ó$  •— t          | t          ¦  «        r"t          d„ ˆfd„| j        D ¦   «         ¦  «        S t          | t          ¦  «        r ‰| j        ¦  «        | j        z  S t          | t          ¦  «        r‰                     | ¦  «        S | S )Nc                 ó   — | |z  S rE   r   )r   Úys     r    rN   z<convert_to.<locals>.get_total_scale_factor.<locals>.<lambda>{   s
   €  q¨1¡u€ r"   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )r   r%   Úget_total_scale_factors     €r    r!   z>convert_to.<locals>.get_total_scale_factor.<locals>.<listcomp>|   s%   ø€ Ð>Ð>Ð>¨qÐ'Ð'¨Ñ*Ô*Ð>Ð>Ð>r"   )	rM   r	   r   rJ   r
   ÚbaseÚexpr   Úget_quantity_scale_factor)r8   rT   r   s    €€r    rT   z*convert_to.<locals>.get_total_scale_factory   s    ø€ Ý�d�CÑ Ô ð 	?ÝÐ,Ð,Ø>Ð>Ð>Ð>°D´IÐ>Ñ>Ô>ñ@ô @ð @å˜�cÑ"Ô"ð 	?Ø)Ð)¨$¬)Ñ4Ô4¸¼Ñ@Ð@Ý˜�hÑ'Ô'ð 	?Ø×8Ò8¸Ñ>Ô>Ð>Øˆr"   Nc              3   óF   •K  — | ]\  }}d  ‰|¦  «        z  |z  |z  V — ŒdS )é   Nr   )r   ÚuÚprT   s      €r    rH   zconvert_to.<locals>.<genexpr>ˆ   sS   øè è € ð ,#ð ,#Ù/3¨q°!ˆÐ!Ð! !Ñ$Ô$Ñ	$ QÑ	&¨Ñ*ð,#ð ,#ð ,#ð ,#ð ,#ð ,#r"   )Úsympy.physics.unitsr   Úget_unit_systemrM   r   r   r   r
   rU   rV   r   r   Útogetherr   ÚhasÚreplacer@   r	   rI   Úzip)r8   r9   r   r   rK   ÚdepmatÚexpr_scale_factorrT   s    ``    @r    rG   rG   4   så  øøø€ ðX /Ð.Ð.Ð.Ð.Ð.Ø,�*Ô,¨[Ñ9Ô9€Kå�l¥X­uÐ$5Ñ6Ô6ð &Ø$�~ˆð ð  ð  ð  ð  ð  õ �$�ÑÔð 2Øˆ{˜4Ñ Ô Ð Ý	�D�#Ñ	Ô	ð 2¥:¨d¬i½Ñ#=Ô#=ð 2Øˆ{˜4œ9Ñ%Ô%¨¬Ñ1Ð1å�4‰=Œ=€DÝ˜<Ñ(Ô(€Lå�$�Ñ!Ô!ð Ø�}Š}‰Œˆå�d�HÑ%Ô%ð ?¨$¯(ª(µ8Ñ*<Ô*<ð ?Ø�|Š|Ð=Ð=Ø=Ð=Ð=Ð=Ð=ñ?ô ?ˆðð ð ð ð ð õ -¨T°<ÀÑMÔM€FØ€~Øˆà.Ð.¨tÑ4Ô4ÐØ�sœ|ð ,#ð ,#ð ,#ð ,#åˆL˜&Ñ!Ô!ð,#ñ ,#ô ,#ñ  #ô  #ñ #ð #r"   FNÚacross_dimensionsc                 ó¤  ‡— | j         s |                      t          t          ¦  «        s| S |                      t          ¦  «        }|                      d„ |D ¦   «         ¦  «        } t          |                      t          ¦  «        d„ ¦  «        }|D ]}}t          ||         ¦  «        dk    rŒt          t          ||         ¦  «        ¦  «        }|d         |d         j
        z  Š|                      ˆfd„|dd…         D ¦   «         ¦  «        } Œ~|rÁ|€t          d¦  «        ‚t          j        |¦  «        }|                     ¦   «         }|                     | ¦  «        }|                     |d¬	¦  «        }	d}
|j                             ¦   «         D ]\  }}||	k    r|}
 nŒ|
€| S |j                             |
¦  «        }|rt+          | ||¦  «        } | S )
aû  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 by default. `across_dimensions` allows
    for units of different dimensions to be simplified together.

    `unit_system` must be specified if `across_dimensions` is True.

    Examples
    ========

    >>> from sympy.physics.units.util import quantity_simplify
    >>> from sympy.physics.units.prefixes import kilo
    >>> from sympy.physics.units import foot, inch, joule, coulomb
    >>> quantity_simplify(kilo*foot*inch)
    250*foot**2/3
    >>> quantity_simplify(foot - 6*inch)
    foot/2
    >>> quantity_simplify(5*joule/coulomb, across_dimensions=True, unit_system="SI")
    5*volt
    c                 ó   — i | ]
}||j         “ŒS r   ©Úscale_factor)r   r[   s     r    ú
<dictcomp>z%quantity_simplify.<locals>.<dictcomp>¨   s   € Ð7Ð7Ð7°˜!˜Qœ^Ð7Ð7Ð7r"   c                 ó   — | j         S rE   )Ú	dimension)r%   s    r    rN   z#quantity_simplify.<locals>.<lambda>¬   s   € ¨Q¬[€ r"   rY   r   c                 ó&   •— i | ]}|‰|j         z  “ŒS r   rg   )r   ÚviÚrefs     €r    ri   z%quantity_simplify.<locals>.<dictcomp>²   s"   ø€ ÐFÐFÐF¸"˜b # b¤oÑ"5ÐFÐFÐFr"   Nz:unit_system must be specified if across_dimensions is TrueTr   )Úis_Atomr_   r   r   ÚatomsÚxreplacer   ÚlenÚlistr   rh   Ú
ValueErrorr   r]   r4   r   r$   Údimensional_dependenciesÚitemsÚderived_unitsr,   rG   )r8   rd   r   r[   Údr1   Úvr&   Údim_exprÚdim_depsÚtarget_dimensionÚds_dimÚds_dim_depsÚtarget_unitrn   s                 @r    Úquantity_simplifyr€   �   só  ø€ ð, „|ð ˜4Ÿ8š8¥F­HÑ5Ô5ð Øˆð 	�
Š
•6ÑÔ€AØ�=Š=Ð7Ð7°QÐ7Ñ7Ô7Ñ8Ô8€Dõ 	ˆT�ZŠZ�Ñ!Ô!Ð#8Ð#8Ñ9Ô9€AØð Hð HˆÝˆq�Œt‰9Œ9˜Š>ˆ>ØÝ•˜˜1œ‘”ÑÔˆØ�Œd�1�Q”4Ô$Ñ$ˆØ�}Š}ÐFÐFÐFÐFÀÀ!À"À"ÄÐFÑFÔFÑGÔGˆˆàð >ð ÐÝÐYÑZÔZÐZå Ô0°Ñ=Ô=ˆØ,7×,LÒ,LÑ,NÔ,NÐØ×3Ò3°DÑ9Ô9ˆØ#×@Ò@ÀÐ^bÐ@ÑcÔcˆà04ÐØ#3Ô#L×#RÒ#RÑ#TÔ#Tð 	ð 	ÑˆF�KØ˜hÒ&Ð&Ø#)Ð Ø�ð 'ð Ð#àˆKà!Ô/×3Ò3Ð4DÑEÔEˆØð 	>Ý˜d K°Ñ=Ô=ˆDà€Kr"   c           
      óB  — ddl m}  |j        |¦  «        }d„ }|                      t          ¦  «        }|                     ¦   «         j        }|D �]b}t          ¦   «         }|j        D �]H}|j	        r| 
                    d¦  «         Œ g }	d}
i }t          j        |¦  «        D ]y}|                     t          ¦  «        r"t          |                     |¦  «        ¦  «        }|                     t          ¦  «        r || ||¦  «        ¦  «        }Œn|j        rd}
 nŒz|	                     |                     ¦   «         ¦  «         |
sk| 
                    t)          t+          |	t,          ¬¦  «        ¦  «        ¦  «         t/          |¦  «        dk    r"t1          d	                     |¦  «        ¦  «        ‚�ŒJ�Œdi }|                      t          ¦  «        D ]<}t5          d
„ |j        D ¦   «         ¦  «        r |j        d„ |j        D ¦   «         Ž ||<   Œ=|                      |¦  «        S )z[Return expr if units in addends have the same
    base dimensions, else raise a ValueError.r   r   c                 óª   — i | ¥|¥}|                      ¦   «         D ]\  }}|| v r||v r|| |         z   ||<   Œd„ |                      ¦   «         D ¦   «         S )z]Merge dictionaries by adding values of common keys and
        removing keys with value of 0.c                 ó&   — i | ]\  }}|d k    ¯||“ŒS r0   r   )r   ÚkeyÚvals      r    ri   z5check_dimensions.<locals>.addDict.<locals>.<dictcomp>å   s#   € ÐBÐBÐB™H˜C ¸Àº¸��C¸¸¸r"   )rv   )Údict1Údict2Údict3r„   Úvalues        r    ÚaddDictz!check_dimensions.<locals>.addDictÞ   sn   € ð #�5Ð"˜EÐ"ˆØŸ+š+™-œ-ð 	0ð 	0‰JˆC�Ø�eˆ|ˆ|  u  Ø" U¨3¤ZÑ/��c‘
øØBÐB¨¯ª©¬ÐBÑBÔBÐBr"   r   FT)r„   rY   z(addends have incompatible dimensions: {}c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S rE   )rM   r   ©r   r%   s     r    rH   z#check_dimensions.<locals>.<genexpr>  s,   è è € Ð8Ð8¨A�z˜!�YÑ'Ô'Ð8Ð8Ð8Ð8Ð8Ð8r"   c                 ó    — g | ]}|j         °	|‘ŒS r   )Ú	is_numberrŒ   s     r    r!   z$check_dimensions.<locals>.<listcomp>  s/   € ð 6ð 6ð 6Ø¨¬ð6Øð6ð 6ð 6r"   )r\   r   r]   rp   r   r4   r$   r5   rJ   rŽ   r(   r	   Ú	make_argsr_   r   r   r   Úfree_symbolsÚextendrv   ÚtupleÚsortedr   rr   rt   ÚformatÚanyÚfuncrq   )r8   r   r   rŠ   ÚaddsÚDIM_OFÚaÚdesetÚaiÚdimsÚskipÚdimdictr%   ÚrepsÚms                  r    Úcheck_dimensionsr¡   Ñ   sU  € ð /Ð.Ð.Ð.Ð.Ð.Ø,�*Ô,¨[Ñ9Ô9€KðCð Cð Cð �:Š:•c‰?Œ?€DØ×-Ò-Ñ/Ô/ÔL€FØð Rñ RˆÝ‘”ˆØ”&ð 	Rñ 	RˆBØŒ|ð Ø—	’	˜"‘”�ØØˆDØˆDØˆGÝ”] 2Ñ&Ô&ð ð �Ø—5’5�‘?”?ð GÝ! +×"BÒ"BÀ1Ñ"EÔ"EÑFÔF�AØ—5’5�Ñ#Ô#ð Ø%˜g g¨v¨v°a©y¬yÑ9Ô9�G�GØ”^ð Ø�DØ�Eðð �KŠK˜Ÿš™œÑ(Ô(Ð(Øð RØ—	’	�%¥ tÕ1AÐ BÑ BÔ BÑCÔCÑDÔDÐDÝ�u‘:”: ’>�>Ý$ØB×IÒIÈ%ÑPÔPñRô Rð Rùñ'	Rð0 €DØ�ZŠZ�‰_Œ_ð 7ð 7ˆÝÐ8Ð8°´Ð8Ñ8Ô8Ñ8Ô8ð 	7Ø�a”fð 6ð 6Øœ6ð6ñ 6ô 6ð 7ˆD�‰Gøð �=Š=˜ÑÔÐr"   )rA   )FN))Ú__doc__Ú	functoolsr   Úcollections.abcr   Útypingr   Úsympyr   Úsympy.core.addr   Úsympy.core.containersr   Úsympy.core.mulr	   Úsympy.core.powerr
   Úsympy.core.sortingr   Úsympy.core.sympifyr   Úsympy.core.functionr   Úsympy.matrices.exceptionsr   Úsympy.physics.units.dimensionsr   r   Úsympy.physics.units.prefixesr   Úsympy.physics.units.quantitiesr   Úsympy.physics.units.unitsystemr   Úsympy.utilities.iterablesr   r@   rG   Úboolr€   r¡   r   r"   r    ú<module>rµ      s¶  ððð ð Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø &Ð &Ð &Ð &Ð &Ð &Ø &Ð &Ð &Ð &Ð &Ð &Ø (Ð (Ð (Ð (Ð (Ð (Ø >Ð >Ð >Ð >Ð >Ð >Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ /Ð /Ð /Ð /Ð /Ð /Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø *Ð *Ð *Ð *Ð *Ð *ðð ð ð8V#ð V#ð V#ð V#ðrAð A¨tð Að Að Að AðH8ð 8ð 8ð 8ð 8ð 8r"   