pygeodesy 24.4.12__py2.py3-none-any.whl → 24.4.24__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyGeodesy
3
- Version: 24.4.12
3
+ Version: 24.4.24
4
4
  Summary: Pure Python geodesy tools
5
5
  Home-page: https://GitHub.com/mrJean1/PyGeodesy
6
6
  Author: Jean M. Brouwers
@@ -158,7 +158,7 @@ and McCabe_ using Python 2.7.18 and with Flake8_ using Python 3.11.5, both in 64
158
158
 
159
159
  For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
160
160
 
161
- *Last updated: April 12, 2024.*
161
+ *Last updated: April 24, 2024.*
162
162
 
163
163
  License
164
164
  =======
@@ -1,13 +1,13 @@
1
1
  pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
- pygeodesy/__init__.py,sha256=VQ4Ax0S1ZenUk2bZtcfv8F-OWwKawIzU85WpPHWDrRE,40824
2
+ pygeodesy/__init__.py,sha256=td1SZErPJBK8oIAHrj4sVvK-n3PjnJbckJQjWhyNHf0,40824
3
3
  pygeodesy/__main__.py,sha256=qMFG3caY8ZXWu6uGiemzyT4OqTFZnsFtlxcGCAgkVJw,4637
4
- pygeodesy/albers.py,sha256=mx1Bu05G52WuDaZdEHSpnN9bmRagem4vsbjYodQeuiM,31102
4
+ pygeodesy/albers.py,sha256=g2AVlpV8JO2AYFCthoIbRC2h1OJqjb9P3hpwF0C3TI8,30994
5
5
  pygeodesy/azimuthal.py,sha256=tc4JxgLi-0jzU08m4Bvi-t-kzHXYPeGuzL3j_tyVFUA,50125
6
6
  pygeodesy/basics.py,sha256=_BMYLzGKA6OIS3qv25HfHy7MIh0kAbmkzyScb59clUs,28160
7
7
  pygeodesy/booleans.py,sha256=HZbwoL-S7Ww9d4C2D1BVqXfmcuqqVpEVSU9_S0uyUyo,74204
8
8
  pygeodesy/cartesianBase.py,sha256=I3q29mRdBB3NCDmPoJsJ0QOFfLzkdMWc8X9zG4IwJyA,47264
9
9
  pygeodesy/clipy.py,sha256=VU3ynQ1IZ0v5hJlicqD48oW0imRgiL5_ZzRPrIjpfPw,27683
10
- pygeodesy/constants.py,sha256=ypxYsWB6tNAVgrD9QVpukJAPscaLgHtPLqPuot1gUfU,19174
10
+ pygeodesy/constants.py,sha256=RxO8dMe_3AEfmZyKaRIy_44QnOTdEpzgYwimN0_w9Qs,19113
11
11
  pygeodesy/css.py,sha256=sKXsahUiyruDcUk-tGjA6mxq-xzwBoBKxKo9_b2uBmY,25394
12
12
  pygeodesy/datums.py,sha256=gJZPgV4bELZvZ8Sj2zE3MBysVtsLxqsN8zm0xjOKvpo,33851
13
13
  pygeodesy/dms.py,sha256=op3MU-59CoJQRdybnu21aVM9wtocd_-XFNAZFqmozSo,44439
@@ -20,16 +20,16 @@ pygeodesy/ellipsoidalGeodSolve.py,sha256=xfNcb70AuPbIiJUqhisIfg6pCQBqXyQffBNuESE
20
20
  pygeodesy/ellipsoidalKarney.py,sha256=FoOsfNf96oHuGa9k4AB42y_UUBuOkh4xMW7PFGF63SA,19246
21
21
  pygeodesy/ellipsoidalNvector.py,sha256=vHVKSfR86LnIapGlwl5_uCaEuQGdm0e89mwE6Ay-394,30323
22
22
  pygeodesy/ellipsoidalVincenty.py,sha256=Uk93B8GFcMnWiwKUOA84TlLwbBlvzVnsAXAx0cU7cn4,26004
23
- pygeodesy/ellipsoids.py,sha256=cykBbfMMDGWk65rfGlYGm1s_Wuh_NZD1_9bgKelPJ5s,119945
24
- pygeodesy/elliptic.py,sha256=J9n6YdKeGQbcwgDKXByGRKMdAyDt1V8xKCPE_3RsGWM,42419
23
+ pygeodesy/ellipsoids.py,sha256=SxMsivNnE9ibUjQGd0d24H0SzoSjh6jfhLWjasOWpao,119946
24
+ pygeodesy/elliptic.py,sha256=XRVpmpdm3hbztM4P-qhWKQizbgsXDUxWujgmOrIpgiQ,42428
25
25
  pygeodesy/epsg.py,sha256=ldHoLWqJWR4FUiBVnDTtrI_e7TNjjtr9OkxDlri1g5E,8165
26
- pygeodesy/errors.py,sha256=fRGrdnb81Y9KB4Y1ua1nvB9zuuiv8IL6c6YN_cb3kBo,27280
26
+ pygeodesy/errors.py,sha256=mUaacHJKcSCowlcbzamaBMDqjI2dqsTM5O4ozIITtAk,27233
27
27
  pygeodesy/etm.py,sha256=joEhU2lw9ehRv101nRpZvXq8hOYAEzdcYFpif9_obfk,44585
28
- pygeodesy/fmath.py,sha256=cmObX2axb8BfPyhaSDGFFVRs63kBP4ZWhWzGzPhl6OQ,30286
28
+ pygeodesy/fmath.py,sha256=cRisVRkuarEwu4pKOCWmBa-98lV2PP9oJVkkODQLc2E,32480
29
29
  pygeodesy/formy.py,sha256=Rces4Q5ecED0WVfuI9mQzeyHE54LDowYfI6faBHpyeA,74536
30
30
  pygeodesy/frechet.py,sha256=qgee-ISBtT7Ov3rJkcd_t-WeXTbeNoMSQuMa0j3MyQc,33512
31
31
  pygeodesy/fstats.py,sha256=r8O2aIknHuoHsW8gZUIY42zpHZy7syHvCB7uCVtPpkc,25559
32
- pygeodesy/fsums.py,sha256=9ekLTz59nSON-PHtgQp_m6FxnYj3UOUCagDtoT7h8AE,69283
32
+ pygeodesy/fsums.py,sha256=Am8CRdltomItdCpdBUDyc1xP53KmrCXXs9rBTa19hs4,73370
33
33
  pygeodesy/gars.py,sha256=fCiWBJ4kOJxPfNOxadX-OzBGDXj7C9g02NuGHiZa_88,11342
34
34
  pygeodesy/geodesicw.py,sha256=5yjJ2rLekSsjT7e-Km6v592ZcFlA41flQP_E42jU9Sw,26901
35
35
  pygeodesy/geodsolve.py,sha256=3GLI2_4gglzTpZwKchNzAv-XhWFBzWRKjcWsjCC3dvI,21900
@@ -42,18 +42,18 @@ pygeodesy/iters.py,sha256=CfU365eE9F4oWZbBx0qTEvfodMhpa8rGOepLIv67xF8,20181
42
42
  pygeodesy/karney.py,sha256=lYdsSHis8xQJVS1V0F3cphx6Dhgd77xTlMOdVR8MN8I,34994
43
43
  pygeodesy/ktm.py,sha256=sCvbLvJItavlruilAyjeZ0sOZx2yJumzGe_UiIVbGi4,27315
44
44
  pygeodesy/latlonBase.py,sha256=LimCMj91J3Q4D_rTu7VN7c63cLL_KzxXagFQfedobmc,77730
45
- pygeodesy/lazily.py,sha256=pLyWvdPoIdAQ8mQXoiGVNSkjBDew0T1Nkvv6OWj8Dv0,48624
45
+ pygeodesy/lazily.py,sha256=YeOQQ2Tu0LTD-AMDABc0bemeLRKTteTEJXJDl3_7vZU,48645
46
46
  pygeodesy/lcc.py,sha256=yNpmAdOwv3HNh2ZLopF5QtvDokeQYCmnxSc8UFUPHO4,25737
47
- pygeodesy/ltp.py,sha256=AEzriv6LyqjJwROF_6kLWjsu0_J_cjVhNMNlsjr4ac4,48579
47
+ pygeodesy/ltp.py,sha256=8se8dYG7LG__Ru0FoK939DJBF9GCQGeJik_Un1Im8Xw,48609
48
48
  pygeodesy/ltpTuples.py,sha256=iKzvDfv33HfmEevjNISUS4c9KXIkiISEkVlQopyKgfY,55769
49
49
  pygeodesy/mgrs.py,sha256=GJ-vG54E2zSLtROyqJ_kj8fHH-8jWGf3kVe7gb8993o,28978
50
50
  pygeodesy/named.py,sha256=2Kg4tv883V80ZVUEgFzDeBmIEMkig_VUbJuufC0lhN0,48009
51
51
  pygeodesy/namedTuples.py,sha256=msEYvQKj4oCW35Kx80RpeQXY85A1G0O3GEqsysLaV2M,27288
52
52
  pygeodesy/nvectorBase.py,sha256=WJY5ylZ_HCeM1wGL7ryEecJphEYibp-EAWL0piKlMG8,28766
53
- pygeodesy/osgr.py,sha256=5JB6b_nvyZ6rFMlC7ZB45mvYtjc_aiLb4DPdeaui-KY,30995
53
+ pygeodesy/osgr.py,sha256=voC1rbOe4dnS_EjaDaRDRUQ4MoG7puMBEMV6lcAuIBI,31029
54
54
  pygeodesy/points.py,sha256=QNAAF0r7iqSXFr_6aQm-wW7f6vU3KusWVhXEMVeVo58,64442
55
55
  pygeodesy/props.py,sha256=ZnXRuSOkfkeJY3Of-iT06FNWZkTYgLZQBPBNF6aS0jE,21421
56
- pygeodesy/resections.py,sha256=WGGsWgN9LCcJ9YCo-lbgtuA9VqEWnYvoe3OFOJ4nYFk,43619
56
+ pygeodesy/resections.py,sha256=nkfBxYrsEdyq2JqAbPrRWKplJBzFkIXLvEZGB4gPu_A,43550
57
57
  pygeodesy/simplify.py,sha256=FT3AzXiFjFfvwJ-X2q8iA9cQOUVdBT1vD_BIskM3gK8,25223
58
58
  pygeodesy/solveBase.py,sha256=cBe3QQWEaJlPWUlXoiYo1eFMh4z6GDZbQyt8ZiwMfos,16687
59
59
  pygeodesy/sphericalBase.py,sha256=sH2WwmY_RL0STyr1OhtCDKvGhO0Ks7o3V-MHLddpiHQ,31944
@@ -61,7 +61,7 @@ pygeodesy/sphericalNvector.py,sha256=TBs_nid_DTcox7bBegh_Djv4zZRGRY4mH6dd1xIHGms
61
61
  pygeodesy/sphericalTrigonometry.py,sha256=Q9qsqzIK43xBken2G8uP9snPXPuBoZ20pMHqbT_IjG0,64216
62
62
  pygeodesy/streprs.py,sha256=-29aUO7dYe-YWfTjflljesxGUp7IfEAjk5dJLHWMPVs,23413
63
63
  pygeodesy/trf.py,sha256=4gVtF780EEZEqWwMBDe4x1AEkIz3hB8h4l0_0NXWM5U,118903
64
- pygeodesy/triaxials.py,sha256=Yet0J9Fr4FbTEIL9_p3ziollRR3PzUN2-qt7Z9ZSODU,61537
64
+ pygeodesy/triaxials.py,sha256=fkUcWkXkykZNbTq62LcdnEjhNu9q-e2UaSpRotdzuu8,61546
65
65
  pygeodesy/units.py,sha256=ofFTYc7mF9wOpfvpYHN83dGszMM18rTdsxfEXVzaIko,38705
66
66
  pygeodesy/unitsBase.py,sha256=xRZlNlO7S47Mwy0FGBg_cefvB4fEtWFM5dAE-Nlw-NE,13111
67
67
  pygeodesy/ups.py,sha256=07AG-Rb1D4EvmN3g-xk3ZxKzyaNYvOzztcyYbx7t8jc,23229
@@ -69,7 +69,7 @@ pygeodesy/utily.py,sha256=jP82RmCPCVghxTQv4ZRuIS89afmsD-roz2iafHfyHXA,36128
69
69
  pygeodesy/utm.py,sha256=0qF5Kjw8Wf9zxGWOaCF-LSweibat-EkHvvmy7dFO_KE,30981
70
70
  pygeodesy/utmups.py,sha256=u2hlWSnmZKwR-ApgKw16R9p75sW_yaqQAmbcBUE8Zfg,13007
71
71
  pygeodesy/utmupsBase.py,sha256=KetB8R0uRYU6X8nLG3JkBHUr1OfNlChKa0isgvm8Yq8,18807
72
- pygeodesy/vector2d.py,sha256=7li4n13cpEm6qNVqlwoE7RH6Cjs9HpbAXBrPX8F4QmI,34963
72
+ pygeodesy/vector2d.py,sha256=IAgmn-9-P6zxh4rond2k0tuf26miVwe-eHqm5f7sWTU,35003
73
73
  pygeodesy/vector3d.py,sha256=Q_brX_URZg_Eln01y8G8_NAEuPbbOI_IgO2wBJk1N0U,44970
74
74
  pygeodesy/vector3dBase.py,sha256=wJpEcgHlJ5Qu0Us7CKuNDepZQzo6a-RvqZbA2-O4-ko,35583
75
75
  pygeodesy/webmercator.py,sha256=1IXiAHBXTm5kMCp5gEI67oBJeRXD7BiPVI7bcRRX1U4,14918
@@ -82,11 +82,11 @@ pygeodesy/auxilats/__main__.py,sha256=TVN8evCKEzBKdANU5-Ucps8bZySqBTQmEGU4hy_U1c
82
82
  pygeodesy/auxilats/auxAngle.py,sha256=3tTYEuiX2YmEOmoyqGPYrSN3gLXbcKWKFH1TNt3NqbI,16738
83
83
  pygeodesy/auxilats/auxDLat.py,sha256=U3BHF6AkW5--nrwH9whL5wZVIZLH_keRLfUz6c6KBx4,10950
84
84
  pygeodesy/auxilats/auxDST.py,sha256=bdNEh3TdABWH7qW6ngZx5SnzDM3B5rtPLvYhvCnFsKc,10497
85
- pygeodesy/auxilats/auxLat.py,sha256=nefYrJK7C_SlzGX2ju2_0l1lJzCWtJVeoY9YV0saxeU,31271
85
+ pygeodesy/auxilats/auxLat.py,sha256=U6thEwMEoUm4OFb2_JviEtEn2-nqyVjNbII7oyMf0hM,31282
86
86
  pygeodesy/auxilats/auxily.py,sha256=ZiCFedYcr32O6TWQ_dcnwMrc9TgogyuhNSbR77WMDpg,8240
87
- pygeodesy/deprecated/__init__.py,sha256=FJz1aCk2T2ta2S0iA6F92mIA1NlHW2nIzm5kY2oVzNA,2815
87
+ pygeodesy/deprecated/__init__.py,sha256=ZRGqgwSdvtKSYZdw09-LPuGa_i0jMHWKIwrPG3r1hHs,2815
88
88
  pygeodesy/deprecated/bases.py,sha256=nxUtxscAg5cb7HEzTSmPJFafLc9Ad2SL5ovwkYaU5z8,1655
89
- pygeodesy/deprecated/classes.py,sha256=NvZsfSzpdNPTBOA0H02-yYZBdnUBSenGFase2ABu-yg,11202
89
+ pygeodesy/deprecated/classes.py,sha256=PXgss-2kEu3bzaxvSeVZJGdcRqsdi_6_aRqsESyUQKQ,11662
90
90
  pygeodesy/deprecated/consterns.py,sha256=W-rQiw443_zCFEUzjCGykGND-i5P_ghEIyJUSGg7-Nc,1908
91
91
  pygeodesy/deprecated/datum.py,sha256=KfuMA64LYGMj1voW2uai2RGcugtWdpvlOL6UHJvpTeQ,1875
92
92
  pygeodesy/deprecated/functions.py,sha256=-Ckor43KBiCDa7rbwY5kHvrs5xwuixTlw1TZpNSBgrU,13647
@@ -109,7 +109,7 @@ pygeodesy/rhumb/aux_.py,sha256=W4HkgoHAQz_aWaysfsmOA5010nCGvBfUs2Q-bymnHYU,16660
109
109
  pygeodesy/rhumb/bases.py,sha256=kzU_Dgt4FNPMgTg5rqbw-HiNpflDPKpmq9jhPbQmR4U,53851
110
110
  pygeodesy/rhumb/ekx.py,sha256=lF3tZ-ZY9fPJV8y1kgHW-7EOZCyb3gJr-kR-jj5Fbf8,23871
111
111
  pygeodesy/rhumb/solve.py,sha256=NZfwx7xv5UriQs7A0c7ZhoxxVUeAT15UwXK_jtwEXQw,27802
112
- PyGeodesy-24.4.12.dist-info/METADATA,sha256=f38SpV-U-BTthJlrzADhDwe_IPavzJf_dj3biK_CRvA,19366
113
- PyGeodesy-24.4.12.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
114
- PyGeodesy-24.4.12.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
115
- PyGeodesy-24.4.12.dist-info/RECORD,,
112
+ PyGeodesy-24.4.24.dist-info/METADATA,sha256=IGu3-2Wu7HfzR8MYGeOU_oWysKdkDfMkndw45lFqWvY,19366
113
+ PyGeodesy-24.4.24.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
114
+ PyGeodesy-24.4.24.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
115
+ PyGeodesy-24.4.24.dist-info/RECORD,,
pygeodesy/__init__.py CHANGED
@@ -586,7 +586,7 @@ else:
586
586
  _init__all__ = False
587
587
 
588
588
  from pygeodesy.interns import _DOT_, _version2 # PYCHOK import
589
- __version__ = '24.04.12'
589
+ __version__ = '24.04.24'
590
590
  # see setup.py for similar logic
591
591
  version = _DOT_(*_version2(__version__, n=3))
592
592
 
pygeodesy/albers.py CHANGED
@@ -22,7 +22,7 @@ from pygeodesy.constants import EPS0, EPS02, _EPSqrt as _TOL, \
22
22
  from pygeodesy.datums import _ellipsoidal_datum, _WGS84
23
23
  from pygeodesy.errors import _ValueError, _xkwds
24
24
  from pygeodesy.fmath import hypot, hypot1, sqrt3
25
- from pygeodesy.fsums import Fsum, fsum1f_
25
+ from pygeodesy.fsums import Fsum, _Fsum1f_, fsum1f_
26
26
  from pygeodesy.interns import NN, _COMMASPACE_, _datum_, _gamma_, _k0_, \
27
27
  _lat_, _lat1_, _lat2_, _lon_, _name_, _not_, \
28
28
  _negative_, _scale_, _SPACE_, _x_, _y_
@@ -38,7 +38,7 @@ from pygeodesy.utily import atan1, atan1d, degrees360, sincos2, sincos2d, \
38
38
  from math import atan2, atanh, degrees, fabs, radians, sqrt
39
39
 
40
40
  __all__ = _ALL_LAZY.albers
41
- __version__ = '24.04.07'
41
+ __version__ = '24.04.14'
42
42
 
43
43
  _k1_ = 'k1'
44
44
  _NUMIT = 8 # XXX 4?
@@ -54,14 +54,6 @@ def _ct2(s, c):
54
54
  return c, (s / c)
55
55
 
56
56
 
57
- def _Fsum1(a, b, c=_0_0): # floats=True
58
- '''(INTERNAL) C{Fsum} 1-primed.
59
- '''
60
- S = Fsum()
61
- S._facc_(_1_0, a, b, c, _N_1_0, up=False)
62
- return S
63
-
64
-
65
57
  def _Ks(**name_k):
66
58
  '''(INTERNAL) Scale C{B{k} >= EPS0}.
67
59
  '''
@@ -388,12 +380,13 @@ class _AlbersBase(_NamedBase):
388
380
 
389
381
  den = hypot(nx, y1) + nrho0 # 0 implies origin with polar aspect
390
382
  if den:
391
- drho = _Fsum1(x * nx, y_ * nrho0 * _N_2_0, y_ * ny).fover(den / k0)
383
+ drho = _Fsum1f_(x * nx, y_ * nrho0 * _N_2_0, y_ * ny).fover(den / k0)
392
384
  # dsxia = scxi0 * dsxi
393
- t += drho * n0
385
+ t += drho * n0 # k0 below
394
386
  d_ = (nrho0 + t) * drho * self._scxi0_ # / (qZ * E.a2)
395
- d_2 = (txi * _2_0 - d_) * d_ + _1_0
396
- txi = (txi - d_) / (sqrt(d_2) if d_2 > EPS02 else EPS0)
387
+ t_ = txi - d_
388
+ d_ = (txi + t_) * d_ + _1_0
389
+ txi = t_ / (sqrt(d_) if d_ > EPS02 else EPS0)
397
390
 
398
391
  ta = self._tanf(txi)
399
392
  lat = atan1d(s * ta)
@@ -487,11 +480,11 @@ class _AlbersBase(_NamedBase):
487
480
  (ca2, sa2, ta2, scb22))
488
481
 
489
482
  dsxi = ((esa12 / esa1_2) + _DatanheE(sa2, sa1, E)) * dsn_2 / self._qx
490
- C = _Fsum1(sxi * dtb12 / dsxi, scb22, scb12).fover(scb22 * scb12 * _2_0)
483
+ C = _Fsum1f_(sxi * dtb12 / dsxi, scb22, scb12).fover(scb22 * scb12 * _2_0)
491
484
 
492
- sa12 = fsum1f_(sa1, sa2, sa12)
493
- axi *= (sa12 * e2 + _1) / (sa12 + _1)
494
- bxi *= _Fsum1(sa1, sa2, esa12).fover(esa1_2) * e2 + _D2atanheE(sa1, sa2, E) * E.e21
485
+ S = _Fsum1f_(sa1, sa2, sa12)
486
+ axi *= (S * e2 + _1).fover(S + _1, raiser=False)
487
+ bxi *= _Fsum1f_(sa1, sa2, esa12).fover(esa1_2) * e2 + _D2atanheE(sa1, sa2, E) * E.e21
495
488
  s1_qZ = (axi * self._qZ - bxi) * dsn_2 / dtb12
496
489
  ta0 = self._ta0(s1_qZ, (ta1 + ta2) * _0_5, E)
497
490
  return ta0, C
@@ -571,7 +564,7 @@ class _AlbersBase(_NamedBase):
571
564
  es2m1a = es2m1 * E.e21 # e2m
572
565
  s = sqrt((ca2 / (es1p1 * es2m1a) + _atanheE(ca2 / es1m1, E))
573
566
  * (es1m1 / es2m1a + _atanheE(es1p1, E)))
574
- t = _Fsum1(sa / es2m1, _atanheE(sa, E)).fover(s)
567
+ t = _Fsum1f_(sa / es2m1, _atanheE(sa, E)).fover(s)
575
568
  return neg(t) if ta < 0 else t
576
569
 
577
570
 
@@ -27,7 +27,7 @@ from pygeodesy.datums import _ellipsoidal_datum, _WGS84, Ellipsoid
27
27
  from pygeodesy.elliptic import Elliptic as _Ef
28
28
  from pygeodesy.errors import AuxError, _xkwds, _xkwds_get, _Xorder
29
29
  # from pygeodesy.fmath import cbrt # from .karney
30
- from pygeodesy.fsums import Fsum, _sum
30
+ from pygeodesy.fsums import Fsum, _Fsumf_, _sum
31
31
  from pygeodesy.karney import _2cos2x, _polynomial, _ALL_DOCS, cbrt, _MODS
32
32
  from pygeodesy.interns import NN, _DOT_, _UNDER_ # _earth_
33
33
  # from pygeodesy.lazily import _ALL_DOCS, _ALL_MODS as _MODS # from .karney
@@ -44,7 +44,7 @@ except ImportError: # Python 3.11-
44
44
  return pow(_2_0, x)
45
45
 
46
46
  __all__ = ()
47
- __version__ = '23.12.10'
47
+ __version__ = '24.04.14'
48
48
 
49
49
  _TRIPS = 1024 # XXX 2 or 3?
50
50
 
@@ -286,7 +286,7 @@ class AuxLat(AuxAngle):
286
286
  atphi = _asinh_2(tphi) # atanh(sphi)
287
287
  t = _asinh_2(em1 * (tphi * scphib)) / em1
288
288
  try:
289
- Dg = Fsum(atphi, atphib, t, e * t)
289
+ Dg = _Fsumf_(atphi, atphib, t, e * t)
290
290
  except ValueError: # Fsum(NAN) exception
291
291
  Dg = _sum((atphi, atphib, t, e * t))
292
292
  e *= atphib
pygeodesy/constants.py CHANGED
@@ -23,7 +23,7 @@ except ImportError: # Python 2-
23
23
  _inf, _nan = float(_INF_), float(_NAN_)
24
24
 
25
25
  __all__ = _ALL_LAZY.constants
26
- __version__ = '24.04.04'
26
+ __version__ = '24.04.23'
27
27
 
28
28
 
29
29
  def _copysign_0_0(y):
@@ -247,7 +247,6 @@ _1_16th = _Float(_1_16th =_1_0 / _16_0) # PYCHOK in .ellipsoids, .karney
247
247
  _1_64th = _Float(_1_64th =_1_0 / 64) # PYCHOK in .elliptic, pow(2.0, -6)
248
248
  _1_3rd = _Float(_1_3rd =_1_0 / _3_0) # PYCHOK in .fmath
249
249
  _1_6th = _Float(_1_6th =_1_0 / _6_0) # PYCHOK in .fmath
250
- _2_3rd = _Float(_2_3rd =_2_0 / _3_0) # PYCHOK in .fmath
251
250
 
252
251
  _K0_UTM = _Float(_K0_UTM = 0.9996) # PYCHOK in .etm, .ktm, .utm, UTM scale at central meridian
253
252
  # sqrt(2) <https://WikiPedia.org/wiki/Square_root_of_2>
@@ -27,7 +27,7 @@ __all__ = (_ALL_DEPRECATED.deprecated_bases +
27
27
  _ALL_DEPRECATED.deprecated_classes +
28
28
  _ALL_DEPRECATED.deprecated_consterns +
29
29
  _ALL_DEPRECATED.deprecated_functions)
30
- __version__ = '24.02.08'
30
+ __version__ = '24.04.17'
31
31
 
32
32
  if _unLazy0:
33
33
  from pygeodesy.deprecated import bases, datum, nvector, rhumbBase, \
@@ -22,7 +22,7 @@ from pygeodesy.trf import TRFXform7Tuple as _TRFXform7Tuple
22
22
  from pygeodesy.units import Bearing, Int, Lat, Lon, Meter
23
23
 
24
24
  __all__ = _ALL_DEPRECATED.deprecated_classes
25
- __version__ = '24.02.02'
25
+ __version__ = '24.04.17'
26
26
 
27
27
 
28
28
  class _Deprecated_NamedTuple(_NamedTuple):
@@ -98,6 +98,19 @@ def EcefCartesian(*args, **kwds):
98
98
  return EcefCartesian_(*args, **kwds)
99
99
 
100
100
 
101
+ def Fn_rt(root, *xs, **name_RESIDUAL_raiser): # PYCHOK no cover
102
+ '''DEPRECATED on 2024.04.17, use class L{Froot}.
103
+ '''
104
+ Froot = _MODS.fmath.Froot
105
+
106
+ class Fn_rt(Froot): # PYCHOK no cover
107
+ '''DEPRECATED on 2024.04.17, use class L{Froot}.
108
+ '''
109
+ def __init__(self, root, *xs, **name_RESIDUAL_raiser):
110
+ deprecated_class(self.__class__)
111
+ Froot.__init__(self, root, *xs, **name_RESIDUAL_raiser)
112
+
113
+
101
114
  def HeightIDW(knots, **kwds): # PYCHOK no cover
102
115
  '''DEPRECATED, use class L{HeightIDWeuclidean}.'''
103
116
  HeightIDWeuclidean = _MODS.heights.HeightIDWeuclidean
pygeodesy/ellipsoids.py CHANGED
@@ -70,8 +70,8 @@ from pygeodesy.constants import EPS, EPS0, EPS02, EPS1, INF, NINF, PI4, PI_2, PI
70
70
  _0_0s, _0_0, _0_5, _1_0, _1_EPS, _2_0, _4_0, _90_0, \
71
71
  _0_25, _3_0 # PYCHOK used!
72
72
  from pygeodesy.errors import _AssertionError, IntersectionError, _ValueError, _xattr, _xkwds_not
73
- from pygeodesy.fmath import cbrt, cbrt2, fdot, Fhorner, fpowers, Fsum, hypot, hypot_, \
74
- hypot1, hypot2, sqrt3
73
+ from pygeodesy.fmath import cbrt, cbrt2, fdot, Fhorner, fpowers, hypot, hypot_, \
74
+ hypot1, hypot2, sqrt3, Fsum
75
75
  # from pygeodesy.fsums import Fsum # from .fmath
76
76
  from pygeodesy.interns import NN, _a_, _Airy1830_, _AiryModified_, _b_, _Bessel1841_, _beta_, \
77
77
  _Clarke1866_, _Clarke1880IGN_, _DOT_, _f_, _GRS80_, _height_, \
@@ -93,7 +93,7 @@ from pygeodesy.utily import atan1, atan1d, atan2b, degrees90, m2radians, radians
93
93
  from math import asinh, atan, atanh, cos, degrees, exp, fabs, radians, sin, sinh, sqrt, tan
94
94
 
95
95
  __all__ = _ALL_LAZY.ellipsoids
96
- __version__ = '24.04.07'
96
+ __version__ = '24.04.14'
97
97
 
98
98
  _f_0_0 = Float(f =_0_0) # zero flattening
99
99
  _f__0_0 = Float(f_=_0_0) # zero inverse flattening
pygeodesy/elliptic.py CHANGED
@@ -97,7 +97,7 @@ from math import asinh, atan, atan2, ceil, cosh, fabs, floor, \
97
97
  radians, sin, sqrt, tanh
98
98
 
99
99
  __all__ = _ALL_LAZY.elliptic
100
- __version__ = '24.04.09'
100
+ __version__ = '24.04.14'
101
101
 
102
102
  _TolRD = zqrt(EPS * 0.002)
103
103
  _TolRF = zqrt(EPS * 0.030)
@@ -1023,13 +1023,12 @@ def _Horner(S, e1, E2, E3, E4, E5, *over):
1023
1023
  # + 3*E5/26 - E2**3/16 + 3*E3**2/40 + 3*E2*E4/20
1024
1024
  # + 45*E2**2*E3/272 - 9*(E3*E4+E2*E5)/68)
1025
1025
  # converted to Horner-like form ...
1026
- F = Fsum
1027
1026
  e = e1 * 4084080
1028
1027
  S *= e
1029
- S += F(E2 * -540540, 471240).fmul(E5)
1030
- S += F(E2 * 612612, E3 * -540540, -556920).fmul(E4)
1031
- S += F(E2 * -706860, E22 * 675675, E3 * 306306, 680680).fmul(E3)
1032
- S += F(E2 * 417690, E22 * -255255, -875160).fmul(E2)
1028
+ S += Fsum(E2 * -540540, 471240).fmul(E5)
1029
+ S += Fsum(E2 * 612612, E3 * -540540, -556920).fmul(E4)
1030
+ S += Fsum(E2 * -706860, E22 * 675675, E3 * 306306, 680680).fmul(E3)
1031
+ S += Fsum(E2 * 417690, E22 * -255255, -875160).fmul(E2)
1033
1032
  S += 4084080
1034
1033
  if over:
1035
1034
  e *= over[0]
@@ -1122,14 +1121,14 @@ def _rG2(inst, x, y, PI_=PI_4): # 2-args
1122
1121
  '''(INTERNAL) Carlson, eqs 2.36 - 2.39.
1123
1122
  '''
1124
1123
  m = -1 # neg!
1125
- S = _Dsum()
1126
- # assert not S
1124
+ S = None
1127
1125
  for a, b in _ab2(inst, x, y): # PYCHOK yield
1128
- if S:
1126
+ if S is None: # initial
1127
+ S = _Dsum()
1128
+ S += (a + b)**2 * _0_5
1129
+ else:
1129
1130
  S += (a - b)**2 * m
1130
1131
  m *= 2
1131
- else: # initial
1132
- S += (a + b)**2 * _0_5
1133
1132
  return S(PI_).fover(a + b)
1134
1133
 
1135
1134
 
pygeodesy/errors.py CHANGED
@@ -11,9 +11,9 @@ chaining}, use command line option C{python -X dev} I{OR} set env variable
11
11
  C{PYTHONDEVMODE=1} or to any non-empty string I{OR} set env variable
12
12
  C{PYGEODESY_EXCEPTION_CHAINING=std} or to any non-empty string.
13
13
  '''
14
- # from pygeodesy.basics import isint, isodd, itemsorted, _xinstanceof, _zip # _MODS
14
+ # from pygeodesy.basics import isint, isodd, issubclassof, itemsorted, _xinstanceof, _zip # _MODS
15
15
  # from pygeodesy.ellipsoidalBase import CartesianEllipsoidalBase, LatLonEllipsoidalBase # _MODS
16
- # from pygeodesy import errors # _MODS.getattr
16
+ # from pygeodesy import errors # _MODS, _MODS.getattr
17
17
  from pygeodesy.interns import MISSING, NN, _a_, _an_, _and_, _clip_, _COLON_, \
18
18
  _COLONSPACE_, _COMMASPACE_, _datum_, _ellipsoidal_, \
19
19
  _incompatible_, _invalid_, _len_, _not_, _or_, _SPACE_, \
@@ -25,7 +25,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _getenv, _PYTHON_X_D
25
25
  from copy import copy as _copy
26
26
 
27
27
  __all__ = _ALL_LAZY.errors # _ALL_DOCS('_InvalidError', '_IsnotError') _under
28
- __version__ = '24.03.24'
28
+ __version__ = '24.04.18'
29
29
 
30
30
  _box_ = 'box'
31
31
  _limiterrors = True # in .formy
@@ -425,7 +425,7 @@ def _error_init(Error, inst, args, fmt_name_value='%s (%r)', txt=NN,
425
425
  def _error_under(inst):
426
426
  '''(INTERNAL) Remove leading underscore from instance' class name.
427
427
  '''
428
- n = inst.__class__.__name__
428
+ n = inst.__class__.__name__ # _tailof?
429
429
  if n.startswith(_UNDER_):
430
430
  inst.__class__.__name__ = n.lstrip(_UNDER_)
431
431
  return inst
@@ -479,8 +479,15 @@ def isError(exc):
479
479
  C{False} if B{C{exc}} is a standard Python error
480
480
  of C{None} if neither.
481
481
  '''
482
- return True if isinstance(exc, _XErrors) else (
483
- False if isinstance(exc, Exception) else None)
482
+ def _X(exc):
483
+ X = type(exc)
484
+ m = X.__module__
485
+ return _MODS.basics.issubclassof(X, *_XErrors) or \
486
+ ((m is __name__ or m == __name__) and
487
+ _tailof(X.__name__).startswith(_UNDER_))
488
+
489
+ return True if isinstance(exc, _XErrors) else (
490
+ _X(exc) if isinstance(exc, Exception) else None)
484
491
 
485
492
 
486
493
  def _IsnotError(*nouns, **name_value_Error_cause): # name=value [, Error=TypeError, cause=None]
@@ -665,31 +672,23 @@ def _xError2(exc): # in .constants, .fsums, .lazily, .vector2d
665
672
 
666
673
  @arg exc: The exception instance (usually, C{Exception}).
667
674
  '''
668
- m = __name__ # 'pygeodesy.errors'
669
- X = type(exc)
670
- n = NN(_UNDER_, _tailof(X.__name__))
671
- E = _MODS.getattr(m, n, X) # == _X2Error.get(X, X)
672
- if E is X and not isError(exc):
673
- E = _NotImplementedError
674
- t = repr(exc)
675
- else:
676
- t = str(exc)
677
- return E, t
675
+ x = isError(exc)
676
+ if x:
677
+ E = type(exc)
678
+ elif x is None:
679
+ E = _AssertionError
680
+ else: # get _Error from Error
681
+ n = NN(_UNDER_, _tailof(type(exc).__name__))
682
+ E = _MODS.getattr(__name__, n, _NotImplementedError)
683
+ x = E is not _NotImplementedError
684
+ return E, (str(exc) if x else repr(exc))
678
685
 
679
686
 
680
- _XErrors = _TypeError, _ValueError
687
+ _XErrors = (_AssertionError, _AttributeError, # some isError's
688
+ _TypeError, _ValueError, _ZeroDivisionError)
681
689
  # map certain C{Exception} classes to the C{_Error}
682
- # _X2Error = {AssertionError: _AssertionError,
683
- # AttributeError: _AttributeError,
684
- # ImportError: _ImportError,
685
- # IndexError: _IndexError,
686
- # KeyError: _KeyError,
687
- # NameError: _NameError,
688
- # NotImplementedError: _NotImplementedError,
689
- # OverflowError: _OverflowError,
690
- # TypeError: _TypeError,
691
- # ValueError: _ValueError,
692
- # ZeroDivisionError: _ZeroDivisionError}
690
+ # _X2Error = {AssertionError: _AssertionError, ...
691
+ # ZeroDivisionError: _ZeroDivisionError}
693
692
 
694
693
  try:
695
694
  _ = {}.__or__ # {} | {} # Python 3.9+