Ë
    7^(h�&  ã                   óü   — 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(y)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                 ó4  — ddl m} |j                  «       }t        |j	                  | «      «      }|j                  |d¬«      }|D �cg c]  }t        |j	                  |«      «      ‘Œ }}|D ��	cg c]  }|j                  |d¬«      D ]  }	|	‘Œ Œ }
}}	t        |«      }|j                  t        |
«      «      sy t        «       }|
D �	cg c]  }	|	|v rŒ|j                  |	«      rŒ|	‘Œ }
}	 ||
D ��	cg c]3  }|D �	cg c]%  }	|j                  |	d¬«      j                  |d«      ‘Œ' c}	‘Œ5 c}	}«      } ||
D �cg c]  }|j                  |d«      ‘Œ c}«      }	 |j                  |«      }|S c c}w c c}	}w c c}	w c c}	w c c}	}w c c}w # t        $ r Y y w xY w)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                     úV/var/www/skyplay_api_hub/venv/lib/python3.12/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ÐX€KÐXØ"-÷  B˜QÐ7G×7dÑ7dÐefÐ{Ð7dó  8Aò  B°!’qð  B�qð  B€Oñ  BÜÐ+Ó,Ðà×$Ñ$¤S¨Ó%9Ô:Øä‹5€DØ"1ÖT˜Q¸!¸tº)ÀtÇxÁxÐPQÅ{’qÐT€OÐTáð  IX÷  Yð  DEÐr}Ö~ÐmnÐ%×BÑBÀ1ÐY]ÐBÓ^×bÑbÐcdÐfgÕhÔ~ó  Yó  Z€EÙ¸/ÖJ°QÐ&×*Ñ*¨1¨aÕ0ÒJÓK€GðØŸ™ GÓ,ˆð Ðùò% Yùó Bùò Uùâ~ùó  YùÚJøô $ò ÙðúsN   Á!E+Á0!E0Ã	E6ÃE6Ã$E6Ã1	F 
Ã:*E;Ä$F 
Ä7FÅF Å;F 
Æ	FÆFc                 ó°  ‡‡‡— ddl m}  |j                  ‰«      Št        ‰t        t
        f«      s‰gŠˆˆfd„}t        | t        «      r || «      S t        | t        «      r9t        | j                  t        «      r || j                  «      | j                  z  S t        | «      } t        ‰«      Št        | t        «      r| j                  «       } t        | t        «      s,| j                  t        «      r| j                  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                 óV   •— t        j                  ˆˆfd„| j                  D «       «      S )Nc              3   ó8   •K  — | ]  }t        |‰‰«      –— Œ y ­w©N©Ú
convert_to)Ú.0r+   r$   r%   s     €€r4   ú	<genexpr>z2convert_to.<locals>.handle_Adds.<locals>.<genexpr>g   s"   øè ø€ ò  Øô ' q¨,¸×Dñ  ùs   ƒ)r   ÚfromiterÚargs)r#   r$   r%   s    €€r4   Úhandle_Addszconvert_to.<locals>.handle_Addsf   s%   ø€ Ü�|‰|ô  Ø—Y‘Yô ó  ð 	 ó    c                 ó"   — t        | t        «      S r9   )Ú
isinstancer   )r)   s    r4   ú<lambda>zconvert_to.<locals>.<lambda>v   s   € ¤j°´HÓ&=€ rA   c                 ó(   •— | j                  ‰‰«      S r9   r:   )r)   r$   r%   s    €€r4   rD   zconvert_to.<locals>.<lambda>w   s   ø€ �a—l‘l <°Ó=€ rA   c           	      ó(  •— t        | t        «      r+t        d„ | j                  D �cg c]
  } ‰|«      ‘Œ c}«      S t        | t        «      r ‰| j
                  «      | j                  z  S t        | t        «      r‰j                  | «      S | S c c}w )Nc                 ó   — | |z  S r9   © )r)   Úys     r4   rD   z<convert_to.<locals>.get_total_scale_factor.<locals>.<lambda>{   s
   €  q¨1¡u€ rA   )	rC   r	   r   r?   r
   ÚbaseÚexpr   Úget_quantity_scale_factor)r#   r+   Úget_total_scale_factorr%   s     €€r4   rM   z*convert_to.<locals>.get_total_scale_factory   s~   ø€ Ü�dœCÔ ÜÑ,Ø48·I±IÖ>¨qÑ'¨Õ*Ò>ó@ð @ä˜œcÔ"Ù)¨$¯)©)Ó4¸¿¹Ñ@Ð@Ü˜œhÔ'Ø×8Ñ8¸Ó>Ð>Øˆùò ?s   §B
c              3   óF   •K  — | ]  \  }}d  ‰|«      z  |z  |z  –— Œ y­w)é   NrH   )r<   ÚuÚprM   s      €r4   r=   zconvert_to.<locals>.<genexpr>ˆ   s/   øè ø€ ò ,#Ù/3¨q°!ˆÑ! !Ó$Ñ	$ QÑ	&¨Õ*ñ,#ùs   ƒ!)Úsympy.physics.unitsr   Úget_unit_systemrC   r   r   r   r
   rJ   rK   r   r   Útogetherr   ÚhasÚreplacer5   r	   r>   Úzip)r#   r$   r%   r   r@   ÚdepmatÚexpr_scale_factorrM   s    ``    @r4   r;   r;   4   s#  ú€ õX /Ø,�*×,Ñ,¨[Ó9€Kä�l¤X¬uÐ$5Ô6Ø$�~ˆõ ô �$œÔÙ˜4Ó Ð Ü	�Dœ#Ô	¤:¨d¯i©i¼Ô#=Ù˜4Ÿ9™9Ó%¨¯©Ñ1Ð1ä�4‹=€DÜ˜<Ó(€Lä�$œÔ!Ø�}‰}‹ˆä�dœHÔ%¨$¯(©(´8Ô*<Ø�|‰|Ñ=Ü=ó?ˆõô -¨T°<ÀÓM€FØ€~Øˆá.¨tÓ4ÐØœsŸ|™|ó ,#äˆL˜&Ó!ô,#ó  #ñ #ð #rA   NÚacross_dimensionsc           	      óx  — | j                   s| j                  t        t        «      s| S | j	                  t        «      }| j                  |D �ci c]  }||j                  “Œ c}«      } t        | j	                  t        «      d„ «      }|D ]p  }t        ||   «      dk(  rŒt        t        ||   «      «      }|d   |d   j                  z  }| j                  |dd D �ci c]  }|||j                  z  “Œ c}«      } Œr |r±|€t        d«      ‚t        j                  |«      }|j                  «       }	|j                  | «      }
|	j!                  |
d¬«      }d}|	j"                  j%                  «       D ]  \  }}||k(  sŒ|} n |€| S |j&                  j)                  |«      }|rt+        | ||«      } | S c c}w c c}w )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                 ó   — | j                   S r9   )Ú	dimension)r+   s    r4   rD   z#quantity_simplify.<locals>.<lambda>¬   s
   € ¨Q¯[©[€ rA   rO   r   Nz:unit_system must be specified if across_dimensions is TrueTr   )Úis_AtomrU   r   r   ÚatomsÚxreplaceÚscale_factorr   ÚlenÚlistr   Ú
ValueErrorr   rS   r   r   r   Údimensional_dependenciesÚitemsÚderived_unitsr!   r;   )r#   rZ   r%   rQ   Údr1   ÚvÚrefÚvir&   Údim_exprÚdim_depsÚtarget_dimensionÚds_dimÚds_dim_depsÚtarget_units                   r4   Úquantity_simplifyrr   �   s¿  € ð, ‡|‚|˜4Ÿ8™8¤F¬HÔ5Øˆð 	�
‰
”6Ó€AØ�=‰=°QÖ7°˜!˜QŸ^™^Ñ+Ò7Ó8€Dô 	ˆT�Z‰ZœÓ!Ñ#8Ó9€AØò HˆÜˆq�‰t‹9˜Š>ØÜ”˜˜1™“ÓˆØ�‰d�1�Q‘4×$Ñ$Ñ$ˆØ�}‰}ÀÀ!À"ÀÖF¸"˜b # b§o¡oÑ"5Ñ5ÒFÓG‰ðHñ ð ÐÜÐYÓZÐZä ×0Ñ0°Ó=ˆØ,7×,LÑ,LÓ,NÐØ×3Ñ3°DÓ9ˆØ#×@Ñ@ÀÐ^bÐ@Ócˆà04ÐØ#3×#LÑ#L×#RÑ#RÓ#Tò 	ÑˆF�KØ˜hÓ&Ø#)Ð Ùð	ð
 Ð#àˆKà!×/Ñ/×3Ñ3Ð4DÓEˆÙÜ˜d K°Ó=ˆDà€KùòM 8ùò Gs   ÁF2ÃF7
c           
      ó  — ddl m}  |j                  |«      }d„ }| j                  t        «      }|j                  «       j                  }|D �]5  }t        «       }|j                  D �]  }|j                  r|j                  d«       Œ"g }	d}
i }t        j                  |«      D ]f  }|j                  t        «      rt        |j!                  |«      «      }|j                  t        «      r || ||«      «      }ŒW|j"                  sŒdd}
 n |	j%                  |j'                  «       «       |
rŒÈ|j                  t)        t+        |	t,        ¬«      «      «       t/        |«      dkD  s�Œt1        d	j3                  |«      «      ‚ �Œ8 i }| j                  t        «      D ]V  }t5        d
„ |j                  D «       «      sŒ  |j6                  |j                  D �cg c]  }|j                  rŒ|‘Œ c}Ž ||<   ŒX | j9                  |«      S c c}w )z[Return expr if units in addends have the same
    base dimensions, else raise a ValueError.r   r   c                 óÈ   — i | ¥|¥}|j                  «       D ]  \  }}|| v sŒ||v sŒ|| |   z   ||<   Œ |j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}S c c}}w )z]Merge dictionaries by adding values of common keys and
        removing keys with value of 0.r   )rf   )Údict1Údict2Údict3ÚkeyÚvalueÚvals         r4   ÚaddDictz!check_dimensions.<locals>.addDictÞ   su   € ð #�5Ð"˜EÐ"ˆØŸ+™+›-ò 	0‰JˆC�Ø�eŠ|  u¢Ø" U¨3¡ZÑ/��c’
ð	0ð ).¯©«×B™H˜C ¸À»��C‘ÓBÐBùÓBs   ÁAÁArH   FT)rx   rO   z(addends have incompatible dimensions: {}c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr9   )rC   r   )r<   r+   s     r4   r=   z#check_dimensions.<locals>.<genexpr>  s   è ø€ Ò8¨AŒz˜!œY×'Ñ8ùs   ‚)rR   r   rS   r_   r   r   r   r   r?   Ú	is_numberr    r	   Ú	make_argsrU   r   r   r   Úfree_symbolsÚextendrf   ÚtupleÚsortedr   rb   rd   ÚformatÚanyÚfuncr`   )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Øó RˆÜ“ˆØ—&‘&ó 	RˆBØ�|Š|Ø—	‘	˜"”ØØˆDØˆDØˆGÜ—]‘] 2Ó&ò �Ø—5‘5œ”?Ü! +×"BÑ"BÀ1Ó"EÓF�AØ—5‘5œÔ#Ù% g©v°a«yÓ9‘GØ—^“^Ø�DÙðð �K‰K˜Ÿ™›Ô(ÚØ—	‘	œ%¤ tÔ1AÔ BÓCÔDÜ�u“: ”>Ü$ØB×IÑIÈ%ÓPóRð Rò'	RðRð4 €DØ�Z‰Zœ‹_ò 7ˆÜÑ8°·±Ô8Õ8Ø�a—f‘fØŸ6™6ö6Ø¨¯«’ò6ð 7ˆD�ŠGð7ð
 �=‰=˜ÓÐùò6s   ÇH
Ç)H
)Ú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;   Úboolrr   r�   rH   rA   r4   ú<module>r¥      s_   ðñõ Ý $Ý å "Ý Ý 'Ý Ý  Ý &Ý &Ý (Ý >ß EÝ /Ý 3Ý 5Ý *òó8V#ñrA¨tó AôH8rA   