Program Listing for File workspace.hpp

Return to documentation for file (/tmp/ws/src/proxsuite/include/proxsuite/proxqp/dense/workspace.hpp)

//
// Copyright (c) 2022 INRIA
//
#ifndef PROXSUITE_PROXQP_DENSE_WORKSPACE_HPP
#define PROXSUITE_PROXQP_DENSE_WORKSPACE_HPP

#include <Eigen/Core>
#include <proxsuite/linalg/dense/ldlt.hpp>
#include <proxsuite/proxqp/timings.hpp>
#include <proxsuite/linalg/veg/vec.hpp>
// #include <proxsuite/proxqp/dense/preconditioner/ruiz.hpp>

namespace proxsuite {
namespace proxqp {
namespace dense {

template<typename T>
struct Workspace
{

  proxsuite::linalg::dense::Ldlt<T> ldl{};
  proxsuite::linalg::veg::Vec<unsigned char> ldl_stack;
  Timer<T> timer;

  Mat<T> H_scaled;
  Vec<T> g_scaled;
  Mat<T> A_scaled;
  Mat<T> C_scaled;
  Vec<T> b_scaled;
  Vec<T> u_scaled;
  Vec<T> l_scaled;


  Vec<T> x_prev;
  Vec<T> y_prev;
  Vec<T> z_prev;

  Mat<T> kkt;

  VecISize current_bijection_map;
  VecISize new_bijection_map;

  VecBool active_set_up;
  VecBool active_set_low;
  VecBool active_inequalities;


  Vec<T> Hdx;
  Vec<T> Cdx;
  Vec<T> Adx;

  Vec<T> active_part_z;
  proxsuite::linalg::veg::Vec<T> alphas;

  Vec<T> dw_aug;
  Vec<T> rhs;
  Vec<T> err;


  T dual_feasibility_rhs_2;
  T correction_guess_rhs_g;
  T correction_guess_rhs_b;
  T alpha;

  Vec<T> dual_residual_scaled;
  Vec<T> primal_residual_eq_scaled;
  Vec<T> primal_residual_in_scaled_up;
  Vec<T> primal_residual_in_scaled_low;

  Vec<T> primal_residual_in_scaled_up_plus_alphaCdx;
  Vec<T> primal_residual_in_scaled_low_plus_alphaCdx;
  Vec<T> CTz;

  bool constraints_changed;
  bool dirty;
  bool refactorize;
  bool proximal_parameter_update;
  bool is_initialized;

  sparse::isize n_c; // final number of active inequalities
  Workspace(isize dim = 0, isize n_eq = 0, isize n_in = 0)
    : //
      // ruiz(preconditioner::RuizEquilibration<T>{dim, n_eq + n_in}),
    ldl{}
    , // old version with alloc
    H_scaled(dim, dim)
    , g_scaled(dim)
    , A_scaled(n_eq, dim)
    , C_scaled(n_in, dim)
    , b_scaled(n_eq)
    , u_scaled(n_in)
    , l_scaled(n_in)
    , x_prev(dim)
    , y_prev(n_eq)
    , z_prev(n_in)
    , kkt(dim + n_eq, dim + n_eq)
    , current_bijection_map(n_in)
    , new_bijection_map(n_in)
    , active_set_up(n_in)
    , active_set_low(n_in)
    , active_inequalities(n_in)
    , Hdx(dim)
    , Cdx(n_in)
    , Adx(n_eq)
    , active_part_z(n_in)
    , dw_aug(dim + n_eq + n_in)
    , rhs(dim + n_eq + n_in)
    , err(dim + n_eq + n_in)
    ,

    dual_residual_scaled(dim)
    , primal_residual_eq_scaled(n_eq)
    , primal_residual_in_scaled_up(n_in)
    , primal_residual_in_scaled_low(n_in)
    ,

    primal_residual_in_scaled_up_plus_alphaCdx(n_in)
    , primal_residual_in_scaled_low_plus_alphaCdx(n_in)
    , CTz(dim)
    , constraints_changed(false)
    , dirty(false)
    , refactorize(false)
    , proximal_parameter_update(false)
    , is_initialized(false)

  {
    ldl.reserve_uninit(dim + n_eq + n_in);
    ldl_stack.resize_for_overwrite(
      proxsuite::linalg::veg::dynstack::StackReq(

        proxsuite::linalg::dense::Ldlt<T>::factorize_req(dim + n_eq + n_in) |

        (proxsuite::linalg::dense::temp_vec_req(
           proxsuite::linalg::veg::Tag<T>{}, n_eq + n_in) &
         proxsuite::linalg::veg::dynstack::StackReq{
           isize{ sizeof(isize) } * (n_eq + n_in), alignof(isize) } &
         proxsuite::linalg::dense::Ldlt<T>::diagonal_update_req(
           dim + n_eq + n_in, n_eq + n_in)) |

        (proxsuite::linalg::dense::temp_mat_req(
           proxsuite::linalg::veg::Tag<T>{}, dim + n_eq + n_in, n_in) &
         proxsuite::linalg::dense::Ldlt<T>::insert_block_at_req(
           dim + n_eq + n_in, n_in)) |

        proxsuite::linalg::dense::Ldlt<T>::solve_in_place_req(dim + n_eq +
                                                              n_in))

        .alloc_req());

    alphas.reserve(2 * n_in);
    H_scaled.setZero();
    g_scaled.setZero();
    A_scaled.setZero();
    C_scaled.setZero();
    b_scaled.setZero();
    u_scaled.setZero();
    l_scaled.setZero();
    x_prev.setZero();
    y_prev.setZero();
    z_prev.setZero();
    kkt.setZero();
    for (isize i = 0; i < n_in; i++) {
      current_bijection_map(i) = i;
      new_bijection_map(i) = i;
    }
    Hdx.setZero();
    Cdx.setZero();
    Adx.setZero();
    active_part_z.setZero();
    dw_aug.setZero();
    rhs.setZero();
    err.setZero();

    dual_feasibility_rhs_2 = 0;
    correction_guess_rhs_g = 0;
    correction_guess_rhs_b = 0;
    alpha = 1.;

    dual_residual_scaled.setZero();
    primal_residual_eq_scaled.setZero();
    primal_residual_in_scaled_up.setZero();
    primal_residual_in_scaled_low.setZero();

    primal_residual_in_scaled_up_plus_alphaCdx.setZero();
    primal_residual_in_scaled_low_plus_alphaCdx.setZero();
    CTz.setZero();
    n_c = 0;
  }
  void cleanup()
  {
    isize n_in = C_scaled.rows();
    H_scaled.setZero();
    g_scaled.setZero();
    A_scaled.setZero();
    C_scaled.setZero();
    b_scaled.setZero();
    u_scaled.setZero();
    l_scaled.setZero();
    Hdx.setZero();
    Cdx.setZero();
    Adx.setZero();
    active_part_z.setZero();
    dw_aug.setZero();
    rhs.setZero();
    err.setZero();

    alpha = 1.;

    dual_residual_scaled.setZero();
    primal_residual_eq_scaled.setZero();
    primal_residual_in_scaled_up.setZero();
    primal_residual_in_scaled_low.setZero();

    primal_residual_in_scaled_up_plus_alphaCdx.setZero();
    primal_residual_in_scaled_low_plus_alphaCdx.setZero();
    CTz.setZero();

    x_prev.setZero();
    y_prev.setZero();
    z_prev.setZero();

    for (isize i = 0; i < n_in; i++) {
      current_bijection_map(i) = i;
      new_bijection_map(i) = i;
      active_inequalities(i) = false;
    }
    constraints_changed = false;
    dirty = false;
    refactorize = false;
    proximal_parameter_update = false;
    is_initialized = false;
    n_c = 0;
  }
};
} // namespace dense
} // namespace proxqp
} // namespace proxsuite

#endif /* end of include guard PROXSUITE_PROXQP_DENSE_WORKSPACE_HPP */