1#[macro_export]
2macro_rules! as_inference_fact_impl {
3 ($IM:ident, $IF: ident) => {
4 impl AsFact<$IM, $IF> for $IF {
5 fn as_fact(&self, _model: &$IM) -> Result<boow::Bow<$IF>> {
6 Ok(boow::Bow::Borrowed(self))
7 }
8 }
9
10 impl AsFact<$IM, $IF> for &str {
11 fn as_fact(&self, model: &$IM) -> Result<boow::Bow<$IF>> {
12 Ok(boow::Bow::Owned($IF::new(model, self)?))
13 }
14 }
15
16 impl AsFact<$IM, $IF> for () {
17 fn as_fact(&self, model: &$IM) -> Result<boow::Bow<$IF>> {
18 Ok(boow::Bow::Owned($IF::new(model, "")?))
19 }
20 }
21
22 impl AsFact<$IM, $IF> for Option<&str> {
23 fn as_fact(&self, model: &$IM) -> Result<boow::Bow<$IF>> {
24 if let Some(it) = self {
25 Ok(boow::Bow::Owned($IF::new(model, it)?))
26 } else {
27 Ok(boow::Bow::Owned($IF::new(model, "")?))
28 }
29 }
30 }
31 };
32}
33
34#[macro_export]
35macro_rules! as_fact_impl {
36 ($M:ident, $F: ident) => {
37 impl AsFact<$M, $F> for $F {
38 fn as_fact(&self, _model: &$M) -> Result<boow::Bow<$F>> {
39 Ok(boow::Bow::Borrowed(self))
40 }
41 }
42
43 impl AsFact<$M, $F> for &str {
44 fn as_fact(&self, model: &$M) -> Result<boow::Bow<$F>> {
45 Ok(boow::Bow::Owned($F::new(model, self)?))
46 }
47 }
48 };
49}
50
51#[macro_export]
52macro_rules! value_from_to_ndarray {
53 () => {
54 impl<T, S, D> TryFrom<ndarray::ArrayBase<S, D>> for Value
55 where
56 T: $crate::Datum + Clone + 'static,
57 S: RawData<Elem = T> + Data,
58 D: Dimension,
59 {
60 type Error = anyhow::Error;
61 fn try_from(view: ndarray::ArrayBase<S, D>) -> Result<Value> {
62 if let Some(slice) = view.as_slice_memory_order()
63 && (0..view.ndim()).all(|ix| {
64 view.strides().get(ix + 1).is_none_or(|next| *next <= view.strides()[ix])
65 })
66 {
67 Value::from_slice(view.shape(), slice)
68 } else {
69 let slice: Vec<_> = view.iter().cloned().collect();
70 Value::from_slice(view.shape(), &slice)
71 }
72 }
73 }
74
75 impl<'a, T: $crate::Datum> TryFrom<&'a Value> for ndarray::ArrayViewD<'a, T> {
76 type Error = anyhow::Error;
77 fn try_from(value: &'a Value) -> Result<Self, Self::Error> {
78 value.view()
79 }
80 }
81 };
82}