Struct ScalarOperatorIr
pub struct ScalarOperatorIr { /* private fields */ }Description
Compact scalar SSA Operator IR lowered from one residual DAG.
Implementations§
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn additive_terms(
&self,
inputs: &[ValueLiteral],
selected: SymbolRef,
) -> Result<Vec<(ScalarOperatorIr, Vec<Ratio<BigInt>>)>, Diagnostic>
pub fn additive_terms( &self, inputs: &[ValueLiteral], selected: SymbolRef, ) -> Result<Vec<(ScalarOperatorIr, Vec<Ratio<BigInt>>)>, Diagnostic>
Express the selected-symbol dependence as an additive sum of opaque scalar terms, each with a coefficient for every original root. Other inputs are frozen at the typed point. Only addition, subtraction, negation, and factors independent of the selected symbol are expanded. Structurally equal terms have equal canonical IR, including across owners. Active guards remain inside terms; this performs no differentiation. Original demanded primal/domain validation occurs before cancellation.
§Errors
Rejects an invalid point, unsupported scalar projection, or exceeded exact-coefficient budget. Coefficients are exact binary rationals, including their sums and products. This does not evaluate derivatives.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn lower_affine_map_density<I>(
typed: &TypedResidual<I>,
resolve: &mut impl FnMut(SymbolRef) -> Option<ValueLiteral>,
) -> Result<ScalarOperatorIr, Diagnostic>where
I: Clone + Eq,
pub fn lower_affine_map_density<I>(
typed: &TypedResidual<I>,
resolve: &mut impl FnMut(SymbolRef) -> Option<ValueLiteral>,
) -> Result<ScalarOperatorIr, Diagnostic>where
I: Clone + Eq,
Project a density for regularity admission at fixed nonspatial inputs. Coordinate-map factors must have structurally affine mapped coordinates. Their spatially constant Jacobians use the shared LU/conditioning owner. This projection is not a parameter derivative: retained expressions remain authoritative for value evaluation and differentiation.
§Errors
Rejects non-affine maps, spatial coefficients, unavailable fixed inputs, invalid numerical factors and the ordinary scalar projection limits.
pub fn bind_affine_coordinate_map<I>(
typed: &TypedResidual<I>,
id: ExprId,
resolve: &mut impl FnMut(SymbolRef) -> Option<ValueLiteral>,
) -> Result<Vec<BoundAffineScalarIr<ScalarSymbolCoordinate>>, Diagnostic>where
I: Clone + Eq,
pub fn bind_affine_coordinate_map<I>(
typed: &TypedResidual<I>,
id: ExprId,
resolve: &mut impl FnMut(SymbolRef) -> Option<ValueLiteral>,
) -> Result<Vec<BoundAffineScalarIr<ScalarSymbolCoordinate>>, Diagnostic>where
I: Clone + Eq,
Prove and bind the rows of one exact retained coordinate map. Rows follow its target-binding order; columns retain the ordered source coordinate identities. Fixed nonspatial inputs include physical Time. The same scalar SSA affine proof supplies values and Jacobian entries; no point sampling or numerical differentiation is used. Invertibility, orientation and a consecutive motion path remain with their consumers.
§Errors
Rejects a foreign or non-map node, non-affine mapped rows, spatial coefficients, unavailable or mistyped fixed inputs, and resource excess.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn lower(expression: &ExprDag) -> Result<ScalarOperatorIr, Diagnostic>
pub fn lower(expression: &ExprDag) -> Result<ScalarOperatorIr, Diagnostic>
Lower a canonical expression DAG into dense symbol slots and scalar instructions without changing operation order. Sample/Hold reuse their operand value; activation and memory admission remain with the validated KernelProgram retained by the executor, not this scalar value projection.
§Errors
Returns EQ0701 if an operand/root index is inconsistent with the DAG
contract.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn require_regular_density(
&self,
varying: impl FnMut(SymbolRef) -> bool,
) -> Result<(), Diagnostic>
pub fn require_regular_density( &self, varying: impl FnMut(SymbolRef) -> bool, ) -> Result<(), Diagnostic>
Require polynomial, sine, cosine and exponential composition with no varying poles or radicals.
varying must identify every input that depends on a coordinate in the density’s
support. Other inputs are held fixed; their numerical values must still pass normal
evaluation (including nonzero divisors and finite intermediates). This structural
check establishes no quadrature error bound and does not admit improper integrals.
§Errors
Rejects varying denominators, negative powers, logarithms or square roots, and operations outside this bounded smooth profile. Callers must separately validate derived input densities.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn evaluate_typed_batch(
&self,
roots: &[ExprId],
inputs: &[Vec<ValueLiteral>],
) -> Result<Vec<Vec<ValueLiteral>>, Diagnostic>
pub fn evaluate_typed_batch( &self, roots: &[ExprId], inputs: &[Vec<ValueLiteral>], ) -> Result<Vec<Vec<ValueLiteral>>, Diagnostic>
Evaluate real scalar property rows in existing symbols() order.
Each row has fresh memoization; total scalar work and retained outputs
are each limited to one million before per-row projection/allocation.
§Errors
Rejects wrong row shapes/types, invalid active domains, and aggregate budgets. No partial batch result is returned on failure.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn coordinate_map_factor_jvp(
entries: &[f64],
direction: &[f64],
extent: usize,
factor: CoordinateMapFactor,
) -> Result<f64, Diagnostic>
pub fn coordinate_map_factor_jvp( entries: &[f64], direction: &[f64], extent: usize, factor: CoordinateMapFactor, ) -> Result<f64, Diagnostic>
Apply one row-major entry tangent to the existing differential-factor calculus. Entries and tangents use coherent units; the typed map owns their dimensions.
§Errors
Rejects wrong tangent cardinality, nonfinite arithmetic, or the factor’s ordinary singularity/conditioning failures.
pub fn coordinate_map_factor(
entries: &[f64],
extent: usize,
factor: CoordinateMapFactor,
) -> Result<f64, Diagnostic>
pub fn coordinate_map_factor( entries: &[f64], extent: usize, factor: CoordinateMapFactor, ) -> Result<f64, Diagnostic>
Evaluate a differential factor with the same factorization and conditioning profile as finite-map determinants and inverses. Entries use coherent units; the typed coordinate-map owner retains their individual dimensions.
§Errors
Rejects invalid shape, resource exhaustion, nonfinite arithmetic, and (for volume/orientation) a singular or numerically unresolved differential.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn lower_typed_scalar<I>(
typed: &TypedResidual<I>,
) -> Result<ScalarOperatorIr, Diagnostic>
pub fn lower_typed_scalar<I>( typed: &TypedResidual<I>, ) -> Result<ScalarOperatorIr, Diagnostic>
Project an admitted real scalar residual for numerical derivative products. Retained definition identity stays in the canonical typed residual; this derived graph uses the existing ordered scalar expansion and input slots. Conditional programs retain their input types so ordinary numerical evaluation and linearization use typed demand and active-branch rules.
§Errors
Rejects non-real or shaped values, invalid typed applications, and the existing scalar projection resource bounds.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn linearize_samples(
&self,
inputs: &[f64],
samples: &[ExprId],
) -> Result<ScalarLinearization<'_>, Diagnostic>
pub fn linearize_samples( &self, inputs: &[f64], samples: &[ExprId], ) -> Result<ScalarLinearization<'_>, Diagnostic>
Bind selected scalar constant leaves as numerical sample inputs.
A discretization first projects sampled Field values or gradients to
scalar constants. Their source expression IDs become dense tangent slots,
without fabricating Semantic Parameters or changing Model meaning.
Existing semantic symbols remain frozen. Unknown tangents follow samples
order and use the ordinary scalar JVP/VJP executor.
§Errors
Rejects nonconstant, duplicate or missing samples, invalid symbols, and expression operations outside the ordinary scalar derivative profile.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn evaluate_typed(
&self,
roots: &[ExprId],
resolve: &mut dyn FnMut(SymbolRef) -> Option<ValueLiteral>,
) -> Result<Vec<ValueLiteral>, Diagnostic>
pub fn evaluate_typed( &self, roots: &[ExprId], resolve: &mut dyn FnMut(SymbolRef) -> Option<ValueLiteral>, ) -> Result<Vec<ValueLiteral>, Diagnostic>
Evaluate requested original DAG roots without projecting exact discrete values through floating point. Unreachable symbol slots are never resolved.
§Errors
Rejects missing operands, incompatible values, and checked arithmetic failures.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn linearize_typed(
&self,
inputs: &[ValueLiteral],
roles: &[DifferentiationRole],
) -> Result<ScalarLinearization<'_>, Diagnostic>
pub fn linearize_typed( &self, inputs: &[ValueLiteral], roles: &[DifferentiationRole], ) -> Result<ScalarLinearization<'_>, Diagnostic>
Bind a typed point, rejecting demanded active-input boundaries. Inactive branches are type-checked but never evaluated or differentiated. Active inputs must be real scalars. Frozen inputs retain their exact typed values (including nominal discrete outcomes) and have no tangent space. Active input symbols and roles retain their original order.
§Errors
Rejects wrong input types, invalid active domains, comparison ties, square root derivatives at zero, and operations outside the scalar derivative profile.
§impl ScalarOperatorIr
impl ScalarOperatorIr
pub fn symbols(&self) -> &[SymbolRef]
pub fn symbols(&self) -> &[SymbolRef]
Dense symbol order expected by Self::evaluate.
pub fn instruction_count(&self) -> usize
pub fn instruction_count(&self) -> usize
Number of scalar SSA instructions.
pub fn residual_count(&self) -> usize
pub fn residual_count(&self) -> usize
Number of residual roots produced by this program.
pub fn constant_symbol_jacobian(
&self,
variables: &[SymbolRef],
) -> Result<ConstantSymbolJacobian, SymbolicLinearityFailure>
pub fn constant_symbol_jacobian( &self, variables: &[SymbolRef], ) -> Result<ConstantSymbolJacobian, SymbolicLinearityFailure>
Prove and extract a residual Jacobian that is constant with respect to every other expression symbol.
This is a structural proof over the SSA program, not a numerical probe.
Expressions with state-dependent coefficients or nonlinear dependence
on any selected variable fail closed. The returned rows follow residual
root order and columns follow variables order.
A selected-variable-independent predicate may choose between branches
with the same coefficients. Required domains remain execution obligations.
§Errors
Returns the first structural reason that a constant Jacobian cannot be proven, or reports a repeated selected variable.
pub fn bind_affine(
&self,
selected_symbols: &[SymbolRef],
bindings: &[(SymbolRef, f64)],
) -> Result<BoundAffineScalarIr, BoundAffineFailure>
pub fn bind_affine( &self, selected_symbols: &[SymbolRef], bindings: &[(SymbolRef, f64)], ) -> Result<BoundAffineScalarIr, BoundAffineFailure>
Bind every non-selected symbol and prove an exact affine residual form.
The returned form satisfies R(w) = A w + c: rows retain residual-root
order, columns retain selected_symbols order, and coefficient/offset
arithmetic follows the original SSA instruction order. This admission
is structural; it performs no numerical probing or finite differences.
Extra bindings are permitted, but every supplied binding is validated.
§Errors
Fails closed for repeated selected symbols, duplicate or non-finite bindings, binding a selected symbol, an unbound symbol read by the IR, nonlinear selected-symbol dependence, non-finite affine arithmetic, or an invalid SSA value reference.
pub fn evaluate(&self, inputs: &[f64]) -> Result<Vec<f64>, Diagnostic>
pub fn evaluate(&self, inputs: &[f64]) -> Result<Vec<f64>, Diagnostic>
Evaluate residual roots with values matching Self::symbols.
§Errors
Returns EQ0702 for the wrong input count and EQ0505 for a non-finite
intermediate result.
pub fn linearize(
&self,
inputs: &[f64],
roles: &[DifferentiationRole],
) -> Result<ScalarLinearization<'_>, Diagnostic>
pub fn linearize( &self, inputs: &[f64], roles: &[DifferentiationRole], ) -> Result<ScalarLinearization<'_>, Diagnostic>
Bind one finite point and explicit input roles into an immutable differentiable residual relation.
§Errors
Returns EQ0704 when point/role cardinality differs from the dense
symbol order or the point contains a non-finite value.
Trait Implementations§
§impl Clone for ScalarOperatorIr
impl Clone for ScalarOperatorIr
§impl Debug for ScalarOperatorIr
impl Debug for ScalarOperatorIr
§impl PartialEq for ScalarOperatorIr
impl PartialEq for ScalarOperatorIr
§fn eq(&self, other: &ScalarOperatorIr) -> bool
fn eq(&self, other: &ScalarOperatorIr) -> bool
self and other values to be equal, and is used by ==.impl StructuralPartialEq for ScalarOperatorIr
Auto Trait Implementations§
impl Freeze for ScalarOperatorIr
impl RefUnwindSafe for ScalarOperatorIr
impl Send for ScalarOperatorIr
impl Sync for ScalarOperatorIr
impl Unpin for ScalarOperatorIr
impl UnsafeUnpin for ScalarOperatorIr
impl UnwindSafe for ScalarOperatorIr
Blanket Implementations§
Source§impl<T> Any for Twhere
T: 'static + ?Sized,
impl<T> Any for Twhere
T: 'static + ?Sized,
§impl<Src, Scheme> ApproxFrom<Src, Scheme> for Srcwhere
Scheme: ApproxScheme,
impl<Src, Scheme> ApproxFrom<Src, Scheme> for Srcwhere
Scheme: ApproxScheme,
§fn approx_from(src: Src) -> Result<Src, <Src as ApproxFrom<Src, Scheme>>::Err>
fn approx_from(src: Src) -> Result<Src, <Src as ApproxFrom<Src, Scheme>>::Err>
§impl<Dst, Src, Scheme> ApproxInto<Dst, Scheme> for Srcwhere
Dst: ApproxFrom<Src, Scheme>,
Scheme: ApproxScheme,
impl<Dst, Src, Scheme> ApproxInto<Dst, Scheme> for Srcwhere
Dst: ApproxFrom<Src, Scheme>,
Scheme: ApproxScheme,
§type Err = <Dst as ApproxFrom<Src, Scheme>>::Err
type Err = <Dst as ApproxFrom<Src, Scheme>>::Err
§fn approx_into(self) -> Result<Dst, <Src as ApproxInto<Dst, Scheme>>::Err>
fn approx_into(self) -> Result<Dst, <Src as ApproxInto<Dst, Scheme>>::Err>
Source§impl<T> Borrow<T> for Twhere
T: ?Sized,
impl<T> Borrow<T> for Twhere
T: ?Sized,
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,
§impl<T, Dst> ConvAsUtil<Dst> for T
impl<T, Dst> ConvAsUtil<Dst> for T
§fn approx(self) -> Result<Dst, Self::Err>where
Self: Sized + ApproxInto<Dst>,
fn approx(self) -> Result<Dst, Self::Err>where
Self: Sized + ApproxInto<Dst>,
§impl<T> ConvUtil for T
impl<T> ConvUtil for T
§fn approx_as<Dst>(self) -> Result<Dst, Self::Err>where
Self: Sized + ApproxInto<Dst>,
fn approx_as<Dst>(self) -> Result<Dst, Self::Err>where
Self: Sized + ApproxInto<Dst>,
§fn approx_as_by<Dst, Scheme>(self) -> Result<Dst, Self::Err>where
Self: Sized + ApproxInto<Dst, Scheme>,
Scheme: ApproxScheme,
fn approx_as_by<Dst, Scheme>(self) -> Result<Dst, Self::Err>where
Self: Sized + ApproxInto<Dst, Scheme>,
Scheme: ApproxScheme,
§fn into_as<Dst>(self) -> Dstwhere
Self: Sized + Into<Dst>,
fn into_as<Dst>(self) -> Dstwhere
Self: Sized + Into<Dst>,
§fn try_as<Dst>(self) -> Result<Dst, Self::Err>where
Self: Sized + TryInto<Dst>,
fn try_as<Dst>(self) -> Result<Dst, Self::Err>where
Self: Sized + TryInto<Dst>,
§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> Twhere
Self: Distribution<T>,
Source§impl<T> From<T> for T
impl<T> From<T> for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T, U> Into<U> for Twhere
U: From<T>,
impl<T, U> Into<U> for Twhere
U: From<T>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>where
F: FnOnce(&Self) -> bool,
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>where
F: FnOnce(&Self) -> bool,
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Same for T
impl<T> Same for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§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).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.