ó
    Š*£h�&  ã                   ó  • S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJrJr  SSKJr  SSKJr  SSK J!r!  SSK"J#r#  S r$SS jr%SS\&4S jjr'SS jr(g)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                 ó^  • SSK Jn  UR                  5       n[        UR	                  U 5      5      nUR                  USS9nU Vs/ s H  n[        UR	                  U5      5      PM     nnU VV	s/ s H  otR                  USS9  H  o™PM     M     n
nn	[        U5      nUR                  [        U
5      5      (       d  g [        5       nU
 V	s/ s H$  o™U;   a  M
  UR                  U	5      (       a  M"  U	PM&     n
n	U" U
 VV	s/ s H2  oØ V	s/ s H"  o”R                  U	SS9R                  US5      PM$     sn	PM4     sn	n5      nU" U
 Vs/ s H  oöR                  US5      PM     sn5      n UR                  U5      nU$ s  snf s  sn	nf s  sn	f s  sn	f s  sn	nf s  snf ! [         a     g f = f)Nr   )ÚMatrixT©Úmark_dimensionless)Úsympy.matrices.denser   Úget_dimension_systemr   Úget_dimensional_exprÚget_dimensional_dependenciesÚsetÚissubsetÚaddÚgetÚsolver   )ÚexprÚtarget_unitsÚunit_systemr   Údimension_systemÚexpr_dimÚdim_dependenciesÚxÚtarget_dimsÚiÚcanon_dim_unitsÚcanon_expr_unitsÚseenÚjÚcamatÚkÚexprmatÚres_exponentss                     ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/physics/units/util.pyÚ_get_conversion_matrix_for_exprr5      sÆ  € Ý+à"×7Ñ7Ó9Ðä˜×9Ñ9¸$Ó?Ó@€HØ'×DÑDÀXÐbfÐDÐgÐÙKWÓXÊ<Àa”9˜[×=Ñ=¸aÓ@ÖAÉ<€KÐXÙ"-ô  B¢+˜Q×7dÑ7dÐefÐ{Ð7dô  8A°!’qñ  8A‘q¡+€Oñ  BÜÐ+Ó,Ðà×$Ñ$¤S¨Ó%9×:Ñ:Øä‹5€DÙ"1ÓT¢/˜Q¸t¹)“qÀtÇxÁxÐPQÇ{—q¡/€OÐTáñ  IXô  Yò  IXð  DEÐr}Ó~Òr}Ðmn×BÑBÀ1ÐY]ÐBÐ^×bÑbÐcdÐfgÖhÑr}Ô~ñ  IXò  Yó  Z€EÙ¹/ÓJº/°Q×*Ñ*¨1¨aÖ0¹/ÑJÓK€GðØŸ™ GÓ,ˆð Ðùò% Yùó Bùò Uùâ~ùó  YùÚJøô $ó ÙðúsN   Á$E?Á0"FÃ	F
ÃF
Ã3F
Ä	F
Ä)FÄ4F
Å	FÅ,F ÆF
Æ
F,Æ+F,c                 ó  ^^^• SSK Jn  UR                  " T5      m[        T[        [
        45      (       d  T/mUU4S jn[        U [        5      (       a  U" U 5      $ [        U [        5      (       a>  [        U R                  [        5      (       a  U" U R                  5      U R                  -  $ [        U 5      n [        T5      m[        U [        5      (       a  U R                  5       n [        U [        5      (       d2  U R                  [        5      (       a  U R                  S UU4S j5      n UU4S jm[!        U TT5      nUc  U $ T" U 5      nU["        R$                  " U4S j['        TU5       5       5      -  $ )aT  
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                 óZ   >• [         R                  " UU4S jU R                   5       5      $ )Nc              3   ó>   >#   • U  H  n[        UTT5      v •  M     g 7f©N©Ú
convert_to)Ú.0r+   r$   r%   s     €€r4   Ú	<genexpr>Ú2convert_to.<locals>.handle_Adds.<locals>.<genexpr>g   s$   øé € ð  Ú�ô ' q¨,¸×DÐDÚùs   ƒ)r   ÚfromiterÚargs)r#   r$   r%   s    €€r4   Úhandle_AddsÚconvert_to.<locals>.handle_Addsf   s%   ø€ Ü�|Š|õ  Ø—Y’Yó ó  ð 	 ó    c                 ó"   • [        U [        5      $ r9   )Ú
isinstancer   )r)   s    r4   Ú<lambda>Úconvert_to.<locals>.<lambda>v   s   € ¤j°´HÔ&=rC   c                 ó(   >• U R                  TT5      $ r9   r:   )r)   r$   r%   s    €€r4   rF   rG   w   s   ø€ �a—l‘l <°Ô=rC   c           	      óL  >• [        U [        5      (       a.  [        S U R                   Vs/ s H  nT" U5      PM     sn5      $ [        U [        5      (       a  T" U R
                  5      U R                  -  $ [        U [        5      (       a  TR                  U 5      $ U $ s  snf )Nc                 ó
   • X-  $ r9   © )r)   Úys     r4   rF   Ú<convert_to.<locals>.get_total_scale_factor.<locals>.<lambda>{   s   €  q¢urC   )	rE   r	   r   r@   r
   ÚbaseÚexpr   Úget_quantity_scale_factor)r#   r+   Úget_total_scale_factorr%   s     €€r4   rQ   Ú*convert_to.<locals>.get_total_scale_factory   s‹   ø€ Ü�dœC× Ñ ÜÑ,Ø48·I²IÓ>²I¨qÑ'¨Ö*±IÑ>ó@ð @ä˜œc×"Ñ"Ù)¨$¯)©)Ó4¸¿¹Ñ@Ð@Ü˜œh×'Ñ'Ø×8Ñ8¸Ó>Ð>Øˆùò ?s   ¬B!
c              3   óJ   >#   • U  H  u  pS T" U5      -  U-  U-  v •  M     g7f)é   NrK   )r<   ÚuÚprQ   s      €r4   r=   Úconvert_to.<locals>.<genexpr>ˆ   s/   øé € ð ,#â!ñ 04¨qˆÑ! !Ó$Ñ	$ QÑ	&¨Ö*Ú!ùs   ƒ #)Úsympy.physics.unitsr   Úget_unit_systemrE   r   r   r   r
   rN   rO   r   r   Útogetherr   ÚhasÚreplacer5   r	   r?   Úzip)r#   r$   r%   r   rA   ÚdepmatÚexpr_scale_factorrQ   s    ``    @r4   r;   r;   4   s6  ú€ õX /Ø×,Ò,¨[Ó9€Kä�l¤X¬uÐ$5×6Ñ6Ø$�~ˆö ô �$œ×ÑÙ˜4Ó Ð Ü	�Dœ#×	Ñ	¤:¨d¯i©i¼×#=Ñ#=Ù˜4Ÿ9™9Ó%¨¯©Ñ1Ð1ä�4‹=€DÜ˜<Ó(€Lä�$œ×!Ñ!Ø�}‰}‹ˆä�dœH×%Ñ%¨$¯(©(´8×*<Ñ*<Ø�|‰|Ñ=Ý=ó?ˆöô -¨T°<ÀÓM€FØ�~Øˆá.¨tÓ4ÐØœsŸ|š|ô ,#äˆL˜&Ô!ó,#ó  #ñ #ð #rC   NÚacross_dimensionsc           	      óª  • U R                   (       d  U R                  [        [        5      (       d  U $ U R	                  [        5      nU R                  U Vs0 s H  o3UR                  _M     sn5      n [        U R	                  [        5      S 5      nU Hr  n[        XE   5      S:X  a  M  [        [        XE   5      5      nUS   US   R                  -  nU R                  USS  Vs0 s H  oˆXxR                  -  _M     sn5      n Mt     U(       a¶  Uc  [        S5      e[        R                  " U5      nUR                  5       n	UR                  U 5      n
U	R!                  U
SS9nSnU	R"                  R%                  5        H  u  pÞXë:X  d  M  Un  O   Uc  U $ UR&                  R)                  U5      nU(       a  [+        XU5      n U $ s  snf s  snf )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                 ó   • U R                   $ r9   )Ú	dimension)r+   s    r4   rF   Ú#quantity_simplify.<locals>.<lambda>¬   s   € ¨Q¯[ª[rC   rT   r   Nz:unit_system must be specified if across_dimensions is TrueTr   )Úis_Atomr[   r   r   ÚatomsÚxreplaceÚscale_factorr   ÚlenÚlistr   Ú
ValueErrorr   rY   r   r   r   Údimensional_dependenciesÚitemsÚderived_unitsr!   r;   )r#   r`   r%   rV   Údr1   ÚvÚrefÚvir&   Údim_exprÚdim_depsÚtarget_dimensionÚds_dimÚds_dim_depsÚtarget_units                   r4   Úquantity_simplifyry   �   s¯  € ð, ‡|‡|˜4Ÿ8™8¤F¬H×5Ñ5Øˆð 	�
‰
”6Ó€AØ�=‰=±QÓ7²Q°˜QŸ^™^Ò+±QÑ7Ó8€Dô 	ˆT�Z‰ZœÓ!Ñ#8Ó9€AÛˆÜˆq‰t‹9˜‹>ÙÜ”˜™“ÓˆØ�‰d�1�Q‘4×$Ñ$Ñ$ˆØ�}‰}ÀÀ!À"ÁÓFÂ¸" #§o¡oÑ"5Ò5ÁÑFÓGŠñ ö ð ÑÜÐYÓZÐZä ×0Ò0°Ó=ˆØ,7×,LÑ,LÓ,NÐØ×3Ñ3°DÓ9ˆØ#×@Ñ@ÀÐ^bÐ@Ðcˆà04ÐØ#3×#LÑ#L×#RÑ#RÖ#TÑˆFØÕ&Ø#)Ð Ùñ $Uð
 Ñ#àˆKà!×/Ñ/×3Ñ3Ð4DÓEˆÞÜ˜d°Ó=ˆDà€KùòM 8ùò Gs   ÁGÃ)G
c                 óv  • SSK Jn  UR                  " U5      nS nU R                  [        5      nUR                  5       R                  nU GHT  n[        5       nUR                   GH5  nUR                  (       a  UR                  S5        M(  / n	Sn
0 n[        R                  " U5       Hv  nUR                  [        5      (       a  [        UR!                  U5      5      nUR                  [        5      (       a  U" Xµ" U5      5      nMa  UR"                  (       d  Mt  Sn
  O   U	R%                  UR'                  5       5        U
(       a  Mæ  UR                  [)        [+        U	[,        S95      5        [/        U5      S:”  d  GM  [1        S	R3                  U5      5      e   GMW     0 nU R                  [        5       Hd  n[5        S
 UR                   5       5      (       d  M&  UR6                  " UR                   Vs/ s H  oÌR                  (       a  M  UPM     sn6 XÞ'   Mf     U R9                  U5      $ s  snf )zWReturn expr if units in addends have the same
base dimensions, else raise a ValueError.r   r   c                 óÔ   • 0 U EUEnUR                  5        H  u  p4X0;   d  M  X1;   d  M  X@U   -   X#'   M     UR                  5        VVs0 s H  u  p5US:w  d  M  X5_M     snn$ s  snnf )zUMerge dictionaries by adding values of common keys and
removing keys with value of 0.r   )rm   )Údict1Údict2Údict3ÚkeyÚvalueÚvals         r4   ÚaddDictÚ!check_dimensions.<locals>.addDictÞ   sh   € ð #�5Ð"˜EÐ"ˆØŸ+™+ž-‰JˆCØ�| ¥Ø"¨3¡ZÑ/�“
ñ (ð ).¯©¬ÔBª™H˜C¸À¹“�’©ÒBÐBùÓBs   Á
A$ÁA$rK   FT)r   rT   z(addends have incompatible dimensions: {}c              3   óB   #   • U  H  n[        U[        5      v •  M     g 7fr9   )rE   r   )r<   r+   s     r4   r=   Ú#check_dimensions.<locals>.<genexpr>  s   é € Ð8²¨AŒz˜!œY×'Ð'²ùs   ‚)rX   r   rY   rf   r   r   r   r   r@   Ú	is_numberr    r	   Ú	make_argsr[   r   r   r   Úfree_symbolsÚextendrm   ÚtupleÚsortedr   ri   rk   ÚformatÚanyÚfuncrg   )r#   r%   r   r‚   ÚaddsÚDIM_OFÚaÚdesetÚaiÚdimsÚskipÚdimdictr+   ÚrepsÚms                  r4   Úcheck_dimensionsr™   Ñ   sµ  € õ /Ø×,Ò,¨[Ó9€KòCð �:‰:”c‹?€DØ×-Ñ-Ó/×LÑL€FÜˆÜ“ˆØ—&•&ˆBØ�|�|Ø—	‘	˜"”ÙØˆDØˆDØˆGÜ—]’] 2Ö&�Ø—5‘5œ—?‘?Ü! +×"BÑ"BÀ1Ó"EÓF�AØ—5‘5œ×#Ñ#Ù% g¨v°a«yÓ9’GØ—^—^‘^Ø�DÙñ 'ð �K‰K˜Ÿ™›Ô(ß�4Ø—	‘	œ%¤ tÔ1AÑ BÓCÔDÜ�u“: –>Ü$ØB×IÑIÈ%ÓPóRð Rô' ñ ð4 €DØ�Z‰ZœŽ_ˆÜÑ8°·²Ó8×8Ó8Ø—f’fØŸ6š6ó6Ú!�a¯­—™6ñ6ð 7ˆD‹Gñ ð
 �=‰=˜ÓÐùò6s   Ç=H6
ÈH6
)ÚSI)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   r5   r;   Úboolry   r™   rK   rC   r4   Ú<module>r®      s_   ðñõ Ý $Ý å "Ý Ý 'Ý Ý  Ý &Ý &Ý (Ý >ß EÝ /Ý 3Ý 5Ý *òô8V#ñrA¨tõ AõH8rC   