4 releases
new 0.1.3 | Mar 7, 2025 |
---|---|
0.1.2 | Mar 4, 2025 |
0.1.1 | Mar 3, 2025 |
0.1.0 | Mar 1, 2025 |
#112 in Science
329 downloads per month
105KB
2.5K
SLoC
odesign
odesign
is an optimal design of experiments library written in pure rust.
There are at least these following use cases:
- Fast calculation of optimal designs of arbitrary linear models with custom design bounds and optimalities.
- Research in area of optimal designs; e.g. I am working on a new optimal design feature selection algorithm, a mixture of SFFS, D-, C- and Measurements-Costs-Optimality, allowing to perform model feature selection and measurements alternating.
Get started
Please have a look at the book on odesign.rs for a high level introduction and theoretical background and at the docs on docs.rs/odesign for the implementation details.
Basic Example
In short, this is a basic example of an optimal design of the simple polynomial 1 + x within design bounds [-1, +1] and 101 equally distributed grid points as an init design.
use nalgebra::{SVector, Vector1};
use num_dual::DualNum;
use odesign::{
DOptimality, Feature, FeatureFunction, FeatureSet, LinearModel, OptimalDesign, Result,
};
use std::sync::Arc;
#[derive(Feature)]
#[dimension = 1]
struct Monomial {
i: i32,
}
impl FeatureFunction<1> for Monomial {
fn f<D: DualNum<f64>>(&self, x: &SVector<D, 1>) -> D {
x[0].powi(self.i)
}
}
// f(x): 1 + x
fn main() -> Result<()> {
let mut fs = FeatureSet::new();
let c: Arc<_> = Monomial { i: 0 }.into();
fs.push(c);
let c: Arc<_> = Monomial { i: 1 }.into();
fs.push(c);
let lm = LinearModel::new(fs.features);
let optimality: Arc<_> = DOptimality::new(lm.into()).into();
let lower = Vector1::new(-1.0);
let upper = Vector1::new(1.0);
let q = Vector1::new(101);
let mut od = OptimalDesign::new()
.with_optimality(optimality)
.with_bound_args(lower, upper)?
.with_init_design_grid_args(lower, upper, q)?;
od.solve();
println!("{od}");
Ok(())
}
// Output
// ---------- Design ----------
// Weight Support Vector
// 0.5000 [ -1.0000 ]
// 0.5000 [ +1.0000 ]
// -------- Statistics --------
// Optimality measure: 1.000000
// No. support vectors: 2
// Iterations: 1
// ----------------------------
Dependencies
~13MB
~287K SLoC