| //@ compile-flags: -Zautodiff=Enable -Zautodiff=NoPostopt -C opt-level=3 -Clto=fat | |
| //@ no-prefer-dynamic | |
| //@ needs-enzyme | |
| // Just check it does not crash for now | |
| // CHECK: ; | |
| #![feature(autodiff)] | |
| use std::autodiff::autodiff_reverse; | |
| #[derive(Clone)] | |
| struct OptProblem { | |
| a: f64, | |
| b: f64, | |
| } | |
| impl OptProblem { | |
| #[autodiff_reverse(d_objective, Duplicated, Duplicated, Duplicated)] | |
| fn objective(&self, x: &[f64], out: &mut f64) { | |
| *out = self.a + x[0].sqrt() * self.b | |
| } | |
| } | |
| fn main() { | |
| let p = OptProblem { a: 1., b: 2. }; | |
| let x = [2.0]; | |
| let mut p_shadow = OptProblem { a: 0., b: 0. }; | |
| let mut dx = [0.0]; | |
| let mut out = 0.0; | |
| let mut dout = 1.0; | |
| p.d_objective(&mut p_shadow, &x, &mut dx, &mut out, &mut dout); | |
| dbg!(dx); | |
| } |