src/experiments.rs

Tue, 06 Oct 2026 00:47:42 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 06 Oct 2026 00:47:42 -0500
changeset 15
7c63af7c9acd
parent 12
a0d61ac3719e
permissions
-rw-r--r--

README updates

1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Access to experiments provided in Python code.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 */
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 use crate::dolfinx_access::DolfinxPyFunction_f64;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 use crate::python_access::{
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 process_error, Differentiable, HasProx, PythonMapping, PythonPlotFactory,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 };
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 use alg_tools::direct_product::Pair;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 use alg_tools::error::{DynError, DynResult};
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 use alg_tools::loc::Loc;
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
12 use alg_tools::sets::Cube;
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 use anyhow::bail;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 use clap::Parser;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 use log::debug;
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
16 use pointsource_algs::domain::{AdmissibleDomain, FullSpace, UniformRandom};
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 use pointsource_algs::measures::DiscreteMeasure;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 use pointsource_algs::prox_penalty::RadonSquared;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 use pointsource_algs::regularisation::{NonnegRadonRegTerm, RadonRegTerm, Regularisation};
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 use pointsource_algs::run::{
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
21 run_fb_dom, run_fb_pair_dom, DefaultAlgorithm, RunError::NotImplemented, RunnableExperiment,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
22 RunnableExperimentExtras,
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 };
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 use pointsource_algs::{AlgorithmOverrides, CommandLineArgs, ExperimentSetup};
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 use pyo3::ffi::c_str;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 use pyo3::prelude::*;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 use pyo3::types::{PyDict, PyFunction};
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
28 use rand::prelude::{SeedableRng, StdRng};
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 use serde::{Deserialize, Serialize};
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 use serde_json;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 use serde_with::skip_serializing_none;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 use std::collections::HashMap;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 use std::ffi::CString;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 use std::path::Path;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 /// Command line experiment setup overrides
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 #[skip_serializing_none]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 #[derive(Parser, Debug, Serialize, Deserialize, Default, Clone)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 #[pyclass(module = "pointsource_pde")]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 pub struct Experiments {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 /// List of Python setup files of experiments to perform
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 #[arg(value_name = "EXPERIMENT.PY")]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 #[pyo3(get, set)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 experiments: Vec<String>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 #[arg(long)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 #[pyo3(get, set)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 /// Regularisation parameter override.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 ///
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 /// Only use if running just a single experiment, as different experiments have different
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 /// regularisation parameters.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 alpha: Option<f64>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 #[arg(long)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 #[pyo3(get, set)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 /// Noise variance override
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 variance: Option<f64>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 /// An experiment implemented in Python code
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 #[derive(Serialize)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 pub struct PythonExperiment {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 /// Name of the experiment
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 name: String,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 /// Source file of experiment
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 filename: String,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 /// The setup function
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 #[serde(skip_serializing)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 setup: Py<PyFunction>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 /// The Python module
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 #[serde(skip_serializing)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 #[allow(unused)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 module: Py<PyModule>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 /// Algorithm overrides
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 algorithm_overrides: HashMap<DefaultAlgorithm, AlgorithmOverrides<f64>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 impl ExperimentSetup for Experiments {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 type FloatType = f64;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 fn runnables(&self) -> DynResult<Vec<Box<dyn RunnableExperiment<Self::FloatType>>>> {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 debug!("Loading runnable experiments. Attaching Python.");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 Python::attach(|py| {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 debug!("Loading json Python module.");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 // Load the "json" Python module, and "dumps" from it.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 let dumps = PyModule::import(py, "json")?.getattr("dumps")?;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 // Load the Python file describing each experiment, and extract
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 // fields to file `PythonExperiment`.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 self.experiments
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 .iter()
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 .cloned()
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 .map(|filename| -> DynResult<Box<dyn RunnableExperiment<_>>> {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 debug!("Trying to load experiment from {filename}");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 let code = std::fs::read_to_string(&filename)?;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 let modname = filename.as_bytes();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 // Add path of this file to module search path, to allow local dependencies
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 let parent = Path::new(&filename).parent().unwrap().to_str().unwrap();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 let locals = PyDict::new(py);
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 locals.set_item("this_path", parent)?;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 py.run(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 c_str!("import sys; sys.path.insert(0, this_path)"),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 None,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 Some(&locals),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 )?;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 // Load module
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 let module = PyModule::from_code(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 py,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 CString::new(code)?.as_ref(),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 CString::new(filename.as_str())?.as_ref(),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 CString::new(modname)?.as_ref(),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 )?;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 let name = module.getattr("name")?.extract()?;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 let setup = module
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 .getattr("setup")?
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 .cast_into() // Check that a Pyfunction
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 .map_err(PyErr::from)? // Can't return a DowncastIntoError
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 .unbind();
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 let algorithm_overrides = match module.getattr("algorithm_overrides") {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 Err(_) => Default::default(),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 Ok(o) => {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 // This passes through JSON and Serde as pyo3 does not allow
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 // generics in AlgorithmOverides<_> - not even instantiating
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 // them to specific values. It would be interesting to write
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 // a proper serde Deserializer to not have to pass through JSON.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 // One day.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 serde_json::from_str(dumps.call1((o,))?.extract()?)?
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 };
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 debug!("… Found {name} with algorithm overrides {algorithm_overrides:?}");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 Ok(Box::new(PythonExperiment {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 name,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 filename,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 setup,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 algorithm_overrides,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 module: module.unbind(),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 }))
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 })
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 .try_collect()
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 })
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 /// Types for experiments in two dimensions with `f64` floats.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 #[allow(non_camel_case_types)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 #[allow(unused)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 mod exp_f64_2 {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 use super::*;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 use crate::python_access::{DolfinxPyFunctionMarker, NumpyArrayMarker};
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 /// Type of unknowns
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 pub type Domain = DiscreteMeasure<Loc<2, f64>, f64>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 /// Type of derivatives of objective function
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 pub type DerivativeCodomain<'py> = DolfinxPyFunction_f64<'py, 2, 2, 1>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 //pub type AuxTODOSpecifyFlexiblise<'py> = DolfinxPyFunction_f64<'py, 2, 2, 1>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 pub type DerivativeMarker = DolfinxPyFunctionMarker<2, 2, 1>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 /// Type of data terms
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 pub type DataTerm<'py> = PythonMapping<'py, Domain, f64, Differentiable<DerivativeMarker>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 /// Plotter
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 pub type PlotFactory<'py> =
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 PythonPlotFactory<'py, DerivativeCodomain<'py>, DerivativeCodomain<'py>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 /// Types for experiments in two dimensions with `f64` floats and aux
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 #[allow(non_camel_case_types, non_snake_case)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 #[allow(unused)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 mod exp_f64_2_auxvar {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 use super::*;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 use crate::python_access::{DolfinxPyFunctionMarker, NumpyArrayMarker};
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 use numpy::Ix2;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 /// Type of unknowns
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 pub type Domain<'py> = Pair<DiscreteMeasure<Loc<2, f64>, f64>, AuxVar<'py>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176 /// Type of derivatives of objective function
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 pub type DerivativeCodomain<'py> = Pair<DolfinxPyFunction_f64<'py, 2, 2, 1>, AuxVar<'py>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 /// Type of derivatives wrt. auxiliary variables.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
179 pub type AuxVar<'py> = Pair<
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 DolfinxPyFunction_f64<'py, 2, 2, 1>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181 Pair<DolfinxPyFunction_f64<'py, 2, 2, 1>, DolfinxPyFunction_f64<'py, 2, 2, 1>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 >;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 pub type DerivativeMarker = Pair<
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184 DolfinxPyFunctionMarker<2, 2, 1>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185 Pair<
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 DolfinxPyFunctionMarker<2, 2, 1>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
187 Pair<DolfinxPyFunctionMarker<2, 2, 1>, DolfinxPyFunctionMarker<2, 2, 1>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
188 >,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189 >;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 /// Type of data terms
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
191 pub type DataTerm<'py> = PythonMapping<'py, Domain<'py>, f64, Differentiable<DerivativeMarker>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 /// Auxiliary objective
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 pub type AuxTerm<'py> = PythonMapping<'py, AuxVar<'py>, f64, HasProx>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 /// Plotter
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195 pub type PlotFactory<'py> =
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196 PythonPlotFactory<'py, DerivativeCodomain<'py>, DerivativeCodomain<'py>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
198
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199 /// Types for experiments in two dimensions with `f64` floats and scalar aux
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200 #[allow(non_camel_case_types, non_snake_case)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
201 #[allow(unused)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
202 mod exp_f64_2_auxvar_scalar {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203 use super::*;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
204 use crate::python_access::{DolfinxPyFunctionMarker, NumpyArrayMarker};
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
205 use numpy::Ix2;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
207 /// Type of unknowns
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
208 pub type Domain<'py> = Pair<DiscreteMeasure<Loc<2, f64>, f64>, AuxVar<'py>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
209 /// Type of derivatives of objective function
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
210 pub type DerivativeCodomain<'py> = Pair<DolfinxPyFunction_f64<'py, 2, 2, 1>, AuxVar<'py>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
211 /// Type of derivatives wrt. auxiliary variables.
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
212 pub type AuxVar<'py> = Pair<f64, Pair<f64, f64>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
213 pub type DerivativeMarker = Pair<DolfinxPyFunctionMarker<2, 2, 1>, Pair<f64, Pair<f64, f64>>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
214 /// Type of data terms
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
215 pub type DataTerm<'py> = PythonMapping<'py, Domain<'py>, f64, Differentiable<DerivativeMarker>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
216 /// Auxiliary objective
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
217 pub type AuxTerm<'py> = PythonMapping<'py, AuxVar<'py>, f64, HasProx>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
218 /// Plotter
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
219 pub type PlotFactory<'py> =
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
220 PythonPlotFactory<'py, DerivativeCodomain<'py>, DerivativeCodomain<'py>>;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
221 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
222
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
223 /// Available regularisation terms, exported to the Python side
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
224 #[pyclass(module = "pointsource_pde", name = "RegTerm")]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
225 #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
226 pub enum RegTermPy {
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
227 /// Radon norm with weight `α`.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
228 Radon(f64),
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
229 /// Radon norm ith weight `α` and a positivity constraint.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
230 NonnegRadon(f64),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
231 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
232
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
233 impl From<RegTermPy> for Regularisation {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
234 fn from(reg: RegTermPy) -> Regularisation {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
235 match reg {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
236 RegTermPy::Radon(α) => Regularisation::Radon(α),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
237 RegTermPy::NonnegRadon(α) => Regularisation::NonnegRadon(α),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
238 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
239 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
240 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
241
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
242 /// Problem description, exported to the Python side to be filled there.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
243 #[pyclass(module = "pointsource_pde")]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
244 #[derive(Debug)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
245 pub struct Problem {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
246 /// Data term. On the python side, this should be a `class` that implements
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
247 /// `apply` and `diff`.
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
248 #[pyo3(set)]
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
249 dataterm: Py<PyAny>,
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
250
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
251 /// Regularisation
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
252 #[pyo3(set, get)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
253 regterm: RegTermPy,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
254
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
255 /// Auxiliary variable regularisation term or similar
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
256 #[pyo3(set, get)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
257 auxterm: Option<Py<PyAny>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
258
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
259 /// Initial auxiliary variable
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
260 #[pyo3(set, get)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
261 auxinit: Option<Py<PyAny>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
262
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
263 /// Initial measure
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
264 #[pyo3(set, get)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
265 μinit: Option<DiscreteMeasure<Loc<2, f64>, f64>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
266
3
c3a4f4bb87f7 Dolfin update, fixes, additional experiment, build instructions.
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
267 /// Plotter
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
268 #[pyo3(set, get)]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
269 plot_factory: Option<Py<PyAny>>,
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
270
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
271 /// Domain
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
272 #[pyo3(set, get)]
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
273 domain: Option<Py<PyAny>>,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
274
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
275 /// Randon number generator seed
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
276 #[pyo3(set, get)]
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
277 seed: Option<u64>,
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
278 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
279
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
280 #[pymethods]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
281 impl Problem {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
282 #[new]
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
283 #[pyo3(signature = (dataterm, regterm, auxterm = None, auxinit = None, μinit = None, plot_factory=None, domain = None, seed = None))]
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
284 fn new(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
285 dataterm: Py<PyAny>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
286 regterm: RegTermPy,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
287 auxterm: Option<Py<PyAny>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
288 auxinit: Option<Py<PyAny>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
289 μinit: Option<DiscreteMeasure<Loc<2, f64>, f64>>,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
290 plot_factory: Option<Py<PyAny>>,
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
291 domain: Option<Py<PyAny>>,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
292 seed: Option<u64>,
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
293 ) -> Self {
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
294 Self { dataterm, regterm, auxterm, auxinit, μinit, plot_factory, seed, domain }
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
295 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
296
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
297 #[getter]
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
298 fn get_dataterm<'py>(&self, py: Python<'py>) -> Bound<'py, PyAny> {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
299 self.dataterm.bind(py).clone()
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
300 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
301 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
302
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
303 impl PythonExperiment {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
304 fn do_runall_phase2<D: AdmissibleDomain<Loc<2, f64>>>(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
305 &self,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
306 cli: &CommandLineArgs,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
307 cli_algorithm_overrides: &AlgorithmOverrides<f64>,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
308 prefix: String,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
309 problem: PyRef<Problem>,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
310 domain: &mut D,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
311 py: Python,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
312 ) -> DynError {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
313 // Set up algorithms
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
314 let algorithms = self.collect_algs(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
315 cli,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
316 cli_algorithm_overrides,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
317 |alg| self.algorithm_overrides.get(&alg).cloned(),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
318 Some(&problem.regterm.into()),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
319 &[DefaultAlgorithm::RadonFB, DefaultAlgorithm::RadonSlidingFB],
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
320 )?;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
321
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
322 let save_extra = |_, ()| Ok(());
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
323 let μ0 = problem.μinit.clone();
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
324
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
325 match (problem.regterm, &problem.auxterm, &problem.auxinit) {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
326 (regterm, None, None) => {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
327 debug!("… Extracting data term.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
328 let dataterm: exp_f64_2::DataTerm<'_> = problem.dataterm.extract(py)?;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
329 debug!("… Extracting plotter.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
330 let plot_factory: exp_f64_2::PlotFactory<'_> =
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
331 if let Some(ref p) = problem.plot_factory {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
332 p.extract(py)?
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
333 } else {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
334 PythonPlotFactory::dummy()
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
335 };
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
336 let make_plotter = |prefix| plot_factory.produce(prefix);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
337
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
338 debug!("Running.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
339 self.do_runall(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
340 &prefix,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
341 cli,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
342 algorithms,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
343 make_plotter,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
344 save_extra,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
345 μ0,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
346 |p| match regterm {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
347 RegTermPy::Radon(α) => run_fb_dom(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
348 &dataterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
349 &RadonRegTerm(α),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
350 &RadonSquared,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
351 p,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
352 domain,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
353 |_| Err(NotImplemented.into()),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
354 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
355 .map(|μ| (μ, ())),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
356 RegTermPy::NonnegRadon(α) => run_fb_dom(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
357 &dataterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
358 &NonnegRadonRegTerm(α),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
359 &RadonSquared,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
360 p,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
361 domain,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
362 |_| Err(NotImplemented.into()),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
363 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
364 .map(|μ| (μ, ())),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
365 },
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
366 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
367 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
368 (regterm, Some(auxterm), Some(z_)) => {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
369 debug!("… Extracting auxiliary variable.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
370 let z0: PyResult<exp_f64_2_auxvar::AuxVar<'_>> = z_.extract(py);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
371
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
372 match z0 {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
373 Ok(z) => {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
374 debug!("… Extracting data term.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
375 let dataterm: exp_f64_2_auxvar::DataTerm<'_> =
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
376 problem.dataterm.extract(py)?;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
377 debug!("… Extracting plotter.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
378 let plot_factory: exp_f64_2::PlotFactory<'_> =
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
379 if let Some(ref p) = problem.plot_factory {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
380 p.extract(py)?
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
381 } else {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
382 PythonPlotFactory::dummy()
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
383 };
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
384 let make_plotter = |prefix| plot_factory.produce(prefix);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
385 debug!("… Extracting auxiliary term.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
386 let auxterm: exp_f64_2_auxvar::AuxTerm<'_> = auxterm.extract(py)?;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
387
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
388 debug!("Running.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
389 self.do_runall(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
390 &prefix,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
391 cli,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
392 algorithms,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
393 make_plotter,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
394 save_extra,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
395 (μ0, z),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
396 |p| match regterm {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
397 RegTermPy::Radon(α) => run_fb_pair_dom(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
398 &dataterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
399 &RadonRegTerm(α),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
400 &RadonSquared,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
401 &auxterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
402 p,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
403 domain,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
404 |_| Err(NotImplemented.into()),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
405 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
406 .map(|Pair(μ, _)| (μ, ())),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
407 RegTermPy::NonnegRadon(α) => run_fb_pair_dom(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
408 &dataterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
409 &NonnegRadonRegTerm(α),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
410 &RadonSquared,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
411 &auxterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
412 p,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
413 domain,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
414 |_| Err(NotImplemented.into()),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
415 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
416 .map(|Pair(μ, _)| (μ, ())),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
417 },
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
418 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
419 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
420 Err(_) => {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
421 let z: exp_f64_2_auxvar_scalar::AuxVar<'_> = z_.extract(py)?;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
422 debug!("… Extracting data term.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
423 let dataterm: exp_f64_2_auxvar_scalar::DataTerm<'_> =
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
424 problem.dataterm.extract(py)?;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
425 debug!("… Extracting plotter.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
426 let plot_factory: exp_f64_2::PlotFactory<'_> =
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
427 if let Some(ref p) = problem.plot_factory {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
428 p.extract(py)?
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
429 } else {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
430 PythonPlotFactory::dummy()
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
431 };
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
432 let make_plotter = |prefix| plot_factory.produce(prefix);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
433 debug!("… Extracting auxiliary term.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
434 let auxterm: exp_f64_2_auxvar_scalar::AuxTerm<'_> = auxterm.extract(py)?;
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
435
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
436 debug!("Running.");
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
437 self.do_runall(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
438 &prefix,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
439 cli,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
440 algorithms,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
441 make_plotter,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
442 save_extra,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
443 (μ0, z),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
444 |p| match regterm {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
445 RegTermPy::Radon(α) => run_fb_pair_dom(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
446 &dataterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
447 &RadonRegTerm(α),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
448 &RadonSquared,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
449 &auxterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
450 p,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
451 domain,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
452 |_| Err(NotImplemented.into()),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
453 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
454 .map(|Pair(μ, _)| (μ, ())),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
455 RegTermPy::NonnegRadon(α) => run_fb_pair_dom(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
456 &dataterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
457 &NonnegRadonRegTerm(α),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
458 &RadonSquared,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
459 &auxterm,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
460 p,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
461 domain,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
462 |_| Err(NotImplemented.into()),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
463 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
464 .map(|Pair(μ, _)| (μ, ())),
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
465 },
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
466 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
467 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
468 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
469 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
470 (_, _, _) => {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
471 bail!("Errors in problem {} setup: auxiliary term or auxiliary variable initialisation given without the other", self.name);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
472 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
473 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
474 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
475 }
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
476
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
477 impl RunnableExperiment<f64> for PythonExperiment {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
478 fn name(&self) -> &str {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
479 &self.name
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
480 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
481
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
482 fn runall(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
483 &self,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
484 cli: &CommandLineArgs,
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
485 cli_algorithm_overrides: &AlgorithmOverrides<f64>,
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
486 ) -> DynError {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
487 debug!(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
488 "Entered PythonExperiment::runall for experimen {}. Attaching Python.",
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
489 self.name
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
490 );
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
491
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
492 Python::attach(|py| {
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
493 debug!("Calling Python-side experiment initialisation.");
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
494
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
495 let prefix = self.start(cli)?;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
496
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
497 // Get the problem description
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
498 let problem: PyRef<Problem> = process_error(
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
499 "PythonExperiment::runall",
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
500 py,
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
501 self.setup
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
502 .call1(py, (&prefix,))
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
503 .and_then(|r| r.extract(py).map_err(PyErr::from)),
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
504 )?;
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
505
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
506 let rng = StdRng::seed_from_u64(problem.seed.unwrap_or(42));
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
507 if let Some(ref d) = problem.domain {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
508 let mut domain: UniformRandom<Cube<2, f64>, _> =
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
509 UniformRandom(d.extract::<[[f64; 2]; 2]>(py)?.into(), rng);
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
510 self.do_runall_phase2(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
511 cli,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
512 cli_algorithm_overrides,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
513 prefix,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
514 problem,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
515 &mut domain,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
516 py,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
517 )
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
518 } else {
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
519 self.do_runall_phase2(
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
520 cli,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
521 cli_algorithm_overrides,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
522 prefix,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
523 problem,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
524 &mut FullSpace,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
525 py,
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
526 )
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
527 }
12
a0d61ac3719e Various revisions:
Tuomo Valkonen <tuomov@iki.fi>
parents: 3
diff changeset
528 })
1
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
529 }
a4137aedcb3a Initial working version for known convectivity and diffusivity
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
530 }

mercurial