Skip to content

Commit

Permalink
feat!: implement high-level API for solving and optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
pnevyk committed Nov 14, 2023
1 parent 16de444 commit f9fba37
Show file tree
Hide file tree
Showing 3 changed files with 672 additions and 74 deletions.
51 changes: 23 additions & 28 deletions examples/rosenbrock.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use gomez::algo::TrustRegion;
use gomez::nalgebra as na;
use gomez::{Domain, Problem, Solver, System};
use gomez::{Domain, Problem, SolverDriver, System};
use na::{Dynamic, IsContiguous};

// https://en.wikipedia.org/wiki/Rosenbrock_function
Expand Down Expand Up @@ -33,31 +32,27 @@ impl System for Rosenbrock {

fn main() -> Result<(), String> {
let f = Rosenbrock { a: 1.0, b: 1.0 };
let dom = f.domain();
let mut solver = TrustRegion::new(&f, &dom);

// Initial guess.
let mut x = na::dvector![-10.0, -5.0];

let mut fx = na::dvector![0.0, 0.0];

for i in 1..=100 {
solver
.solve_next(&f, &dom, &mut x, &mut fx)
.map_err(|err| format!("{}", err))?;

println!(
"iter = {}\t|| fx || = {}\tx = {:?}",
i,
fx.norm(),
x.as_slice()
);

if fx.norm() < 1e-6 {
println!("solved");
return Ok(());
}
let mut solver = SolverDriver::builder(&f)
.with_initial(vec![-10.0, -5.0])
.build();

let tolerance = 1e-6;

let result = solver
.find(|state| {
println!(
"iter = {}\t|| fx || = {}\tx = {:?}",
state.iter(),
state.norm(),
state.x()
);
state.norm() <= tolerance || state.iter() >= 100
})
.map_err(|error| format!("{error}"))?;

if result <= tolerance {
Ok(())
} else {
Err("did not converge".to_string())
}

Err("did not converge".to_string())
}
Loading

0 comments on commit f9fba37

Please sign in to comment.