rsdiff_core/traits/
mod.rs

1/*
2    Appellation: traits <mod>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5pub 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}