bilby_rust 0.1.0

Rust implementation of domain-specific geometrical operations for Bilby to mirror the functionality in bilby-cython using PyO3.
Documentation
import numpy as np
import bilby_rust.geometry as rg
import bilby_cython.geometry as cg
import utils
import pytest


def test_calculate_arm():
    np.testing.assert_allclose(
        cg.calculate_arm(1.0, 1.0, 1.0, 1.0),
        rg.calculate_arm(1.0, 1.0, 1.0, 1.0),
    )


def test_detector_tensor():
    np.testing.assert_allclose(
        cg.detector_tensor(np.array([1.0, 2.0, 3.0]), np.array([4.0, 5.0, 6.0])),
        rg.detector_tensor(np.array([1.0, 2.0, 3.0]), np.array([4.0, 5.0, 6.0])),
    )


def test_get_polarization_tensor():
    np.testing.assert_allclose(
        cg.get_polarization_tensor(1.0, 1.0, 1.0, 1.0, "cross"),
        rg.get_polarization_tensor(1.0, 1.0, 1.0, 1.0, "cross"),
    )


def test_rotation_matrix_from_delta():
    """
    One of the elements is zero and so we need to set the absolute tolerance
    as differences are in units of machine precision.
    """
    np.testing.assert_allclose(
        cg.rotation_matrix_from_delta(np.array([1.0, 2.0, 3.0])),
        rg.rotation_matrix_from_delta_x(np.array([1.0, 2.0, 3.0])),
        atol=1e-14,
    )


def time_delay_from_geocenter():
    np.testing.assert_almost_equal(
        cg.time_delay_from_geocenter(np.array([1.0, 2.0, 3.0]) * 1e9, 1.0, 1.0, 1.0),
        rg.time_delay_from_geocenter(np.array([1.0, 2.0, 3.0]) * 1e9, 1.0, 1.0, 1.0),
    )


def test_zenith_azimuth_to_theta_phi():
    np.testing.assert_almost_equal(
        rg.zenith_azimuth_to_theta_phi(1.0, 1.0, np.array([1.0, 2.0, 3.0])),
        cg.zenith_azimuth_to_theta_phi(1.0, 1.0, np.array([1.0, 2.0, 3.0])),
    )


@pytest.mark.parametrize("mode", ["plus", "cross", "longitudinal", "breathing", "x", "y"])
def test_antenna_response(mode):
    np.testing.assert_almost_equal(
        rg.antenna_response(
            x=np.array([-0.22389266,  0.79983063,  0.55690488]),
            y=np.array([-0.91397819,  0.02609404, -0.40492342]),
            frequency=np.linspace(10, 4096, 1000),
            ra=1.0,
            dec=1.0,
            gps_time=np.zeros(1000),
            free_spectral_range=2000,
            psi=1.0,
            mode=mode,
        ),
        utils.antenna_response(
            x=np.array([-0.22389266,  0.79983063,  0.55690488]),
            y=np.array([-0.91397819,  0.02609404, -0.40492342]),
            frequency=np.linspace(10, 4096, 1000),
            free_spectral_range=2000.0,
            ra=1.0,
            dec=1.0,
            gps_time=0.0,
            psi=1.0,
            mode=mode,
        )
    )