src/python.rs

Thu, 04 Dec 2025 14:36:22 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Thu, 04 Dec 2025 14:36:22 -0500
changeset 3
fbdee8e4a78d
parent 0
e8f3b6c55ce7
child 6
aefacd832408
permissions
-rw-r--r--

Added padded_iter to the Python interface, to deal with Fenics quirks

0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Python wrapper to measures. Only enabled with crate feature `pyo3`.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 These should really be in the `pointsource_pde` crate, but Rust doesn't allow that.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 */
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 use super::{DeltaMeasure, DiscreteMeasure};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 use alg_tools::loc::Loc;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 use numpy::{Ix1, PyArray};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 use pyo3::prelude::*;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 use pyo3::types::{PyList, PyModule, PyModuleMethods};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 use pyo3::{pymodule, Borrowed, Bound, PyResult};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 macro_rules! create_interface {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 ($name: ident, $iter:ident, $N: literal, $F:ident) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 #[allow(non_camel_case_types)]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 #[pyclass(module = "pointsource_algs")]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 /// Wrapper to [`DiscreteMeasure<Loc<$N, $F>, $F>,`]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 ///
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 /// This is mainly needed because pyo3 does not support generics, not even instantiating
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 /// them to specific values.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 pub struct $name {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 inner: DiscreteMeasure<Loc<$N, $F>, $F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 impl $name {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 pub fn wrap(inner: DiscreteMeasure<Loc<$N, $F>, $F>) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 Self { inner }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 #[pymethods]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 impl $name {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 #[new]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 pub fn new(contents: &Bound<'_, PyList>) -> PyResult<Self> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 // let vec: Vec<(PyArray<$F, Ix1>, $F)> = contents.extract()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 // Ok(Self { inner: vec.into() })
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 let mut res = DiscreteMeasure::new();
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 for v in contents.iter() {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 let (x, α): ([$F; $N], $F) = v.extract()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 res.push(DeltaMeasure { x: x.into(), α });
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 Ok(Self { inner: res })
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 /*pub fn from(vec: Vec<([$F; $N], $F)>) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 inner: DiscreteMeasure::from_iter(vec.into_iter()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 }*/
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 fn __iter__(slf: Bound<'_, Self>) -> PyResult<Py<$iter>> {
3
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
53 Py::new(slf.py(), $iter {
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
54 measure_ref: slf.unbind(),
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
55 next: 0,
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
56 pad: false,
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
57 })
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
58 }
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
59
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
60 /// Same as iterating the object, but pads (or cuts) location vectors to 3 dimensions.
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
61 fn iter_padded(slf: Bound<'_, Self>) -> PyResult<Py<$iter>> {
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
62 Py::new(slf.py(), $iter {
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
63 measure_ref: slf.unbind(),
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
64 next: 0,
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
65 pad: true,
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
66 })
0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 #[allow(non_camel_case_types)]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 #[pyclass(module = "pointsource_algs")]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 /// Python-side iterator for [`DiscreteMeasure<Loc<$N, $F>, $F>,`]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 /// Returns tuples (weight, coords)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 pub struct $iter {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 measure_ref: Py<$name>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 next: usize,
3
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
77 pad: bool,
0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 #[pymethods]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 impl $iter {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 slf
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 // We cannot use lifetimes in types exported to Python, so have to use a
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 // very primitive iterator.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 fn __next__(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 mut slf: PyRefMut<'_, Self>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 ) -> PyResult<Option<(Bound<'_, PyArray<$F, Ix1>>, $F)>> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 let py = slf.py();
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 let meas_: PyRef<'_, $name> = slf.measure_ref.extract(py)?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 let meas = &(meas_.inner);
3
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
94 let pad = slf.pad;
0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 let next = &mut slf.next;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 Ok((*next < meas.len()).then(|| {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 let δ = meas[*next];
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 *next += 1;
3
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
99 if pad {
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
100 (
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
101 PyArray::from_iter(
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
102 py,
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
103 δ.x.iter().copied().chain(std::iter::repeat(0.0)).take(3),
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
104 ),
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
105 δ.α,
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
106 )
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
107 } else {
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
108 (PyArray::from_slice(py, &δ.x.0), δ.α)
fbdee8e4a78d Added padded_iter to the Python interface, to deal with Fenics quirks
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
109 }
0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 }))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 // Direct access without passing through the wrappers
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 impl<'a, 'py> FromPyObject<'a, 'py> for DiscreteMeasure<Loc<$N, $F>, $F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 type Error = PyErr;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 fn extract(obj: Borrowed<'a, 'py, PyAny>) -> PyResult<Self> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 let wrapper: PyRef<'_, $name> = obj.extract()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 Ok(wrapper.inner.clone())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 impl<'a, 'py> IntoPyObject<'py> for &'a mut DiscreteMeasure<Loc<$N, $F>, $F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 type Target = $name;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 type Error = PyErr;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 type Output = Bound<'py, $name>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 Bound::new(py, $name { inner: self.clone() })
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 impl<'py> IntoPyObject<'py> for DiscreteMeasure<Loc<$N, $F>, $F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 type Target = $name;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 type Error = PyErr;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 type Output = Bound<'py, $name>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 Bound::new(py, $name { inner: self })
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 create_interface!(DiscreteMeasure_1_f64, DiscreteMeasureIter_1_f64, 1, f64);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 create_interface!(DiscreteMeasure_2_f64, DiscreteMeasureIter_2_f64, 2, f64);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 create_interface!(DiscreteMeasure_3_f64, DiscreteMeasureIter_3_f64, 3, f64);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 /// Populates the Python module.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 ///
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 /// Needs to be called with [`pyo3::append_to_inittab`]:
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 /// ```
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 /// append_to_inittab!(pymod_pointsource_algs);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 /// ```
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 /// before initialising the intepreter.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 #[pymodule]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 #[pyo3(name = "measures")]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 pub fn pymod(m: &Bound<'_, PyModule>) -> PyResult<()> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 //m.add_class::<crate::run::DefaultAlgorithm>()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 m.add_class::<crate::python::DiscreteMeasure_1_f64>()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 m.add_class::<crate::python::DiscreteMeasure_2_f64>()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 m.add_class::<crate::python::DiscreteMeasure_3_f64>()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 m.add_class::<crate::python::DiscreteMeasureIter_1_f64>()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 m.add_class::<crate::python::DiscreteMeasureIter_2_f64>()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 m.add_class::<crate::python::DiscreteMeasureIter_3_f64>()?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 Ok(())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 }

mercurial