| //@ 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)] | |
| #![feature(core_intrinsics)] | |
| #![feature(rustc_attrs)] | |
| use std::autodiff::autodiff_reverse; | |
| struct Foo { | |
| a: f64, | |
| } | |
| trait MyTrait { | |
| #[rustc_autodiff] | |
| fn f(&self, x: f64) -> f64; | |
| #[rustc_autodiff(Reverse, 1, Const, Active, Active)] | |
| fn df(&self, x: f64, seed: f64) -> (f64, f64) { | |
| std::hint::black_box(seed); | |
| std::hint::black_box(x); | |
| ::std::intrinsics::autodiff( | |
| Self::f as for<'a> fn(&'a Self, _: f64) -> f64, | |
| Self::df, | |
| (self, x, seed), | |
| ) | |
| } | |
| } | |
| impl MyTrait for Foo { | |
| fn f(&self, x: f64) -> f64 { | |
| x.sin() | |
| } | |
| } | |
| fn main() { | |
| let foo = Foo { a: 3.0f64 }; | |
| dbg!(foo.df(2.0, 1.0)); | |
| dbg!(2.0_f64.cos()); | |
| } |