
    \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  oPM     M     n
nn	[        U5      nUR                  [        U
5      5      (       d  g [        5       nU
 V	s/ s H$  oU;   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"  oR                  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  oR                  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                     P/var/www/auris/envauris/lib/python3.13/site-packages/sympy/physics/units/util.py_get_conversion_matrix_for_exprr5      s   +"77999$?@H'DDXbfDgKWX<a9[==a@A<KX"-  B+Q7d7def{7d  8A!q  8Aq+O  B+,$$S%9::5D"1T/Qt)qtxxPQ{q/OT  IX  Y  IX  DEr}~r}mnBB1Y]B^bbcdfghr}~  IX  Y  ZE/J/Q**1a0/JKG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%    ||  YY    	     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    all<=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    qurC   )	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    dC  ,48II>Iq'*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/      ,#! 04q!!$	$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 /,,[9KlXu$566$~  $4  	D#		:dii#=#=499%114=D<(L$!!}}dH%%$((8*<*<||==? -T<MF~.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  oXxR                  -  _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  pX: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   , ||488FH55 	

6A==Q7QQ^^+Q78D 	TZZ!#89Aqt9>d1Q4$$$}}!"F"#oo"55FG   YZZ 00=,7,L,L,N33D9#@@^b@c04#3#L#L#R#R#TF&#)  $U
 #K!//334DEd=DKM 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  oR                  (       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"++-JC|"3Z/
 ( ).BHC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Az!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    /,,[9KC ::c?D--/LLF&&B||		"DDG]]2&55??!+"B"B1"EFA55##%gvay9G^^^D ' KK(4		%t1A BCDu:>$BII%PR R'  4 DZZ_8888ff666!a66 7DG 
 ==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   