6#ifndef PROXSUITE_PROXQP_SPARSE_WORKSPACE_HPP 
    7#define PROXSUITE_PROXQP_SPARSE_WORKSPACE_HPP 
   24#include <Eigen/IterativeLinearSolvers> 
   25#include <unsupported/Eigen/IterativeSolvers> 
   31template<
typename T, 
typename I>
 
   40            proxsuite::linalg::veg::Tag<T>& xtag)
 
   43  T mu_eq_neg = -results.
info.mu_eq;
 
   50      mu_in_neg = -results.
info.mu_in;
 
   69    auto _diag = stack.make_new_for_overwrite(xtag, n_tot);
 
   72    for (
isize i = 0; i < data.
dim; ++i) {
 
   73      diag[i] = results.
info.rho;
 
   76      diag[data.
dim + i] = mu_eq_neg;
 
   79      diag[(data.
dim + data.
n_eq) + i] =
 
   80        active_constraints[i] ? mu_in_neg : T(1);
 
  100                                         results.
info.mu_eq_inv,
 
  101                                         results.
info.mu_in_inv } };
 
 
  106template<
typename T, 
typename I>
 
  118template<
typename T, 
typename I>
 
  140    std::unique_ptr<detail::AugmentedKkt<T, I>>
 
  143    std::unique_ptr<Eigen::MINRES<detail::AugmentedKkt<T, I>,
 
  144                                  Eigen::Upper | Eigen::Lower,
 
  145                                  Eigen::IdentityPreconditioner>>
 
  152        proxsuite::linalg::veg::from_slice_mut,
 
  201    proxsuite::linalg::veg::Tag<I> itag;
 
  206    isize n_tot = n + n_eq + n_in;
 
  216      data.
kkt_values.resize_for_overwrite(nnz_tot);
 
  225      auto insert_submatrix =
 
  227            bool assert_sym_hi) -> 
void {
 
  236            checked_non_negative_plus(kktp[col], I(col_end - col_start));
 
  239          for (
usize p = col_start; p < col_end; ++p) {
 
  240            usize i = zero_extend(mi[p]);
 
  252      insert_submatrix(H, 
true);
 
  253      insert_submatrix(AT, 
false);
 
  254      insert_submatrix(CT, 
false);
 
  270    ldl.col_ptrs.resize_for_overwrite(n_tot + 1);
 
  271    ldl.perm_inv.resize_for_overwrite(n_tot);
 
  275    bool overflow = 
false;
 
  277      ldl.etree.resize_for_overwrite(n_tot);
 
  278      auto etree_ptr = 
ldl.etree.ptr_mut();
 
  282        proxsuite::linalg::sparse::from_raw_parts,
 
  291        ldl.col_ptrs.ptr_mut() +
 
  294        ldl.perm_inv.ptr_mut(),
 
  295        static_cast<I const*
>(
nullptr),
 
  299      auto pcol_ptrs = 
ldl.col_ptrs.ptr_mut();
 
  306        acc += 
u64(zero_extend(pcol_ptrs[i + 1]));
 
  307        if (acc != 
u64(I(acc))) {
 
  310        pcol_ptrs[(i + 1)] = I(acc);
 
 
  364    data.
g = qp.
g.to_eigen();
 
  365    data.
b = qp.
b.to_eigen();
 
  366    data.
l = qp.
l.to_eigen();
 
  367    data.
u = qp.
u.to_eigen();
 
  373    proxsuite::linalg::veg::Tag<I> itag;
 
  374    proxsuite::linalg::veg::Tag<T> xtag;
 
  379    isize n_tot = n + n_eq + n_in;
 
  391        data.
kkt_values.resize_for_overwrite(nnz_tot);
 
  402                                    bool assert_sym_hi) -> 
void {
 
  412              checked_non_negative_plus(kktp[col], I(col_end - col_start));
 
  415            for (
usize p = col_start; p < col_end; ++p) {
 
  416              usize i = zero_extend(mi[p]);
 
  429        insert_submatrix(qp.
H, 
true);
 
  430        insert_submatrix(qp.
AT, 
false);
 
  431        insert_submatrix(qp.
CT, 
false);
 
  448      ldl.col_ptrs.resize_for_overwrite(n_tot + 1);
 
  449      ldl.perm_inv.resize_for_overwrite(n_tot);
 
  453      bool overflow = 
false;
 
  455        ldl.etree.resize_for_overwrite(n_tot);
 
  456        auto etree_ptr = 
ldl.etree.ptr_mut();
 
  460          proxsuite::linalg::sparse::from_raw_parts,
 
  469          ldl.col_ptrs.ptr_mut() + 1,
 
  471          ldl.perm_inv.ptr_mut(),
 
  472          static_cast<I const*
>(
nullptr),
 
  476        auto pcol_ptrs = 
ldl.col_ptrs.ptr_mut();
 
  486          acc += 
u64(zero_extend(pcol_ptrs[i + 1]));
 
  487          if (acc != 
u64(I(acc))) {
 
  490          pcol_ptrs[(i + 1)] = I(acc);
 
  509      auto insert_submatrix =
 
  511        T 
const* mx = m.values();
 
  512        isize ncols = m.ncols();
 
  515          usize col_start = m.col_start(j);
 
  516          usize col_end = m.col_end(j);
 
  517          for (
usize p = col_start; p < col_end; ++p) {
 
  526      insert_submatrix(qp.
H);
 
  527      insert_submatrix(qp.
AT);
 
  528      insert_submatrix(qp.
CT);
 
  531#define PROX_QP_ALL_OF(...)                                                    \ 
  532  ::proxsuite::linalg::veg::dynstack::StackReq::and_(                          \ 
  533    ::proxsuite::linalg::veg::init_list(__VA_ARGS__)) 
  534#define PROX_QP_ANY_OF(...)                                                    \ 
  535  ::proxsuite::linalg::veg::dynstack::StackReq::or_(                           \ 
  536    ::proxsuite::linalg::veg::init_list(__VA_ARGS__)) 
  538    auto refactorize_req =
 
  547              SR::with_len(xtag, n_tot),                        
 
  557            SR::with_len(itag, 0), 
 
  559            SR::with_len(xtag, 0), 
 
  573    auto unscaled_primal_dual_residual_req = x_vec(n); 
 
  587        ldl_solve_in_place_req,
 
  589          SR::with_len(proxsuite::linalg::veg::Tag<bool>{},
 
  591          SR::with_len(proxsuite::linalg::veg::Tag<bool>{},
 
  593          SR::with_len(proxsuite::linalg::veg::Tag<bool>{},
 
  597                                      xtag, itag, n_tot, 
false, n, n_tot),
 
  599                                      xtag, itag, n_tot, n_tot),
 
  621                         unscaled_primal_dual_residual_req,
 
  626                           primal_dual_newton_semi_smooth_req,
 
  638        SR::with_len(proxsuite::linalg::veg::Tag<bool>{},
 
  640        SR::with_len(itag, n_tot), 
 
  646                        SR::with_len(itag, n_tot), 
 
  647                        SR::with_len(itag, n_tot), 
 
  648                        SR::with_len(itag, n_tot), 
 
  649                        SR::with_len(itag, 
lnnz),  
 
  650                        SR::with_len(xtag, 
lnnz),  
 
  653                        SR::with_len(itag, 0),
 
  654                        SR::with_len(xtag, 0),
 
  669      proxsuite::linalg::veg::unsafe,
 
  700      (data.
u.array() <= T(1.E20))
 
  702                Eigen::Matrix<T, Eigen::Dynamic, 1>::Zero(data.
n_in).array() +
 
  705      (data.
l.array() >= T(-1.E20))
 
  707                Eigen::Matrix<T, Eigen::Dynamic, 1>::Zero(data.
n_in).array() -
 
  712      { proxsuite::linalg::sparse::from_eigen, 
g_scaled },
 
  714      { proxsuite::linalg::sparse::from_eigen, 
b_scaled },
 
  716      { proxsuite::linalg::sparse::from_eigen, 
l_scaled },
 
  717      { proxsuite::linalg::sparse::from_eigen, 
u_scaled },
 
  721    precond.scale_qp_in_place(qp_scaled,
 
  730      proxsuite::linalg::sparse::from_raw_parts,
 
  739      kkt.row_indices_mut(),
 
  743    using MatrixFreeSolver = Eigen::MINRES<detail::AugmentedKkt<T, I>,
 
  744                                           Eigen::Upper | Eigen::Lower,
 
  745                                           Eigen::IdentityPreconditioner>;
 
  747      new MatrixFreeSolver,
 
  764    auto zx = proxsuite::linalg::sparse::util::zero_extend; 
 
  765    auto max_lnnz = 
isize(zx(
ldl.col_ptrs[n_tot]));
 
  769    ldl.nnz_counts.resize_for_overwrite(ldlt_ntot);
 
  770    ldl.row_indices.resize_for_overwrite(ldlt_lnnz);
 
  771    ldl.values.resize_for_overwrite(ldlt_lnnz);
 
  773    ldl.perm.resize_for_overwrite(ldlt_ntot);
 
  776      for (
isize i = 0; i < n_tot; ++i) {
 
 
 
#define VEG_ONLY_USED_FOR_DEBUG(var)
auto temp_vec_req(proxsuite::linalg::veg::Tag< T >, isize rows) noexcept -> proxsuite::linalg::veg::dynstack::StackReq
void factorize_symbolic_non_zeros(I *nnz_per_col, I *etree, I *perm_inv, I const *perm, SymbolicMatRef< I > a, DynStackMut stack) noexcept
auto delete_row_req(proxsuite::linalg::veg::Tag< T >, proxsuite::linalg::veg::Tag< I >, isize n, isize max_nnz) noexcept -> proxsuite::linalg::veg::dynstack::StackReq
void factorize_numeric(T *values, I *row_indices, proxsuite::linalg::veg::DoNotDeduce< T const * > diag_to_add, proxsuite::linalg::veg::DoNotDeduce< I const * > perm, I const *col_ptrs, I const *etree, I const *perm_inv, MatRef< T, I > a, DynStackMut stack) noexcept(false)
auto factorize_symbolic_req(proxsuite::linalg::veg::Tag< I > tag, isize n, isize nnz, Ordering o) noexcept -> proxsuite::linalg::veg::dynstack::StackReq
auto factorize_numeric_req(proxsuite::linalg::veg::Tag< T >, proxsuite::linalg::veg::Tag< I >, isize n, isize a_nnz, Ordering o) noexcept -> proxsuite::linalg::veg::dynstack::StackReq
auto add_row_req(proxsuite::linalg::veg::Tag< T >, proxsuite::linalg::veg::Tag< I >, isize n, bool id_perm, isize nnz, isize max_nnz) noexcept -> proxsuite::linalg::veg::dynstack::StackReq
decltype(sizeof(0)) usize
_detail::_meta::make_signed< usize >::Type isize
auto middle_cols_mut(proxsuite::linalg::sparse::MatMut< T, I > mat, isize start, isize ncols, isize nnz) -> proxsuite::linalg::sparse::MatMut< T, I >
auto top_rows_mut_unchecked(proxsuite::linalg::veg::Unsafe, proxsuite::linalg::sparse::MatMut< T, I > mat, isize nrows) -> proxsuite::linalg::sparse::MatMut< T, I >
void refactorize(Workspace< T, I > &work, Results< T > const &results, Settings< T > const &settings, proxsuite::linalg::sparse::MatMut< T, I > kkt_active, proxsuite::linalg::veg::SliceMut< bool > active_constraints, Model< T, I > const &data, proxsuite::linalg::veg::dynstack::DynStackMut stack, proxsuite::linalg::veg::Tag< T > &xtag)
Eigen::Matrix< bool, DYN, 1 > VecBool
#define PROX_QP_ALL_OF(...)
#define PROX_QP_ANY_OF(...)
auto as_const() const noexcept -> MatRef< T, I >
auto symbolic() const noexcept -> SymbolicMatRef< I >
auto values() const noexcept -> T const *
auto col_start(usize j) const noexcept -> usize
auto col_end(usize j) const noexcept -> usize
auto row_indices() const noexcept -> I const *
VEG_NODISCARD VEG_INLINE constexpr auto as_const() const noexcept -> Slice< T >
VEG_NODISCARD VEG_INLINE auto ptr_mut() VEG_NOEXCEPT -> T *
VEG_NODISCARD VEG_INLINE auto ptr() const VEG_NOEXCEPT -> T const *
VEG_NODISCARD auto ptr_mut() const VEG_NOEXCEPT -> void *
static constexpr auto with_len(proxsuite::linalg::veg::Tag< T >, isize len) noexcept -> StackReq
This class stores all the results of PROXQP solvers with sparse and dense backends.
This class defines the settings of PROXQP solvers with sparse and dense backends.
MeritFunctionType merit_function_type
SparseBackend sparse_backend
bool primal_infeasibility_solving
isize preconditioner_max_iter
T preconditioner_accuracy
This class mimics the way "boost/timer/timer.hpp" operates while using the modern std::chrono library...
proxsuite::linalg::veg::Vec< I > nnz_counts
proxsuite::linalg::veg::Vec< I > row_indices
proxsuite::linalg::veg::Vec< T > values
proxsuite::linalg::veg::Vec< I > etree
proxsuite::linalg::veg::Vec< I > perm_inv
proxsuite::linalg::veg::Vec< I > col_ptrs
proxsuite::linalg::veg::Vec< I > perm
This class stores the model of the QP problem.
proxsuite::linalg::veg::Vec< I > kkt_col_ptrs
proxsuite::linalg::veg::Vec< T > kkt_values
proxsuite::linalg::veg::Vec< I > kkt_row_indices_unscaled
proxsuite::linalg::veg::Vec< T > kkt_values_unscaled
auto kkt_mut() -> proxsuite::linalg::sparse::MatMut< T, I >
proxsuite::linalg::veg::Vec< I > kkt_row_indices
proxsuite::linalg::veg::Vec< I > kkt_col_ptrs_unscaled
proxsuite::linalg::sparse::DenseVecRef< T > u
proxsuite::linalg::sparse::MatRef< T, I > AT
proxsuite::linalg::sparse::DenseVecRef< T > b
proxsuite::linalg::sparse::DenseVecRef< T > g
proxsuite::linalg::sparse::MatRef< T, I > CT
proxsuite::linalg::sparse::MatRef< T, I > H
proxsuite::linalg::sparse::DenseVecRef< T > l
This class defines the workspace of the sparse solver.
bool proximal_parameter_update
Eigen::Matrix< T, Eigen::Dynamic, 1 > u_scaled
std::unique_ptr< detail::AugmentedKkt< T, I > > matrix_free_kkt
proxsuite::linalg::veg::Vec< bool > active_inequalities
Eigen::Matrix< T, Eigen::Dynamic, 1 > b_scaled
void setup_impl(const QpView< T, I > qp, Model< T, I > &data, const Settings< T > &settings, bool execute_or_not, P &precond, proxsuite::linalg::veg::dynstack::StackReq precond_req)
auto ldl_col_ptrs_mut() -> I *
std::unique_ptr< Eigen::MINRES< detail::AugmentedKkt< T, I >, Eigen::Upper|Eigen::Lower, Eigen::IdentityPreconditioner > > matrix_free_solver
Eigen::Matrix< T, Eigen::Dynamic, 1 > l_scaled
Eigen::Matrix< T, Eigen::Dynamic, 1 > g_scaled
proxsuite::linalg::veg::Vec< I > kkt_nnz_counts
auto stack_mut() -> proxsuite::linalg::veg::dynstack::DynStackMut
void setup_symbolic_factorizaton(Model< T, I > &data, proxsuite::linalg::sparse::SymbolicMatRef< I > H, proxsuite::linalg::sparse::SymbolicMatRef< I > AT, proxsuite::linalg::sparse::SymbolicMatRef< I > CT)
auto ldl_col_ptrs() const -> I const *
struct proxsuite::proxqp::sparse::Workspace::@264003372134257347371071110143372335131167035304 internal
proxsuite::linalg::veg::Vec< proxsuite::linalg::veg::mem::byte > storage