K i&dZddlmZddlmZddlmZddlmZddl m Z ddl m Z ddl mZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZmZddlmZddlmZddl m!Z!ddl"m#Z#dZ$ddZ%dde&fdZ'ddZ(y)zA Several methods to simplify expressions involving unit objects. )reduce)Iterable)Optional)default_sort_key)Add)Tuple)Mul)Pow)ordered)sympify)Function)NonInvertibleMatrixError) DimensionDimensionSystem)Prefix)Quantity UnitSystem)siftc 4ddlm}|j}t|j |}|j |d}|Dcgc]}t|j |}}|D cgc]}|j |dD]} | } }} t |} | jt | syt } | D cgc]} | | vr| j| r| } } || D cgc]3} |D cgc]%} |j | dj| d'c} 5c} } }|| Dcgc]}|j|dc}} |j|}|Scc}wcc} }wcc} wcc} wcc} } wcc}w#t$rYywxYw)Nr)MatrixTmark_dimensionless) sympy.matrices.denserget_dimension_systemrget_dimensional_exprget_dimensional_dependenciessetissubsetaddgetsolver)expr target_units unit_systemrdimension_systemexpr_dimdim_dependenciesx target_dimsicanon_dim_unitscanon_expr_unitsseenjcamatkexprmat res_exponentss ^/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/physics/units/util.py_get_conversion_matrix_for_exprr5s+"77999$?@H'DDXbfDgKWXa9[==a@AXKX"-BQ7G7d7def{7d8AB!qBqBOB+,  $ $S%9 : 5D"1TQ!t)txxPQ{qTOT IXYDEr}~mn%BB1Y]B^bbcdfgh~Y ZE/JQ&**1a0JKG G,  %YBU~YJ $sN!E+0!E0 E6E6$E61 F :*E;$F 7FF ;F FFcddlm}|jttt fsgfd}t|t r||St|tr9t|jt r||j|jzSt|}tt|tr|j}t|ts,|jtr|jdfd}fdt!|}||S|}|t#j$fdt'|DzS)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 rrcVtjfd|jDS)Nc38K|]}t|ywN convert_to).0r+r$r%s r4 z2convert_to..handle_Adds..gs" 'q, D s)rfromiterargs)r#r$r%s r4 handle_Addszconvert_to..handle_Addsfs%|| YY   c"t|tSr9) isinstancer)r)s r4zconvert_to..vs jH&=rAc(|jSr9r:)r)r$r%s r4rDzconvert_to..wsall<=rAc (t|tr+td|jDcgc] }| c}St|tr|j |j zSt|trj|S|Scc}w)Nc ||zSr9)r)ys r4rDz.get_total_scale_factor..{s q1urA) rCr rr?r baseexprget_quantity_scale_factor)r#r+get_total_scale_factorr%s r4rMz*convert_to..get_total_scale_factorys~ dC ,48II>q'*>@ @ c ")$))4@ @ h '88> > ?sB c3FK|]\}}d|z |z|zyw)NrH)r<uprMs r4r=zconvert_to..s/,#/3q! !! $ $Q &*,#s!)sympy.physics.unitsrget_unit_systemrCrrrr rJrKr r togetherrhasreplacer5r r>zip)r#r$r%rr@depmatexpr_scale_factorrMs `` @r4r;r;4s#X/,*,,[9K lXu$5 6$~  $4  D# :dii#=499%11 4=D<(L$!}} dH %$((8*<||= =?-T< MF ~ .t4 s||,# L&!,# # ##rANacross_dimensionsc x|js|jtts|S|j t}|j |Dcic]}||j c}}t|j td}|D]p}t||dk(rtt||}|d|dj z }|j |ddDcic]}|||j zc}}r|r| tdtj|}|j} |j|} | j!| d} d} | j"j%D]\} }|| k(s | } n| |S|j&j)| }|r t+|||}|Scc}wcc}w)aReturn 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|jSr9) dimension)r+s r4rDz#quantity_simplify..s Q[[rArOrNz:unit_system must be specified if across_dimensions is TrueTr)is_AtomrUrratomsxreplace scale_factorrlenlistr ValueErrorrrSrrrdimensional_dependenciesitems derived_unitsr!r;)r#rZr%rQdr1vrefvir&dim_exprdim_depstarget_dimensionds_dim ds_dim_deps target_units r4quantity_simplifyrrs, ||488FH5  6A ==Q7!Q^^+7 8D TZZ !#89A H qt9>  1 d1Q4$$$}}!"F"b#boo"55FG H  YZ Z 00= ,7,L,L,N33D9#@@^b@c04#3#L#L#R#R#T  FKh&#)    #K!//334DE dK=D KM8Gs F2F7 c ddlm}|j|}d}|jt}|j j }|D]5}t}|jD]}|jr|jd"g} d} i} tj|D]f} | jtrt|j!| } | jtr|| || } W| j"sdd} n| j%| j'| r|jt)t+| t,t/|dkDst1d j3|8i} |jtD]V}t5d |jDs |j6|jD cgc]} | jr| c} | |<X|j9| Scc} w) z[Return expr if units in addends have the same base dimensions, else raise a ValueError.rrci||}|jD]\}}||vs ||vs|||z||<|jDcic]\}}|dk7s ||c}}Scc}}w)z]Merge dictionaries by adding values of common keys and removing keys with value of 0.r)rf)dict1dict2dict3keyvaluevals r4addDictz!check_dimensions..addDictsu#5"E"++- 0JCe|u "U3Z/c  0). BHCCBBBs  AArHFT)rxrOz(addends have incompatible dimensions: {}c3<K|]}t|tywr9)rCr)r<r+s r4r=z#check_dimensions..s8Az!Y'8s)rRrrSr_rrrrr? is_numberr r make_argsrUrrr free_symbolsextendrftuplesortedrrbrdformatanyfuncr`)r#r%rr{addsDIM_OFadesetaidimsskipdimdictr+repsms r4check_dimensionsrs/,*,,[9KC ::c?D  - - / L LF R&& RB|| " DDG]]2& 55?!+"B"B1"EFA55#%gvay9G^^D  KK  ( %t1A BCDu:>$BII%PRR' RR4 D ZZ_7 88 8aff66667DG7 == 6s H )H )SI)FN))__doc__ functoolsrcollections.abcrtypingrsympyrsympy.core.addrsympy.core.containersrsympy.core.mulr sympy.core.powerr sympy.core.sortingr sympy.core.sympifyr sympy.core.functionr sympy.matrices.exceptionsrsympy.physics.units.dimensionsrrsympy.physics.units.prefixesrsympy.physics.units.quantitiesrsympy.physics.units.unitsystemrsympy.utilities.iterablesrr5r;boolrrrrHrAr4rs_$"' &&(>E/35*8V#rAtAH8rA