Program Listing for File backward_data.hpp

Return to documentation for file (include/proxsuite/proxqp/dense/backward_data.hpp)

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

#include <proxsuite/helpers/optional.hpp>
#include <Eigen/Core>
#include "proxsuite/linalg/veg/type_traits/core.hpp"
#include "proxsuite/proxqp/dense/fwd.hpp"

namespace proxsuite {
namespace proxqp {
namespace dense {


template<typename T>
struct BackwardData
{
  using Mat = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;

  // dL_dH
  Mat dL_dH;
  // dL_dg
  Vec<T> dL_dg;
  // dL_dA
  Mat dL_dA;
  // dL_db
  Vec<T> dL_db;
  // dL_dC
  Mat dL_dC;
  // dL_du
  Vec<T> dL_du;
  // dL_dl
  Vec<T> dL_dl;

  bool is_valid(isize dim, isize n_eq, isize n_in)
  {
#define PROXSUITE_CHECK_SIZE(size, expected_size)                              \
  if (size != 0) {                                                             \
    if (!(size == expected_size))                                              \
      return false;                                                            \
  }

    // check that all matrices and vectors of qpmodel have the correct size
    // and that H and C have expected properties

    // dx_dg
    if (dL_dH.size()) {
      PROXSUITE_CHECK_SIZE(dL_dH.rows(), dim);
      PROXSUITE_CHECK_SIZE(dL_dH.cols(), dim);
    } else {
      return false;
    }
    // dL_dg
    if (dL_dg.size()) {
      PROXSUITE_CHECK_SIZE(dL_dg.rows(), dim);
    } else {
      return false;
    }
    // dL_dA
    if (dL_dA.size()) {
      PROXSUITE_CHECK_SIZE(dL_dA.rows(), n_eq);
      PROXSUITE_CHECK_SIZE(dL_dA.cols(), dim);
    } else {
      return false;
    }
    // dL_db
    if (dL_db.size()) {
      PROXSUITE_CHECK_SIZE(dL_db.rows(), n_eq);
    } else {
      return false;
    }
    // dL_dC
    if (dL_dC.size()) {
      PROXSUITE_CHECK_SIZE(dL_dC.rows(), n_in);
      PROXSUITE_CHECK_SIZE(dL_dC.cols(), dim);
    } else {
      return false;
    }
    // dL_du
    if (dL_du.size()) {
      PROXSUITE_CHECK_SIZE(dL_du.rows(), n_in);
    } else {
      return false;
    }
    // dL_dl
    if (dL_dl.size()) {
      PROXSUITE_CHECK_SIZE(dL_dl.rows(), n_in);
    } else {
      return false;
    }
    return true;
#undef PROXSUITE_CHECK_SIZE
  }

  void initialize(isize dim, isize n_eq, isize n_in)
  {
    bool valid_dimensions = is_valid(dim, n_eq, n_in);
    if (valid_dimensions == false) {

      dL_dH.resize(dim, dim);
      dL_dg.resize(dim);
      dL_dA.resize(n_eq, dim);
      dL_db.resize(n_eq);
      dL_dC.resize(n_in, dim);
      dL_du.resize(n_in);
      dL_dl.resize(n_in);
    }
    dL_dH.setZero();
    dL_dg.setZero();
    dL_dA.setZero();
    dL_db.setZero();
    dL_dC.setZero();
    dL_du.setZero();
    dL_dl.setZero();
  }
};

} // namespace dense
} // namespace proxqp
} // namespace proxsuite

#endif /* end of include guard PROXSUITE_PROXQP_DENSE_BACKWARD_DATA_HPP */