CelestialCalendar 1.0.0 · unreleased development @ 67a7c4c79a4a4a6aa7e703c9e6f0039ae34bee82
Loading...
Searching...
No Matches
astro::detail::event_search Namespace Reference

Classes

struct  Value
 A scalar observation with an absolute error allowance at the requested abscissa. More...
struct  LongitudeValue
 A longitude observation with an absolute circular error allowance in degrees. More...
struct  Sample
 A scalar observation whose allowance applies at the requested TT time. More...
struct  Bounds
 Uniform absolute first- and second-derivative bounds on a closed cell. More...
struct  Budget
 Shared limits on scalar-evaluation attempts and candidate slots. More...
struct  Cell
 A sampled bracket with an explicit rule for including exact endpoint roots. More...
struct  Candidate
 A retained bracket, either certified to contain one root or left unresolved. More...
struct  Root
 A reported TT root time and its certified local crossing direction. More...
struct  LongitudeRoot
 A longitude-level event, including a contact at a canonical numerical station. More...
struct  TrajectoryBounds
 Uniform smooth-longitude and D_h derivative bounds, with their absolute rate discrepancy. More...
struct  Interval
 A nonempty half-open interval in JDE(TT). More...
struct  NumericalContact
 A canonical contact and the entire certified extremum region it replaces. More...
struct  Grid
 A query-independent cell partition; the provider must cover its closed domain. More...
struct  StationContact
 A station's reported TT instant and contact outcome; an uncertified one has no two-sided region. More...
struct  RegionDirection
 A contact region's certified direction, if any; crosses_level marks a level sign change across it. More...

Enumerations

enum class  ContactDirection : uint8_t { INCREASING , DECREASING , TANGENT }
 The level's direction across a canonical stationary contact, not the sign of its rate at that time. More...
enum class  Isolation : uint8_t { UNIQUE , UNRESOLVED }
 Whether a retained bracket has a unique-root certificate or remains unresolved. More...
enum class  EndpointOwnership : uint8_t { LEFT , BOTH }
 Exact endpoint roots belong to [left,right) for LEFT, or [left,right] for BOTH. More...
enum class  CellDecision : uint8_t { DISCARD , UNIQUE , SPLIT }
 A sufficient cell verdict: exclude, certify one root, or subdivide. More...

Functions

auto lower (const double value) -> double
 Enclose a nearest-rounded result on its lower side.
auto upper (const double value) -> double
 Enclose a nearest-rounded result on its upper side.
auto finite_nonnegative (const double value) -> bool
 Test whether a scalar is finite and nonnegative.
auto magnitude_floor (const Value evaluated) -> double
 Bound an observation's absolute magnitude from below; the bound may be negative.
auto exact_zero (const Value evaluated) -> bool
 Recognize a certified zero, not merely a zero-valued observation.
auto sign (const Value evaluated) -> int32_t
 Return a robust sign, or zero when the allowance includes zero.
auto shifted (const Value evaluated, const double offset, const double first_derivative) -> Value
 Adjust a provider's error allowance when it evaluates at a different abscissa.
template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto sample (const Provider &provider, const double jde_tt, Budget &budget) -> Sample
 Charge an evaluation even if the provider fails.
auto derivative_floor (const Sample left, const Sample right, const Bounds bounds) -> double
 Bound |f'| from below using the noisy secant and the curvature bound.
auto valid_time_span (const double start_jde_tt, const double end_jde_tt) -> bool
 Test finite, strictly ordered TT endpoints whose difference is finite.
auto validate_cell (const double start_jde_tt, const double end_jde_tt, const Bounds bounds) -> void
 Require a finite positive time span and finite nonnegative derivative bounds.
auto endpoint_exclusion (const Cell &cell, const Bounds bounds) -> bool
 Test sufficient endpoint conditions for a cell to contain no root.
auto classify_cell (const Cell &cell, const Bounds bounds) -> CellDecision
 Certify exclusion or uniqueness; otherwise request subdivision.
auto append_candidate (const Cell &cell, const Isolation isolation, Budget &budget, std::vector< Candidate > &candidates) -> void
 Consume one candidate slot before retaining a bracket.
template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto visit_cell (const Provider &provider, const Cell &cell, const Bounds bounds, Budget &budget, const uint32_t depth, std::vector< Candidate > &candidates) -> void
 Traverse a sampled cell, retaining unresolved brackets when subdivision stops.
template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto isolate_cell (const Provider &provider, const double start_jde_tt, const double end_jde_tt, const Bounds bounds, Budget &budget, const EndpointOwnership ownership=EndpointOwnership::LEFT, const uint32_t maximum_depth=32) -> std::vector< Candidate >
 Isolate a C2 scalar on a fixed canonical cell, not a query-clipped cell.
auto project_longitude_difference (const LongitudeValue first, const LongitudeValue second) -> Value
 Observe first minus second modulo 360 degrees, including subtraction roundoff.
auto longitude_residual (const LongitudeValue observed, const toolbox::AngleDeg target) -> Value
 Return a scalar level residual only when its observation cannot straddle the antipodal cut.
auto curvature_sign (const Sample left, const Sample middle, const Sample right, const double third_derivative) -> int32_t
 Certify one sign of f'' throughout three observations' span; zero means unresolved.
auto contact_direction (const LongitudeValue at_station, const toolbox::AngleDeg target, const Value before, const Value after, const int32_t curvature) -> ContactDirection
 Classify an exact numerical contact from certified observations on both sides.
template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, LongitudeValue>
auto isolate_longitude_cell (const Provider &provider, const toolbox::AngleDeg target, const Interval cell, const Bounds bounds, Budget &budget, const EndpointOwnership ownership=EndpointOwnership::LEFT) -> std::vector< Candidate >
 Isolate longitude-level roots after excluding distant cells or certifying a continuous scalar lift.
auto resolves_sample (const double minimum_slope, const Sample observed, const double time_resolution) -> bool
 Decide whether an observation ends refinement.
template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto refine_bracket (const Provider &provider, const Candidate &candidate, const double minimum_slope, Budget &budget, const double time_resolution, const uint32_t maximum_iterations) -> Root
 Bisect a unique-root bracket with robust signs and bounded work.
template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto refine (const Provider &provider, const Candidate &candidate, const Bounds bounds, Budget &budget, const double time_resolution=0.0, const uint32_t maximum_iterations=96) -> Root
 Refine a certified unique root to the requested time resolution or adjacent doubles.
auto grid_time (const Grid grid, const uint32_t index, const uint32_t cell_count) -> double
 Return a stored grid boundary, with the first and final boundaries kept exact.
auto grid_cell_count (const Grid grid) -> uint32_t
 Validate distinct representable cell boundaries and a bounded index range.
auto containing_cell (const Grid grid, const uint32_t cell_count, const double jde_tt) -> uint32_t
 Locate the canonical cell containing an admitted time, correcting quotient rounding.
template<typename Visitor>
requires std::invocable<const Visitor&, Interval>
auto visit_query_cells (const Grid grid, const Interval query, const Visitor &visitor) -> void
 Visit whole canonical cells touching a query, including its preceding cell for rounded roots.
auto reported_time (const double jde_tt, const double quantum_tt_days) -> double
 Round a reported TT time to a binary lattice; zero quantum preserves the refined double.
auto validate_reporting_grid (const Grid grid, const double quantum_tt_days) -> void
 Require a power-of-two reporting lattice that fixes every canonical cell boundary.
template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto append_interval_roots (const Provider &provider, const std::span< const Candidate > candidates, const Interval query, const Bounds bounds, Budget &budget, const double time_resolution, std::vector< Root > &roots, const double report_quantum_tt_days=0.0) -> void
 Append only query-owned roots; intersecting unresolved regions and aliased root times fail.
auto contact_window (const Grid grid, const uint32_t index, const uint32_t cell_count) -> Interval
 Return the fixed neighbor window of a canonical cell, clipped to the grid domain.
template<typename LongitudeProvider, typename RateProvider, typename WindowLongitudeProvider, typename WindowRateProvider>
requires std::invocable<const LongitudeProvider&, double> and std::same_as<std::invoke_result_t<const LongitudeProvider&, double>, LongitudeValue> and std::invocable<const RateProvider&, double> and std::same_as<std::invoke_result_t<const RateProvider&, double>, Value> and std::invocable<const WindowLongitudeProvider&, double> and std::same_as<std::invoke_result_t<const WindowLongitudeProvider&, double>, LongitudeValue> and std::invocable<const WindowRateProvider&, double> and std::same_as<std::invoke_result_t<const WindowRateProvider&, double>, Value>
auto certify_contact (const LongitudeProvider &longitude, const RateProvider &rate, const WindowLongitudeProvider &window_longitude, const WindowRateProvider &window_rate, const Candidate &candidate, const Interval cell, const Interval window, const toolbox::AngleDeg target, const TrajectoryBounds bounds, const TrajectoryBounds window_bounds, Budget &budget, const double time_resolution, const double report_quantum_tt_days) -> StationContact
 Certify one exact-level numerical contact, trying its cell before its fixed neighbor window.
template<typename LongitudeProvider, typename RateProvider, typename WindowLongitudeProvider, typename WindowRateProvider>
requires std::invocable<const LongitudeProvider&, double> and std::same_as<std::invoke_result_t<const LongitudeProvider&, double>, LongitudeValue> and std::invocable<const RateProvider&, double> and std::same_as<std::invoke_result_t<const RateProvider&, double>, Value> and std::invocable<const WindowLongitudeProvider&, double> and std::same_as<std::invoke_result_t<const WindowLongitudeProvider&, double>, LongitudeValue> and std::invocable<const WindowRateProvider&, double> and std::same_as<std::invoke_result_t<const WindowRateProvider&, double>, Value>
auto cell_contacts (const LongitudeProvider &longitude, const RateProvider &rate, const WindowLongitudeProvider &window_longitude, const WindowRateProvider &window_rate, const toolbox::AngleDeg target, const Interval cell, const Interval window, const TrajectoryBounds bounds, const TrajectoryBounds window_bounds, Budget &budget, const double time_resolution, const double report_quantum_tt_days, const Interval query) -> std::vector< NumericalContact >
 Verify isolated stations in a fixed grid cell using observations on both sides.
template<typename LongitudeProvider>
requires std::invocable<const LongitudeProvider&, double> and std::same_as<std::invoke_result_t<const LongitudeProvider&, double>, LongitudeValue>
auto cell_crossings (const LongitudeProvider &longitude, const toolbox::AngleDeg target, const Interval cell, const std::span< const Interval > exclusions, const Interval query, const Bounds bounds, Budget &budget, const double time_resolution, const double report_quantum_tt_days) -> std::vector< Root >
 Scan one visited cell for crossings outside its sorted, disjoint contact exclusions.
template<typename Contacts, typename Crossings>
requires std::invocable<const Contacts&, Interval, Interval> and std::same_as<std::invoke_result_t<const Contacts&, Interval, Interval>, std::vector<NumericalContact>> and std::invocable<const Crossings&, Interval, std::span<const Interval>> and std::same_as<std::invoke_result_t<const Crossings&, Interval, std::span<const Interval>>, std::vector<Root>>
auto contact_traversal (const Grid grid, const Interval query, const Contacts &contacts, const Crossings &crossings) -> std::vector< LongitudeRoot >
 Find crossings and exact contacts, reporting each contact from the cell containing its reported time.

Variables

constexpr uint32_t MAXIMUM_CONTACT_REGION_ATTEMPTS

Enumeration Type Documentation

◆ CellDecision

enum class astro::detail::event_search::CellDecision : uint8_t
strong

A sufficient cell verdict: exclude, certify one root, or subdivide.

Enumerator
DISCARD 
UNIQUE 
SPLIT 

◆ ContactDirection

enum class astro::detail::event_search::ContactDirection : uint8_t
strong

The level's direction across a canonical stationary contact, not the sign of its rate at that time.

Enumerator
INCREASING 
DECREASING 
TANGENT 

◆ EndpointOwnership

Exact endpoint roots belong to [left,right) for LEFT, or [left,right] for BOTH.

Enumerator
LEFT 
BOTH 

◆ Isolation

enum class astro::detail::event_search::Isolation : uint8_t
strong

Whether a retained bracket has a unique-root certificate or remains unresolved.

Enumerator
UNIQUE 
UNRESOLVED 

Function Documentation

◆ append_candidate()

auto astro::detail::event_search::append_candidate ( const Cell & cell,
const Isolation isolation,
Budget & budget,
std::vector< Candidate > & candidates )->void
inline

Consume one candidate slot before retaining a bracket.

◆ append_interval_roots()

template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto astro::detail::event_search::append_interval_roots ( const Provider & provider,
const std::span< const Candidate > candidates,
const Interval query,
const Bounds bounds,
Budget & budget,
const double time_resolution,
std::vector< Root > & roots,
const double report_quantum_tt_days = 0.0 )->void
inline

Append only query-owned roots; intersecting unresolved regions and aliased root times fail.

Note
roots retains earlier cells so the strict-order guard also covers cell seams.

◆ cell_contacts()

template<typename LongitudeProvider, typename RateProvider, typename WindowLongitudeProvider, typename WindowRateProvider>
requires std::invocable<const LongitudeProvider&, double> and std::same_as<std::invoke_result_t<const LongitudeProvider&, double>, LongitudeValue> and std::invocable<const RateProvider&, double> and std::same_as<std::invoke_result_t<const RateProvider&, double>, Value> and std::invocable<const WindowLongitudeProvider&, double> and std::same_as<std::invoke_result_t<const WindowLongitudeProvider&, double>, LongitudeValue> and std::invocable<const WindowRateProvider&, double> and std::same_as<std::invoke_result_t<const WindowRateProvider&, double>, Value>
auto astro::detail::event_search::cell_contacts ( const LongitudeProvider & longitude,
const RateProvider & rate,
const WindowLongitudeProvider & window_longitude,
const WindowRateProvider & window_rate,
const toolbox::AngleDeg target,
const Interval cell,
const Interval window,
const TrajectoryBounds bounds,
const TrajectoryBounds window_bounds,
Budget & budget,
const double time_resolution,
const double report_quantum_tt_days,
const Interval query )->std::vector< NumericalContact >
inlinenodiscard

Verify isolated stations in a fixed grid cell using observations on both sides.

Note
A reported instant inside the query requires two-sided evidence, including at cell boundaries.
Providers and bounds cover the cell; the window providers and bounds cover its contact_window.

◆ cell_crossings()

template<typename LongitudeProvider>
requires std::invocable<const LongitudeProvider&, double> and std::same_as<std::invoke_result_t<const LongitudeProvider&, double>, LongitudeValue>
auto astro::detail::event_search::cell_crossings ( const LongitudeProvider & longitude,
const toolbox::AngleDeg target,
const Interval cell,
const std::span< const Interval > exclusions,
const Interval query,
const Bounds bounds,
Budget & budget,
const double time_resolution,
const double report_quantum_tt_days )->std::vector< Root >
inlinenodiscard

Scan one visited cell for crossings outside its sorted, disjoint contact exclusions.

◆ certify_contact()

template<typename LongitudeProvider, typename RateProvider, typename WindowLongitudeProvider, typename WindowRateProvider>
requires std::invocable<const LongitudeProvider&, double> and std::same_as<std::invoke_result_t<const LongitudeProvider&, double>, LongitudeValue> and std::invocable<const RateProvider&, double> and std::same_as<std::invoke_result_t<const RateProvider&, double>, Value> and std::invocable<const WindowLongitudeProvider&, double> and std::same_as<std::invoke_result_t<const WindowLongitudeProvider&, double>, LongitudeValue> and std::invocable<const WindowRateProvider&, double> and std::same_as<std::invoke_result_t<const WindowRateProvider&, double>, Value>
auto astro::detail::event_search::certify_contact ( const LongitudeProvider & longitude,
const RateProvider & rate,
const WindowLongitudeProvider & window_longitude,
const WindowRateProvider & window_rate,
const Candidate & candidate,
const Interval cell,
const Interval window,
const toolbox::AngleDeg target,
const TrajectoryBounds bounds,
const TrajectoryBounds window_bounds,
Budget & budget,
const double time_resolution,
const double report_quantum_tt_days )->StationContact
inlinenodiscard

Certify one exact-level numerical contact, trying its cell before its fixed neighbor window.

Note
The stationary instant uses the cell's rate provider and bounds, as stations() does. Window samples use providers and bounds covering the whole window, which never extends past a grid-domain endpoint.

◆ classify_cell()

auto astro::detail::event_search::classify_cell ( const Cell & cell,
const Bounds bounds )->CellDecision
inlinenodiscard

Certify exclusion or uniqueness; otherwise request subdivision.

◆ contact_direction()

auto astro::detail::event_search::contact_direction ( const LongitudeValue at_station,
const toolbox::AngleDeg target,
const Value before,
const Value after,
const int32_t curvature )->ContactDirection
inlinenodiscard

Classify an exact numerical contact from certified observations on both sides.

Note
The caller supplies one query-independent stationary reference and excludes other turning points in its region. Equal-side contacts also require a matching curvature certificate; angular proximity is never equality.

◆ contact_traversal()

template<typename Contacts, typename Crossings>
requires std::invocable<const Contacts&, Interval, Interval> and std::same_as<std::invoke_result_t<const Contacts&, Interval, Interval>, std::vector<NumericalContact>> and std::invocable<const Crossings&, Interval, std::span<const Interval>> and std::same_as<std::invoke_result_t<const Crossings&, Interval, std::span<const Interval>>, std::vector<Root>>
auto astro::detail::event_search::contact_traversal ( const Grid grid,
const Interval query,
const Contacts & contacts,
const Crossings & crossings )->std::vector< LongitudeRoot >
inlinenodiscard

Find crossings and exact contacts, reporting each contact from the cell containing its reported time.

Note
Visited cells are those of visit_query_cells; one lookahead cell per side supplies contact regions that reach them. Every output is filtered by its reported time, and overlapping exclusions throw.

◆ contact_window()

auto astro::detail::event_search::contact_window ( const Grid grid,
const uint32_t index,
const uint32_t cell_count )->Interval
inlinenodiscard

Return the fixed neighbor window of a canonical cell, clipped to the grid domain.

Note
Depends only on the cell index, never on the query, budget or target.

◆ containing_cell()

auto astro::detail::event_search::containing_cell ( const Grid grid,
const uint32_t cell_count,
const double jde_tt )->uint32_t
inlinenodiscard

Locate the canonical cell containing an admitted time, correcting quotient rounding.

◆ curvature_sign()

auto astro::detail::event_search::curvature_sign ( const Sample left,
const Sample middle,
const Sample right,
const double third_derivative )->int32_t
inlinenodiscard

Certify one sign of f'' throughout three observations' span; zero means unresolved.

Note
The samples bound one C3 scalar, and third_derivative bounds |f'''| throughout their closed span.
See also
https://en.wikipedia.org/wiki/Mean_value_theorem_for_divided_differences (n=2).

◆ derivative_floor()

auto astro::detail::event_search::derivative_floor ( const Sample left,
const Sample right,
const Bounds bounds )->double
inlinenodiscard

Bound |f'| from below using the noisy secant and the curvature bound.

Note
IEEE binary64 nearest rounding, without reassociation; bounds cover the complete bracket.
See also
docs/EPHEMERIS_EVENTS.md, "Scalar cell certificates" (project derivation).

◆ endpoint_exclusion()

auto astro::detail::event_search::endpoint_exclusion ( const Cell & cell,
const Bounds bounds )->bool
inlinenodiscard

Test sufficient endpoint conditions for a cell to contain no root.

See also
docs/EPHEMERIS_EVENTS.md, "Scalar cell certificates" (project derivation).

◆ exact_zero()

auto astro::detail::event_search::exact_zero ( const Value evaluated) ->bool
inlinenodiscard

Recognize a certified zero, not merely a zero-valued observation.

◆ finite_nonnegative()

auto astro::detail::event_search::finite_nonnegative ( const double value) ->bool
inlinenodiscard

Test whether a scalar is finite and nonnegative.

◆ grid_cell_count()

auto astro::detail::event_search::grid_cell_count ( const Grid grid) ->uint32_t
inlinenodiscard

Validate distinct representable cell boundaries and a bounded index range.

◆ grid_time()

auto astro::detail::event_search::grid_time ( const Grid grid,
const uint32_t index,
const uint32_t cell_count )->double
inlinenodiscard

Return a stored grid boundary, with the first and final boundaries kept exact.

Note
The grid is validated and index is in [0, cell_count].

◆ isolate_cell()

template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto astro::detail::event_search::isolate_cell ( const Provider & provider,
const double start_jde_tt,
const double end_jde_tt,
const Bounds bounds,
Budget & budget,
const EndpointOwnership ownership = EndpointOwnership::LEFT,
const uint32_t maximum_depth = 32 )->std::vector< Candidate >
inlinenodiscard

Isolate a C2 scalar on a fixed canonical cell, not a query-clipped cell.

Note
Each value allowance bounds the error at the requested time, including any abscissa shift. Derivative bounds cover the entire closed cell. Unresolved regions are not event results.
Parameters
maximum_depthDyadic subdivision cap; 32 levels divide a quarter-day cell below 6e-11 day. Observation error can stop certification sooner; the cap retains unresolved candidates.

◆ isolate_longitude_cell()

template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, LongitudeValue>
auto astro::detail::event_search::isolate_longitude_cell ( const Provider & provider,
const toolbox::AngleDeg target,
const Interval cell,
const Bounds bounds,
Budget & budget,
const EndpointOwnership ownership = EndpointOwnership::LEFT )->std::vector< Candidate >
inlinenodiscard

Isolate longitude-level roots after excluding distant cells or certifying a continuous scalar lift.

Note
Bounds cover the smooth angular lift on the whole closed cell. Unresolved contacts remain candidates.

◆ longitude_residual()

auto astro::detail::event_search::longitude_residual ( const LongitudeValue observed,
const toolbox::AngleDeg target )->Value
inlinenodiscard

Return a scalar level residual only when its observation cannot straddle the antipodal cut.

◆ lower()

auto astro::detail::event_search::lower ( const double value) ->double
inlinenodiscard

Enclose a nearest-rounded result on its lower side.

◆ magnitude_floor()

auto astro::detail::event_search::magnitude_floor ( const Value evaluated) ->double
inlinenodiscard

Bound an observation's absolute magnitude from below; the bound may be negative.

◆ project_longitude_difference()

auto astro::detail::event_search::project_longitude_difference ( const LongitudeValue first,
const LongitudeValue second )->Value
inlinenodiscard

Observe first minus second modulo 360 degrees, including subtraction roundoff.

Note
The allowance is circular; scalar isolation requires a certified continuous lift over its cell.
See also
Knuth, The Art of Computer Programming, Vol. 2, Section 4.2.2 (error-free addition/subtraction).

◆ refine()

template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto astro::detail::event_search::refine ( const Provider & provider,
const Candidate & candidate,
const Bounds bounds,
Budget & budget,
const double time_resolution = 0.0,
const uint32_t maximum_iterations = 96 )->Root
inlinenodiscard

Refine a certified unique root to the requested time resolution or adjacent doubles.

Parameters
maximum_iterationsWork cap; 96 bisections exceed the binary64 significand width, but cannot overcome unresolved observation error. Exhaustion throws without a post-budget acceptance check.

◆ refine_bracket()

template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto astro::detail::event_search::refine_bracket ( const Provider & provider,
const Candidate & candidate,
const double minimum_slope,
Budget & budget,
const double time_resolution,
const uint32_t maximum_iterations )->Root
inlinenodiscard

Bisect a unique-root bracket with robust signs and bounded work.

Note
The caller has established uniqueness and handled exact endpoint roots.

◆ reported_time()

auto astro::detail::event_search::reported_time ( const double jde_tt,
const double quantum_tt_days )->double
inlinenodiscard

Round a reported TT time to a binary lattice; zero quantum preserves the refined double.

Note
Requires a validated reporting quantum and nearest-even rounding.

◆ resolves_sample()

auto astro::detail::event_search::resolves_sample ( const double minimum_slope,
const Sample observed,
const double time_resolution )->bool
inlinenodiscard

Decide whether an observation ends refinement.

Exceptions
std::runtime_errorIf its error allowance prevents the requested time resolution.

◆ sample()

template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto astro::detail::event_search::sample ( const Provider & provider,
const double jde_tt,
Budget & budget )->Sample
inlinenodiscard

Charge an evaluation even if the provider fails.

◆ shifted()

auto astro::detail::event_search::shifted ( const Value evaluated,
const double offset,
const double first_derivative )->Value
inlinenodiscard

Adjust a provider's error allowance when it evaluates at a different abscissa.

◆ sign()

auto astro::detail::event_search::sign ( const Value evaluated) ->int32_t
inlinenodiscard

Return a robust sign, or zero when the allowance includes zero.

◆ upper()

auto astro::detail::event_search::upper ( const double value) ->double
inlinenodiscard

Enclose a nearest-rounded result on its upper side.

◆ valid_time_span()

auto astro::detail::event_search::valid_time_span ( const double start_jde_tt,
const double end_jde_tt )->bool
inlinenodiscard

Test finite, strictly ordered TT endpoints whose difference is finite.

◆ validate_cell()

auto astro::detail::event_search::validate_cell ( const double start_jde_tt,
const double end_jde_tt,
const Bounds bounds )->void
inline

Require a finite positive time span and finite nonnegative derivative bounds.

◆ validate_reporting_grid()

auto astro::detail::event_search::validate_reporting_grid ( const Grid grid,
const double quantum_tt_days )->void
inline

Require a power-of-two reporting lattice that fixes every canonical cell boundary.

◆ visit_cell()

template<typename Provider>
requires std::invocable<const Provider&, double> and std::same_as<std::invoke_result_t<const Provider&, double>, Value>
auto astro::detail::event_search::visit_cell ( const Provider & provider,
const Cell & cell,
const Bounds bounds,
Budget & budget,
const uint32_t depth,
std::vector< Candidate > & candidates )->void
inline

Traverse a sampled cell, retaining unresolved brackets when subdivision stops.

◆ visit_query_cells()

template<typename Visitor>
requires std::invocable<const Visitor&, Interval>
auto astro::detail::event_search::visit_query_cells ( const Grid grid,
const Interval query,
const Visitor & visitor )->void
inline

Visit whole canonical cells touching a query, including its preceding cell for rounded roots.

Variable Documentation

◆ MAXIMUM_CONTACT_REGION_ATTEMPTS

uint32_t astro::detail::event_search::MAXIMUM_CONTACT_REGION_ATTEMPTS
inlineconstexpr