use crate::{constraints::Constraint, FunctionCallResult};
use num::Float;
use std::marker::PhantomData;
pub struct AlmProblem<
MappingAlm,
MappingPm,
ParametricGradientType,
ParametricCostType,
ConstraintsType,
AlmSetC,
LagrangeSetY,
T = f64,
> where
T: Float,
MappingAlm: Fn(&[T], &mut [T]) -> FunctionCallResult,
MappingPm: Fn(&[T], &mut [T]) -> FunctionCallResult,
ParametricGradientType: Fn(&[T], &[T], &mut [T]) -> FunctionCallResult,
ParametricCostType: Fn(&[T], &[T], &mut T) -> FunctionCallResult,
ConstraintsType: Constraint<T>,
AlmSetC: Constraint<T>,
LagrangeSetY: Constraint<T>,
{
pub(crate) constraints: ConstraintsType,
pub(crate) alm_set_c: Option<AlmSetC>,
pub(crate) alm_set_y: Option<LagrangeSetY>,
pub(crate) parametric_cost: ParametricCostType,
pub(crate) parametric_gradient: ParametricGradientType,
pub(crate) mapping_f1: Option<MappingAlm>,
pub(crate) mapping_f2: Option<MappingPm>,
pub(crate) n1: usize,
pub(crate) n2: usize,
marker: PhantomData<T>,
}
impl<
MappingAlm,
MappingPm,
ParametricGradientType,
ParametricCostType,
ConstraintsType,
AlmSetC,
LagrangeSetY,
T,
>
AlmProblem<
MappingAlm,
MappingPm,
ParametricGradientType,
ParametricCostType,
ConstraintsType,
AlmSetC,
LagrangeSetY,
T,
>
where
T: Float,
MappingAlm: Fn(&[T], &mut [T]) -> FunctionCallResult,
MappingPm: Fn(&[T], &mut [T]) -> FunctionCallResult,
ParametricGradientType: Fn(&[T], &[T], &mut [T]) -> FunctionCallResult,
ParametricCostType: Fn(&[T], &[T], &mut T) -> FunctionCallResult,
ConstraintsType: Constraint<T>,
AlmSetC: Constraint<T>,
LagrangeSetY: Constraint<T>,
{
#[allow(clippy::too_many_arguments)]
#[must_use]
pub fn new(
constraints: ConstraintsType,
alm_set_c: Option<AlmSetC>,
alm_set_y: Option<LagrangeSetY>,
parametric_cost: ParametricCostType,
parametric_gradient: ParametricGradientType,
mapping_f1: Option<MappingAlm>,
mapping_f2: Option<MappingPm>,
n1: usize,
n2: usize,
) -> Self {
assert!(
!(mapping_f1.is_none() ^ alm_set_c.is_none()),
"either F1 or C has not been provided"
);
assert!(!(alm_set_c.is_none() ^ (n1 == 0)), "C is Some iff n1 > 0");
assert!(!(alm_set_y.is_none() ^ (n1 == 0)), "Y is Some iff n1 > 0");
assert!(!(mapping_f2.is_none() ^ (n2 == 0)), "F2 is Some iff n2 > 0");
AlmProblem {
constraints,
alm_set_c,
alm_set_y,
parametric_cost,
parametric_gradient,
mapping_f1,
mapping_f2,
n1,
n2,
marker: PhantomData,
}
}
}