LLNL / SSAPy

A Python package allowing for fast and precise orbital modeling.
https://software.llnl.gov/SSAPy/
MIT License
36 stars 8 forks source link

SSapy test suite failures #18

Open rusu24edward opened 3 months ago

rusu24edward commented 3 months ago
tests/test_accel.py ...........F..                                                              [ 25%]
tests/test_frame.py .s.                                                                         [ 30%]
tests/test_linker.py ss                                                                         [ 34%]
tests/test_orbit.py .....s...F.....F.F..F                                                       [ 72%]
tests/test_orbit_solver.py ......                                                               [ 83%]
tests/test_particles.py s                                                                       [ 85%]
tests/test_sampler.py .....                                                                     [ 94%]
tests/test_utils.py ...                                                                         [100%]

============================================== FAILURES ===============================================
______________________________________________ test_RK78 ______________________________________________

    @timer
    def test_RK78():
        # Test that analytic Keplerian propagation matches RK78 propagator when
        # acceleration is purely Keplerian
        np.random.seed(5772156)
        t0 = Time("1982-03-14", scale='utc')
        # times = t0 + np.linspace(0, 24, 1000)*u.h
        times = t0 + np.arange(1000)*70*u.s

        for _ in range(10):
            while True:
                # Pick a distance near GEO
                r = np.random.uniform(4e7, 5e7)
                # Pick a random direction (not uniform on sphere)
                theta = np.random.uniform(0, 2*np.pi)
                phi = np.random.uniform(0, np.pi)
                x = r * np.cos(theta) * np.sin(phi)
                y = r * np.sin(theta) * np.sin(phi)
                z = r * np.cos(phi)
                r = np.array([x, y, z])
                # Pick a velocity near VGEO
                v = np.random.uniform(2.7e3, 3.3e3)
                # and a randomish direction
                theta = np.random.uniform(0, 2*np.pi)
                phi = np.random.uniform(0, np.pi)
                vx = v * np.cos(theta) * np.sin(phi)
                vy = v * np.sin(theta) * np.sin(phi)
                vz = v * np.cos(phi)
                v = np.array([vx, vy, vz])
                orbit = ssapy.Orbit(r, v, t0)
                if norm(orbit.periapsis) > 1e7:
                    break

            r1, v1 = ssapy.rv(orbit, times)
            r2, v2 = ssapy.rv(
                orbit, times,
                propagator=ssapy.RK78Propagator(
                    ssapy.AccelKepler(),
                    h=60.0,
                    tol=(1e-6,)*3+(1e-9,)*3
                )
            )
>           np.testing.assert_allclose(r1, r2, rtol=0, atol=1e-2)

tests/test_accel.py:966: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = (<function assert_allclose.<locals>.compare at 0x173daea60>, array([[ 1870289.48279425,  2811083.2705752 , 40623249.72...00.12911878, 46108402.25304425, -2325857.1730373 ],
       [ 5726276.56217508, 46101666.99857446, -2126942.010325  ]]))
kwds = {'equal_nan': True, 'err_msg': '', 'header': 'Not equal to tolerance rtol=0, atol=0.01', 'verbose': True}

    @wraps(func)
    def inner(*args, **kwds):
        with self._recreate_cm():
>           return func(*args, **kwds)
E           AssertionError: 
E           Not equal to tolerance rtol=0, atol=0.01
E           
E           Mismatched elements: 3 / 3000 (0.1%)
E           Max absolute difference: 0.01011332
E           Max relative difference: 4.71202718e-09
E            x: array([[ 1870289.482794,  2811083.270575, 40623249.721042],
E                  [ 1842038.995281,  2585895.461168, 40626138.312491],
E                  [ 1813735.340139,  2360633.014728, 40627854.289834],...
E            y: array([[ 1870289.482794,  2811083.270575, 40623249.721042],
E                  [ 1842038.995281,  2585895.461168, 40626138.312491],
E                  [ 1813735.340139,  2360633.014729, 40627854.289834],...

/opt/homebrew/Cellar/python@3.8/3.8.18/Frameworks/Python.framework/Versions/3.8/lib/python3.8/contextlib.py:75: AssertionError
__________________________________________ test_groundTrack ___________________________________________

a = [Orbit(r=array([ -5645090.63554971, -26450217.65414144, -39779723.24259774]), v=array([ 1310.5600129 , -1984.05092597,...17925.07085068, -10007020.38624488]), v=array([ 1758.44040144,  1256.81795235, -1880.37705403]), t=630763148.816), ...]

    @array_function_dispatch(_shape_dispatcher)
    def shape(a):
        """
        Return the shape of an array.

        Parameters
        ----------
        a : array_like
            Input array.

        Returns
        -------
        shape : tuple of ints
            The elements of the shape tuple give the lengths of the
            corresponding array dimensions.

        See Also
        --------
        len : ``len(a)`` is equivalent to ``np.shape(a)[0]`` for N-D arrays with
              ``N>=1``.
        ndarray.shape : Equivalent array method.

        Examples
        --------
        >>> np.shape(np.eye(3))
        (3, 3)
        >>> np.shape([[1, 3]])
        (1, 2)
        >>> np.shape([0])
        (1,)
        >>> np.shape(0)
        ()

        >>> a = np.array([(1, 2), (3, 4), (5, 6)],
        ...              dtype=[('x', 'i4'), ('y', 'i4')])
        >>> np.shape(a)
        (3,)
        >>> a.shape
        (3,)

        """
        try:
>           result = a.shape
E           AttributeError: 'list' object has no attribute 'shape'

../.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/numpy/core/fromnumeric.py:2033: AttributeError

During handling of the above exception, another exception occurred:

    @timer
    def test_groundTrack():
        np.random.seed(5772156)
        NORBIT = 30
        NTIME = 300

        orbits = []
        for _ in range(NORBIT):
            # Pick a distance near GEO
            r = np.random.uniform(4e7, 5e7)
            # Pick a random direction (not uniform on sphere)
            theta = np.random.uniform(0, 2*np.pi)
            phi = np.random.uniform(0, np.pi)
            x = r * np.cos(theta) * np.sin(phi)
            y = r * np.sin(theta) * np.sin(phi)
            z = r * np.cos(phi)
            r = np.array([x, y, z])
            # Pick a velocity near VGEO
            v = np.random.uniform(2.7e3, 3.3e3)
            # and a randomish direction
            theta = np.random.uniform(0, 2*np.pi)
            phi = np.random.uniform(0, np.pi)
            vx = v * np.cos(theta) * np.sin(phi)
            vy = v * np.sin(theta) * np.sin(phi)
            vz = v * np.cos(phi)
            v = np.array([vx, vy, vz])

            orbits.append(ssapy.Orbit(r, v, Time("J2000")))

        for prop in [
            ssapy.KeplerianPropagator(), ssapy.SeriesPropagator(0),
            ssapy.SeriesPropagator(1), ssapy.SeriesPropagator(2)
        ]:
            print("testing propagator: ", prop)
            times = Time("J2000") + np.linspace(-2, 2, NTIME)*u.year
>           lat, lon, h = ssapy.groundTrack(orbits, times, propagator=prop)

tests/test_orbit.py:772: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
ssapy/compute.py:309: in groundTrack
    nOrbit, squeezeOrbit, r = _countR(orbit)  # (n, m, 3)
ssapy/compute.py:115: in _countR
    if np.shape(r)[-1] == 3:
<__array_function__ internals>:200: in shape
    ???
../.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/numpy/core/fromnumeric.py:2035: in shape
    result = asarray(a).shape
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = Orbit(r=array([ -5645090.63554971, -26450217.65414144, -39779723.24259774]), v=array([ 1310.5600129 , -1984.05092597, -2241.90971411]), t=630763148.816)

    def __next__(self):
        if self._iter < len(self):
            # propagate kozai directly if possible
            if 'kozaiMeanKeplerianElements' in self.__dict__:
                kMKE = self.__dict__['kozaiMeanKeplerianElements']
            else:
                kMKE = None
            out = Orbit(
                self.r[self._iter],
                self.v[self._iter],
>               self.t[self._iter],
                propkw={k: v[self._iter] for k, v in self.propkw.items()}
            )
E           IndexError: invalid index to scalar variable.

ssapy/orbit.py:702: IndexError
---------------------------------------- Captured stdout call -----------------------------------------
testing propagator:  KeplerianPropagator()
_____________________________________________ test_kozai ______________________________________________

    @timer
    def test_kozai():
        np.random.seed(5772156649015 % 2**32)
        # Start with 100 ~GEO orbits
        # import tqdm
        # for _ in tqdm.tqdm(range(10_000)):
        for _ in range(100):
            # Random point near GEO sphere:
            a = np.random.uniform(-1e3, 1e3) + ssapy.constants.RGEO
            u = np.random.uniform(0, 2*np.pi)
            v = np.random.uniform(-1, 1)
            r = np.array([np.sqrt(1-v*v)*np.cos(u), np.sqrt(1-v*v)*np.sin(u), v])
            # Orthogonal velocity of correct magnitude.
            # Generate another point on the unit sphere then subtract component along r
            u = np.random.uniform(0, 2*np.pi)
            v = np.random.uniform(-1, 1)
            n = np.array([np.sqrt(1-v*v)*np.cos(u), np.sqrt(1-v*v)*np.sin(u), v])
            n -= np.dot(r, n) * r
            r *= a
            v = normed(n) * ssapy.constants.VGEO + np.random.uniform(-5, 5, size=3)

            orbit = ssapy.Orbit(r, v, 0.0, mu=ssapy.constants.WGS72_EARTH_MU)
            # Test round trip
            elements = orbit.kozaiMeanKeplerianElements
            newOrbit = ssapy.Orbit.fromKozaiMeanKeplerianElements(*elements, t=0.0)
            np.testing.assert_allclose(orbit.r, newOrbit.r, rtol=0, atol=1e-6)
            np.testing.assert_allclose(orbit.v, newOrbit.v, rtol=0, atol=1e-10)
            # How far off are we over 1/3 period ?
            r0, v0 = ssapy.rv(orbit, orbit.period/3)
            r1, v1 = ssapy.rv(newOrbit, orbit.period/3)
>           np.testing.assert_allclose(r0, r1, rtol=0, atol=1e-5)

tests/test_orbit.py:1523: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = (<function assert_allclose.<locals>.compare at 0x17273b310>, array([-19761191.61566088,  14046761.50802184, -34329345.07587284]), array([-19761184.2004245 ,  14046760.28182712, -34329361.1148786 ]))
kwds = {'equal_nan': True, 'err_msg': '', 'header': 'Not equal to tolerance rtol=0, atol=1e-05', 'verbose': True}

    @wraps(func)
    def inner(*args, **kwds):
        with self._recreate_cm():
>           return func(*args, **kwds)
E           AssertionError: 
E           Not equal to tolerance rtol=0, atol=1e-05
E           
E           Mismatched elements: 3 / 3 (100%)
E           Max absolute difference: 16.03900576
E           Max relative difference: 4.67209562e-07
E            x: array([-19761191.615661,  14046761.508022, -34329345.075873])
E            y: array([-19761184.200424,  14046760.281827, -34329361.114879])

/opt/homebrew/Cellar/python@3.8/3.8.18/Frameworks/Python.framework/Versions/3.8/lib/python3.8/contextlib.py:75: AssertionError
______________________________________________ test_sgp4 ______________________________________________

    @timer
    def test_sgp4():
        import os
        from sgp4.api import Satrec

        for i in range(1,3):
            tle_file = os.path.join(os.path.dirname(__file__), "data", f"aeroTLE_{i}.txt")
            with open(tle_file, 'r') as fd:
                line1, line2 = fd.readlines()
            orbit = ssapy.Orbit.fromTLETuple((line1, line2))
            r, v = ssapy.rv(orbit, orbit.t, propagator=ssapy.SGP4Propagator())
>           np.testing.assert_allclose(
                orbit.r, r,
                rtol=0, atol=1e-6
            )

tests/test_orbit.py:1656: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = (<function assert_allclose.<locals>.compare at 0x33635b940>, array([-41379294.80632839,   -285843.38933783,   8218521.28120114]), array([-41379292.79246487,   -285843.37492187,   8218520.88022589]))
kwds = {'equal_nan': True, 'err_msg': '', 'header': 'Not equal to tolerance rtol=0, atol=1e-06', 'verbose': True}

    @wraps(func)
    def inner(*args, **kwds):
        with self._recreate_cm():
>           return func(*args, **kwds)
E           AssertionError: 
E           Not equal to tolerance rtol=0, atol=1e-06
E           
E           Mismatched elements: 3 / 3 (100%)
E           Max absolute difference: 2.01386352
E           Max relative difference: 5.04330841e-08
E            x: array([-41379294.806328,   -285843.389338,   8218521.281201])
E            y: array([-41379292.792465,   -285843.374922,   8218520.880226])

/opt/homebrew/Cellar/python@3.8/3.8.18/Frameworks/Python.framework/Versions/3.8/lib/python3.8/contextlib.py:75: AssertionError
_____________________________________________ test_musun ______________________________________________

    def test_musun():
        # Travis & Nate discovered mu wasn't always being propagated.  Here's an previously
        # failing example.

        a = u.AU.to(u.m)
>       mu = ssapy.constants.GM_SUN
E       AttributeError: module 'ssapy.constants' has no attribute 'GM_SUN'

tests/test_orbit.py:1889: AttributeError
========================================== warnings summary ===========================================
../.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/PyPDF2/__init__.py:21
  /Users/rusu1/.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/PyPDF2/__init__.py:21: DeprecationWarning: PyPDF2 is deprecated. Please move to the pypdf library instead.
    warnings.warn(

../.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/traitlets/__init__.py:28
  /Users/rusu1/.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/traitlets/__init__.py:28: DeprecationWarning: 
              Sentinel is not a public part of the traitlets API.
              It was published by mistake, and may be removed in the future.

    warn(

../.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/traittypes/traittypes.py:188
  /Users/rusu1/.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/traittypes/traittypes.py:188: DeprecationWarning: metadata {'dtype': None} was set from the constructor. With traitlets 4.1, metadata should be set using the .tag() method, e.g., Int().tag(key1='value1', key2='value2')
    super(DataFrame, self).__init__(

ssapy/plotUtils.py:1276: 190 warnings
  /Users/rusu1/SSAPy/ssapy/plotUtils.py:1276: DeprecationWarning: Starting with ImageIO v3 the behavior of this function will switch to that of iio.v3.imread. To keep the current behavior (and make this warning disappear) use `import imageio.v2 as imageio` or call `imageio.v2.imread` directly.
    image = imageio.imread(filename)

../.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/erfa/core.py:154
  /Users/rusu1/.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/erfa/core.py:154: ErfaWarning: ERFA function "dtf2d" yielded 1423 of "dubious year (Note 6)"
    warnings.warn('ERFA function "{}" yielded {}'.format(func_name, wmsg),

../.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/erfa/core.py:154
  /Users/rusu1/.virtual_envs/v_ssapy_38/lib/python3.8/site-packages/erfa/core.py:154: ErfaWarning: ERFA function "dtf2d" yielded 1 of "dubious year (Note 6)"
    warnings.warn('ERFA function "{}" yielded {}'.format(func_name, wmsg),

tests/test_orbit.py: 102 warnings
  /Users/rusu1/SSAPy/ssapy/compute.py:73: DeprecationWarning: list of Orbit syntax is deprecated.  Please use a vector Orbit instead.
    warnings.warn(

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================================= short test summary info =======================================
FAILED tests/test_accel.py::test_RK78 - AssertionError: 
FAILED tests/test_orbit.py::test_groundTrack - IndexError: invalid index to scalar variable.
FAILED tests/test_orbit.py::test_kozai - AssertionError: 
FAILED tests/test_orbit.py::test_sgp4 - AssertionError: 
FAILED tests/test_orbit.py::test_musun - AttributeError: module 'ssapy.constants' has no attribute 'GM_SUN'