Skip to main content

Dual2

Struct Dual2 

Source
pub struct Dual2<S: JetField> {
    pub v: S,
    pub g: S,
    pub h: S,
}
Expand description

A single-direction second-order jet over the field S: value v, first derivative g, second derivative h, all with respect to ONE seeded direction. Nest it (Dual2<Dual2<f64>>) for a second, independent direction.

Fields§

§v: S

Value channel.

§g: S

First derivative in this dual’s direction.

§h: S

Second derivative in this dual’s direction.

Implementations§

Source§

impl<S: JetFieldConst> Dual2<S>

Source

pub fn constant(v: S) -> Self

A constant (value v, zero derivatives) — carries no dependence on this dual’s direction (but v may still depend on an inner nested direction).

Source

pub fn variable(v: S) -> Self

The seeded variable at v: unit first derivative in this dual’s direction, zero second derivative.

Source§

impl Dual2<Dual2<f64>>

Source

pub fn seed_outer(x: f64) -> Self

Seed a primary that varies only along the OUTER direction a (∂/∂a = 1, ∂/∂b = 0) — the Tower4::variable(x, 0) analogue.

Source

pub fn seed_inner(x: f64) -> Self

Seed a primary that varies only along the INNER direction b (∂/∂a = 0, ∂/∂b = 1) — the Tower4::variable(x, 1) analogue.

Source

pub fn seed_directional(base: f64, d1: f64, d2: f64) -> Self

Seed a primary at value base that moves as base + s·d1 + t·d2 under the two independent scalar directions s (outer a) and t (inner b): ∂/∂a = d1, ∂/∂b = d2, all second-and-higher self-derivatives zero (the primary is affine in s, t). This is what a directional bidirectional contraction along arbitrary weight vectors d1, d2 needs — seed every primary i with seed_directional(base_i, d1_i, d2_i), run the program, and read channels()[8] (∂²_a ∂²_b) for Σ_{a,b,c,d} ℓ_{abcd}·d1_a d1_b d2_c d2_d.

Source

pub fn from_channels(c: [f64; 9]) -> Self

Build a nested dual directly from its nine (s-order, t-order) channels, ordered as Self::channels: [v, ∂a, ∂b, ∂aa, ∂ab, ∂bb, ∂aab, ∂abb, ∂aabb]. The inverse of Self::channels. Used to assemble the result of a channel-space operation (e.g. a moment-recurrence residual term) back into a Dual22.

Source

pub fn channels(&self) -> [f64; 9]

The nine channels this nested dual represents, keyed to the two-primary crate::jet_tower::Tower4 indices 0 (outer a) and 1 (inner b): (value, ∂a, ∂b, ∂aa, ∂ab, ∂bb, ∂aab, ∂abb, ∂aabb).

Trait Implementations§

Source§

impl<S: Clone + JetField> Clone for Dual2<S>

Source§

fn clone(&self) -> Dual2<S>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<S: Copy + JetField> Copy for Dual2<S>

Source§

impl<S: Debug + JetField> Debug for Dual2<S>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<S: JetField> JetField for Dual2<S>

Source§

fn value(&self) -> f64

The real value channel (recurses through any nesting to the f64 leaf).
Source§

fn add(&self, o: &Self) -> Self

Source§

fn sub(&self, o: &Self) -> Self

Source§

fn mul(&self, o: &Self) -> Self

Source§

fn neg(&self) -> Self

Source§

fn scale(&self, s: f64) -> Self

Multiply every channel by a plain f64.
Source§

fn compose_unary(&self, d: [f64; 5]) -> Self

Faà di Bruno composition f ∘ self given the OUTER real function’s derivative stack d = [f(u), f′(u), f″(u), f‴(u), f⁗(u)] evaluated at u = self.value() — the identical [f64; 5] stack shape crate::jet_tower::Tower4::compose_unary consumes.
Source§

fn constant_like(&self, v: f64) -> Self

A constant carrying THIS element’s shape: real value v, every derivative channel zero. Read more
Source§

fn with_value(&self, v: f64) -> Self

self with its real value channel replaced by v, every derivative channel untouched. Read more
Source§

impl<S: JetFieldConst> JetFieldConst for Dual2<S>

Source§

fn from_f64(x: f64) -> Self

A constant field element with value x and every derivative channel zero.
Source§

impl<S, const K: usize> JetScalar<K> for Dual2<S>
where S: JetScalar<K>,

Lift a fixed-width primary jet through an independent second-order direction. Primary variables live in the inner scalar; constructing one must not seed the outer direction, which is reserved for a family or hyperparameter derivative selected by the caller.

Source§

fn constant(c: f64) -> Self

A constant: value c, every derivative channel zero.
Source§

fn variable(x: f64, axis: usize) -> Self

The seeded variable p_axis at value x: unit first derivative in slot axis, all higher channels zero. (The nilpotent / cross channels of the directional scalars are seeded zero — callers set ε/δ directions through the scalar-specific OneSeed::seed_direction / TwoSeed::seed.)
Source§

fn symmetric_quadratic_form<C: SymmetricQuadraticCoefficients>( inputs: &[Self], coefficients: &C, ) -> Self

Evaluate inputs' A inputs from one universal semantic primitive. Order-specific scalars may lower the mechanically derived channels directly; the default is the exact scalar program over mul/add/scale.
Source§

fn linear_combination(inputs: &[Self], weights: &[f64]) -> Self

Evaluate sum_i weights[i] * inputs[i] in one semantic primitive.
Source§

fn add_constant(&self, constant: f64) -> Self

Add a primal constant without changing derivative channels.
Source§

fn multiply_add(&self, right: &Self, addend: &Self) -> Self

Evaluate self * right + addend in one semantic primitive.
Source§

fn composed_sum(inputs: &[Self], derivative_stacks: &[[f64; 5]]) -> Self

Sum unary compositions directly from certified derivative stacks.
Source§

fn product(&self, right: &Self) -> Self

Exact product as an explicit compiled graph node.
Source§

fn affine_compose( &self, input_scale: f64, input_shift: f64, derivative_stack: [f64; 5], ) -> Self

Compose a certified outer stack after the affine map u = input_scale * self + input_shift.
Source§

fn affine_composed_sum( inputs: &[Self], input_scales: &[f64], derivative_stacks: &[[f64; 5]], ) -> Self

Sum unary compositions whose inputs each carry an affine scale.
Source§

fn shared_multiply_add_affine_composed_sum<const N: usize>( lefts: &[&Self; N], right: &Self, addend: &Self, addend_scales: &[f64; N], input_scales: &[f64; N], derivative_stacks: &[[f64; 5]; N], ) -> Self

Evaluate Σ_i f_i(input_scale_i · (left_i · right + addend_scale_i · addend)) from the certified derivative stack of each f_i. The shared operands make expression-level common subexpressions explicit, so optimized backends apply their inherited derivative channels once. Expression arity is part of the type, and borrowed operands never copy a full tower. An exact-zero addend scale (either sign of IEEE zero) removes that addend from the corresponding term entirely.
Source§

fn compose_unary_with(&self, stack_fn: impl Fn(f64) -> [f64; 5]) -> Self

Compose with a unary special-function whose derivative stack is built from the scalar base value through stack_fn. This evaluates stack_fn(self.value()) once and forwards to compose_unary, so it is bit-identical to the explicit self.compose_unary(stack_fn(self.value())) form.
Source§

fn exp(&self) -> Self

e^self. Convenience for tame arguments (see module stability note).
Source§

fn sqrt(&self) -> Self

√self. Caller guarantees positivity.
Source§

fn ln(&self) -> Self

ln(self). Caller guarantees positivity. Same derivative stack crate::jet_tower::Tower4::ln uses, so any program written over both matches term-for-term.
Source§

fn recip(&self) -> Self

1/self.
Source§

fn powf(&self, a: f64) -> Self

self^a for real exponent a. Caller guarantees a positive base. Mirrors crate::jet_tower::Tower4::powf (falling-factorial stack).
Source§

fn ln_gamma(&self) -> Self

ln Γ(self). Caller guarantees a positive argument. Uses the SAME hand-certified derivative stack crate::jet_tower::Tower4::ln_gamma consumes (crate::jet_tower::ln_gamma_derivative_stack), so any program written over both matches term-for-term.
Source§

fn digamma(&self) -> Self

ψ(self) = d/dx ln Γ(x) (digamma). Caller guarantees a positive argument. Same hand-certified stack crate::jet_tower::digamma_derivative_stack.

Auto Trait Implementations§

§

impl<S> Freeze for Dual2<S>
where S: Freeze,

§

impl<S> RefUnwindSafe for Dual2<S>
where S: RefUnwindSafe,

§

impl<S> Send for Dual2<S>
where S: Send,

§

impl<S> Sync for Dual2<S>
where S: Sync,

§

impl<S> Unpin for Dual2<S>
where S: Unpin,

§

impl<S> UnsafeUnpin for Dual2<S>
where S: UnsafeUnpin,

§

impl<S> UnwindSafe for Dual2<S>
where S: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.