rsdiff_core/ops/traits/
evaluate.rs

1/*
2    Appellation: evaluate <traits>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use crate::ops::{Operator, Params};
6
7pub trait Evaluate<Args>
8where
9    Self: Operator,
10    Args: Params,
11{
12    type Output;
13
14    fn eval(&self, args: Args) -> Self::Output;
15}
16
17pub trait Differentiable<Args>
18where
19    Self: Evaluate<Args>,
20    Args: Params,
21{
22    type Grad;
23
24    fn grad(&self, args: Args) -> Self::Grad;
25}
26
27pub trait FnArgs {
28    type Kind;
29}
30
31pub struct Partial<T, F> {
32    pub args: T,
33    pub func: F,
34}
35
36impl<T, F> Partial<T, F>
37where
38    F: for<'a> Fn(&'a T) -> T,
39{
40    pub fn new(args: T, func: F) -> Self {
41        Self { args, func }
42    }
43}