Thu, 04 Dec 2025 14:36:22 -0500
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 | } |