use crate::{constraints, continuation::ContinuationMode, SolverError};
pub struct HomotopyProblem<
ParametricPenaltyFunctionType,
ParametricGradientType,
ConstraintType,
ParametricCostType,
> where
ParametricPenaltyFunctionType: Fn(&[f64], &[f64], &mut [f64]) -> Result<(), SolverError>,
ParametricGradientType: Fn(&[f64], &[f64], &mut [f64]) -> Result<(), SolverError>,
ParametricCostType: Fn(&[f64], &[f64], &mut f64) -> Result<(), SolverError>,
ConstraintType: constraints::Constraint,
{
pub(crate) constraints: ConstraintType,
pub(crate) parametric_gradient: ParametricGradientType,
pub(crate) parametric_cost: ParametricCostType,
pub(crate) penalty_function: ParametricPenaltyFunctionType,
pub(crate) idx: Vec<usize>,
pub(crate) from: Vec<f64>,
pub(crate) to: Vec<f64>,
pub(crate) transition_mode: Vec<ContinuationMode>,
pub(crate) num_penalty_constraints: usize,
}
impl<ParametricPenaltyFunctionType, ParametricGradientType, ConstraintType, ParametricCostType>
HomotopyProblem<
ParametricPenaltyFunctionType,
ParametricGradientType,
ConstraintType,
ParametricCostType,
>
where
ParametricPenaltyFunctionType: Fn(&[f64], &[f64], &mut [f64]) -> Result<(), SolverError>,
ParametricGradientType: Fn(&[f64], &[f64], &mut [f64]) -> Result<(), SolverError>,
ParametricCostType: Fn(&[f64], &[f64], &mut f64) -> Result<(), SolverError>,
ConstraintType: constraints::Constraint,
{
pub fn new(
constraints: ConstraintType,
parametric_gradient: ParametricGradientType,
parametric_cost: ParametricCostType,
penalty_function: ParametricPenaltyFunctionType,
num_penalty_constraints: usize,
) -> HomotopyProblem<
ParametricPenaltyFunctionType,
ParametricGradientType,
ConstraintType,
ParametricCostType,
> {
HomotopyProblem {
constraints: constraints,
parametric_gradient: parametric_gradient,
parametric_cost: parametric_cost,
penalty_function: penalty_function,
idx: Vec::new(),
from: Vec::new(),
to: Vec::new(),
transition_mode: Vec::new(),
num_penalty_constraints: num_penalty_constraints,
}
}
pub fn add_continuation(
&mut self,
idx: usize,
from: f64,
to: f64,
transition: ContinuationMode,
) {
self.idx.push(idx);
self.from.push(from);
self.to.push(to);
self.transition_mode.push(transition);
}
pub fn add_continuations(
&mut self,
idx: &[usize],
from: &[f64],
to: &[f64],
transition: &[ContinuationMode],
) {
self.idx.extend(idx);
self.from.extend(from);
self.to.extend(to);
self.transition_mode.extend(transition);
}
}