Program Listing for File matrix-block.hpp

Return to documentation for file (include/pinocchio/math/matrix-block.hpp)

//
// Copyright (c) 2019 INRIA
//

#ifndef __pinocchio_math_matrix_block_hpp__
#define __pinocchio_math_matrix_block_hpp__

#include <Eigen/Core>

namespace pinocchio
{
  template<int NV>
  struct SizeDepType
  {
    template<class Mat>
    struct SegmentReturn
    {
      typedef typename Mat::template FixedSegmentReturnType<NV>::Type Type;
      typedef typename Mat::template ConstFixedSegmentReturnType<NV>::Type ConstType;
    };

    template<typename D>
    static typename SegmentReturn<D>::ConstType segment(
      const Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size = NV)
    {
      PINOCCHIO_UNUSED_VARIABLE(size);
      return mat.template segment<NV>(start);
    }

    template<typename D>
    static typename SegmentReturn<D>::Type segment(
      Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size = NV)
    {
      PINOCCHIO_UNUSED_VARIABLE(size);
      return mat.template segment<NV>(start);
    }

    template<class Mat>
    struct ColsReturn
    {
      typedef typename Mat::template NColsBlockXpr<NV>::Type Type;
      typedef typename Mat::template ConstNColsBlockXpr<NV>::Type ConstType;
    };

    template<typename D>
    static typename ColsReturn<D>::ConstType middleCols(
      const Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size = NV)
    {
      PINOCCHIO_UNUSED_VARIABLE(size);
      return mat.template middleCols<NV>(start);
    }

    template<typename D>
    static typename ColsReturn<D>::Type middleCols(
      Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size = NV)
    {
      PINOCCHIO_UNUSED_VARIABLE(size);
      return mat.template middleCols<NV>(start);
    }

    template<class Mat>
    struct RowsReturn
    {
      typedef typename Mat::template NRowsBlockXpr<NV>::Type Type;
      typedef typename Mat::template ConstNRowsBlockXpr<NV>::Type ConstType;
    };

    template<typename D>
    static typename RowsReturn<D>::ConstType middleRows(
      const Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size = NV)
    {
      PINOCCHIO_UNUSED_VARIABLE(size);
      return mat.template middleRows<NV>(start);
    }

    template<typename D>
    static typename RowsReturn<D>::Type middleRows(
      Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size = NV)
    {
      PINOCCHIO_UNUSED_VARIABLE(size);
      return mat.template middleRows<NV>(start);
    }

    template<class Mat>
    struct BlockReturn
    {
      typedef Eigen::Block<Mat, NV, NV> Type;
      typedef const Eigen::Block<const Mat, NV, NV> ConstType;
    };

    template<typename D>
    static typename BlockReturn<D>::ConstType block(
      const Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index row_id,
      typename Eigen::DenseBase<D>::Index col_id,
      typename Eigen::DenseBase<D>::Index row_size_block = NV,
      typename Eigen::DenseBase<D>::Index col_size_block = NV)
    {
      PINOCCHIO_UNUSED_VARIABLE(row_size_block);
      PINOCCHIO_UNUSED_VARIABLE(col_size_block);
      return mat.template block<NV, NV>(row_id, col_id);
    }

    template<typename D>
    static typename BlockReturn<D>::Type block(
      Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index row_id,
      typename Eigen::DenseBase<D>::Index col_id,
      typename Eigen::DenseBase<D>::Index row_size_block = NV,
      typename Eigen::DenseBase<D>::Index col_size_block = NV)
    {
      PINOCCHIO_UNUSED_VARIABLE(row_size_block);
      PINOCCHIO_UNUSED_VARIABLE(col_size_block);
      return mat.template block<NV, NV>(row_id, col_id);
    }
  };

  template<>
  struct SizeDepType<Eigen::Dynamic>
  {
    template<class Mat>
    struct SegmentReturn
    {
      typedef typename Mat::SegmentReturnType Type;
      typedef typename Mat::ConstSegmentReturnType ConstType;
    };

    template<typename D>
    static typename SegmentReturn<D>::ConstType segment(
      const Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size)
    {
      return mat.segment(start, size);
    }

    template<typename D>
    static typename SegmentReturn<D>::Type segment(
      Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size)
    {
      return mat.segment(start, size);
    }

    template<class Mat>
    struct ColsReturn
    {
      typedef typename Mat::ColsBlockXpr Type;
      typedef typename Mat::ConstColsBlockXpr ConstType;
    };

    template<typename D>
    static typename ColsReturn<D>::ConstType middleCols(
      const Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size)
    {
      return mat.middleCols(start, size);
    }

    template<typename D>
    static typename ColsReturn<D>::Type middleCols(
      Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size)
    {
      return mat.middleCols(start, size);
    }

    template<class Mat>
    struct RowsReturn
    {
      typedef typename Mat::RowsBlockXpr Type;
      typedef typename Mat::ConstRowsBlockXpr ConstType;
    };

    template<typename D>
    static typename RowsReturn<D>::ConstType middleRows(
      const Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size)
    {
      return mat.middleRows(start, size);
    }

    template<typename D>
    static typename RowsReturn<D>::Type middleRows(
      Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index start,
      typename Eigen::DenseBase<D>::Index size)
    {
      return mat.middleRows(start, size);
    }

    template<class Mat>
    struct BlockReturn
    {
      typedef Eigen::Block<Mat> Type;
      typedef const Eigen::Block<const Mat> ConstType;
    };

    template<typename D>
    static typename BlockReturn<D>::ConstType block(
      const Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index row_id,
      typename Eigen::DenseBase<D>::Index col_id,
      typename Eigen::DenseBase<D>::Index row_size_block,
      typename Eigen::DenseBase<D>::Index col_size_block)
    {
      return mat.block(row_id, col_id, row_size_block, col_size_block);
    }

    template<typename D>
    static typename BlockReturn<D>::Type block(
      Eigen::MatrixBase<D> & mat,
      typename Eigen::DenseBase<D>::Index row_id,
      typename Eigen::DenseBase<D>::Index col_id,
      typename Eigen::DenseBase<D>::Index row_size_block,
      typename Eigen::DenseBase<D>::Index col_size_block)
    {
      return mat.block(row_id, col_id, row_size_block, col_size_block);
    }
  };
} // namespace pinocchio

#endif // ifndef __pinocchio_math_matrix_block_hpp__