use crate::kernel::Kernel;
use crate::newton::StatusExtended;
use crate::problem::Problem;
use crate::Status;
use crate::newton;
use crate::smo;
pub struct Params {
pub smo: smo::Params,
pub newton: newton::Params,
}
impl Params {
pub fn new() -> Params {
Params {
smo: smo::Params::new(),
newton: newton::Params::new(),
}
}
}
pub fn solve(
problem: &dyn Problem,
kernel: &mut dyn Kernel,
params: &Params,
callback_smo: Option<&dyn Fn(&Status) -> bool>,
callback_newton: Option<&dyn Fn(&Status) -> bool>,
) -> StatusExtended {
let n = problem.size();
let mut status = smo::solve(problem, kernel, ¶ms.smo, callback_smo);
let full_set = (0..n).collect();
kernel.set_active(&vec![], &full_set);
problem.recompute_kernel_product(kernel, &mut status, &full_set);
newton::solve_with_status(status, problem, kernel, ¶ms.newton, callback_newton)
}