pub struct DynamicOrder2<'arena> {
pub v: f64,
pub g: &'arena [f64],
pub h: &'arena [f64],
/* private fields */
}Expand description
Runtime-sized packed second-order scalar: value, gradient, and a row-major
Hessian. Storage is O(K^2) in the row’s actual primary dimension and comes
from the row’s reusable DynamicJetArena.
Fields§
§v: f64Value channel.
g: &'arena [f64]Gradient channel.
h: &'arena [f64]Row-major Hessian channel.
Implementations§
Source§impl DynamicOrder2<'_>
impl DynamicOrder2<'_>
Sourcepub fn from_channel_functions<'arena>(
value: f64,
dimension: usize,
arena: &'arena DynamicJetArena,
gradient: impl FnMut(usize) -> f64,
hessian: impl FnMut(usize, usize) -> f64,
) -> DynamicOrder2<'arena>
pub fn from_channel_functions<'arena>( value: f64, dimension: usize, arena: &'arena DynamicJetArena, gradient: impl FnMut(usize) -> f64, hessian: impl FnMut(usize, usize) -> f64, ) -> DynamicOrder2<'arena>
Construct an arena-backed second-order scalar from channel functions.
This is the allocation-free extension seam for exact projected products
whose channel law is not ordinary scalar multiplication. Each channel is
written directly into the row arena, so downstream runtime-jet programs
can keep their specialized algebra without materializing temporary
Vecs or exposing the arena pointer stored by DynamicOrder2. The
Hessian function is evaluated on the upper triangle and mirrored because
a scalar Hessian is symmetric.
Source§impl<'arena> DynamicOrder2<'arena>
impl<'arena> DynamicOrder2<'arena>
Sourcepub fn scaled_product_sum(
scales: &[f64],
lefts: &[Self],
rights: &[Self],
) -> Self
pub fn scaled_product_sum( scales: &[f64], lefts: &[Self], rights: &[Self], ) -> Self
Σ_k scales[k] · lefts[k] · rights[k] in one pass over the result.
The one-seed batch’s epsilon lanes are sums of products of order-two
jets; forming each product and each partial sum as its own jet would
allocate and stream 2k − 1 intermediate blocks for a result that is
one block.
Sourcepub fn product_pair_sum_plus(
a: &Self,
b: &Self,
c: &Self,
d: &Self,
e: &Self,
) -> Self
pub fn product_pair_sum_plus( a: &Self, b: &Self, c: &Self, d: &Self, e: &Self, ) -> Self
a·b + c·d + e in one pass over the result.
Trait Implementations§
Source§impl<'arena> Clone for DynamicOrder2<'arena>
impl<'arena> Clone for DynamicOrder2<'arena>
Source§fn clone(&self) -> DynamicOrder2<'arena>
fn clone(&self) -> DynamicOrder2<'arena>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<'arena> Copy for DynamicOrder2<'arena>
Source§impl<'arena> Debug for DynamicOrder2<'arena>
impl<'arena> Debug for DynamicOrder2<'arena>
Source§impl<'arena> RuntimeJetScalar<'arena> for DynamicOrder2<'arena>
impl<'arena> RuntimeJetScalar<'arena> for DynamicOrder2<'arena>
Source§fn weighted_compose_sum(
lefts: &[Self],
right: &Self,
derivative_stacks: &[[f64; 5]],
addend: &Self,
) -> Self
fn weighted_compose_sum( lefts: &[Self], right: &Self, derivative_stacks: &[[f64; 5]], addend: &Self, ) -> Self
addend + Σ_i L_i · f_i(R) in ONE output block.
Every f_i(R) shares the composition point, so its channels are
(s0_i, s1_i·R.g, s1_i·R.h + s2_i·R.g⊗R.g) and the product with L_i
expands to
v = Σ L_i.v·s0_i
g_a = Σ (L_i.v·s1_i)·R.g_a + s0_i·L_i.g_a
h_ab = Σ (L_i.v·s1_i)·R.h_ab + (L_i.v·s2_i)·R.g_a·R.g_b
+ s1_i·(L_i.g_a·R.g_b + R.g_a·L_i.g_b) + s0_i·L_i.h_abso the R-dependent coefficients collapse into two scalars, Σ L_i.v·s1_i
and Σ L_i.v·s2_i, that multiply R.h and R.g⊗R.g ONCE. The default
walks the same algebra through 2N intermediate jets, each of which
allocates and streams its own n² block; this writes one.
Source§type Workspace = DynamicJetArena
type Workspace = DynamicJetArena
Source§fn constant(c: f64, dimension: usize, arena: &'arena DynamicJetArena) -> Self
fn constant(c: f64, dimension: usize, arena: &'arena DynamicJetArena) -> Self
dimension-primary algebra.Source§fn variable(
x: f64,
axis: usize,
dimension: usize,
arena: &'arena DynamicJetArena,
) -> Self
fn variable( x: f64, axis: usize, dimension: usize, arena: &'arena DynamicJetArena, ) -> Self
dimension-primary algebra.Source§fn constant_like(&self, c: f64) -> Self
fn constant_like(&self, c: f64) -> Self
self. Read moreSource§fn with_value(&self, value: f64) -> Self
fn with_value(&self, value: f64) -> Self
Source§fn symmetric_quadratic_form<C: SymmetricQuadraticCoefficients>(
inputs: &[Self],
coefficients: &C,
dimension: usize,
arena: &'arena DynamicJetArena,
) -> Self
fn symmetric_quadratic_form<C: SymmetricQuadraticCoefficients>( inputs: &[Self], coefficients: &C, dimension: usize, arena: &'arena DynamicJetArena, ) -> Self
inputs' A inputs from the same universal semantic primitive
as JetScalar::symmetric_quadratic_form.Source§fn affine_compose(
&self,
input_scale: f64,
input_shift: f64,
derivative_stack: [f64; 5],
) -> Self
fn affine_compose( &self, input_scale: f64, input_shift: f64, derivative_stack: [f64; 5], ) -> Self
Source§fn affine_composed_sum(
inputs: &[Self],
input_scales: &[f64],
derivative_stacks: &[[f64; 5]],
dimension: usize,
arena: &'arena DynamicJetArena,
) -> Self
fn affine_composed_sum( inputs: &[Self], input_scales: &[f64], derivative_stacks: &[[f64; 5]], dimension: usize, arena: &'arena DynamicJetArena, ) -> Self
Σ_i f_i(input_scale_i · (left_i · right + addend_scale_i · addend))
from certified derivative stacks. Const expression arity replaces an
implementation-specific term cap, while shared operands expose universal
common-subexpression elimination. If every addend scale is exact zero
(including -0.0), the addend has no dimension, workspace, or
derivative-channel obligations.Source§fn multiply_add(&self, right: &Self, addend: &Self) -> Self
fn multiply_add(&self, right: &Self, addend: &Self) -> Self
self * right + addend in one semantic primitive.Source§fn composed_sum(
inputs: &[Self],
derivative_stacks: &[[f64; 5]],
dimension: usize,
arena: &'arena DynamicJetArena,
) -> Self
fn composed_sum( inputs: &[Self], derivative_stacks: &[[f64; 5]], dimension: usize, arena: &'arena DynamicJetArena, ) -> Self
Source§fn linear_combination(
inputs: &[Self],
weights: &[f64],
dimension: usize,
arena: &'arena DynamicJetArena,
) -> Self
fn linear_combination( inputs: &[Self], weights: &[f64], dimension: usize, arena: &'arena DynamicJetArena, ) -> Self
sum_i weights[i] * inputs[i] in one semantic primitive.Source§fn compose_unary(&self, d: [f64; 5]) -> Self
fn compose_unary(&self, d: [f64; 5]) -> Self
Source§fn add_constant(&self, constant: f64) -> Self
fn add_constant(&self, constant: f64) -> Self
Source§fn ln(&self) -> Self
fn ln(&self) -> Self
ln(self). Caller guarantees positivity. This is the runtime-width
counterpart of JetScalar::ln and uses the identical certified
derivative stack.Auto Trait Implementations§
impl<'arena> !RefUnwindSafe for DynamicOrder2<'arena>
impl<'arena> !Send for DynamicOrder2<'arena>
impl<'arena> !Sync for DynamicOrder2<'arena>
impl<'arena> !UnwindSafe for DynamicOrder2<'arena>
impl<'arena> Freeze for DynamicOrder2<'arena>
impl<'arena> Unpin for DynamicOrder2<'arena>
impl<'arena> UnsafeUnpin for DynamicOrder2<'arena>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.