Skip to main content

Exact ellipsoid intersection tests and spatial trees (header-only C++ core with Python bindings)

Project description

etree

Exact intersection tests for ellipsoids and friends. Points, boxes, balls, ellipsoids, and simplices in R^d; single pairs, tree-accelerated queries, and tree-vs-tree sweeps. Header-only C++17 with Python bindings; Eigen is the only dependency.

CI Docs PyPI Python versions License: MIT

A family of anisotropic ellipsoids partitioned into batches of mutually non-overlapping members (example). The figures throughout are 2D because the built-in visualization is 2D; the library itself is dimension-generic.

The design in one idea

etree is organized around a small closed system:

Objects. Five geometric types — point, Box, Ball, Ellipsoid, Simplex. A Simplex may be lower-dimensional (a point, segment, or triangle embedded in R^d). Two more types participate as queries only: Segment and Halfspace.

Trees over each type. BoxTree, BallTree, EllipsoidTree, and SimplexTree index a family of objects for logarithmic-time queries (SimplexMesh adds mesh connectivity on top of a cell tree; a point cloud is a BallTree with zero radii).

Intersections at three levels, all built from one table of exact pairwise tests:

level call what you get
object × object intersects(A, B) one exact test
tree × object tree.collisions(B) every member of a family intersecting B
tree × tree collision_pairs(T1, T2) every intersecting pair between two families, in one simultaneous descent of both trees

The diagonal of the third level is self-collision (tree.self_collision_pairs()), which yields the overlap graph of a family: the input to batch picking. Tree × tree over two meshes' cell trees is mesh × mesh collision, the kernel of supermeshing.

The intersection table

The algorithm behind each cell of intersects (all exact; solver-backed cells to documented tolerance). See the visual gallery of every pair.

point Box Ball Ellipsoid Simplex
point coordinate bounds distance Mahalanobis test (LDLT) barycentric solve
Box interval overlap clamped closest point projected coordinate-descent QP phase-I LP
Ball center distance Gilitschenski–Hanebeck with Σ = r²I face-enumeration projection (Euclidean)
Ellipsoid generalized eigenproblem + 1D minimization (Gilitschenski–Hanebeck) face-enumeration projection in the Σ⁻¹ metric
Simplex phase-I LP (convex hull vs convex hull)

Query-only columns: a Segment is tested by the slab method (box), projection (ball), a 1D quadratic (ellipsoid), or coordinate intervals (simplex); a Halfspace is a closed-form support-function comparison against everything.

Conventions: ellipsoids are E(τ) = {x : (x−μ)ᵀ Σ⁻¹ (x−μ) ≤ τ²} with Σ symmetric positive definite and the scale τ passed at call time. All objects are solid and closed, so touching counts as intersecting. Tree queries prune conservatively (an ellipsoid query uses a bounding-box test and then the exact ellipsoid-box QP on survivors), so acceleration never changes answers.

Beyond intersections

  • Simplicial meshes (SimplexMesh): point location with barycentric coordinates, closest boundary point, CG1 finite element evaluation, mesh × ellipsoid and mesh × mesh queries.
  • Supporting cast: k-nearest-neighbor KDTree, axis-alternating geometric_sort, greedy non-overlapping ellipsoid batch picking.
  • Optional zero-dependency 2D visualization (etree/plot2d.hpp): SVG and PNG figures of objects, trees, queries, and CG1 fields. Every figure in the documentation is drawn with it.

Quick start

#include "etree/etree.hpp"
using namespace etree;

Ellipsoid A{mu_a, Sigma_a}, B{mu_b, Sigma_b};
bool overlap = intersects(A, B, /*tau=*/1.0);

EllipsoidTree tree(family_of_ellipsoids, /*tau=*/1.0);
std::vector<int> hits = tree.collisions(some_box);
auto batches = pick_ellipsoid_batches(tree);

Installing

C++ — three equivalent routes, all ending in target_link_libraries(your_target PRIVATE etree::etree):

  • vendor or FetchContent this repo and add_subdirectory(ellipsoid_tree);
  • or install it: cmake -S . -B build && cmake --install build --prefix <prefix>, then find_package(etree REQUIRED) from any project with <prefix> on CMAKE_PREFIX_PATH;
  • or just add include/ to your include path (header-only; Eigen required).

Eigen is found via find_package(Eigen3), with an automatic pinned download as fallback when building this repo standalone.

Pythonpip install . (or pip install git+https://github.com/NickAlger/ellipsoid_tree) builds the etree module via scikit-build-core; points are rows ((n, d) arrays, scipy-style), and figures render inline in Jupyter. Alternatively, build the module without pip via cmake -B build -DETREE_BUILD_PYTHON=ON && cmake --build build --target etree_python. For a worked walkthrough, see the Python quickstart notebook.

Compile-time and memory

etree is header-only but includes Eigen, so every translation unit that includes an etree header pays Eigen's compile cost — roughly 1.5 s and ~180 MB of RAM per file (a precompiled header cuts that to ~0.2 s and ~125 MB). This is normal for an Eigen-based library, but it adds up if you include etree in many files. On a memory-limited machine, don't over-parallelize the build: keep at least ~1 GB of RAM per compile job (for example cmake --build . -j N with N no larger than your RAM in GB), or set up a precompiled header on your side.

Examples ("show, don't tell")

Every page in docs/examples/ is a complete program, its actual output, and the figures it draws, which are regenerated from the code by docs/generate_examples.py and checked in CI:

From Python: non-overlapping ellipsoid batches, in a Jupyter notebook — the batch-picking example via the bindings, with figures rendered inline (GitHub renders the executed notebook).

Building and testing

Header-only: add include/ to your include path. To run the tests and examples:

cmake -S . -B build && cmake --build build -j $(nproc) && ctest --test-dir build
python3 docs/generate_examples.py   # regenerate the example documentation

References and acknowledgements

etree grew out of the point-spread-function probing developed in N. Alger, T. Hartland, N. Petra, and O. Ghattas, Point spread function approximation of high-rank Hessians with locally supported nonnegative integral kernels, SIAM Journal on Scientific Computing 46(3), 2024, A1658–A1689 — the origin of the non-overlapping ellipsoid batch-picking problem. The algorithms and tools it builds on:

  • I. Gilitschenski and U. D. Hanebeck, A Direct Method for Checking Overlap of Two Hyperellipsoids, Sensor Data Fusion: Trends, Solutions, Applications (SDF), 2014 — the ellipsoid–ellipsoid overlap test.
  • R. P. Brent, Algorithms for Minimization without Derivatives, Prentice-Hall, 1973 — the scalar minimizer used inside it.
  • Eigen for linear algebra; stb_image_write (public domain) for PNG encoding; doctest for testing; doxygen-awesome-css for the API-reference theme.

MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ellipsoid_tree-0.1.0.tar.gz (579.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ellipsoid_tree-0.1.0-cp313-cp313-win_amd64.whl (642.1 kB view details)

Uploaded CPython 3.13Windows x86-64

ellipsoid_tree-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (545.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ellipsoid_tree-0.1.0-cp313-cp313-macosx_10_13_universal2.whl (1.0 MB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

ellipsoid_tree-0.1.0-cp312-cp312-win_amd64.whl (642.1 kB view details)

Uploaded CPython 3.12Windows x86-64

ellipsoid_tree-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (545.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ellipsoid_tree-0.1.0-cp312-cp312-macosx_10_13_universal2.whl (1.0 MB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

ellipsoid_tree-0.1.0-cp311-cp311-win_amd64.whl (639.0 kB view details)

Uploaded CPython 3.11Windows x86-64

ellipsoid_tree-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (541.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ellipsoid_tree-0.1.0-cp311-cp311-macosx_10_9_universal2.whl (998.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

ellipsoid_tree-0.1.0-cp310-cp310-win_amd64.whl (637.9 kB view details)

Uploaded CPython 3.10Windows x86-64

ellipsoid_tree-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (540.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ellipsoid_tree-0.1.0-cp310-cp310-macosx_10_9_universal2.whl (995.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

ellipsoid_tree-0.1.0-cp39-cp39-win_amd64.whl (638.4 kB view details)

Uploaded CPython 3.9Windows x86-64

ellipsoid_tree-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (540.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

ellipsoid_tree-0.1.0-cp39-cp39-macosx_10_9_universal2.whl (995.6 kB view details)

Uploaded CPython 3.9macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file ellipsoid_tree-0.1.0.tar.gz.

File metadata

  • Download URL: ellipsoid_tree-0.1.0.tar.gz
  • Upload date:
  • Size: 579.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ellipsoid_tree-0.1.0.tar.gz
Algorithm Hash digest
SHA256 1e28d1279e2ed3d5a194d8a0457cabbf45fa75bf97487b271fbe8e0289fa3d09
MD5 2169c1d51f1a1763f39866afcb0fce0e
BLAKE2b-256 e89609e4829fee2a041b6a7e5f8ba9d50e2c4cd6ceb6bb5efc24ce41cf920847

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0.tar.gz:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c5de39ca65eab5bd0197118a6a18b6a036cb45ea87afe403d318262d5aa5a432
MD5 ab597ff3b6d8b8078971e3fd6db5a4f6
BLAKE2b-256 b6186172d8016816c823af7f3e6e93bede9f6066825bd9e4fe244dbc7035cdf4

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp313-cp313-win_amd64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 786fec97a8382a241c614058db8db0d10a333c3360d28c509e62b6b8aab7f5ce
MD5 8dc45a4c8ecc495a3eab267fb0f38941
BLAKE2b-256 87d2160f1da9b6f239f642fcce3b837019274adb0005c22aef3291793e7f32d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c7043e3976edc600789bfa07e2ef243912721f2237740409e71556673802772e
MD5 3c9ddfc5177c54f9a935e23ea767e59f
BLAKE2b-256 d14884416d983fd2449c315f1fdf41465cfdca587fe43d98029e7944fbbae504

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp313-cp313-macosx_10_13_universal2.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 724fcbddd524cbe65d87fa93a0062f83e0c6e9617973f345f6863f868724671a
MD5 af16654eb0f93d216b22db062f27ace2
BLAKE2b-256 f623c645d627d566d868647bbd137f6bfbae073ea16cb78e1a0ef152547c48c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp312-cp312-win_amd64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1bf57902da1e8b0095d2def497d56a6fede48903596efa04206cf35e81e2011f
MD5 b8df68d6457773b6ac877c2a0c6aff8e
BLAKE2b-256 d6d9b53e1123cd7f56513246a67248b117c5f3b7e593b1520b37351a0ce144ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 e9ff872ac962113d8c172a043375655edb7f31e42ea05bb147a56caa2d0a04d2
MD5 26e7fd47bce134a58be7a71a43aebe74
BLAKE2b-256 c0fd8d7c8e27f2f541ce38d8af727f15981c10f699659f614d5f5777ef2ac3da

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp312-cp312-macosx_10_13_universal2.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 80076cb4c44eb1f0811f6e7374fe5122cb7560ba2c5d3a59c015380082dd0bab
MD5 efd2268d74087830131b1ad33d6079b6
BLAKE2b-256 85a1b192adc63b515667ce7df976a9e0fa7813504d426a0d83f4adb6bd1b24b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp311-cp311-win_amd64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c49547c7ab9fd05cad8bd50d037fb858bba8a7c829c1c64a814216da52101388
MD5 29cc35a99c6bfb98681e039acd0660bd
BLAKE2b-256 65cc928bdedcda48561383f0d1bb09784936522ecde4d5904c1161c41f8357d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d56738e8a826aa49790b8c4cfad52cc82d991a18eba84d7a4f56e93af3ddfc95
MD5 647c79d82f41df1cb790470abaa8deac
BLAKE2b-256 12d80a195aad5a3bb26d96768514474834bdbda769dc58bd4bf9594dc8cc3c8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp311-cp311-macosx_10_9_universal2.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 529296eb912d12b53daa0da21bc94239e66b4830caad4f580b63683680948313
MD5 015db8904ef49a055d4dfa293252a654
BLAKE2b-256 ac585e71978a73473f395eb8cd506c7dba9f6d478df92b1b9fd086b5db5ad14b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp310-cp310-win_amd64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6f6fedd94cbd6422e6695736fa8fef5d316d82eb316d0887850f950b4c51881a
MD5 5cfb693d71dd73cfe10f851349c2ff27
BLAKE2b-256 856d9ca839c5a180ec33ea5bfbbc599d56a1ee3478003a6936388a70f8cca9ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 adad78acf495145d48a5299c203d36d75a40a1f0b0253fdb778adeea4d58b09a
MD5 495da2ade3ba466df58ab9ffd9b20d68
BLAKE2b-256 4821bb21fd4ede77fbfa2f3d0dbf4f70968d140f11f207d25ddcec18027e81c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp310-cp310-macosx_10_9_universal2.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6223034a5efd0c41df4671f271062357b83cd4c55b7956b66600adc7f4a74d3a
MD5 06961ab415a2dc4da193170e2b635b8c
BLAKE2b-256 22fecb446442d2d88f20cd1a8ab4641e7a85b8997c3538db0c32dfd309d2f87d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp39-cp39-win_amd64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8c882b210a064f8a75f81e3f4544ccfb3be043eddf66c5e00cb6dc20e984f293
MD5 7f217ffe59ffef8dd210c2d792f79eb4
BLAKE2b-256 c5d32844085616fd39b6316f733888a0b1b72dfe55b95cfedb49e7cf0a180159

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ellipsoid_tree-0.1.0-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for ellipsoid_tree-0.1.0-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 456a4e904ece0cef3bdf34145d30612069414ddca05b01e2705d73fef3753fb1
MD5 dd21dd10f08e46059b2a41a3a643a2b7
BLAKE2b-256 b89816f7ef61eaabe1504d06e834caefc390b2a5bd721538fed687edf6b63c39

See more details on using hashes here.

Provenance

The following attestation bundles were made for ellipsoid_tree-0.1.0-cp39-cp39-macosx_10_9_universal2.whl:

Publisher: wheels.yml on NickAlger/ellipsoid_tree

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page