#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RealSign {
Negative,
Zero,
Positive,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ZeroKnowledge {
Zero,
NonZero,
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RealSignCertificate {
StructuralFacts,
ExactZeroScale,
BoundedRefinement {
min_precision: i32,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CertifiedRealSign {
Known {
sign: RealSign,
certificate: RealSignCertificate,
},
Unknown {
min_precision: i32,
},
}
impl CertifiedRealSign {
pub const fn sign(self) -> Option<RealSign> {
match self {
Self::Known { sign, .. } => Some(sign),
Self::Unknown { .. } => None,
}
}
pub const fn is_known(self) -> bool {
matches!(self, Self::Known { .. })
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RealEqualityCertificate {
StructuralEquality,
ExactRationalComparison,
StructuralFacts,
DifferenceStructuralFacts,
BoundedRefinement {
min_precision: i32,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RealOrderingCertificate {
StructuralEquality,
ExactRationalComparison,
DifferenceStructuralFacts,
BoundedRefinement {
min_precision: i32,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CertifiedRealOrdering {
Known {
ordering: core::cmp::Ordering,
certificate: RealOrderingCertificate,
},
Unknown {
min_precision: i32,
},
}
impl CertifiedRealOrdering {
pub const fn ordering(self) -> Option<core::cmp::Ordering> {
match self {
Self::Known { ordering, .. } => Some(ordering),
Self::Unknown { .. } => None,
}
}
pub const fn is_known(self) -> bool {
matches!(self, Self::Known { .. })
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CertifiedRealEquality {
Equal {
certificate: RealEqualityCertificate,
},
NotEqual {
certificate: RealEqualityCertificate,
},
Unknown {
min_precision: i32,
},
}
impl CertifiedRealEquality {
pub const fn as_bool(self) -> Option<bool> {
match self {
Self::Equal { .. } => Some(true),
Self::NotEqual { .. } => Some(false),
Self::Unknown { .. } => None,
}
}
pub const fn is_known(self) -> bool {
!matches!(self, Self::Unknown { .. })
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct MagnitudeBits {
pub msd: i32,
pub exact_msd: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RealStructuralFacts {
pub sign: Option<RealSign>,
pub zero: ZeroKnowledge,
pub exact_rational: bool,
pub magnitude: Option<MagnitudeBits>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum StructuralComparison {
Less,
Equal,
Greater,
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum DomainStatus {
Valid,
Invalid,
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum StructuralKind {
ExactRational,
PiLike,
ExpLike,
SqrtLike,
LogLike,
TrigExact,
ProductConstant,
ComputableOpaque,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ExpressionDegree {
Constant,
Unknown,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct SymbolicDependencyMask(u16);
impl SymbolicDependencyMask {
pub const NONE: Self = Self(0);
pub const PI: Self = Self(1 << 0);
pub const EXP: Self = Self(1 << 1);
pub const SQRT: Self = Self(1 << 2);
pub const LOG: Self = Self(1 << 3);
pub const TRIG: Self = Self(1 << 4);
pub const OPAQUE: Self = Self(1 << 15);
pub const fn from_bits(bits: u16) -> Self {
Self(bits)
}
pub const fn bits(self) -> u16 {
self.0
}
pub const fn contains(self, dependency: Self) -> bool {
(self.0 & dependency.0) == dependency.0
}
pub const fn is_empty(self) -> bool {
self.0 == 0
}
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ZeroOneStatus {
Zero,
One,
NeitherOrUnknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ZeroOneMinusOneStatus {
Zero,
One,
MinusOne,
NeitherOrUnknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RationalStorageClass {
Zero,
WordSized,
MultiLimb,
VeryLarge,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PrimitiveFloatStatus {
Zero,
NormalFinite,
SubnormalOrUnderflows,
Overflows,
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PrimitiveFacts {
pub f32: PrimitiveFloatStatus,
pub f64: PrimitiveFloatStatus,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct IdentityFacts {
pub known_one: bool,
pub known_minus_one: bool,
pub zero_or_one: ZeroOneStatus,
pub zero_one_or_minus_one: ZeroOneMinusOneStatus,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RationalFacts {
pub exact_integer: bool,
pub exact_small_integer_i64: bool,
pub exact_dyadic: bool,
pub power_of_two: bool,
pub storage: RationalStorageClass,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct OrderingFacts {
pub cmp_one: StructuralComparison,
pub abs_cmp_one: StructuralComparison,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct DomainFacts {
pub reciprocal: DomainStatus,
pub sqrt: DomainStatus,
pub log: DomainStatus,
pub asin_acos: DomainStatus,
pub unit_interval_closed: DomainStatus,
pub unit_interval_open: DomainStatus,
pub acosh: DomainStatus,
pub atanh: DomainStatus,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct SymbolicFacts {
pub kind: StructuralKind,
pub degree: ExpressionDegree,
pub dependencies: SymbolicDependencyMask,
pub has_sqrt_factor: bool,
pub has_pi_factor: bool,
pub has_exp_factor: bool,
pub has_log_factor: bool,
pub has_trig_factor: bool,
pub computable_required: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RealDetailedFacts {
pub base: RealStructuralFacts,
pub identity: IdentityFacts,
pub rational: RationalFacts,
pub primitive: PrimitiveFacts,
pub ordering: OrderingFacts,
pub domains: DomainFacts,
pub symbolic: SymbolicFacts,
}