use super::rules::{
AntiderivativeRule, EvaluationMethod, RecurrenceRule, SpecialValue, ThreeTermRecurrence,
};
use crate::core::Expression;
#[derive(Debug, Clone, Copy)]
pub enum SymbolicExpander {
Custom(fn(usize) -> Expression),
}
#[derive(Clone)]
pub struct SpecialProperties {
pub has_derivative: bool,
pub has_antiderivative: bool,
pub antiderivative_rule: Option<AntiderivativeRule>,
pub recurrence_relations: Vec<RecurrenceRule>,
pub differential_equation: Option<DifferentialEquation>,
pub special_values: Vec<SpecialValue>,
pub asymptotic_behavior: Option<AsymptoticData>,
pub wolfram_name: Option<&'static str>,
}
impl std::fmt::Debug for SpecialProperties {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SpecialProperties")
.field("has_derivative", &self.has_derivative)
.field("has_antiderivative", &self.has_antiderivative)
.field("antiderivative_rule", &self.antiderivative_rule)
.field("recurrence_relations", &self.recurrence_relations)
.field("differential_equation", &self.differential_equation)
.field("special_values", &self.special_values)
.field("asymptotic_behavior", &self.asymptotic_behavior)
.field("wolfram_name", &self.wolfram_name)
.finish()
}
}
#[derive(Clone)]
pub struct PolynomialProperties {
pub family: PolynomialFamily,
pub recurrence: ThreeTermRecurrence,
pub orthogonality: Option<OrthogonalityData>,
pub rodrigues_formula: Option<RodriguesFormula>,
pub generating_function: Option<GeneratingFunction>,
pub special_values: Vec<SpecialValue>,
pub evaluation_method: EvaluationMethod,
pub symbolic_expander: Option<SymbolicExpander>,
pub antiderivative_rule: AntiderivativeRule,
pub wolfram_name: Option<&'static str>,
}
impl std::fmt::Debug for PolynomialProperties {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PolynomialProperties")
.field("family", &self.family)
.field("recurrence", &self.recurrence)
.field("orthogonality", &self.orthogonality)
.field("rodrigues_formula", &self.rodrigues_formula)
.field("generating_function", &self.generating_function)
.field("special_values", &self.special_values)
.field("evaluation_method", &self.evaluation_method)
.field("symbolic_expander", &self.symbolic_expander)
.field("antiderivative_rule", &self.antiderivative_rule)
.field("wolfram_name", &self.wolfram_name)
.finish()
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PolynomialFamily {
Legendre,
Hermite,
Laguerre,
Chebyshev,
Jacobi,
Gegenbauer,
}
#[derive(Debug, Clone)]
pub struct OrthogonalityData {
pub weight_function: Expression,
pub interval: (Expression, Expression),
pub norm_squared: Expression,
}
#[derive(Debug, Clone)]
pub struct RodriguesFormula {
pub formula: String,
pub normalization: Expression,
pub weight_function: Expression,
}
#[derive(Debug, Clone)]
pub struct GeneratingFunction {
pub function: Expression,
pub gf_type: GeneratingFunctionType,
}
#[derive(Debug, Clone, Copy)]
pub enum GeneratingFunctionType {
Ordinary,
Exponential,
}
#[derive(Debug, Clone)]
pub struct DifferentialEquation {
pub order: usize,
pub equation: String,
pub coefficients: Vec<Expression>,
}
#[derive(Debug, Clone)]
pub struct AsymptoticData {
pub as_x_to_infinity: String,
pub as_x_to_zero: String,
pub leading_coefficient: Expression,
}