From 2313d09996bbf54ef160df41f491a5818565e0b4 Mon Sep 17 00:00:00 2001 From: Pierre Marchand Date: Sat, 3 Aug 2024 10:26:25 +0200 Subject: [PATCH] fix default template for CoordinatePrecision --- include/htool/clustering/cluster_node.hpp | 13 +++++++------ .../implementations/partition_from_cluster.hpp | 2 +- include/htool/hmatrix/hmatrix.hpp | 8 ++++---- .../htool/hmatrix/hmatrix_distributed_output.hpp | 4 ++-- include/htool/hmatrix/hmatrix_output.hpp | 15 ++++++++------- include/htool/hmatrix/hmatrix_tree_data.hpp | 2 +- .../interfaces/virtual_lrmat_generator.hpp | 2 +- .../add_hmatrix_matrix_product_row_major.hpp | 6 +++--- .../hmatrix/linalg/add_hmatrix_vector_product.hpp | 4 ++-- include/htool/hmatrix/linalg/factorization.hpp | 8 ++++---- .../linalg/triangular_hmatrix_hmatrix_solve.hpp | 2 +- .../linalg/triangular_hmatrix_lrmat_solve.hpp | 2 +- .../linalg/triangular_hmatrix_matrix_solve.hpp | 4 ++-- .../hmatrix/lrmat/linalg/add_lrmat_lrmat.hpp | 2 +- .../lrmat/linalg/add_matrix_matrix_product.hpp | 2 +- include/htool/hmatrix/lrmat/lrmat.hpp | 4 ++-- include/htool/solvers/ddm.hpp | 2 +- .../local_hmatrix_plus_overlap_solvers.hpp | 2 +- .../local_solvers/local_hmatrix_solvers.hpp | 2 +- 19 files changed, 44 insertions(+), 42 deletions(-) diff --git a/include/htool/clustering/cluster_node.hpp b/include/htool/clustering/cluster_node.hpp index 4ea0550c..23a905cf 100644 --- a/include/htool/clustering/cluster_node.hpp +++ b/include/htool/clustering/cluster_node.hpp @@ -3,6 +3,7 @@ #include "../basic_types/tree.hpp" #include "../misc/logger.hpp" +#include "../misc/misc.hpp" #include "../misc/user.hpp" #include "cluster_tree_data.hpp" #include @@ -153,7 +154,7 @@ bool left_cluster_contains_right_cluster(const Cluster &cl // } // Permutations -template +template > void root_cluster_to_global(const Cluster &root_cluster, const CoefficientPrecision *const in, CoefficientPrecision *const out) { if (!root_cluster.is_root()) { htool::Logger::get_instance().log(LogLevel::ERROR, "Permutation needs root cluster"); // LCOV_EXCL_LINE @@ -167,7 +168,7 @@ void root_cluster_to_global(const Cluster &root_cluster, c } } -template +template > void global_to_root_cluster(const Cluster &root_cluster, const CoefficientPrecision *const in, CoefficientPrecision *const out) { if (!root_cluster.is_root()) { htool::Logger::get_instance().log(LogLevel::ERROR, "Permutation needs root cluster"); // LCOV_EXCL_LINE @@ -180,7 +181,7 @@ void global_to_root_cluster(const Cluster &root_cluster, c } // Local permutations -template +template > void local_cluster_to_local(const Cluster &cluster, int index, const CoefficientPrecision *in, CoefficientPrecision *out) { if (!cluster.is_permutation_local()) { htool::Logger::get_instance().log(LogLevel::ERROR, "Permutation is not local to partition, local_cluster_to_local cannot be used"); // LCOV_EXCL_LINE @@ -193,7 +194,7 @@ void local_cluster_to_local(const Cluster &cluster, int in out[permutation[cluster_on_partition->get_offset() + i] - cluster_on_partition->get_offset()] = in[i]; } } -template +template > void local_to_local_cluster(const Cluster &cluster, int index, const CoefficientPrecision *in, CoefficientPrecision *out) { if (!cluster.is_permutation_local()) { htool::Logger::get_instance().log(LogLevel::ERROR, "Permutation is not local to partition, local_cluster_to_local cannot be used"); // LCOV_EXCL_LINE @@ -209,7 +210,7 @@ void local_to_local_cluster(const Cluster &cluster, int in } // Local permutations -template +template > void cluster_to_user(const Cluster &cluster, const CoefficientPrecision *in, CoefficientPrecision *out) { if (!cluster.is_root() && !is_cluster_on_partition(cluster)) { htool::Logger::get_instance().log(LogLevel::ERROR, "Cluster is neither root nor local, permutation is not stable."); // LCOV_EXCL_LINE @@ -222,7 +223,7 @@ void cluster_to_user(const Cluster &cluster, const Coeffic out[permutation[cluster.get_offset() + i] - cluster.get_offset()] = in[i]; } } -template +template > void user_to_cluster(const Cluster &cluster, const CoefficientPrecision *in, CoefficientPrecision *out) { if (!cluster.is_root() && !is_cluster_on_partition(cluster)) { htool::Logger::get_instance().log(LogLevel::ERROR, "Cluster is neither root nor local, permutation is not stable."); // LCOV_EXCL_LINE diff --git a/include/htool/distributed_operator/implementations/partition_from_cluster.hpp b/include/htool/distributed_operator/implementations/partition_from_cluster.hpp index 1998aaed..a112a856 100644 --- a/include/htool/distributed_operator/implementations/partition_from_cluster.hpp +++ b/include/htool/distributed_operator/implementations/partition_from_cluster.hpp @@ -6,7 +6,7 @@ namespace htool { -template +template > class PartitionFromCluster final : public IPartition { const Cluster &m_root_cluster; diff --git a/include/htool/hmatrix/hmatrix.hpp b/include/htool/hmatrix/hmatrix.hpp index 35edbd07..432a15d1 100644 --- a/include/htool/hmatrix/hmatrix.hpp +++ b/include/htool/hmatrix/hmatrix.hpp @@ -268,7 +268,7 @@ class HMatrix : public TreeNode +template > void copy_to_dense(const HMatrix &hmatrix, CoefficientPrecision *ptr) { int target_offset = hmatrix.get_target_cluster().get_offset(); @@ -299,7 +299,7 @@ void copy_to_dense(const HMatrix &hma } } -template +template > void copy_to_dense_in_user_numbering(const HMatrix &hmatrix, CoefficientPrecision *ptr) { const auto &target_cluster = hmatrix.get_target_cluster(); @@ -378,7 +378,7 @@ void copy_to_dense_in_user_numbering(const HMatrix +template > void copy_diagonal(const HMatrix &hmatrix, CoefficientPrecision *ptr) { if (hmatrix.get_target_cluster().get_offset() != hmatrix.get_source_cluster().get_offset() || hmatrix.get_target_cluster().get_size() != hmatrix.get_source_cluster().get_size()) { htool::Logger::get_instance().log(LogLevel::ERROR, "Matrix is not square a priori, get_local_diagonal cannot be used"); // LCOV_EXCL_LINE @@ -407,7 +407,7 @@ void copy_diagonal(const HMatrix &hma } } -template +template > void copy_diagonal_in_user_numbering(const HMatrix &hmatrix, CoefficientPrecision *ptr) { if (hmatrix.get_target_cluster().get_offset() != hmatrix.get_source_cluster().get_offset() || hmatrix.get_target_cluster().get_size() != hmatrix.get_source_cluster().get_size()) { htool::Logger::get_instance().log(LogLevel::ERROR, "Matrix is not square a priori, get_local_diagonal cannot be used"); // LCOV_EXCL_LINE diff --git a/include/htool/hmatrix/hmatrix_distributed_output.hpp b/include/htool/hmatrix/hmatrix_distributed_output.hpp index ecc885a9..43ca72e8 100644 --- a/include/htool/hmatrix/hmatrix_distributed_output.hpp +++ b/include/htool/hmatrix/hmatrix_distributed_output.hpp @@ -23,7 +23,7 @@ bool is_positive_integer(const std::string &s) { return !s.empty() && std::find_if(s.begin(), s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end(); } -template +template > std::map get_distributed_hmatrix_information(const HMatrix &hmatrix, MPI_Comm comm) { std::map distributed_information; int sizeWorld, rankWorld; @@ -195,7 +195,7 @@ std::map get_distributed_hmatrix_information(const HMa return distributed_information; } -template +template > void print_distributed_hmatrix_information(const HMatrix &hmatrix, std::ostream &os, MPI_Comm comm) { auto distributed_information = get_distributed_hmatrix_information(hmatrix, comm); int rankWorld; diff --git a/include/htool/hmatrix/hmatrix_output.hpp b/include/htool/hmatrix/hmatrix_output.hpp index dfcafad9..80e9db14 100644 --- a/include/htool/hmatrix/hmatrix_output.hpp +++ b/include/htool/hmatrix/hmatrix_output.hpp @@ -11,6 +11,7 @@ #if defined(_OPENMP) # include #endif +#include "../misc/misc.hpp" namespace htool { @@ -35,7 +36,7 @@ std::ostream &operator<<(std::ostream &output_stream, const DisplayBlock +template > void save_leaves_with_rank(const HMatrix &hmatrix, std::string filename) { std::ofstream output(filename + ".csv"); std::vector> output_blocks{}; @@ -54,7 +55,7 @@ void save_leaves_with_rank(const HMatrix +template > void save_levels(const HMatrix &hmatrix, std::string filename, std::vector depths) { std::vector>> output_blocks(depths.size()); @@ -81,7 +82,7 @@ void save_levels(const HMatrix &hmatr } } -template +template > std::map get_tree_parameters(const HMatrix &hmatrix) { const HMatrixTreeData *hmatrix_tree_data = hmatrix.get_hmatrix_tree_data(); std::map tree_parameters; @@ -98,7 +99,7 @@ std::map get_tree_parameters(const HMatrix +template > void print_tree_parameters(const HMatrix &hmatrix, std::ostream &os) { auto tree_parameters = get_tree_parameters(hmatrix); int output_size = 23; @@ -117,7 +118,7 @@ void print_tree_parameters(const HMatrix +template > void get_leaves(const HMatrix &hmatrix, std::vector *> &dense_blocks, std::vector *> &low_rank_blocks) { preorder_tree_traversal( hmatrix, @@ -130,7 +131,7 @@ void get_leaves(const HMatrix &hmatri }); } -template +template > std::map get_hmatrix_information(const HMatrix &hmatrix) { const HMatrixTreeData *hmatrix_tree_data = hmatrix.get_hmatrix_tree_data(); @@ -219,7 +220,7 @@ std::map get_hmatrix_information(const HMatrix +template > void print_hmatrix_information(const HMatrix &hmatrix, std::ostream &os) { auto hmatrix_information = get_hmatrix_information(hmatrix); diff --git a/include/htool/hmatrix/hmatrix_tree_data.hpp b/include/htool/hmatrix/hmatrix_tree_data.hpp index df02ec98..3ac60e49 100644 --- a/include/htool/hmatrix/hmatrix_tree_data.hpp +++ b/include/htool/hmatrix/hmatrix_tree_data.hpp @@ -11,7 +11,7 @@ namespace htool { template class HMatrix; -template +template > struct HMatrixTreeData { // Parameters std::shared_ptr> m_target_cluster_tree, m_source_cluster_tree; // root clusters diff --git a/include/htool/hmatrix/interfaces/virtual_lrmat_generator.hpp b/include/htool/hmatrix/interfaces/virtual_lrmat_generator.hpp index 81b02eee..0767152f 100644 --- a/include/htool/hmatrix/interfaces/virtual_lrmat_generator.hpp +++ b/include/htool/hmatrix/interfaces/virtual_lrmat_generator.hpp @@ -9,7 +9,7 @@ namespace htool { -template +template > class VirtualLowRankGenerator { public: VirtualLowRankGenerator() {} diff --git a/include/htool/hmatrix/linalg/add_hmatrix_matrix_product_row_major.hpp b/include/htool/hmatrix/linalg/add_hmatrix_matrix_product_row_major.hpp index 2b864a03..3ad7d36f 100644 --- a/include/htool/hmatrix/linalg/add_hmatrix_matrix_product_row_major.hpp +++ b/include/htool/hmatrix/linalg/add_hmatrix_matrix_product_row_major.hpp @@ -6,7 +6,7 @@ namespace htool { -template +template > void add_hmatrix_matrix_product_row_major(char transa, char transb, CoefficientPrecision alpha, const HMatrix &A, const CoefficientPrecision *in, CoefficientPrecision beta, CoefficientPrecision *out, int mu) { switch (A.get_storage_type()) { case HMatrix::StorageType::Dense: @@ -25,7 +25,7 @@ void add_hmatrix_matrix_product_row_major(char transa, char transb, CoefficientP } } -template +template > void add_hmatrix_matrix_product_row_major(char transa, char transb, std::complex alpha, const HMatrix, CoordinatePrecision> &A, const std::complex *in, std::complex beta, std::complex *out, int mu) { switch (A.get_storage_type()) { case HMatrix, CoordinatePrecision>::StorageType::Dense: @@ -213,7 +213,7 @@ void openmp_add_hmatrix_matrix_product_row_major(char transa, char transb, Coeff // Blas::axpy(&out_size, &alpha, temp.data(), &incx, C, &incy); // } -// template +// template > // void add_symmetric_hmatrix_matrix_product_row_major(char side, char UPLO, CoefficientPrecision alpha, const HMatrix &A, const CoefficientPrecision *in, CoefficientPrecision beta, CoefficientPrecision *out, int mu) { // switch (A.get_storage_type()) { // case HMatrix::StorageType::Dense: diff --git a/include/htool/hmatrix/linalg/add_hmatrix_vector_product.hpp b/include/htool/hmatrix/linalg/add_hmatrix_vector_product.hpp index 5a70f65c..16118724 100644 --- a/include/htool/hmatrix/linalg/add_hmatrix_vector_product.hpp +++ b/include/htool/hmatrix/linalg/add_hmatrix_vector_product.hpp @@ -9,7 +9,7 @@ namespace htool { -template +template > void add_hmatrix_vector_product(char trans, CoefficientPrecision alpha, const HMatrix &A, const CoefficientPrecision *in, CoefficientPrecision beta, CoefficientPrecision *out) { switch (A.get_storage_type()) { case HMatrix::StorageType::Dense: @@ -28,7 +28,7 @@ void add_hmatrix_vector_product(char trans, CoefficientPrecision alpha, const HM } } -template +template > void add_hmatrix_vector_product(char trans, std::complex alpha, const HMatrix, CoordinatePrecision> &A, const std::complex *in, std::complex beta, std::complex *out) { switch (A.get_storage_type()) { case HMatrix, CoordinatePrecision>::StorageType::Dense: diff --git a/include/htool/hmatrix/linalg/factorization.hpp b/include/htool/hmatrix/linalg/factorization.hpp index 807ef145..44bb1850 100644 --- a/include/htool/hmatrix/linalg/factorization.hpp +++ b/include/htool/hmatrix/linalg/factorization.hpp @@ -7,7 +7,7 @@ namespace htool { -template +template > void lu_factorization(HMatrix &hmatrix) { if (hmatrix.is_hierarchical()) { @@ -62,7 +62,7 @@ void lu_factorization(HMatrix &hmatri } } -template +template > void lu_solve(char trans, const HMatrix &A, Matrix &X) { if (trans == 'N') { @@ -74,7 +74,7 @@ void lu_solve(char trans, const HMatrix +template > void cholesky_factorization(char UPLO, HMatrix &hmatrix) { if (hmatrix.is_hierarchical()) { @@ -143,7 +143,7 @@ void cholesky_factorization(char UPLO, HMatrix +template > void cholesky_solve(char UPLO, const HMatrix &A, Matrix &X) { if (UPLO == 'L') { triangular_hmatrix_matrix_solve('L', 'L', 'N', 'N', CoefficientPrecision(1), A, X); diff --git a/include/htool/hmatrix/linalg/triangular_hmatrix_hmatrix_solve.hpp b/include/htool/hmatrix/linalg/triangular_hmatrix_hmatrix_solve.hpp index 135410ec..4fe6e312 100644 --- a/include/htool/hmatrix/linalg/triangular_hmatrix_hmatrix_solve.hpp +++ b/include/htool/hmatrix/linalg/triangular_hmatrix_hmatrix_solve.hpp @@ -6,7 +6,7 @@ #include "./triangular_hmatrix_lrmat_solve.hpp" namespace htool { -template +template > void triangular_hmatrix_hmatrix_solve(char side, char UPLO, char transa, char diag, CoefficientPrecision alpha, const HMatrix &A, HMatrix &B) { if (alpha != CoefficientPrecision(1)) { scale(alpha, B); diff --git a/include/htool/hmatrix/linalg/triangular_hmatrix_lrmat_solve.hpp b/include/htool/hmatrix/linalg/triangular_hmatrix_lrmat_solve.hpp index a1056711..8c0295c1 100644 --- a/include/htool/hmatrix/linalg/triangular_hmatrix_lrmat_solve.hpp +++ b/include/htool/hmatrix/linalg/triangular_hmatrix_lrmat_solve.hpp @@ -4,7 +4,7 @@ #include "./triangular_hmatrix_matrix_solve.hpp" namespace htool { -template +template > void triangular_hmatrix_lrmat_solve(char side, char UPLO, char transa, char diag, CoefficientPrecision alpha, const HMatrix &A, LowRankMatrix &B) { if (alpha != CoefficientPrecision(1)) { scale(alpha, B); diff --git a/include/htool/hmatrix/linalg/triangular_hmatrix_matrix_solve.hpp b/include/htool/hmatrix/linalg/triangular_hmatrix_matrix_solve.hpp index dcc933ae..bee0cb90 100644 --- a/include/htool/hmatrix/linalg/triangular_hmatrix_matrix_solve.hpp +++ b/include/htool/hmatrix/linalg/triangular_hmatrix_matrix_solve.hpp @@ -9,7 +9,7 @@ // --- Reversed iterable namespace htool { -template +template > void triangular_hmatrix_matrix_solve_row_major(char side, char UPLO, char transa, char diag, CoefficientPrecision alpha, const HMatrix &A, Matrix &Bt) { if (alpha != CoefficientPrecision(1)) { scale(alpha, Bt); @@ -105,7 +105,7 @@ void triangular_hmatrix_matrix_solve_row_major(char side, char UPLO, char transa } } -template +template > void triangular_hmatrix_matrix_solve(char side, char UPLO, char transa, char diag, CoefficientPrecision alpha, const HMatrix &A, Matrix &B) { if (side == 'L') { Matrix transposed_B(B.nb_cols(), B.nb_rows()); diff --git a/include/htool/hmatrix/lrmat/linalg/add_lrmat_lrmat.hpp b/include/htool/hmatrix/lrmat/linalg/add_lrmat_lrmat.hpp index 43445477..12a98824 100644 --- a/include/htool/hmatrix/lrmat/linalg/add_lrmat_lrmat.hpp +++ b/include/htool/hmatrix/lrmat/linalg/add_lrmat_lrmat.hpp @@ -5,7 +5,7 @@ #include "add_lrmat_matrix_product.hpp" namespace htool { -template +template > void add_lrmat_lrmat(const LowRankMatrix &X_lrmat, const Cluster &X_target_cluster, const Cluster &X_source_cluster, LowRankMatrix &Y_lrmat, const Cluster &Y_target_cluster, const Cluster &Y_source_cluster) { if (left_cluster_contains_right_cluster(Y_target_cluster, X_target_cluster) && left_cluster_contains_right_cluster(Y_source_cluster, X_source_cluster)) { // extends X and add to Y int row_offset = X_target_cluster.get_offset() - Y_target_cluster.get_offset(); diff --git a/include/htool/hmatrix/lrmat/linalg/add_matrix_matrix_product.hpp b/include/htool/hmatrix/lrmat/linalg/add_matrix_matrix_product.hpp index 0927b072..f31cbb18 100644 --- a/include/htool/hmatrix/lrmat/linalg/add_matrix_matrix_product.hpp +++ b/include/htool/hmatrix/lrmat/linalg/add_matrix_matrix_product.hpp @@ -7,7 +7,7 @@ namespace htool { -template +template > void add_matrix_matrix_product(char transa, char transb, CoefficientPrecision alpha, const Matrix &A, const Matrix &B, CoefficientPrecision beta, LowRankMatrix &C) { bool C_is_overwritten = (beta == CoefficientPrecision(0) || C.rank_of() == 0); diff --git a/include/htool/hmatrix/lrmat/lrmat.hpp b/include/htool/hmatrix/lrmat/lrmat.hpp index eec17aec..d3a60a41 100644 --- a/include/htool/hmatrix/lrmat/lrmat.hpp +++ b/include/htool/hmatrix/lrmat/lrmat.hpp @@ -152,7 +152,7 @@ class LowRankMatrix { } }; -template +template > underlying_type Frobenius_relative_error(const Cluster &target_cluster, const Cluster &source_cluster, const LowRankMatrix &lrmat, const VirtualGenerator &ref, int reqrank = -1) { assert(reqrank <= lrmat.rank_of()); if (reqrank == -1) { @@ -175,7 +175,7 @@ underlying_type Frobenius_relative_error(const Cluster +template > underlying_type Frobenius_absolute_error(const Cluster &target_cluster, const Cluster &source_cluster, const LowRankMatrix &lrmat, const VirtualGenerator &ref, int reqrank = -1) { assert(reqrank <= lrmat.rank_of()); if (reqrank == -1) { diff --git a/include/htool/solvers/ddm.hpp b/include/htool/solvers/ddm.hpp index c41df1c8..ef961b08 100644 --- a/include/htool/solvers/ddm.hpp +++ b/include/htool/solvers/ddm.hpp @@ -476,7 +476,7 @@ DDM make_DDM_solver_w_custom_local return ddm_solver; } -template +template > DDM make_DDM_solver_w_custom_local_solver(const DistributedOperator &distributed_operator, HMatrix &local_hmatrix, Matrix &B, Matrix &C, Matrix &D, const std::vector &neighbors, const std::vector> &intersections) { int n = local_hmatrix.get_target_cluster().get_size() + C.nb_rows(); diff --git a/include/htool/solvers/local_solvers/local_hmatrix_plus_overlap_solvers.hpp b/include/htool/solvers/local_solvers/local_hmatrix_plus_overlap_solvers.hpp index 42e9241f..765cac23 100644 --- a/include/htool/solvers/local_solvers/local_hmatrix_plus_overlap_solvers.hpp +++ b/include/htool/solvers/local_solvers/local_hmatrix_plus_overlap_solvers.hpp @@ -6,7 +6,7 @@ namespace htool { -template +template > class LocalHMatrixPlusOverlapSolver : public VirtualLocalSolver { private: HMatrix &m_local_hmatrix; diff --git a/include/htool/solvers/local_solvers/local_hmatrix_solvers.hpp b/include/htool/solvers/local_solvers/local_hmatrix_solvers.hpp index 52023284..24783287 100644 --- a/include/htool/solvers/local_solvers/local_hmatrix_solvers.hpp +++ b/include/htool/solvers/local_solvers/local_hmatrix_solvers.hpp @@ -6,7 +6,7 @@ namespace htool { -template +template > class LocalHMatrixSolver : public VirtualLocalSolver { private: HMatrix &m_local_hmatrix;