Hierarchical matrix

Builder

template<typename CoefficientsPrecision, typename CoordinatesPrecision = htool::underlying_type<CoefficientsPrecision>>
class HMatrixBuilder

Public Functions

inline HMatrixBuilder(int target_number_of_points, int target_spatial_dimension, const CoordinatesPrecision *target_coordinates, const ClusterTreeBuilder<CoordinatesPrecision> *target_cluster_tree_builder, int source_number_of_points, int source_spatial_dimension, const CoordinatesPrecision *source_coordinates, const ClusterTreeBuilder<CoordinatesPrecision> *source_cluster_tree_builder)
Parameters:
  • target_number_of_points

  • target_spatial_dimension

  • target_coordinates

  • target_cluster_tree_builder

  • source_number_of_points

  • source_spatial_dimension

  • source_coordinates

  • source_cluster_tree_builder

inline HMatrixBuilder(int target_number_of_points, int target_spatial_dimension, const CoordinatesPrecision *target_coordinates, int source_number_of_points, int source_spatial_dimension, const CoordinatesPrecision *source_coordinates)
Parameters:
  • target_number_of_points

  • target_spatial_dimension

  • target_coordinates

  • source_number_of_points

  • source_spatial_dimension

  • source_coordinates

inline HMatrixBuilder(int number_of_points, int spatial_dimension, const CoordinatesPrecision *coordinates)
Parameters:
  • number_of_points

  • spatial_dimension

  • coordinates

inline HMatrix<CoefficientsPrecision, CoordinatesPrecision> build(const VirtualGenerator<CoefficientsPrecision> &generator, const HMatrixTreeBuilder<CoefficientsPrecision, CoordinatesPrecision> &hmatrix_tree_builder)
Parameters:
  • generator

  • hmatrix_tree_builder

Returns:

Public Members

Cluster<CoordinatesPrecision> target_cluster
Cluster<CoordinatesPrecision> source_cluster
template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
class HMatrixTreeBuilder

a HMatrixTreeBuilder object encapsulates the parameters and strategies to create HMatrix objects.

Template Parameters:
  • CoefficientPrecision

  • CoordinatePrecision

Public Functions

inline explicit HMatrixTreeBuilder(underlying_type<CoefficientPrecision> epsilon, CoordinatePrecision eta, char symmetry, char UPLO, int reqrank, std::shared_ptr<VirtualInternalLowRankGenerator<CoefficientPrecision>> low_rank_strategy, std::shared_ptr<VirtualAdmissibilityCondition<CoordinatePrecision>> admissibility_condition_strategy = nullptr)
inline explicit HMatrixTreeBuilder(underlying_type<CoefficientPrecision> epsilon, CoordinatePrecision eta, char symmetry, char UPLO, int reqrank = -1, std::shared_ptr<VirtualLowRankGenerator<CoefficientPrecision>> low_rank_strategy = nullptr, std::shared_ptr<VirtualAdmissibilityCondition<CoordinatePrecision>> admissibility_condition_strategy = nullptr)
HMatrixTreeBuilder(const HMatrixTreeBuilder&) = delete
HMatrixTreeBuilder &operator=(const HMatrixTreeBuilder&) = delete
HMatrixTreeBuilder(HMatrixTreeBuilder&&) noexcept = default
HMatrixTreeBuilder &operator=(HMatrixTreeBuilder&&) noexcept = default
virtual ~HMatrixTreeBuilder() = default
HMatrixType build(const VirtualInternalGenerator<CoefficientPrecision> &generator, const ClusterType &target_root_cluster_tree, const ClusterType &source_root_cluster_tree, int target_partition_number, int partition_number_for_symmetry) const
inline HMatrixType build(const VirtualInternalGenerator<CoefficientPrecision> &generator, const ClusterType &target_root_cluster_tree, const ClusterType &source_root_cluster_tree, int target_partition_number) const
inline HMatrixType build(const VirtualInternalGenerator<CoefficientPrecision> &generator, const ClusterType &target_root_cluster_tree, const ClusterType &source_root_cluster_tree) const
inline HMatrixType build(const VirtualGenerator<CoefficientPrecision> &generator, const ClusterType &target_root_cluster_tree, const ClusterType &source_root_cluster_tree, int target_partition_number, int partition_number_for_symmetry) const
inline HMatrixType build(const VirtualGenerator<CoefficientPrecision> &generator, const ClusterType &target_root_cluster_tree, const ClusterType &source_root_cluster_tree, int target_partition_number) const
inline HMatrixType build(const VirtualGenerator<CoefficientPrecision> &generator, const ClusterType &target_root_cluster_tree, const ClusterType &source_root_cluster_tree) const
inline void set_symmetry(char symmetry_type)
inline void set_UPLO(char UPLO_type)
inline void set_low_rank_generator(std::shared_ptr<VirtualLowRankGenerator<CoefficientPrecision>> ptr)
inline void set_low_rank_generator(std::shared_ptr<VirtualInternalLowRankGenerator<CoefficientPrecision>> ptr)
inline void set_admissibility_condition(std::shared_ptr<VirtualAdmissibilityCondition<CoordinatePrecision>> ptr)
inline void set_minimal_source_depth(int minimal_source_depth)
inline void set_minimal_target_depth(int minimal_target_depth)
inline void set_dense_blocks_generator(std::shared_ptr<VirtualDenseBlocksGenerator<CoefficientPrecision>> dense_blocks_generator)
inline void set_block_tree_consistency(bool consistency)
inline char get_symmetry() const
inline char get_UPLO() const
inline double get_epsilon() const
inline double get_eta() const
inline std::shared_ptr<VirtualInternalLowRankGenerator<CoefficientPrecision>> get_internal_low_rank_generator() const
inline std::shared_ptr<VirtualLowRankGenerator<CoefficientPrecision>> get_low_rank_generator() const

HMatrix

template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
class HMatrix : public htool::TreeNode<HMatrix<CoefficientPrecision, underlying_type<CoefficientPrecision>>, HMatrixTreeData<CoefficientPrecision, underlying_type<CoefficientPrecision>>>

Public Types

enum class StorageType

Values:

enumerator Dense
enumerator LowRank
enumerator Hierarchical

Public Functions

inline HMatrix(const Cluster<CoordinatePrecision> &target_cluster, const Cluster<CoordinatePrecision> &source_cluster)
inline HMatrix(const HMatrix &parent, const Cluster<CoordinatePrecision> *target_cluster, const Cluster<CoordinatePrecision> *source_cluster)
inline HMatrix(const HMatrix &rhs)
inline HMatrix &operator=(const HMatrix &rhs)
HMatrix(HMatrix&&) noexcept = default
HMatrix &operator=(HMatrix&&) noexcept = default
virtual ~HMatrix() = default
inline const Cluster<CoordinatePrecision> &get_target_cluster() const
inline const Cluster<CoordinatePrecision> &get_source_cluster() const
inline int nb_cols() const
inline int nb_rows() const
inline htool::underlying_type<CoefficientPrecision> get_epsilon() const
inline HMatrix<CoefficientPrecision, CoordinatePrecision> *get_child_or_this(const Cluster<CoordinatePrecision> &required_target_cluster, const Cluster<CoordinatePrecision> &required_source_cluster)
inline const HMatrix<CoefficientPrecision, CoordinatePrecision> *get_child_or_this(const Cluster<CoordinatePrecision> &required_target_cluster, const Cluster<CoordinatePrecision> &required_source_cluster) const
inline int get_rank() const
inline const Matrix<CoefficientPrecision> *get_dense_data() const
inline Matrix<CoefficientPrecision> *get_dense_data()
inline const LowRankMatrix<CoefficientPrecision> *get_low_rank_data() const
inline LowRankMatrix<CoefficientPrecision> *get_low_rank_data()
inline char get_symmetry() const
inline char get_UPLO() const
inline const HMatrixTreeData<CoefficientPrecision, CoordinatePrecision> *get_hmatrix_tree_data() const
inline const HMatrix<CoefficientPrecision> *get_sub_hmatrix(const Cluster<CoordinatePrecision> &target_cluster, const Cluster<CoordinatePrecision> &source_cluster) const
inline HMatrix<CoefficientPrecision> *get_sub_hmatrix(const Cluster<CoordinatePrecision> &target_cluster, const Cluster<CoordinatePrecision> &source_cluster)
inline StorageType get_storage_type() const
inline void set_symmetry(char symmetry)
inline void set_UPLO(char UPLO)
inline void set_symmetry_for_leaves(char symmetry)
inline void set_UPLO_for_leaves(char UPLO)
inline void set_target_cluster(const Cluster<CoordinatePrecision> *new_target_cluster)
inline bool is_dense() const
inline bool is_low_rank() const
inline bool is_hierarchical() const
inline void set_eta(CoordinatePrecision eta)
inline void set_epsilon(underlying_type<CoefficientPrecision> epsilon)
inline void set_low_rank_generator(std::shared_ptr<VirtualInternalLowRankGenerator<CoefficientPrecision>> ptr)
inline void set_admissibility_condition(std::shared_ptr<VirtualAdmissibilityCondition<CoordinatePrecision>> ptr)
inline void set_minimal_target_depth(unsigned int minimal_target_depth)
inline void set_minimal_source_depth(unsigned int minimal_source_depth)
inline void set_block_tree_consistency(bool consistency)
inline char get_symmetry_for_leaves() const
inline char get_UPLO_for_leaves() const
inline bool is_block_tree_consistent() const
inline void compute_dense_data(const VirtualInternalGenerator<CoefficientPrecision> &generator)
inline bool compute_low_rank_data(const VirtualInternalLowRankGenerator<CoefficientPrecision> &low_rank_generator, int reqrank, underlying_type<CoefficientPrecision> epsilon)
inline void clear_low_rank_data()
inline void set_dense_data(std::unique_ptr<Matrix<CoefficientPrecision>> dense_matrix_ptr)

Admissibility conditions

template<typename CoordinatePrecision>
class VirtualAdmissibilityCondition

Subclassed by htool::RjasanowSteinbach< CoordinatePrecision >

Public Functions

virtual bool ComputeAdmissibility(const Cluster<CoordinatePrecision> &target, const Cluster<CoordinatePrecision> &source, double eta) const = 0
inline virtual ~VirtualAdmissibilityCondition()
template<typename CoordinatePrecision>
class RjasanowSteinbach : public htool::VirtualAdmissibilityCondition<CoordinatePrecision>

Public Functions

inline virtual bool ComputeAdmissibility(const Cluster<CoordinatePrecision> &target, const Cluster<CoordinatePrecision> &source, double eta) const override

Low-rank compression

template<typename CoefficientPrecision, typename CoordinatesPrecision = underlying_type<CoefficientPrecision>>
class VirtualLowRankGenerator

Public Functions

inline VirtualLowRankGenerator()
virtual bool copy_low_rank_approximation(int M, int N, const int *rows, const int *cols, LowRankMatrix<CoefficientPrecision> &lrmat) const = 0
virtual bool copy_low_rank_approximation(int M, int N, const int *rows, const int *cols, int reqrank, LowRankMatrix<CoefficientPrecision> &lrmat) const = 0
inline virtual ~VirtualLowRankGenerator()
template<typename CoefficientPrecision>
class SVD : public htool::VirtualInternalLowRankGenerator<CoefficientPrecision>

It provides low-rank approximation using truncated Singular Value Decomposition (SVD).

Template Parameters:

CoefficientPrecision

Public Functions

inline SVD(const VirtualInternalGenerator<CoefficientPrecision> &A)
inline SVD(const VirtualGenerator<CoefficientPrecision> &A)
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, LowRankMatrix<CoefficientPrecision> &lrmat) const override
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, int rank, LowRankMatrix<CoefficientPrecision> &lrmat) const override
template<typename CoefficientPrecision>
class fullACA : public htool::VirtualInternalLowRankGenerator<CoefficientPrecision>

It provides low-rank approximation using the full Adaptive Cross Approximation (ACA).

Template Parameters:

CoefficientPrecision

Public Functions

inline fullACA(const VirtualInternalGenerator<CoefficientPrecision> &A)
inline fullACA(const VirtualGenerator<CoefficientPrecision> &A)
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, LowRankMatrix<CoefficientPrecision> &lrmat) const override
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, int reqrank, LowRankMatrix<CoefficientPrecision> &lrmat) const override
template<typename CoefficientPrecision>
class partialACA : public htool::VirtualInternalLowRankGenerator<CoefficientPrecision>

It provides low-rank approximation using the partial Adaptive Cross Approximation (ACA).

Public Functions

inline partialACA(const VirtualInternalGenerator<CoefficientPrecision> &A)
inline partialACA(const VirtualGenerator<CoefficientPrecision> &A)
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, LowRankMatrix<CoefficientPrecision> &lrmat) const override
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, int reqrank, LowRankMatrix<CoefficientPrecision> &lrmat) const override
template<typename CoefficientPrecision>
class sympartialACA : public htool::VirtualInternalLowRankGenerator<CoefficientPrecision>

It provides low-rank approximation using a symmetric version of the partial Adaptive Cross Approximation (ACA).

Public Functions

inline sympartialACA(const VirtualInternalGenerator<CoefficientPrecision> &A)
inline sympartialACA(const VirtualGenerator<CoefficientPrecision> &A)
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, LowRankMatrix<CoefficientPrecision> &lrmat) const override
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, int reqrank, LowRankMatrix<CoefficientPrecision> &lrmat) const override
template<typename CoefficientPrecision>
class RecompressedLowRankGenerator : public htool::VirtualInternalLowRankGenerator<CoefficientPrecision>

It provides low-rank approximation using a given compression method with a QR-SVD recompression.

Template Parameters:

CoefficientPrecision

Public Functions

inline RecompressedLowRankGenerator(const VirtualInternalLowRankGenerator<CoefficientPrecision> &low_rank_generator, std::function<void(LowRankMatrix<CoefficientPrecision>&)> recompression)
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, LowRankMatrix<CoefficientPrecision> &lrmat) const
inline virtual bool copy_low_rank_approximation(int M, int N, int row_offset, int col_offset, int reqrank, LowRankMatrix<CoefficientPrecision> &lrmat) const

Visualisation

template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::save_leaves_with_rank(const HMatrix<CoefficientPrecision, CoordinatePrecision> &hmatrix, std::string filename)
template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
std::map<std::string, std::string> htool::get_tree_parameters(const HMatrix<CoefficientPrecision, CoordinatePrecision> &hmatrix)
template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::print_tree_parameters(const HMatrix<CoefficientPrecision, CoordinatePrecision> &hmatrix, std::ostream &os)
template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
std::map<std::string, std::string> htool::get_hmatrix_information(const HMatrix<CoefficientPrecision, CoordinatePrecision> &hmatrix)
template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::print_hmatrix_information(const HMatrix<CoefficientPrecision, CoordinatePrecision> &hmatrix, std::ostream &os)

Linear algebra

template<typename ExecutionPolicy, typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::add_hmatrix_vector_product(ExecutionPolicy&&, char trans, CoefficientPrecision alpha, const HMatrix<CoefficientPrecision, CoordinatePrecision> &A, const CoefficientPrecision *in, CoefficientPrecision beta, CoefficientPrecision *out, CoefficientPrecision *buffer = nullptr)
Template Parameters:
  • ExecutionPolicy

  • CoefficientPrecision

  • CoordinatePrecision

Parameters:
  • trans

  • alpha

  • A

  • in

  • beta

  • out

  • buffer

template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::add_hmatrix_vector_product(char trans, CoefficientPrecision alpha, const HMatrix<CoefficientPrecision, CoordinatePrecision> &A, const CoefficientPrecision *in, CoefficientPrecision beta, CoefficientPrecision *out, CoefficientPrecision *buffer = nullptr)
Template Parameters:
  • CoefficientPrecision

  • CoordinatePrecision

Parameters:
  • trans

  • alpha

  • A

  • in

  • beta

  • out

  • buffer

template<typename ExecutionPolicy, typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::add_hmatrix_matrix_product(ExecutionPolicy &&execution_policy, char transa, char transb, CoefficientPrecision alpha, const HMatrix<CoefficientPrecision, CoordinatePrecision> &A, const Matrix<CoefficientPrecision> &B, CoefficientPrecision beta, Matrix<CoefficientPrecision> &C, CoefficientPrecision *buffer = nullptr)

test

Template Parameters:
  • ExecutionPolicy

  • CoefficientPrecision

  • CoordinatePrecision

Parameters:
  • execution_policy

  • transa

  • transb

  • alpha

  • A

  • B

  • beta

  • C

  • buffer

template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::add_hmatrix_matrix_product(char transa, char transb, CoefficientPrecision alpha, const HMatrix<CoefficientPrecision, CoordinatePrecision> &A, const Matrix<CoefficientPrecision> &B, CoefficientPrecision beta, Matrix<CoefficientPrecision> &C, CoefficientPrecision *buffer = nullptr)
Template Parameters:
  • CoefficientPrecision

  • CoordinatePrecision

Parameters:
  • transa

  • transb

  • alpha

  • A

  • B

  • beta

  • C

  • buffer

template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::lu_factorization(HMatrix<CoefficientPrecision, CoordinatePrecision> &hmatrix)
Template Parameters:
  • CoefficientPrecision

  • CoordinatePrecision

Parameters:

hmatrix

template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::lu_solve(char trans, const HMatrix<CoefficientPrecision, CoordinatePrecision> &A, Matrix<CoefficientPrecision> &X)
Template Parameters:
  • CoefficientPrecision

  • CoordinatePrecision

Parameters:
  • trans

  • A

  • X

template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::cholesky_factorization(char UPLO, HMatrix<CoefficientPrecision, CoordinatePrecision> &hmatrix)
Template Parameters:
  • CoefficientPrecision

  • CoordinatePrecision

Parameters:
  • UPLO

  • hmatrix

template<typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
void htool::cholesky_solve(char UPLO, const HMatrix<CoefficientPrecision, CoordinatePrecision> &A, Matrix<CoefficientPrecision> &X)
Template Parameters:
  • CoefficientPrecision

  • CoordinatePrecision

Parameters:
  • UPLO

  • A

  • X