1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//! Linear Operator

use ndarray::*;

use super::types::*;

pub trait Operator<A, S, D>
where
    S: Data<Elem = A>,
    D: Dimension,
{
    fn op(&self, &ArrayBase<S, D>) -> Array<A, D>;
}

pub trait OperatorInto<S, D>
where
    S: DataMut,
    D: Dimension,
{
    fn op_into(&self, ArrayBase<S, D>) -> ArrayBase<S, D>;
}

pub trait OperatorMut<S, D>
where
    S: DataMut,
    D: Dimension,
{
    fn op_mut<'a>(&self, &'a mut ArrayBase<S, D>) -> &'a mut ArrayBase<S, D>;
}

impl<T, A, S, D> Operator<A, S, D> for T
where
    A: Scalar,
    S: Data<Elem = A>,
    D: Dimension,
    T: linalg::Dot<ArrayBase<S, D>, Output = Array<A, D>>,
{
    fn op(&self, rhs: &ArrayBase<S, D>) -> Array<A, D> {
        self.dot(rhs)
    }
}