#[cfg(feature = "quadrature-basic")]
mod adaptive;
#[cfg(any(
feature = "quadrature-basic",
feature = "quadrature-breakpoints",
feature = "quadrature-weighted",
feature = "quadrature-oscillatory",
feature = "quadrature-fourier",
feature = "quadrature-nonadaptive",
feature = "quadrature-piecewise-polynomial"
))]
mod callback;
mod error;
#[cfg(any(
feature = "quadrature-breakpoints",
feature = "quadrature-weighted",
feature = "quadrature-oscillatory",
feature = "quadrature-fourier",
feature = "quadrature-nonadaptive"
))]
mod extended;
#[cfg(feature = "quadrature-piecewise-polynomial")]
mod piecewise_polynomial;
#[cfg(feature = "tabulated-data")]
mod tabulated;
mod validation;
#[cfg(feature = "quadrature-basic")]
pub use adaptive::{
integrate, integrate_f32, integrate_infinite, integrate_infinite_f32,
integrate_principal_value, integrate_principal_value_f32, integrate_singular,
integrate_singular_f32,
};
pub use error::IntegrationError;
#[cfg(feature = "quadrature-fourier")]
pub use extended::{integrate_fourier_tail, integrate_fourier_tail_f32};
#[cfg(feature = "quadrature-nonadaptive")]
pub use extended::{
integrate_nc79, integrate_nc79_f32, integrate_non_adaptive, integrate_non_adaptive_f32,
};
#[cfg(feature = "quadrature-oscillatory")]
pub use extended::{integrate_oscillatory, integrate_oscillatory_f32};
#[cfg(feature = "quadrature-weighted")]
pub use extended::{integrate_weighted_endpoints, integrate_weighted_endpoints_f32};
#[cfg(feature = "quadrature-breakpoints")]
pub use extended::{integrate_with_breakpoints, integrate_with_breakpoints_f32};
#[cfg(feature = "quadrature-piecewise-polynomial")]
pub use piecewise_polynomial::{
PiecewiseQuadratureResult, PiecewiseQuadratureStatus, integrate_piecewise_polynomial,
};
#[cfg(feature = "tabulated-data")]
pub use tabulated::{integrate_tabulated, integrate_tabulated_f32};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum IntegrationRule {
Points15,
Points21,
Points31,
Points41,
Points51,
Points61,
}
#[cfg(feature = "quadrature-basic")]
impl IntegrationRule {
pub(crate) const fn key(self) -> i32 {
match self {
Self::Points15 => 1,
Self::Points21 => 2,
Self::Points31 => 3,
Self::Points41 => 4,
Self::Points51 => 5,
Self::Points61 => 6,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct IntegrationOptions {
pub absolute_tolerance: f64,
pub relative_tolerance: f64,
pub limit: usize,
pub rule: IntegrationRule,
}
impl IntegrationOptions {
pub const fn single_precision() -> Self {
Self {
absolute_tolerance: 0.0,
relative_tolerance: 1.0e-5,
limit: 100,
rule: IntegrationRule::Points21,
}
}
}
impl Default for IntegrationOptions {
fn default() -> Self {
Self {
absolute_tolerance: 0.0,
relative_tolerance: 1.0e-10,
limit: 100,
rule: IntegrationRule::Points21,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct IntegrationResult<T = f64> {
pub value: T,
pub estimated_error: T,
pub evaluations: usize,
pub intervals: usize,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum EndpointWeight {
Algebraic,
AlgebraicLogLower,
AlgebraicLogUpper,
AlgebraicLogBoth,
}
#[cfg(feature = "quadrature-weighted")]
impl EndpointWeight {
pub(crate) const fn native_selector(self) -> i32 {
match self {
Self::Algebraic => 1,
Self::AlgebraicLogLower => 2,
Self::AlgebraicLogUpper => 3,
Self::AlgebraicLogBoth => 4,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum OscillatoryWeight {
Cosine,
Sine,
}
#[cfg(any(feature = "quadrature-oscillatory", feature = "quadrature-fourier"))]
impl OscillatoryWeight {
pub(crate) const fn native_selector(self) -> i32 {
match self {
Self::Cosine => 1,
Self::Sine => 2,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct OscillatoryOptions {
pub absolute_tolerance: f64,
pub relative_tolerance: f64,
pub subdivision_limit: usize,
pub maximum_moments: usize,
}
impl OscillatoryOptions {
pub const fn single_precision() -> Self {
Self {
absolute_tolerance: 0.0,
relative_tolerance: 1.0e-5,
subdivision_limit: 100,
maximum_moments: 25,
}
}
}
impl Default for OscillatoryOptions {
fn default() -> Self {
Self {
absolute_tolerance: 0.0,
relative_tolerance: 1.0e-10,
subdivision_limit: 100,
maximum_moments: 25,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct FourierOptions {
pub absolute_tolerance: f64,
pub subdivision_limit: usize,
pub cycle_limit: usize,
pub maximum_moments: usize,
}
impl FourierOptions {
pub const fn single_precision() -> Self {
Self {
absolute_tolerance: 1.0e-5,
subdivision_limit: 100,
cycle_limit: 50,
maximum_moments: 25,
}
}
}
impl Default for FourierOptions {
fn default() -> Self {
Self {
absolute_tolerance: 1.0e-10,
subdivision_limit: 100,
cycle_limit: 50,
maximum_moments: 25,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct NonAdaptiveOptions {
pub absolute_tolerance: f64,
pub relative_tolerance: f64,
}
impl NonAdaptiveOptions {
pub const fn single_precision() -> Self {
Self {
absolute_tolerance: 0.0,
relative_tolerance: 1.0e-5,
}
}
}
impl Default for NonAdaptiveOptions {
fn default() -> Self {
Self {
absolute_tolerance: 0.0,
relative_tolerance: 1.0e-10,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Nc79Options {
pub relative_tolerance: f64,
}
impl Nc79Options {
pub const fn single_precision() -> Self {
Self {
relative_tolerance: 1.0e-5,
}
}
}
impl Default for Nc79Options {
fn default() -> Self {
Self {
relative_tolerance: 1.0e-10,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct FourierIntegrationResult<T = f64> {
pub value: T,
pub estimated_error: T,
pub evaluations: usize,
pub cycles: usize,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Nc79IntegrationResult<T = f64> {
pub value: T,
pub evaluations: usize,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum InfiniteInterval<T = f64> {
Above(T),
Below(T),
WholeLine,
}
#[cfg(feature = "quadrature-basic")]
impl InfiniteInterval<f64> {
pub(crate) fn native_parameters(self) -> Result<(f64, i32), IntegrationError> {
match self {
Self::Above(bound) if bound.is_finite() => Ok((bound, 1)),
Self::Below(bound) if bound.is_finite() => Ok((bound, -1)),
Self::WholeLine => Ok((0.0, 2)),
Self::Above(_) | Self::Below(_) => Err(IntegrationError::InvalidBounds),
}
}
}
#[cfg(feature = "quadrature-basic")]
impl InfiniteInterval<f32> {
pub(crate) fn native_parameters(self) -> Result<(f32, i32), IntegrationError> {
match self {
Self::Above(bound) if bound.is_finite() => Ok((bound, 1)),
Self::Below(bound) if bound.is_finite() => Ok((bound, -1)),
Self::WholeLine => Ok((0.0, 2)),
Self::Above(_) | Self::Below(_) => Err(IntegrationError::InvalidBounds),
}
}
}