rsdiff_core/traits/
mod.rs1pub use self::{eval::*, propagate::*, scalar::Scalar};
6
7pub mod eval;
8pub mod propagate;
9pub mod scalar;
10
11pub trait AsSlice<T> {
12 fn as_slice(&self) -> &[T];
13}
14
15pub trait AsSliceMut<T> {
16 fn as_mut_slice(&mut self) -> &mut [T];
17}
18
19impl<S, T> AsSlice<T> for S
20where
21 S: AsRef<[T]>,
22{
23 fn as_slice(&self) -> &[T] {
24 self.as_ref()
25 }
26}
27
28impl<S, T> AsSliceMut<T> for S
29where
30 S: AsMut<[T]>,
31{
32 fn as_mut_slice(&mut self) -> &mut [T] {
33 self.as_mut()
34 }
35}
36
37pub trait Gradient<T> {
38 type Gradient;
39
40 fn grad(&self, args: T) -> Self::Gradient;
41}
42
43pub(crate) mod prelude {
44 pub use super::eval::*;
45 pub use super::propagate::*;
46 pub use super::scalar::Scalar;
47 pub use super::{AsSlice, AsSliceMut, Gradient};
48}
49
50#[cfg(test)]
51mod tests {
52 use super::scalar::Scalar;
53 use num::Complex;
54
55 #[test]
56 fn test_scalar() {
57 let a = 3f64;
58 let b = Complex::new(4f64, 0f64);
59
60 assert_eq!(Scalar::sqr(a), 9f64);
61 assert_eq!(Scalar::sqrt(b), 2f64.into());
62 }
63}