14#ifndef PDLP_SHARDER_H_
15#define PDLP_SHARDER_H_
23#include "Eigen/SparseCore"
24#include "absl/log/check.h"
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()) {
93 CHECK_EQ(diag.diagonal().size(), parent_.
NumElements());
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) {
133 CHECK_NE(parent,
nullptr);
134 CHECK_GE(shard_num, 0);
135 CHECK_LT(shard_num, parent->
NumShards());
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_;
238 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix,
239 const Eigen::VectorXd& vector,
const Sharder& sharder);
260 const Sharder& sharder, Eigen::VectorXd& dest);
264 Eigen::VectorXd& dest);
272 Eigen::VectorXd& dest);
277 Eigen::VectorXd& dest);
280double Dot(
const Eigen::VectorXd& v1,
const Eigen::VectorXd& v2,
289double Norm(
const Eigen::VectorXd& vector,
const Sharder& sharder);
293 const Eigen::VectorXd& vector2,
const Sharder& sharder);
295double Distance(
const Eigen::VectorXd& vector1,
const Eigen::VectorXd& vector2,
303 const Eigen::VectorXd& scale,
const Sharder& sharder);
307 const Eigen::VectorXd& scale,
const Sharder& sharder);
309double ScaledNorm(
const Eigen::VectorXd& vector,
const Eigen::VectorXd& scale,
323 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix,
324 const Eigen::VectorXd& row_scaling_vec,
325 const Eigen::VectorXd& col_scaling_vec,
const Sharder& sharder);
328 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& matrix,
329 const Eigen::VectorXd& row_scaling_vec,
330 const Eigen::VectorXd& col_scaling_vec,
const Sharder& sharder);
Eigen::VectorBlock< const Eigen::VectorXd > operator()(Eigen::VectorBlock< const Eigen::VectorXd > vector) const
Returns this shard of vector.
SparseColumnBlock operator()(Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix) const
Returns this shard of the columns of matrix in mutable form.
ConstSparseColumnBlock operator()(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix) const
Returns this shard of the columns of matrix.
Eigen::VectorBlock< Eigen::VectorXd > operator()(Eigen::VectorXd &vector) const
Returns this shard of vector in mutable form.
Eigen::VectorBlock< const Eigen::VectorXd > operator()(const Eigen::VectorXd &vector) const
Returns this shard of vector.
Eigen::VectorBlock< Eigen::VectorXd > operator()(Eigen::VectorBlock< Eigen::VectorXd > vector) const
Returns this shard of vector in mutable form.
auto operator()(const Eigen::DiagonalMatrix< double, Eigen::Dynamic > &diag) const -> decltype(diag.diagonal().segment(0, 0).asDiagonal())
const std::vector< int64_t > & ShardStartsForTesting() const
Public for testing only.
Sharder(const Sharder &other)=delete
Sharder(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, int num_shards, ThreadPool *thread_pool)
Sharder & operator=(Sharder &&other)=default
bool ParallelTrueForAllShards(const std::function< bool(const Shard &)> &func) const
double ParallelSumOverShards(const std::function< double(const Shard &)> &func) const
Runs func on each of the shards and sums the results.
Sharder & operator=(const Sharder &other)=delete
int64_t ShardSize(int shard) const
::Eigen::Block< Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t >, Eigen::Dynamic, Eigen::Dynamic, true > SparseColumnBlock
::Eigen::Block< const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t >, Eigen::Dynamic, Eigen::Dynamic, true > ConstSparseColumnBlock
Sharder(Sharder &&other)=default
int64_t ShardMass(int shard) const
Sharder(int64_t num_elements, int num_shards, ThreadPool *thread_pool, const std::function< int64_t(int64_t)> &element_mass)
void ParallelForEachShard(const std::function< void(const Shard &)> &func) const
Runs func on each of the shards.
int64_t NumElements() const
The number of elements that are split into shards.
int64_t ShardStart(int shard) const
Validation utilities for solvers.proto.
double SquaredNorm(const VectorXd &vector, const Sharder &sharder)
void SetZero(const Sharder &sharder, VectorXd &dest)
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 ZeroVector(const Sharder &sharder)
Like VectorXd::Zero(sharder.NumElements()).
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)
VectorXd OnesVector(const Sharder &sharder)
Like VectorXd::Ones(sharder.NumElements()).
double Norm(const VectorXd &vector, const Sharder &sharder)
void AssignVector(const VectorXd &vec, const Sharder &sharder, VectorXd &dest)