Automatic Differentiation - Evaluators #
This file provides the evaluation functions for automatic differentiation, mapping expressions to dual intervals.
Main definitions #
DualEnv- Environment mapping variable indices to dual intervalsevalDual- Main evaluator for supported expressions (total)evalDual?- Partial evaluator supporting inv and log (returns Option)evalDual?1- Single-variable version of evalDual?mkDualEnv- Create a dual environment for differentiation w.r.t. a variableevalWithDeriv- Evaluate and differentiate w.r.t. a variable indexderivInterval- Get just the derivative intervalevalWithDeriv1- Single-variable evaluation and differentiation
Dual evaluation #
Environment for dual evaluation
Equations
Instances For
Evaluate expression in dual interval mode.
For supported expressions (const, var, add, mul, neg, sin, cos, exp), this computes correct dual interval bounds with a fully-verified proof.
For unsupported expressions (inv, log), returns a default interval. Do not rely on results for expressions containing inv or log. Use evalDual? for partial functions like inv and log.
Equations
- LeanCert.Engine.evalDual (LeanCert.Core.Expr.const q) ρ = LeanCert.Engine.DualInterval.const q
- LeanCert.Engine.evalDual (LeanCert.Core.Expr.var idx) ρ = ρ idx
- LeanCert.Engine.evalDual (e₁.add e₂) ρ = (LeanCert.Engine.evalDual e₁ ρ).add (LeanCert.Engine.evalDual e₂ ρ)
- LeanCert.Engine.evalDual (e₁.mul e₂) ρ = (LeanCert.Engine.evalDual e₁ ρ).mul (LeanCert.Engine.evalDual e₂ ρ)
- LeanCert.Engine.evalDual e_2.neg ρ = (LeanCert.Engine.evalDual e_2 ρ).neg
- LeanCert.Engine.evalDual e_2.inv ρ = default
- LeanCert.Engine.evalDual e_2.exp ρ = (LeanCert.Engine.evalDual e_2 ρ).exp
- LeanCert.Engine.evalDual e_2.sin ρ = (LeanCert.Engine.evalDual e_2 ρ).sin
- LeanCert.Engine.evalDual e_2.cos ρ = (LeanCert.Engine.evalDual e_2 ρ).cos
- LeanCert.Engine.evalDual e_2.log ρ = default
- LeanCert.Engine.evalDual e_2.atan ρ = (LeanCert.Engine.evalDual e_2 ρ).atan
- LeanCert.Engine.evalDual e_2.arsinh ρ = (LeanCert.Engine.evalDual e_2 ρ).arsinh
- LeanCert.Engine.evalDual e_2.atanh ρ = default
- LeanCert.Engine.evalDual e_2.sinc ρ = (LeanCert.Engine.evalDual e_2 ρ).sinc
- LeanCert.Engine.evalDual e_2.erf ρ = (LeanCert.Engine.evalDual e_2 ρ).erf
- LeanCert.Engine.evalDual e_2.sinh ρ = (LeanCert.Engine.evalDual e_2 ρ).sinh
- LeanCert.Engine.evalDual e_2.cosh ρ = (LeanCert.Engine.evalDual e_2 ρ).cosh
- LeanCert.Engine.evalDual e_2.tanh ρ = (LeanCert.Engine.evalDual e_2 ρ).tanh
- LeanCert.Engine.evalDual e_2.sqrt ρ = (LeanCert.Engine.evalDual e_2 ρ).sqrt
- LeanCert.Engine.evalDual LeanCert.Core.Expr.pi ρ = LeanCert.Engine.DualInterval.piConst
Instances For
Partial dual evaluation (supports inv) #
Partial dual evaluator that supports inv and log.
Returns none if any domain error would occur:
- inv of an interval containing zero
- log of an interval not strictly positive
When it returns
some, the result is guaranteed to be correct.
This is the Option-returning version that safely handles expressions with inv and log.
Equations
- LeanCert.Engine.evalDual? (LeanCert.Core.Expr.const q) ρ = some (LeanCert.Engine.DualInterval.const q)
- LeanCert.Engine.evalDual? (LeanCert.Core.Expr.var idx) ρ = some (ρ idx)
- LeanCert.Engine.evalDual? (e₁.add e₂) ρ = match LeanCert.Engine.evalDual? e₁ ρ, LeanCert.Engine.evalDual? e₂ ρ with | some d₁, some d₂ => some (d₁.add d₂) | x, x_1 => none
- LeanCert.Engine.evalDual? (e₁.mul e₂) ρ = match LeanCert.Engine.evalDual? e₁ ρ, LeanCert.Engine.evalDual? e₂ ρ with | some d₁, some d₂ => some (d₁.mul d₂) | x, x_1 => none
- LeanCert.Engine.evalDual? e_2.neg ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.neg | none => none
- LeanCert.Engine.evalDual? e_2.inv ρ = match LeanCert.Engine.evalDual? e_2 ρ with | none => none | some d => d.inv?
- LeanCert.Engine.evalDual? e_2.exp ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.exp | none => none
- LeanCert.Engine.evalDual? e_2.sin ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.sin | none => none
- LeanCert.Engine.evalDual? e_2.cos ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.cos | none => none
- LeanCert.Engine.evalDual? e_2.log ρ = match LeanCert.Engine.evalDual? e_2 ρ with | none => none | some d => d.log?
- LeanCert.Engine.evalDual? e_2.atan ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.atan | none => none
- LeanCert.Engine.evalDual? e_2.arsinh ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.arsinh | none => none
- LeanCert.Engine.evalDual? e_2.atanh ρ = none
- LeanCert.Engine.evalDual? e_2.sinc ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.sinc | none => none
- LeanCert.Engine.evalDual? e_2.erf ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.erf | none => none
- LeanCert.Engine.evalDual? e_2.sinh ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.sinh | none => none
- LeanCert.Engine.evalDual? e_2.cosh ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.cosh | none => none
- LeanCert.Engine.evalDual? e_2.tanh ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => some d.tanh | none => none
- LeanCert.Engine.evalDual? e_2.sqrt ρ = match LeanCert.Engine.evalDual? e_2 ρ with | some d => d.sqrt? | none => none
- LeanCert.Engine.evalDual? LeanCert.Core.Expr.pi ρ = some LeanCert.Engine.DualInterval.piConst
Instances For
Single-variable version of evalDual?
Equations
- LeanCert.Engine.evalDual?1 e I = LeanCert.Engine.evalDual? e fun (x : ℕ) => LeanCert.Engine.DualInterval.varActive I
Instances For
Single variable differentiation #
Create dual environment for differentiating with respect to variable idx
Equations
- LeanCert.Engine.mkDualEnv ρ idx i = if i = idx then LeanCert.Engine.DualInterval.varActive (ρ i) else LeanCert.Engine.DualInterval.varPassive (ρ i)
Instances For
Evaluate and differentiate with respect to variable idx
Equations
- LeanCert.Engine.evalWithDeriv e ρ idx = LeanCert.Engine.evalDual e (LeanCert.Engine.mkDualEnv ρ idx)
Instances For
Get just the derivative interval
Equations
- LeanCert.Engine.derivInterval e ρ idx = (LeanCert.Engine.evalWithDeriv e ρ idx).der
Instances For
Evaluate and differentiate a single-variable expression
Equations
- LeanCert.Engine.evalWithDeriv1 e I = LeanCert.Engine.evalDual e fun (x : ℕ) => LeanCert.Engine.DualInterval.varActive I