| //@ 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); |
| } |