use amplrs::ampl::Ampl;
use amplrs::dataframe::DataFrame;
fn main() {
let args: Vec<String> = std::env::args().collect();
let mut ampl = Ampl::new();
if args.len() > 1 {
ampl.set_option("solver", &args[1]);
}
let model_dir = if args.len() == 3 {
args[2].clone()
} else {
"examples/models".to_string()
};
ampl.read(&format!("{}/diet/diet.mod", model_dir));
let foods = ["BEEF", "CHK", "FISH", "HAM", "MCH", "MTL", "SPG", "TUR"];
let costs = [3.59, 2.59, 2.29, 2.89, 1.89, 1.99, 1.99, 2.49];
let fmin = [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0];
let fmax = [10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0];
let df = DataFrame::new(1, 0, &["FOOD"]);
df.set_column_strings("FOOD", &foods);
df.add_column_doubles("cost", &costs);
df.add_column_doubles("f_min", &fmin);
df.add_column_doubles("f_max", &fmax);
ampl.set_data(&df, Some("FOOD"));
let nutrients = ["A", "C", "B1", "B2", "NA", "CAL"];
let nmin = [700.0, 700.0, 700.0, 700.0, 0.0, 16000.0];
let nmax = [20000.0, 20000.0, 20000.0, 20000.0, 50000.0, 24000.0];
let df2 = DataFrame::new(1, 0, &["NUTR"]);
df2.set_column_strings("NUTR", &nutrients);
df2.add_column_doubles("n_min", &nmin);
df2.add_column_doubles("n_max", &nmax);
ampl.set_data(&df2, Some("NUTR"));
#[rustfmt::skip]
let amounts: &[f64] = &[
60.0, 8.0, 8.0, 40.0, 15.0, 70.0, 25.0, 60.0, 20.0, 0.0, 10.0, 40.0, 35.0, 30.0, 50.0, 20.0, 10.0, 20.0, 15.0, 35.0, 15.0, 15.0, 25.0, 15.0, 15.0, 20.0, 10.0, 10.0, 15.0, 15.0, 15.0, 10.0, 928.0, 2180.0, 945.0, 278.0, 1182.0, 896.0, 1329.0, 1397.0, 295.0, 770.0, 440.0, 430.0, 315.0, 400.0, 379.0, 450.0, ];
let df3 = DataFrame::new(2, 1, &["NUTR", "FOOD", "amt"]);
df3.set_matrix(&nutrients, &foods, amounts);
ampl.set_data(&df3, None);
ampl.solve("", "");
println!("Objective: {}", ampl.get_objective("Total_Cost").value());
}