1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
//! An optimization problem
//!
//! This struct defines an optimization problem in terms of its cost function
//! (cost function and its gradient) and constraints
//!
//! Cost functions are user defined. They can either be defined in Rust or in
//! C (and then invoked from Rust via an interface such as icasadi).
//!
use crate::{constraints, FunctionCallResult};
/// Definition of an optimisation problem
///
/// The definition of an optimisation problem involves:
/// - the gradient of the cost function
/// - the cost function
/// - the set of constraints, which is described by implementations of
/// [Constraint](../../panoc_rs/constraints/trait.Constraint.html)
pub struct Problem<'a, GradientType, ConstraintType, CostType>
where
GradientType: Fn(&[f64], &mut [f64]) -> FunctionCallResult,
CostType: Fn(&[f64], &mut f64) -> FunctionCallResult,
ConstraintType: constraints::Constraint,
{
/// constraints
pub(crate) constraints: &'a ConstraintType,
/// gradient of the cost
pub(crate) gradf: GradientType,
/// cost function
pub(crate) cost: CostType,
}
impl<'a, GradientType, ConstraintType, CostType> Problem<'a, GradientType, ConstraintType, CostType>
where
GradientType: Fn(&[f64], &mut [f64]) -> FunctionCallResult,
CostType: Fn(&[f64], &mut f64) -> FunctionCallResult,
ConstraintType: constraints::Constraint,
{
/// Construct a new instance of an optimisation problem
///
/// ## Arguments
///
/// - `constraints` constraints
/// - `cost_gradient` gradient of the cost function
/// - `cost` cost function
///
/// ## Returns
///
/// New instance of `Problem`
pub fn new(
constraints: &'a ConstraintType,
cost_gradient: GradientType,
cost: CostType,
) -> Problem<'a, GradientType, ConstraintType, CostType> {
Problem {
constraints,
gradf: cost_gradient,
cost,
}
}
}