pub enum HOp {
Show 45 variants
FwdLoadVar {
dst: u32,
x_idx: u32,
},
FwdLoadConst {
dst: u32,
c_idx: u32,
},
FwdAdd {
dst: u32,
a: u32,
b: u32,
},
FwdSub {
dst: u32,
a: u32,
b: u32,
},
FwdMul {
dst: u32,
a: u32,
b: u32,
},
FwdDiv {
dst: u32,
a: u32,
b: u32,
},
FwdPow {
dst: u32,
a: u32,
b: u32,
},
FwdNeg {
dst: u32,
a: u32,
},
FwdAbs {
dst: u32,
a: u32,
},
FwdSqrt {
dst: u32,
a: u32,
},
FwdExp {
dst: u32,
a: u32,
},
FwdLog {
dst: u32,
a: u32,
},
FwdLog10 {
dst: u32,
a: u32,
},
FwdSin {
dst: u32,
a: u32,
},
FwdCos {
dst: u32,
a: u32,
},
SetZero {
dst: u32,
},
SetOne {
dst: u32,
},
ZeroRange {
start: u32,
len: u32,
},
DotAdd {
dst: u32,
a: u32,
b: u32,
},
DotSub {
dst: u32,
a: u32,
b: u32,
},
DotMul {
dst: u32,
dot_a: u32,
vb: u32,
va: u32,
dot_b: u32,
},
DotDiv {
dst: u32,
dot_a: u32,
vb: u32,
va: u32,
dot_b: u32,
},
DotSqrt {
dst: u32,
dot_a: u32,
vd: u32,
},
DotExp {
dst: u32,
dot_a: u32,
vd: u32,
},
DotLog {
dst: u32,
dot_a: u32,
va: u32,
},
DotLog10 {
dst: u32,
dot_a: u32,
va: u32,
},
DotSin {
dst: u32,
dot_a: u32,
va: u32,
},
DotCos {
dst: u32,
dot_a: u32,
va: u32,
},
DotNeg {
dst: u32,
dot_a: u32,
},
DotAbs {
dst: u32,
dot_a: u32,
va: u32,
},
DotPow {
dst: u32,
va: u32,
vb: u32,
vd: u32,
dot_a: u32,
dot_b: u32,
},
RevAdd {
adj_a: u32,
adj_b: u32,
adj_dot_a: u32,
adj_dot_b: u32,
w: u32,
wd: u32,
},
RevSub {
adj_a: u32,
adj_b: u32,
adj_dot_a: u32,
adj_dot_b: u32,
w: u32,
wd: u32,
},
RevMul {
adj_a: u32,
adj_b: u32,
adj_dot_a: u32,
adj_dot_b: u32,
w: u32,
wd: u32,
va: u32,
vb: u32,
dot_a: u32,
dot_b: u32,
},
RevDiv {
adj_a: u32,
adj_b: u32,
adj_dot_a: u32,
adj_dot_b: u32,
w: u32,
wd: u32,
va: u32,
vb: u32,
dot_a: u32,
dot_b: u32,
},
RevPow {
adj_a: u32,
adj_b: u32,
adj_dot_a: u32,
adj_dot_b: u32,
w: u32,
wd: u32,
va: u32,
vb: u32,
vd: u32,
dot_a: u32,
dot_b: u32,
},
RevNeg {
adj_a: u32,
adj_dot_a: u32,
w: u32,
wd: u32,
},
RevAbs {
adj_a: u32,
adj_dot_a: u32,
w: u32,
wd: u32,
va: u32,
},
RevSqrt {
adj_a: u32,
adj_dot_a: u32,
w: u32,
wd: u32,
va: u32,
vd: u32,
dot_a: u32,
},
RevExp {
adj_a: u32,
adj_dot_a: u32,
w: u32,
wd: u32,
vd: u32,
dot_a: u32,
},
RevLog {
adj_a: u32,
adj_dot_a: u32,
w: u32,
wd: u32,
va: u32,
dot_a: u32,
},
RevLog10 {
adj_a: u32,
adj_dot_a: u32,
w: u32,
wd: u32,
va: u32,
dot_a: u32,
},
RevSin {
adj_a: u32,
adj_dot_a: u32,
w: u32,
wd: u32,
va: u32,
dot_a: u32,
},
RevCos {
adj_a: u32,
adj_dot_a: u32,
w: u32,
wd: u32,
va: u32,
dot_a: u32,
},
HessEmit {
hess_ptr: u32,
adj_dot_slot: u32,
},
}Expand description
One primitive operation in the compiled Hessian program.
dst/a/b/etc. are u32 offsets into the caller’s scratch
slice; see the module docs for the slot layout.
Variants§
FwdLoadVar
FwdLoadConst
FwdAdd
FwdSub
FwdMul
FwdDiv
FwdPow
FwdNeg
FwdAbs
FwdSqrt
FwdExp
FwdLog
FwdLog10
FwdSin
FwdCos
SetZero
SetOne
ZeroRange
DotAdd
DotSub
DotMul
dot[d] = dot[a]*v[b] + v[a]*dot[b]
DotDiv
dot[d] = (dot[a]*v[b] - v[a]*dot[b]) / (v[b]*v[b])
DotSqrt
dot[d] = 0.5 / v[d] * dot[a] (v[d] = sqrt(v[a]))
DotExp
dot[d] = v[d] * dot[a] (v[d] = exp(v[a]))
DotLog
DotLog10
DotSin
DotCos
DotNeg
DotAbs
DotPow
Compound: dot[d] for Pow(a, b). Carries the runtime
u != 0 / u > 0 branches.
RevAdd
RevSub
RevMul
Fields
RevDiv
Fields
RevPow
Fields
RevNeg
RevAbs
RevSqrt
RevExp
RevLog
RevLog10
RevSin
RevCos
HessEmit
values[hess_ptr] += weight * scratch[adj_dot_slot].
Trait Implementations§
Auto Trait Implementations§
impl Freeze for HOp
impl RefUnwindSafe for HOp
impl Send for HOp
impl Sync for HOp
impl Unpin for HOp
impl UnsafeUnpin for HOp
impl UnwindSafe for HOp
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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>
Converts
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>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
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