add new tests for autodiff batching and update old ones
This commit is contained in:
parent
b7c63a973f
commit
79e17bc71e
7 changed files with 251 additions and 54 deletions
|
@ -11,7 +11,7 @@ fn square(x: &f64) -> f64 {
|
|||
x * x
|
||||
}
|
||||
|
||||
// CHECK:define internal fastcc double @diffesquare(double %x.0.val, ptr nocapture align 8 %"x'"
|
||||
// CHECK:define internal fastcc double @diffesquare(double %x.0.val, ptr nocapture nonnull align 8 %"x'"
|
||||
// CHECK-NEXT:invertstart:
|
||||
// CHECK-NEXT: %_0 = fmul double %x.0.val, %x.0.val
|
||||
// CHECK-NEXT: %0 = fadd fast double %x.0.val, %x.0.val
|
||||
|
@ -22,7 +22,7 @@ fn square(x: &f64) -> f64 {
|
|||
// CHECK-NEXT:}
|
||||
|
||||
fn main() {
|
||||
let x = 3.0;
|
||||
let x = std::hint::black_box(3.0);
|
||||
let output = square(&x);
|
||||
assert_eq!(9.0, output);
|
||||
|
||||
|
|
116
tests/codegen/autodiffv.rs
Normal file
116
tests/codegen/autodiffv.rs
Normal file
|
@ -0,0 +1,116 @@
|
|||
//@ compile-flags: -Zautodiff=Enable -C opt-level=3 -Clto=fat
|
||||
//@ no-prefer-dynamic
|
||||
//@ needs-enzyme
|
||||
//
|
||||
// In Enzyme, we test against a large range of LLVM versions (5+) and don't have overly many
|
||||
// breakages. One benefit is that we match the IR generated by Enzyme only after running it
|
||||
// through LLVM's O3 pipeline, which will remove most of the noise.
|
||||
// However, our integration test could also be affected by changes in how rustc lowers MIR into
|
||||
// LLVM-IR, which could cause additional noise and thus breakages. If that's the case, we should
|
||||
// reduce this test to only match the first lines and the ret instructions.
|
||||
|
||||
#![feature(autodiff)]
|
||||
|
||||
use std::autodiff::autodiff;
|
||||
|
||||
#[autodiff(d_square3, Forward, Dual, DualOnly)]
|
||||
#[autodiff(d_square2, Forward, 4, Dual, DualOnly)]
|
||||
#[autodiff(d_square1, Forward, 4, Dual, Dual)]
|
||||
#[no_mangle]
|
||||
fn square(x: &f32) -> f32 {
|
||||
x * x
|
||||
}
|
||||
|
||||
// d_sqaure2
|
||||
// CHECK: define internal fastcc [4 x float] @fwddiffe4square(float %x.0.val, [4 x ptr] %"x'")
|
||||
// CHECK-NEXT: start:
|
||||
// CHECK-NEXT: %0 = extractvalue [4 x ptr] %"x'", 0
|
||||
// CHECK-NEXT: %"_2'ipl" = load float, ptr %0, align 4
|
||||
// CHECK-NEXT: %1 = extractvalue [4 x ptr] %"x'", 1
|
||||
// CHECK-NEXT: %"_2'ipl1" = load float, ptr %1, align 4
|
||||
// CHECK-NEXT: %2 = extractvalue [4 x ptr] %"x'", 2
|
||||
// CHECK-NEXT: %"_2'ipl2" = load float, ptr %2, align 4
|
||||
// CHECK-NEXT: %3 = extractvalue [4 x ptr] %"x'", 3
|
||||
// CHECK-NEXT: %"_2'ipl3" = load float, ptr %3, align 4
|
||||
// CHECK-NEXT: %4 = insertelement <4 x float> poison, float %"_2'ipl", i64 0
|
||||
// CHECK-NEXT: %5 = insertelement <4 x float> %4, float %"_2'ipl1", i64 1
|
||||
// CHECK-NEXT: %6 = insertelement <4 x float> %5, float %"_2'ipl2", i64 2
|
||||
// CHECK-NEXT: %7 = insertelement <4 x float> %6, float %"_2'ipl3", i64 3
|
||||
// CHECK-NEXT: %8 = fadd fast <4 x float> %7, %7
|
||||
// CHECK-NEXT: %9 = insertelement <4 x float> poison, float %x.0.val, i64 0
|
||||
// CHECK-NEXT: %10 = shufflevector <4 x float> %9, <4 x float> poison, <4 x i32> zeroinitializer
|
||||
// CHECK-NEXT: %11 = fmul fast <4 x float> %8, %10
|
||||
// CHECK-NEXT: %12 = extractelement <4 x float> %11, i64 0
|
||||
// CHECK-NEXT: %13 = insertvalue [4 x float] undef, float %12, 0
|
||||
// CHECK-NEXT: %14 = extractelement <4 x float> %11, i64 1
|
||||
// CHECK-NEXT: %15 = insertvalue [4 x float] %13, float %14, 1
|
||||
// CHECK-NEXT: %16 = extractelement <4 x float> %11, i64 2
|
||||
// CHECK-NEXT: %17 = insertvalue [4 x float] %15, float %16, 2
|
||||
// CHECK-NEXT: %18 = extractelement <4 x float> %11, i64 3
|
||||
// CHECK-NEXT: %19 = insertvalue [4 x float] %17, float %18, 3
|
||||
// CHECK-NEXT: ret [4 x float] %19
|
||||
// CHECK-NEXT: }
|
||||
|
||||
// d_square3, the extra float is the original return value (x * x)
|
||||
// CHECK: define internal fastcc { float, [4 x float] } @fwddiffe4square.1(float %x.0.val, [4 x ptr] %"x'")
|
||||
// CHECK-NEXT: start:
|
||||
// CHECK-NEXT: %0 = extractvalue [4 x ptr] %"x'", 0
|
||||
// CHECK-NEXT: %"_2'ipl" = load float, ptr %0, align 4
|
||||
// CHECK-NEXT: %1 = extractvalue [4 x ptr] %"x'", 1
|
||||
// CHECK-NEXT: %"_2'ipl1" = load float, ptr %1, align 4
|
||||
// CHECK-NEXT: %2 = extractvalue [4 x ptr] %"x'", 2
|
||||
// CHECK-NEXT: %"_2'ipl2" = load float, ptr %2, align 4
|
||||
// CHECK-NEXT: %3 = extractvalue [4 x ptr] %"x'", 3
|
||||
// CHECK-NEXT: %"_2'ipl3" = load float, ptr %3, align 4
|
||||
// CHECK-NEXT: %_0 = fmul float %x.0.val, %x.0.val
|
||||
// CHECK-NEXT: %4 = insertelement <4 x float> poison, float %"_2'ipl", i64 0
|
||||
// CHECK-NEXT: %5 = insertelement <4 x float> %4, float %"_2'ipl1", i64 1
|
||||
// CHECK-NEXT: %6 = insertelement <4 x float> %5, float %"_2'ipl2", i64 2
|
||||
// CHECK-NEXT: %7 = insertelement <4 x float> %6, float %"_2'ipl3", i64 3
|
||||
// CHECK-NEXT: %8 = fadd fast <4 x float> %7, %7
|
||||
// CHECK-NEXT: %9 = insertelement <4 x float> poison, float %x.0.val, i64 0
|
||||
// CHECK-NEXT: %10 = shufflevector <4 x float> %9, <4 x float> poison, <4 x i32> zeroinitializer
|
||||
// CHECK-NEXT: %11 = fmul fast <4 x float> %8, %10
|
||||
// CHECK-NEXT: %12 = extractelement <4 x float> %11, i64 0
|
||||
// CHECK-NEXT: %13 = insertvalue [4 x float] undef, float %12, 0
|
||||
// CHECK-NEXT: %14 = extractelement <4 x float> %11, i64 1
|
||||
// CHECK-NEXT: %15 = insertvalue [4 x float] %13, float %14, 1
|
||||
// CHECK-NEXT: %16 = extractelement <4 x float> %11, i64 2
|
||||
// CHECK-NEXT: %17 = insertvalue [4 x float] %15, float %16, 2
|
||||
// CHECK-NEXT: %18 = extractelement <4 x float> %11, i64 3
|
||||
// CHECK-NEXT: %19 = insertvalue [4 x float] %17, float %18, 3
|
||||
// CHECK-NEXT: %20 = insertvalue { float, [4 x float] } undef, float %_0, 0
|
||||
// CHECK-NEXT: %21 = insertvalue { float, [4 x float] } %20, [4 x float] %19, 1
|
||||
// CHECK-NEXT: ret { float, [4 x float] } %21
|
||||
// CHECK-NEXT: }
|
||||
|
||||
fn main() {
|
||||
let x = std::hint::black_box(3.0);
|
||||
let output = square(&x);
|
||||
dbg!(&output);
|
||||
assert_eq!(9.0, output);
|
||||
dbg!(square(&x));
|
||||
|
||||
let mut df_dx1 = 1.0;
|
||||
let mut df_dx2 = 2.0;
|
||||
let mut df_dx3 = 3.0;
|
||||
let mut df_dx4 = 0.0;
|
||||
let [o1, o2, o3, o4] = d_square2(&x, &mut df_dx1, &mut df_dx2, &mut df_dx3, &mut df_dx4);
|
||||
dbg!(o1, o2, o3, o4);
|
||||
let [output2, o1, o2, o3, o4] =
|
||||
d_square1(&x, &mut df_dx1, &mut df_dx2, &mut df_dx3, &mut df_dx4);
|
||||
dbg!(o1, o2, o3, o4);
|
||||
assert_eq!(output, output2);
|
||||
assert!((6.0 - o1).abs() < 1e-10);
|
||||
assert!((12.0 - o2).abs() < 1e-10);
|
||||
assert!((18.0 - o3).abs() < 1e-10);
|
||||
assert!((0.0 - o4).abs() < 1e-10);
|
||||
assert_eq!(1.0, df_dx1);
|
||||
assert_eq!(2.0, df_dx2);
|
||||
assert_eq!(3.0, df_dx3);
|
||||
assert_eq!(0.0, df_dx4);
|
||||
assert_eq!(d_square3(&x, &mut df_dx1), 2.0 * o1);
|
||||
assert_eq!(d_square3(&x, &mut df_dx2), 2.0 * o2);
|
||||
assert_eq!(d_square3(&x, &mut df_dx3), 2.0 * o3);
|
||||
assert_eq!(d_square3(&x, &mut df_dx4), 2.0 * o4);
|
||||
}
|
|
@ -25,27 +25,31 @@ pub fn f1(x: &[f64], y: f64) -> f64 {
|
|||
|
||||
// We want to be sure that the same function can be differentiated in different ways
|
||||
|
||||
|
||||
// Make sure, that we add the None for the default return.
|
||||
|
||||
|
||||
::core::panicking::panic("not implemented")
|
||||
}
|
||||
#[rustc_autodiff(Forward, Dual, Const, Dual,)]
|
||||
#[rustc_autodiff(Forward, 1, Dual, Const, Dual)]
|
||||
#[inline(never)]
|
||||
pub fn df1(x: &[f64], bx: &[f64], y: f64) -> (f64, f64) {
|
||||
pub fn df1(x: &[f64], bx_0: &[f64], y: f64) -> (f64, f64) {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f1(x, y));
|
||||
::core::hint::black_box((bx,));
|
||||
::core::hint::black_box((f1(x, y), f64::default()))
|
||||
::core::hint::black_box((bx_0,));
|
||||
::core::hint::black_box(<(f64, f64)>::default())
|
||||
}
|
||||
#[rustc_autodiff]
|
||||
#[inline(never)]
|
||||
pub fn f2(x: &[f64], y: f64) -> f64 {
|
||||
::core::panicking::panic("not implemented")
|
||||
}
|
||||
#[rustc_autodiff(Forward, Dual, Const, Const,)]
|
||||
#[rustc_autodiff(Forward, 1, Dual, Const, Const)]
|
||||
#[inline(never)]
|
||||
pub fn df2(x: &[f64], bx: &[f64], y: f64) -> f64 {
|
||||
pub fn df2(x: &[f64], bx_0: &[f64], y: f64) -> f64 {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f2(x, y));
|
||||
::core::hint::black_box((bx,));
|
||||
::core::hint::black_box((bx_0,));
|
||||
::core::hint::black_box(f2(x, y))
|
||||
}
|
||||
#[rustc_autodiff]
|
||||
|
@ -53,20 +57,20 @@ pub fn df2(x: &[f64], bx: &[f64], y: f64) -> f64 {
|
|||
pub fn f3(x: &[f64], y: f64) -> f64 {
|
||||
::core::panicking::panic("not implemented")
|
||||
}
|
||||
#[rustc_autodiff(Forward, Dual, Const, Const,)]
|
||||
#[rustc_autodiff(Forward, 1, Dual, Const, Const)]
|
||||
#[inline(never)]
|
||||
pub fn df3(x: &[f64], bx: &[f64], y: f64) -> f64 {
|
||||
pub fn df3(x: &[f64], bx_0: &[f64], y: f64) -> f64 {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f3(x, y));
|
||||
::core::hint::black_box((bx,));
|
||||
::core::hint::black_box((bx_0,));
|
||||
::core::hint::black_box(f3(x, y))
|
||||
}
|
||||
#[rustc_autodiff]
|
||||
#[inline(never)]
|
||||
pub fn f4() {}
|
||||
#[rustc_autodiff(Forward, None)]
|
||||
#[rustc_autodiff(Forward, 1, None)]
|
||||
#[inline(never)]
|
||||
pub fn df4() {
|
||||
pub fn df4() -> () {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f4());
|
||||
::core::hint::black_box(());
|
||||
|
@ -76,28 +80,82 @@ pub fn df4() {
|
|||
pub fn f5(x: &[f64], y: f64) -> f64 {
|
||||
::core::panicking::panic("not implemented")
|
||||
}
|
||||
#[rustc_autodiff(Forward, Const, Dual, Const,)]
|
||||
#[rustc_autodiff(Forward, 1, Const, Dual, Const)]
|
||||
#[inline(never)]
|
||||
pub fn df5_y(x: &[f64], y: f64, by: f64) -> f64 {
|
||||
pub fn df5_y(x: &[f64], y: f64, by_0: f64) -> f64 {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f5(x, y));
|
||||
::core::hint::black_box((by,));
|
||||
::core::hint::black_box((by_0,));
|
||||
::core::hint::black_box(f5(x, y))
|
||||
}
|
||||
#[rustc_autodiff(Forward, Dual, Const, Const,)]
|
||||
#[rustc_autodiff(Forward, 1, Dual, Const, Const)]
|
||||
#[inline(never)]
|
||||
pub fn df5_x(x: &[f64], bx: &[f64], y: f64) -> f64 {
|
||||
pub fn df5_x(x: &[f64], bx_0: &[f64], y: f64) -> f64 {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f5(x, y));
|
||||
::core::hint::black_box((bx,));
|
||||
::core::hint::black_box((bx_0,));
|
||||
::core::hint::black_box(f5(x, y))
|
||||
}
|
||||
#[rustc_autodiff(Reverse, Duplicated, Const, Active,)]
|
||||
#[rustc_autodiff(Reverse, 1, Duplicated, Const, Active)]
|
||||
#[inline(never)]
|
||||
pub fn df5_rev(x: &[f64], dx: &mut [f64], y: f64, dret: f64) -> f64 {
|
||||
pub fn df5_rev(x: &[f64], dx_0: &mut [f64], y: f64, dret: f64) -> f64 {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f5(x, y));
|
||||
::core::hint::black_box((dx, dret));
|
||||
::core::hint::black_box((dx_0, dret));
|
||||
::core::hint::black_box(f5(x, y))
|
||||
}
|
||||
struct DoesNotImplDefault;
|
||||
#[rustc_autodiff]
|
||||
#[inline(never)]
|
||||
pub fn f6() -> DoesNotImplDefault {
|
||||
::core::panicking::panic("not implemented")
|
||||
}
|
||||
#[rustc_autodiff(Forward, 1, Const)]
|
||||
#[inline(never)]
|
||||
pub fn df6() -> DoesNotImplDefault {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f6());
|
||||
::core::hint::black_box(());
|
||||
::core::hint::black_box(f6())
|
||||
}
|
||||
#[rustc_autodiff]
|
||||
#[inline(never)]
|
||||
pub fn f7(x: f32) -> () {}
|
||||
#[rustc_autodiff(Forward, 1, Const, None)]
|
||||
#[inline(never)]
|
||||
pub fn df7(x: f32) -> () {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f7(x));
|
||||
::core::hint::black_box(());
|
||||
}
|
||||
#[no_mangle]
|
||||
#[rustc_autodiff]
|
||||
#[inline(never)]
|
||||
fn f8(x: &f32) -> f32 { ::core::panicking::panic("not implemented") }
|
||||
#[rustc_autodiff(Forward, 4, Dual, Dual)]
|
||||
#[inline(never)]
|
||||
fn f8_3(x: &f32, bx_0: &f32, bx_1: &f32, bx_2: &f32, bx_3: &f32)
|
||||
-> [f32; 5usize] {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f8(x));
|
||||
::core::hint::black_box((bx_0, bx_1, bx_2, bx_3));
|
||||
::core::hint::black_box(<[f32; 5usize]>::default())
|
||||
}
|
||||
#[rustc_autodiff(Forward, 4, Dual, DualOnly)]
|
||||
#[inline(never)]
|
||||
fn f8_2(x: &f32, bx_0: &f32, bx_1: &f32, bx_2: &f32, bx_3: &f32)
|
||||
-> [f32; 4usize] {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f8(x));
|
||||
::core::hint::black_box((bx_0, bx_1, bx_2, bx_3));
|
||||
::core::hint::black_box(<[f32; 4usize]>::default())
|
||||
}
|
||||
#[rustc_autodiff(Forward, 1, Dual, DualOnly)]
|
||||
#[inline(never)]
|
||||
fn f8_1(x: &f32, bx_0: &f32) -> f32 {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f8(x));
|
||||
::core::hint::black_box((bx_0,));
|
||||
::core::hint::black_box(<f32>::default())
|
||||
}
|
||||
fn main() {}
|
||||
|
|
|
@ -36,4 +36,22 @@ pub fn f5(x: &[f64], y: f64) -> f64 {
|
|||
unimplemented!()
|
||||
}
|
||||
|
||||
struct DoesNotImplDefault;
|
||||
#[autodiff(df6, Forward, Const)]
|
||||
pub fn f6() -> DoesNotImplDefault {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
// Make sure, that we add the None for the default return.
|
||||
#[autodiff(df7, Forward, Const)]
|
||||
pub fn f7(x: f32) -> () {}
|
||||
|
||||
#[autodiff(f8_1, Forward, Dual, DualOnly)]
|
||||
#[autodiff(f8_2, Forward, 4, Dual, DualOnly)]
|
||||
#[autodiff(f8_3, Forward, 4, Dual, Dual)]
|
||||
#[no_mangle]
|
||||
fn f8(x: &f32) -> f32 {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -28,18 +28,18 @@ pub fn f1(x: &[f64], y: f64) -> f64 {
|
|||
|
||||
::core::panicking::panic("not implemented")
|
||||
}
|
||||
#[rustc_autodiff(Reverse, Duplicated, Const, Active,)]
|
||||
#[rustc_autodiff(Reverse, 1, Duplicated, Const, Active)]
|
||||
#[inline(never)]
|
||||
pub fn df1(x: &[f64], dx: &mut [f64], y: f64, dret: f64) -> f64 {
|
||||
pub fn df1(x: &[f64], dx_0: &mut [f64], y: f64, dret: f64) -> f64 {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f1(x, y));
|
||||
::core::hint::black_box((dx, dret));
|
||||
::core::hint::black_box((dx_0, dret));
|
||||
::core::hint::black_box(f1(x, y))
|
||||
}
|
||||
#[rustc_autodiff]
|
||||
#[inline(never)]
|
||||
pub fn f2() {}
|
||||
#[rustc_autodiff(Reverse, None)]
|
||||
#[rustc_autodiff(Reverse, 1, None)]
|
||||
#[inline(never)]
|
||||
pub fn df2() {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
|
@ -51,12 +51,12 @@ pub fn df2() {
|
|||
pub fn f3(x: &[f64], y: f64) -> f64 {
|
||||
::core::panicking::panic("not implemented")
|
||||
}
|
||||
#[rustc_autodiff(Reverse, Duplicated, Const, Active,)]
|
||||
#[rustc_autodiff(Reverse, 1, Duplicated, Const, Active)]
|
||||
#[inline(never)]
|
||||
pub fn df3(x: &[f64], dx: &mut [f64], y: f64, dret: f64) -> f64 {
|
||||
pub fn df3(x: &[f64], dx_0: &mut [f64], y: f64, dret: f64) -> f64 {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f3(x, y));
|
||||
::core::hint::black_box((dx, dret));
|
||||
::core::hint::black_box((dx_0, dret));
|
||||
::core::hint::black_box(f3(x, y))
|
||||
}
|
||||
enum Foo { Reverse, }
|
||||
|
@ -64,7 +64,7 @@ use Foo::Reverse;
|
|||
#[rustc_autodiff]
|
||||
#[inline(never)]
|
||||
pub fn f4(x: f32) { ::core::panicking::panic("not implemented") }
|
||||
#[rustc_autodiff(Reverse, Const, None)]
|
||||
#[rustc_autodiff(Reverse, 1, Const, None)]
|
||||
#[inline(never)]
|
||||
pub fn df4(x: f32) {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
|
@ -76,11 +76,11 @@ pub fn df4(x: f32) {
|
|||
pub fn f5(x: *const f32, y: &f32) {
|
||||
::core::panicking::panic("not implemented")
|
||||
}
|
||||
#[rustc_autodiff(Reverse, DuplicatedOnly, Duplicated, None)]
|
||||
#[rustc_autodiff(Reverse, 1, DuplicatedOnly, Duplicated, None)]
|
||||
#[inline(never)]
|
||||
pub unsafe fn df5(x: *const f32, dx: *mut f32, y: &f32, dy: &mut f32) {
|
||||
pub unsafe fn df5(x: *const f32, dx_0: *mut f32, y: &f32, dy_0: &mut f32) {
|
||||
unsafe { asm!("NOP", options(pure, nomem)); };
|
||||
::core::hint::black_box(f5(x, y));
|
||||
::core::hint::black_box((dx, dy));
|
||||
::core::hint::black_box((dx_0, dy_0));
|
||||
}
|
||||
fn main() {}
|
||||
|
|
|
@ -177,4 +177,11 @@ fn f21(x: f32) -> f32 {
|
|||
unimplemented!()
|
||||
}
|
||||
|
||||
struct DoesNotImplDefault;
|
||||
#[autodiff(df22, Forward, Dual)]
|
||||
pub fn f22() -> DoesNotImplDefault {
|
||||
//~^^ ERROR the function or associated item `default` exists for tuple `(DoesNotImplDefault, DoesNotImplDefault)`, but its trait bounds were not satisfied
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -19,32 +19,24 @@ error: expected 1 activities, but found 2
|
|||
|
|
||||
LL | #[autodiff(df3, Reverse, Duplicated, Const)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: expected 1 activities, but found 0
|
||||
--> $DIR/autodiff_illegal.rs:27:1
|
||||
|
|
||||
LL | #[autodiff(df4, Reverse)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: Dual can not be used in Reverse Mode
|
||||
--> $DIR/autodiff_illegal.rs:34:1
|
||||
|
|
||||
LL | #[autodiff(df5, Reverse, Dual)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: Duplicated can not be used in Forward Mode
|
||||
--> $DIR/autodiff_illegal.rs:41:1
|
||||
|
|
||||
LL | #[autodiff(df6, Forward, Duplicated)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: Duplicated can not be used for this type
|
||||
--> $DIR/autodiff_illegal.rs:42:14
|
||||
|
@ -107,7 +99,6 @@ LL | #[autodiff(fn_exists, Reverse, Active)]
|
|||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `fn_exists` redefined here
|
||||
|
|
||||
= note: `fn_exists` must be defined only once in the value namespace of this module
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: autodiff requires at least a name and mode
|
||||
--> $DIR/autodiff_illegal.rs:95:1
|
||||
|
@ -135,42 +126,49 @@ error: invalid return activity Active in Forward Mode
|
|||
|
|
||||
LL | #[autodiff(df19, Forward, Dual, Active)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: invalid return activity Dual in Reverse Mode
|
||||
--> $DIR/autodiff_illegal.rs:167:1
|
||||
|
|
||||
LL | #[autodiff(df20, Reverse, Active, Dual)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: invalid return activity Duplicated in Reverse Mode
|
||||
--> $DIR/autodiff_illegal.rs:174:1
|
||||
|
|
||||
LL | #[autodiff(df21, Reverse, Active, Duplicated)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0433]: failed to resolve: use of undeclared type `MyFloat`
|
||||
--> $DIR/autodiff_illegal.rs:130:1
|
||||
|
|
||||
LL | #[autodiff(df15, Reverse, Active, Active)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ use of undeclared type `MyFloat`
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0433]: failed to resolve: use of undeclared type `F64Trans`
|
||||
--> $DIR/autodiff_illegal.rs:154:1
|
||||
|
|
||||
LL | #[autodiff(df18, Reverse, Active, Active)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ use of undeclared type `F64Trans`
|
||||
|
||||
error[E0599]: the function or associated item `default` exists for tuple `(DoesNotImplDefault, DoesNotImplDefault)`, but its trait bounds were not satisfied
|
||||
--> $DIR/autodiff_illegal.rs:181:1
|
||||
|
|
||||
LL | struct DoesNotImplDefault;
|
||||
| ------------------------- doesn't satisfy `DoesNotImplDefault: Default`
|
||||
LL | #[autodiff(df22, Forward, Dual)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function or associated item cannot be called on `(DoesNotImplDefault, DoesNotImplDefault)` due to unsatisfied trait bounds
|
||||
|
|
||||
= note: the following trait bounds were not satisfied:
|
||||
`DoesNotImplDefault: Default`
|
||||
which is required by `(DoesNotImplDefault, DoesNotImplDefault): Default`
|
||||
help: consider annotating `DoesNotImplDefault` with `#[derive(Default)]`
|
||||
|
|
||||
LL + #[derive(Default)]
|
||||
LL | struct DoesNotImplDefault;
|
||||
|
|
||||
= note: this error originates in the attribute macro `autodiff` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 22 previous errors
|
||||
error: aborting due to 23 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0428, E0433, E0658.
|
||||
Some errors have detailed explanations: E0428, E0433, E0599, E0658.
|
||||
For more information about an error, try `rustc --explain E0428`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue