GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |
GeezerVison is showing github.com — Add LM regression for parameter optimization in Rust by g-bauer · Pull Request #350 · feos-org/feos Conversation
|
|
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: |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
d7e53a9 to
494700e
Compare
b953aba to
2619325
Compare
At least 1 approving review is required to merge this pull request.
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
There was an error while loading. Please reload this page.