14#ifndef PDLP_SHARDER_H_
15#define PDLP_SHARDER_H_
23#include "Eigen/SparseCore"
39 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>,
40 Eigen::Dynamic, Eigen::Dynamic,
43 ::Eigen::Block<Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>,
44 Eigen::Dynamic, Eigen::Dynamic,
59 const Eigen::VectorXd& vector)
const {
61 return vector.segment(parent_.
ShardStart(shard_num_),
66 Eigen::VectorXd& vector)
const {
68 return vector.segment(parent_.
ShardStart(shard_num_),
73 Eigen::VectorBlock<const Eigen::VectorXd> vector)
const {
75 return Eigen::VectorBlock<const Eigen::VectorXd>(
76 vector.nestedExpression(),
77 vector.startRow() + parent_.
ShardStart(shard_num_),
82 Eigen::VectorBlock<Eigen::VectorXd> vector)
const {
84 return Eigen::VectorBlock<Eigen::VectorXd>(
85 vector.nestedExpression(),
86 vector.startRow() + parent_.
ShardStart(shard_num_),
91 auto operator()(
const Eigen::DiagonalMatrix<double, Eigen::Dynamic>& diag)
92 const ->
decltype(diag.diagonal().segment(0, 0).asDiagonal()) {
94 return diag.diagonal()
101 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix)
104 auto result = matrix.middleCols(parent_.
ShardStart(shard_num_),
110 "The return type of middleCols changed!");
115 Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix)
const {
117 auto result = matrix.middleCols(parent_.
ShardStart(shard_num_),
122 "The return type of middleCols changed!");
127 int Index()
const {
return shard_num_; }
132 : shard_num_(shard_num), parent_(*parent) {
137 const int shard_num_;
150 const std::function<int64_t(int64_t)>& element_mass);
161 Sharder(
const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix,
163 :
Sharder(matrix.cols(), num_shards, thread_pool, [&matrix](int64_t
col) {
164 return 1 + 1 * matrix.col(
col).nonZeros();
181 int NumShards()
const {
return static_cast<int>(shard_starts_.size()) - 1; }
189 return shard_starts_[shard + 1] - shard_starts_[shard];
195 return shard_starts_[shard];
201 return shard_masses_[shard];
206 const std::function<
void(
const Shard&)>& func)
const;
210 const std::function<
double(
const Shard&)>& func)
const;
215 const std::function<
bool(
const Shard&)>& func)
const;
219 return shard_starts_;
226 std::vector<int64_t> shard_starts_;
228 std::vector<int64_t> shard_masses_;
239 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix,
251 const Sharder& sharder, Eigen::VectorXd& dest);
255 Eigen::VectorXd& dest);
263 Eigen::VectorXd& dest);
268 Eigen::VectorXd& dest);
271double Dot(
const Eigen::VectorXd& v1,
const Eigen::VectorXd& v2,
280double Norm(
const Eigen::VectorXd& vector,
const Sharder& sharder);
284 const Eigen::VectorXd& vector2,
const Sharder& sharder);
286double Distance(
const Eigen::VectorXd& vector1,
const Eigen::VectorXd& vector2,
294 const Eigen::VectorXd& scale,
const Sharder& sharder);
298 const Eigen::VectorXd& scale,
const Sharder& sharder);
300double ScaledNorm(
const Eigen::VectorXd& vector,
const Eigen::VectorXd& scale,
314 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix,
315 const Eigen::VectorXd& row_scaling_vec,
316 const Eigen::VectorXd& col_scaling_vec,
const Sharder& sharder);
319 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix,
320 const Eigen::VectorXd& row_scaling_vec,
321 const Eigen::VectorXd& col_scaling_vec,
const Sharder& sharder);
325 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix,
#define CHECK_LT(val1, val2)
#define CHECK_EQ(val1, val2)
#define CHECK_GE(val1, val2)
#define CHECK_NE(val1, val2)
auto operator()(const Eigen::DiagonalMatrix< double, Eigen::Dynamic > &diag) const -> decltype(diag.diagonal().segment(0, 0).asDiagonal())
Eigen::VectorBlock< Eigen::VectorXd > operator()(Eigen::VectorXd &vector) const
Eigen::VectorBlock< Eigen::VectorXd > operator()(Eigen::VectorBlock< Eigen::VectorXd > vector) const
ConstSparseColumnBlock operator()(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix) const
Eigen::VectorBlock< const Eigen::VectorXd > operator()(Eigen::VectorBlock< const Eigen::VectorXd > vector) const
Eigen::VectorBlock< const Eigen::VectorXd > operator()(const Eigen::VectorXd &vector) const
SparseColumnBlock operator()(Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix) const
Sharder(const Sharder &other)=default
Sharder(int64_t num_elements, int num_shards, ThreadPool *thread_pool, const std::function< int64_t(int64_t)> &element_mass)
double ParallelSumOverShards(const std::function< double(const Shard &)> &func) const
::Eigen::Block< const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t >, Eigen::Dynamic, Eigen::Dynamic, true > ConstSparseColumnBlock
void ParallelForEachShard(const std::function< void(const Shard &)> &func) const
const std::vector< int64_t > & ShardStartsForTesting() const
Sharder(Sharder &&other)=default
bool ParallelTrueForAllShards(const std::function< bool(const Shard &)> &func) const
int64_t ShardSize(int shard) const
::Eigen::Block< Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t >, Eigen::Dynamic, Eigen::Dynamic, true > SparseColumnBlock
int64_t ShardStart(int shard) const
int64_t NumElements() const
Sharder(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, int num_shards, ThreadPool *thread_pool)
Sharder & operator=(const Sharder &other)=default
Sharder & operator=(Sharder &&other)=default
int64_t ShardMass(int shard) const
double SquaredNorm(const VectorXd &vector, const Sharder &sharder)
double ScaledNorm(const VectorXd &vector, const VectorXd &scale, const Sharder &sharder)
double Dot(const VectorXd &v1, const VectorXd &v2, const Sharder &sharder)
double SquaredDistance(const VectorXd &vector1, const VectorXd &vector2, const Sharder &sharder)
double LInfNorm(const VectorXd &vector, const Sharder &sharder)
double Distance(const VectorXd &vector1, const VectorXd &vector2, const Sharder &sharder)
VectorXd TransposedMatrixVectorProduct(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, const VectorXd &vector, const Sharder &sharder)
double ScaledLInfNorm(const VectorXd &vector, const VectorXd &scale, const Sharder &sharder)
double ScaledSquaredNorm(const VectorXd &vector, const VectorXd &scale, const Sharder &sharder)
VectorXd ScaledColLInfNorm(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, const VectorXd &row_scaling_vec, const VectorXd &col_scaling_vec, const Sharder &sharder)
void AddScaledVector(const double scale, const VectorXd &increment, const Sharder &sharder, VectorXd &dest)
void CoefficientWiseProductInPlace(const VectorXd &scale, const Sharder &sharder, VectorXd &dest)
void CoefficientWiseQuotientInPlace(const VectorXd &scale, const Sharder &sharder, VectorXd &dest)
VectorXd ScaledColL2Norm(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, const VectorXd &row_scaling_vec, const VectorXd &col_scaling_vec, const Sharder &sharder)
double L1Norm(const VectorXd &vector, const Sharder &sharder)
VectorXd CloneVector(const VectorXd &vec, const Sharder &sharder)
bool IsDiagonal(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, const Sharder &sharder)
double Norm(const VectorXd &vector, const Sharder &sharder)
void AssignVector(const VectorXd &vec, const Sharder &sharder, VectorXd &dest)