Add LM regression for parameter optimization in Rust#350
Open
g-bauer wants to merge 5 commits into
Open
Conversation
…structured dataset caches, added examples.
f69ecfe to
fe81486
Compare
Contributor
Author
|
Update to latest changes: Datasets (pure component)
Datasets (binary mixture)
Regressor (parameter optimisation object and utilities)
Datasets support construction from numpy arrays, CSV files, or record structs. Todos
Open Decisions
AI usage
Usage Pythonimport feos
import pandas as pd
# Construct datasets from numpy arrays
df_vp = pd.read_csv("vapor_pressure.csv")
df_rho = pd.read_csv("liquid_density.csv")
vp = feos.VaporPressureDataset(
df_vp.temperature_k.values,
df_vp.vapor_pressure_pa.values,
)
rho = feos.LiquidDensityDataset(
df_rho.temperature_k.values,
df_rho.pressure_pa.values,
df_rho.liquid_density_kmol_m3.values,
)
# or from CSV:
vp = feos.VaporPressureDataset.from_csv("vapor_pressure.csv")
dh = feos.EnthalpyOfVaporizationDataset.from_csv("dh_vap.csv")
# Define regressor
regressor = feos.PureRegressor(
model=feos.EquationOfStateAD.PcSaftNonAssoc,
datasets=[vp, rho, dh],
params={"m": 2.0, "sigma": 3.0, "epsilon_k": 300.0, "mu": 0.0},
fit=["m", "sigma", "epsilon_k"],
residual="relative_difference", # default
weights=[1.0, 1.0, 2.0], # optional per-dataset weights
)
# Run fit with custom configuration
result = regressor.fit(
config=feos.RegressorConfig(
patience=100,
ftol=1e-12,
xtol=1e-12,
gtol=1e-12,
stepbound=0.1,
strategy=feos.NonConvergenceStrategy.penalty(10.0), # default
),
loss=feos.LossFunction.huber(0.1), # optional; default is L2
)
# Print results
print(result)
print(result.all_parameters())
# Evaluate datasets — no argument uses the fitted parameters
dfs = [pd.DataFrame(d) for d in regressor.evaluate_datasets()]
# or pass explicit parameters
dfs = [pd.DataFrame(d) for d in regressor.evaluate_datasets(result.all_parameters())]
# Binary mixture example
bp = feos.BubblePointDataset.from_csv("bubble_point.csv")
bin_reg = feos.BinaryRegressor(
model=feos.EquationOfStateAD.PcSaftNonAssoc,
datasets=[bp],
params={"m1": 2.0, ..., "k_ij": 0.01},
fit=["k_ij"],
)
bin_result = bin_reg.fit()Output (250 vapor pressures and 250 liquid densities for hexane): Usage Rustuse feos::core::parameter_optimization::*;
use feos::pcsaft::PcSaftPure;
use std::collections::HashMap;
use std::path::Path;
fn main() {
let vp = VaporPressureDataset::from_csv(Path::new("vapor_pressure.csv"))
.expect("failed to read vapor pressure CSV");
let rho = LiquidDensityDataset::from_csv(Path::new("liquid_density.csv"))
.expect("failed to read liquid density CSV");
let datasets = vec![
PureDataset::VaporPressure(vp),
PureDataset::LiquidDensity(rho),
];
let params = HashMap::from([
("m".to_string(), 2.0),
("sigma".to_string(), 3.0),
("epsilon_k".to_string(), 300.0),
("mu".to_string(), 0.0),
]);
let regressor = PureRegressor::<PcSaftPure<f64, 4>>::new(datasets, params, &["m", "sigma", "epsilon_k"])
.expect("failed to build regressor");
let config = RegressorConfig {
patience: 100,
ftol: 1e-12,
xtol: 1e-12,
gtol: 1e-12,
stepbound: 0.1,
strategy: NonConvergenceStrategy::Penalty(10.0),
..Default::default()
};
let (regressor, report) = regressor.fit(config);
let result = regressor.to_result(&report);
println!("converged: {}", result.converged);
println!("reason: {}", result.termination_reason);
println!("n_evaluations: {}", result.n_evaluations);
println!("aad_per_dataset: {:?}", result.aad_per_dataset);
println!("all_parameters: {:?}", result.all_parameters());
let ds_results = regressor.evaluate_datasets(&result.optimal_params);
}Output: |
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR adds parameter optimization utilities to
feos-coreand exposesRegressorobjects to Python.Edit: See current implementation examples and status in comment below.