Nonconvex constrained optimization
Loading...
Searching...
No Matches
dl-problem.h File Reference
#include <stddef.h>
#include <stdint.h>
#include <any>
#include <exception>
#include <functional>
#include <map>
#include <string>
Include dependency graph for dl-problem.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  alpaqa_register_arg_t
 User-provided argument that is passed to the problem registration functions. More...
struct  alpaqa_dense_t
struct  alpaqa_sparse_csc_t
struct  alpaqa_sparse_csc_l_t
struct  alpaqa_sparse_csc_ll_t
struct  alpaqa_sparse_coo_t
struct  alpaqa_sparse_coo_l_t
struct  alpaqa_sparse_coo_ll_t
struct  alpaqa_sparsity_t
 Sparsity of matrices. More...
struct  alpaqa_problem_functions_t
 C API providing function pointers to problem functions. More...
struct  alpaqa_problem_register_t
struct  alpaqa_control_problem_functions_t
struct  alpaqa_control_problem_register_t
struct  alpaqa_function_dict_s
struct  alpaqa_exception_ptr_s
struct  function_wrapper_t< Signature >
 Custom type for which we can export the RTTI to support std::any across shared library boundaries when using libc++. More...
union  alpaqa_sparsity_t.__unnamed0__

Namespaces

namespace  alpaqa
namespace  alpaqa::detail

Macros

#define ALPAQA_DL_ABI_VERSION   0xA1A000000005
#define ALPAQA_DL_PROBLEM_EXPORT
#define ALPAQA_DEFAULT(...)
#define ALPAQA_PROBLEM_REGISTER_INIT(self)
 Initialize an instance of alpaqa_problem_register_t or alpaqa_control_problem_register_t.

Typedefs

typedef double alpaqa_real_t
typedef ptrdiff_t alpaqa_length_t
typedef alpaqa_length_t alpaqa_index_t
typedef uint64_t alpaqa_dl_abi_version_t
typedef struct alpaqa_register_arg_t alpaqa_register_arg_t
typedef struct alpaqa_dense_t alpaqa_dense_t
typedef struct alpaqa_problem_functions_t alpaqa_problem_functions_t
typedef struct alpaqa_function_dict_s alpaqa_function_dict_t
 Opaque type for a C++-only map of extra functions.
typedef struct alpaqa_exception_ptr_s alpaqa_exception_ptr_t
 Opaque type for a C++-only exception pointer.
typedef struct alpaqa_problem_register_t alpaqa_problem_register_t
typedef struct alpaqa_control_problem_functions_t alpaqa_control_problem_functions_t
typedef struct alpaqa_control_problem_register_t alpaqa_control_problem_register_t
using function_dict_t = alpaqa_function_dict_t
using problem_register_t = alpaqa_problem_register_t
using control_problem_register_t = alpaqa_control_problem_register_t
using problem_functions_t = alpaqa_problem_functions_t
using control_problem_functions_t = alpaqa_control_problem_functions_t

Enumerations

enum  alpaqa_register_arg_type_t { alpaqa_register_arg_unspecified = 0 , alpaqa_register_arg_std_any = 1 , alpaqa_register_arg_strings = 2 , alpaqa_register_arg_py_args = 3 }
enum  alpaqa_symmetry { alpaqa_unsymmetric = 0 , alpaqa_upper = 1 , alpaqa_lower = 2 }

Functions

static void alpaqa_problem_register_init (alpaqa_problem_register_t *self)
static void alpaqa_control_problem_register_init (alpaqa_control_problem_register_t *self)
template<class Signature>
 function_wrapper_t (std::function< Signature >) -> function_wrapper_t< Signature >
template<class Func>
void register_function (function_dict_t *&extra_functions, std::string name, Func &&func)
 Make the given function available to alpaqa.
template<class Func>
void register_function (problem_register_t &result, std::string name, Func &&func)
template<class Func>
void register_function (control_problem_register_t &result, std::string name, Func &&func)
template<class Result, class T, class Ret, class... Args>
void register_member_function (Result &result, std::string name, Ret(T::*member)(Args...))
template<auto Member, class Class, class Ret, class... Args>
static auto member_caller (Ret(Class::*)(Args...))
 Overload for non-const-qualified member functions.
template<auto Member, class Class, class Ret>
static auto member_caller (Ret Class::*)
 Overload for member variables.
template<auto Member>
static auto member_caller ()
 Wrap the given member function or variable into a (possibly generic) lambda function that accepts the instance as a type-erased void pointer.
void unregister_functions (function_dict_t *&extra_functions)
 Cleans up the extra functions registered by register_function.

Class Documentation

◆ alpaqa_register_arg_t

struct alpaqa_register_arg_t
Collaboration diagram for alpaqa_register_arg_t:
Class Members
void * data {nullptr} Pointer to the user-provided argument passed to the problem registration functions.

Use the type member to determine its type.

alpaqa_register_arg_type_t type {alpaqa_register_arg_unspecified} Specifies the type of the data pointed to by data.

◆ alpaqa_dense_t

struct alpaqa_dense_t
Collaboration diagram for alpaqa_dense_t:
Class Members
alpaqa_length_t rows {0}
alpaqa_length_t cols {0}
alpaqa_symmetry symmetry {alpaqa_unsymmetric}

◆ alpaqa_problem_functions_t

struct alpaqa_problem_functions_t
Collaboration diagram for alpaqa_problem_functions_t:
Class Members
alpaqa_length_t num_variables {0} Number of decision variables.
See also
get_num_variables()
alpaqa_length_t num_constraints {0} Number of constraints.
See also
get_num_constraints()
const char * name {nullptr} Name of the problem.
See also
get_name()
alpaqa_real_t(*)(void *instance, const alpaqa_real_t *x) eval_objective Cost function.
See also
eval_objective()
void(*)(void *instance, const alpaqa_real_t *x, alpaqa_real_t *grad_fx) eval_objective_gradient Gradient of the cost function.
See also
eval_objective_gradient()
void(*)(void *instance, const alpaqa_real_t *x, alpaqa_real_t *gx) eval_constraints Constraints function.
See also
eval_constraints()
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, alpaqa_real_t *grad_gxy) eval_constraints_gradient_product Gradient-vector product of the constraints function.
See also
eval_constraints_gradient_product()
void(*)(void *instance, const alpaqa_real_t *z, alpaqa_real_t *e) eval_projecting_difference_constraints Difference between point and its projection onto the general constraint set D.
See also
eval_projecting_difference_constraints()
void(*)(void *instance, alpaqa_real_t *y, alpaqa_real_t M) eval_projection_multipliers Project the Lagrange multipliers.
See also
eval_projection_multipliers()
alpaqa_real_t(*)(void *instance, alpaqa_real_t γ, const alpaqa_real_t *x, const alpaqa_real_t *grad_ψ, alpaqa_real_t *x̂, alpaqa_real_t *p) eval_proximal_gradient_step Proximal gradient step.
See also
eval_proximal_gradient_step() If not set, the default implementation from BoxConstrProblem is used.
alpaqa_index_t(*)(void *instance, alpaqa_real_t γ, const alpaqa_real_t *x, const alpaqa_real_t *grad_ψ, alpaqa_index_t *J) eval_inactive_indices_res_lna Active indices for proximal operator.
See also
eval_inactive_indices_res_lna() If not set, the default implementation from BoxConstrProblem is used.
void(*)(void *instance, const alpaqa_real_t *x, alpaqa_real_t *J_values) eval_constraints_jacobian Jacobian of the constraints function.
See also
eval_constraints_jacobian()
alpaqa_sparsity_t(*)(void *instance) get_constraints_jacobian_sparsity Get the sparsity pattern of the Jacobian of the constraints function.
See also
get_constraints_jacobian_sparsity()
void(*)(void *instance, const alpaqa_real_t *x, alpaqa_index_t i, alpaqa_real_t *grad_gi) eval_grad_gi Gradient of specific constraint function.
See also
eval_grad_gi()
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, alpaqa_real_t scale, const alpaqa_real_t *v, alpaqa_real_t *Hv) eval_lagrangian_hessian_product Hessian-vector product of the Lagrangian.
See also
eval_lagrangian_hessian_product()
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, alpaqa_real_t scale, alpaqa_real_t *H_values) eval_lagrangian_hessian Hessian of the Lagrangian.
See also
eval_lagrangian_hessian()
alpaqa_sparsity_t(*)(void *instance) get_lagrangian_hessian_sparsity Get the sparsity pattern of the Hessian of the Lagrangian.
See also
get_lagrangian_hessian_sparsity()
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, const alpaqa_real_t *Σ, alpaqa_real_t scale, const alpaqa_real_t *zl, const alpaqa_real_t *zu, const alpaqa_real_t *v, alpaqa_real_t *Hv) eval_augmented_lagrangian_hessian_product Hessian-vector product of the augmented Lagrangian.
See also
eval_augmented_lagrangian_hessian_product()
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, const alpaqa_real_t *Σ, alpaqa_real_t scale, const alpaqa_real_t *zl, const alpaqa_real_t *zu, alpaqa_real_t *H_values) eval_augmented_lagrangian_hessian Hessian of the augmented Lagrangian.
See also
eval_augmented_lagrangian_hessian()
alpaqa_sparsity_t(*)(void *instance) get_augmented_lagrangian_hessian_sparsity Get the sparsity pattern of the Hessian of the augmented Lagrangian.
See also
get_augmented_lagrangian_hessian_sparsity()
alpaqa_real_t(*)(void *instance, const alpaqa_real_t *x, alpaqa_real_t *grad_fx) eval_objective_and_gradient Cost and its gradient.
See also
eval_objective_and_gradient()
alpaqa_real_t(*)(void *instance, const alpaqa_real_t *x, alpaqa_real_t *g) eval_objective_and_constraints Cost and constraints.
See also
eval_objective_and_constraints()
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, alpaqa_real_t *grad_f, alpaqa_real_t *grad_gxy) eval_objective_gradient_and_constraints_gradient_product Gradient of the cost and gradient-vector product of the constraints.
See also
eval_objective_gradient_and_constraints_gradient_product()
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, alpaqa_real_t *grad_L, alpaqa_real_t *work_n) eval_lagrangian_gradient Gradient of the Lagrangian.
See also
eval_lagrangian_gradient()
alpaqa_real_t(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, const alpaqa_real_t *Σ, const alpaqa_real_t *zl, const alpaqa_real_t *zu, alpaqa_real_t *ŷ) eval_augmented_lagrangian Augmented Lagrangian.
See also
eval_augmented_lagrangian()
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, const alpaqa_real_t *Σ, const alpaqa_real_t *zl, const alpaqa_real_t *zu, alpaqa_real_t *grad_ψ, alpaqa_real_t *work_n, alpaqa_real_t *work_m) eval_augmented_lagrangian_gradient Gradient of the augmented Lagrangian.
See also
eval_augmented_lagrangian_gradient()
alpaqa_real_t(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *y, const alpaqa_real_t *Σ, const alpaqa_real_t *zl, const alpaqa_real_t *zu, alpaqa_real_t *grad_ψ, alpaqa_real_t *work_n, alpaqa_real_t *work_m) eval_augmented_lagrangian_and_gradient Augmented Lagrangian and its gradient.
See also
eval_augmented_lagrangian_and_gradient()
void(*)(void *instance, alpaqa_real_t *lb, alpaqa_real_t *ub) initialize_variable_bounds Provide the initial values for the bounds of variable_bounds, i.e.

the box constraints on the decision variables.

void(*)(void *instance, alpaqa_real_t *lb, alpaqa_real_t *ub) initialize_general_bounds Provide the initial values for the bounds of general_bounds, i.e.

the general constraints.

void(*)(void *instance, alpaqa_real_t *lambda, alpaqa_length_t *size) initialize_l1_reg Provide the initial values for l1_reg, the ℓ₁-regularization factor.

This function is called twice:

  1. with lambda set to nullptr, and the user should set the size.
  2. with lambda pointing to an array of that size, and the user should initialize this array.

◆ alpaqa_problem_register_t

struct alpaqa_problem_register_t
Collaboration diagram for alpaqa_problem_register_t:
Class Members
alpaqa_dl_abi_version_t abi_version { 0xA1A000000005 } To check whether the loaded problem is compatible with the version of the solver.
void * instance {nullptr} Owning pointer.
alpaqa_problem_functions_t * functions {nullptr} Non-owning pointer, lifetime at least as long as instance.
void(*)(void *) cleanup Pointer to the function to clean up instance.
alpaqa_function_dict_t * extra_functions {nullptr} Pointer to a map of extra functions (C++ only).
See also
register_function
register_member_function
alpaqa_exception_ptr_t * exception {nullptr} Pointer to an exception that ocurred during problem creation.

◆ alpaqa_control_problem_functions_t

struct alpaqa_control_problem_functions_t
Collaboration diagram for alpaqa_control_problem_functions_t:
Class Members
alpaqa_length_t N {0}
alpaqa_length_t nx {0}
alpaqa_length_t nu {0}
alpaqa_length_t nh {0}
alpaqa_length_t nh_N {0}
alpaqa_length_t nc {0}
alpaqa_length_t nc_N {0}
void(*)(void *instance, alpaqa_real_t *lb, alpaqa_real_t *ub) get_U
void(*)(void *instance, alpaqa_real_t *lb, alpaqa_real_t *ub) get_D
void(*)(void *instance, alpaqa_real_t *lb, alpaqa_real_t *ub) get_D_N
void(*)(void *instance, alpaqa_real_t *x_init) get_x_init
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *x, const alpaqa_real_t *u, alpaqa_real_t *fxu) eval_f
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *x, const alpaqa_real_t *u, alpaqa_real_t *J_fxu) eval_jac_f
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *x, const alpaqa_real_t *u, const alpaqa_real_t *p, alpaqa_real_t *grad_fxu_p) eval_grad_f_prod
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *x, const alpaqa_real_t *u, alpaqa_real_t *h) eval_h
void(*)(void *instance, const alpaqa_real_t *x, alpaqa_real_t *h) eval_h_N
alpaqa_real_t(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *h) eval_l
alpaqa_real_t(*)(void *instance, const alpaqa_real_t *h) eval_l_N
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *xu, const alpaqa_real_t *h, alpaqa_real_t *qr) eval_qr
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *h, alpaqa_real_t *q) eval_q_N
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *xu, const alpaqa_real_t *h, alpaqa_real_t *Q) eval_add_Q
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *h, alpaqa_real_t *Q) eval_add_Q_N
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *xu, const alpaqa_real_t *h, const alpaqa_index_t *mask, alpaqa_real_t *R, alpaqa_real_t *work) eval_add_R_masked
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *xu, const alpaqa_real_t *h, const alpaqa_index_t *mask, alpaqa_real_t *S, alpaqa_real_t *work) eval_add_S_masked
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *xu, const alpaqa_real_t *h, const alpaqa_index_t *mask_J, const alpaqa_index_t *mask_K, const alpaqa_real_t *v, alpaqa_real_t *out, alpaqa_real_t *work) eval_add_R_prod_masked
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *xu, const alpaqa_real_t *h, const alpaqa_index_t *mask_K, const alpaqa_real_t *v, alpaqa_real_t *out, alpaqa_real_t *work) eval_add_S_prod_masked
alpaqa_length_t(*)(void *instance) get_R_work_size
alpaqa_length_t(*)(void *instance) get_S_work_size
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *x, alpaqa_real_t *c) eval_constr
void(*)(void *instance, const alpaqa_real_t *x, alpaqa_real_t *c) eval_constr_N
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *x, const alpaqa_real_t *p, alpaqa_real_t *grad_cx_p) eval_grad_constr_prod
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *p, alpaqa_real_t *grad_cx_p) eval_grad_constr_prod_N
void(*)(void *instance, alpaqa_index_t timestep, const alpaqa_real_t *x, const alpaqa_real_t *M, alpaqa_real_t *out) eval_add_gn_hess_constr
void(*)(void *instance, const alpaqa_real_t *x, const alpaqa_real_t *M, alpaqa_real_t *out) eval_add_gn_hess_constr_N

◆ alpaqa_control_problem_register_t

struct alpaqa_control_problem_register_t
Collaboration diagram for alpaqa_control_problem_register_t:
Class Members
alpaqa_dl_abi_version_t abi_version { 0xA1A000000005 } To check whether the loaded problem is compatible with the version of the solver.
void * instance {nullptr} Owning pointer.
alpaqa_control_problem_functions_t * functions {nullptr} Non-owning pointer, lifetime at least as long as instance.
void(*)(void *) cleanup Pointer to the function to clean up instance.
alpaqa_function_dict_t * extra_functions {nullptr} Pointer to a map of extra functions (C++ only).
alpaqa_exception_ptr_t * exception {nullptr} Pointer to an exception that ocurred during problem creation.

◆ alpaqa_function_dict_s

struct alpaqa_function_dict_s
Collaboration diagram for alpaqa_function_dict_s:
Class Members
map< string, any > dict {}

◆ alpaqa_exception_ptr_s

struct alpaqa_exception_ptr_s
Collaboration diagram for alpaqa_exception_ptr_s:
Class Members
exception_ptr exc {}

◆ alpaqa::detail::function_wrapper_t

struct alpaqa::detail::function_wrapper_t
Collaboration diagram for function_wrapper_t< Signature >:
Class Members
function< Signature > function

◆ alpaqa_sparsity_t.__unnamed0__

union alpaqa_sparsity_t.__unnamed0__
Collaboration diagram for alpaqa_sparsity_t.__unnamed0__:
Class Members
alpaqa_dense_t dense
alpaqa_sparse_csc_t sparse_csc
alpaqa_sparse_csc_l_t sparse_csc_l
alpaqa_sparse_csc_ll_t sparse_csc_ll
alpaqa_sparse_coo_t sparse_coo
alpaqa_sparse_coo_l_t sparse_coo_l
alpaqa_sparse_coo_ll_t sparse_coo_ll

Macro Definition Documentation

◆ ALPAQA_DL_ABI_VERSION

#define ALPAQA_DL_ABI_VERSION   0xA1A000000005

◆ ALPAQA_DL_PROBLEM_EXPORT

#define ALPAQA_DL_PROBLEM_EXPORT

Definition at line 16 of file dl-problem.h.

◆ ALPAQA_DEFAULT

#define ALPAQA_DEFAULT ( ...)
Value:
{__VA_ARGS__}

Definition at line 21 of file dl-problem.h.

◆ ALPAQA_PROBLEM_REGISTER_INIT

#define ALPAQA_PROBLEM_REGISTER_INIT ( self)
Value:
_Generic((self), \
static void alpaqa_control_problem_register_init(alpaqa_control_problem_register_t *self)
Definition dl-problem.h:650
static void alpaqa_problem_register_init(alpaqa_problem_register_t *self)
Definition dl-problem.h:644

Initialize an instance of alpaqa_problem_register_t or alpaqa_control_problem_register_t.

It initializes all members to zero, except for the ABI version, which is initialized to the current ABI version. Available in C only (unnecessary in C++).

Parameters
selfA pointer to the instance to initialize.
Examples
C++/DLProblem/main.cpp.

Definition at line 661 of file dl-problem.h.

Typedef Documentation

◆ alpaqa_real_t

typedef double alpaqa_real_t
Examples
C++/DLProblem/main.cpp.

Definition at line 26 of file dl-problem.h.

◆ alpaqa_length_t

typedef ptrdiff_t alpaqa_length_t
Examples
C++/DLProblem/main.cpp.

Definition at line 27 of file dl-problem.h.

◆ alpaqa_index_t

Examples
C++/DLProblem/main.cpp.

Definition at line 28 of file dl-problem.h.

◆ alpaqa_dl_abi_version_t

◆ alpaqa_register_arg_t

typedef struct alpaqa_register_arg_t alpaqa_register_arg_t

Definition at line 68 of file dl-problem.h.

◆ alpaqa_dense_t

typedef struct alpaqa_dense_t alpaqa_dense_t

Definition at line 82 of file dl-problem.h.

◆ alpaqa_problem_functions_t

typedef struct alpaqa_problem_functions_t alpaqa_problem_functions_t

Definition at line 432 of file dl-problem.h.

◆ alpaqa_function_dict_t

Opaque type for a C++-only map of extra functions.

Definition at line 435 of file dl-problem.h.

◆ alpaqa_exception_ptr_t

Opaque type for a C++-only exception pointer.

Examples
problems/sparse-logistic-regression.cpp.

Definition at line 437 of file dl-problem.h.

◆ alpaqa_problem_register_t

typedef struct alpaqa_problem_register_t alpaqa_problem_register_t

Definition at line 460 of file dl-problem.h.

◆ alpaqa_control_problem_functions_t

typedef struct alpaqa_control_problem_functions_t alpaqa_control_problem_functions_t

Definition at line 614 of file dl-problem.h.

◆ alpaqa_control_problem_register_t

typedef struct alpaqa_control_problem_register_t alpaqa_control_problem_register_t

Definition at line 636 of file dl-problem.h.

Enumeration Type Documentation

◆ alpaqa_register_arg_type_t

Enumerator
alpaqa_register_arg_unspecified 

No type was specified (discouraged).

alpaqa_register_arg_std_any 

The data pointer points to a C++ std::any object.

Use reinterpret_cast<std::any *>(data) to convert back. Then use std::any_cast to get the actual value out.

Warning
std::any relies on RTTI that is included in both the dynamically loaded problem module and in the code that actually loads that module. Types that need to be passed between the loading and loaded code need to be exported as public classes to ensure that only a single symbol ends up in the final application. If the RTTI symbols are private, each library will end up with its own local copy, and the type information won't compare equal when using libc++, causing std::any_cast to fail.
alpaqa_register_arg_strings 

The data pointer points to a dynamic C++ std::span of std::string_view.

Use reinterpret_cast<std::span<std::string_view> *>(data) to convert back.

alpaqa_register_arg_py_args 

The data pointer points to a C++ tuple of pybind11::args and pybind11::kwargs.

Use reinterpret_cast<std::tuple<pybind11::args, pybind11::kwargs> *>(data) to convert back.

Definition at line 31 of file dl-problem.h.

◆ alpaqa_symmetry

See also
alpaqa::sparsity::Symmetry
Enumerator
alpaqa_unsymmetric 
alpaqa_upper 
alpaqa_lower 

Definition at line 71 of file dl-problem.h.

Function Documentation

◆ alpaqa_problem_register_init()

void alpaqa_problem_register_init ( alpaqa_problem_register_t * self)
inlinestatic

Definition at line 644 of file dl-problem.h.

◆ alpaqa_control_problem_register_init()

void alpaqa_control_problem_register_init ( alpaqa_control_problem_register_t * self)
inlinestatic

Definition at line 650 of file dl-problem.h.