OR-Tools  9.6
sharder_test.cc
Go to the documentation of this file.
1 // Copyright 2010-2022 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 #include "ortools/pdlp/sharder.h"
15 
16 #include <algorithm>
17 #include <cmath>
18 #include <cstdint>
19 #include <numeric>
20 #include <random>
21 #include <vector>
22 
23 #include "Eigen/Core"
24 #include "Eigen/SparseCore"
25 #include "absl/random/distributions.h"
26 #include "gmock/gmock.h"
27 #include "gtest/gtest.h"
28 #include "ortools/base/logging.h"
29 #include "ortools/base/mathutil.h"
31 
32 namespace operations_research::pdlp {
33 namespace {
34 
35 using ::Eigen::DiagonalMatrix;
36 using ::Eigen::VectorXd;
37 using ::testing::DoubleNear;
38 using ::testing::ElementsAre;
39 using ::testing::Test;
40 using Shard = Sharder::Shard;
41 
42 // Returns a sparse representation of the matrix
43 // 7 -0.5 . .
44 // 1 . 3 2
45 // -1 . . 5
46 Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> TestSparseMatrix() {
47  Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> mat(3, 4);
48  mat.coeffRef(0, 0) = 7;
49  mat.coeffRef(0, 1) = -0.5;
50  mat.coeffRef(1, 0) = 1;
51  mat.coeffRef(1, 2) = 3;
52  mat.coeffRef(1, 3) = 2;
53  mat.coeffRef(2, 0) = -1;
54  mat.coeffRef(2, 3) = 5;
55  mat.makeCompressed();
56  return mat;
57 }
58 
59 // A random matrix with a power law distribution of non-zeros per col.
60 // Specifically col i has order n/(i+1) non-zeros in expectation.
61 Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> LargeSparseMatrix(
62  const int64_t size) {
63  // Deterministic RNG.
64  std::mt19937 rand(48709241);
65  std::vector<Eigen::Triplet<double, int64_t>> triplets;
66  for (int64_t col = 0; col < size; ++col) {
67  int64_t row = -1;
68  while (row < size) {
69  row += absl::Uniform(rand, 1, col + 2);
70  if (row < size) {
71  double value = absl::Uniform(rand, 1, 10);
72  triplets.emplace_back(row, col, value);
73  }
74  }
75  }
76  Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> mat(size, size);
77  mat.setFromTriplets(triplets.begin(), triplets.end());
78  return mat;
79 }
80 
81 // Verify that `sharder` is consistent and has shards of reasonable mass.
82 // Requires `target_num_shards > 0` and `!element_masses.empty()`.
83 void VerifySharder(const Sharder& sharder, const int target_num_shards,
84  const std::vector<int64_t>& element_masses) {
85  int64_t num_elements = element_masses.size();
86  int num_shards = sharder.NumShards();
87  ASSERT_EQ(sharder.NumElements(), num_elements);
88  ASSERT_GE(num_elements, 1);
89  ASSERT_GE(num_shards, 1);
90  int64_t elements_so_far = 0;
91  for (int shard = 0; shard < num_shards; ++shard) {
92  int64_t shard_start = sharder.ShardStart(shard);
93  EXPECT_EQ(shard_start, elements_so_far) << " in shard: " << shard;
94  int64_t shard_mass = 0;
95  EXPECT_GE(sharder.ShardSize(shard), 1) << " in shard: " << shard;
96  EXPECT_GE(sharder.ShardMass(shard), 1) << " in shard: " << shard;
97  for (int64_t i = 0; i < sharder.ShardSize(shard); ++i) {
98  shard_mass += element_masses[shard_start + i];
99  }
100  EXPECT_EQ(shard_mass, sharder.ShardMass(shard)) << " in shard: " << shard;
101  elements_so_far += sharder.ShardSize(shard);
102  }
103  EXPECT_EQ(elements_so_far, num_elements);
104 
105  EXPECT_LE(num_shards, 2 * target_num_shards);
106  ASSERT_GE(target_num_shards, 1);
107  const int64_t overall_mass =
108  std::accumulate(element_masses.begin(), element_masses.end(), int64_t{0});
109  const int64_t max_element_mass =
110  *std::max_element(element_masses.begin(), element_masses.end());
111  const int64_t upper_mass_limit = std::max(
112  max_element_mass,
113  MathUtil::CeilOfRatio(max_element_mass, int64_t{2}) +
114  MathUtil::CeilOfRatio(overall_mass, int64_t{target_num_shards}));
115  const int64_t lower_mass_limit =
116  overall_mass / target_num_shards -
117  MathUtil::CeilOfRatio(max_element_mass, int64_t{2});
118  for (int shard = 0; shard < sharder.NumShards(); ++shard) {
119  EXPECT_LE(sharder.ShardMass(shard), upper_mass_limit)
120  << " in shard: " << shard;
121  if (shard + 1 < sharder.NumShards()) {
122  EXPECT_GE(sharder.ShardMass(shard), lower_mass_limit)
123  << " in shard: " << shard;
124  }
125  }
126 }
127 
128 TEST(SharderTest, SharderFromMatrix) {
129  Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> mat =
130  TestSparseMatrix();
131  Sharder sharder(mat, /*num_shards=*/2, nullptr);
132  VerifySharder(sharder, 2, {4, 2, 2, 3});
133 }
134 
135 TEST(SharderTest, UniformSharder) {
136  Sharder sharder(/*num_elements=*/10, /*num_shards=*/3, nullptr);
137  VerifySharder(sharder, 3, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1});
138 }
139 
140 TEST(SharderTest, UniformSharderFromOtherSharder) {
141  Sharder other_sharder(/*num_elements=*/5, /*num_shards=*/3, nullptr);
142  Sharder sharder(other_sharder, /*num_elements=*/10);
143  VerifySharder(sharder, other_sharder.NumShards(),
144  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1});
145 }
146 
147 TEST(SharderTest, UniformSharderExcessiveShards) {
148  Sharder sharder(/*num_elements=*/5, /*num_shards=*/7, nullptr);
149  EXPECT_THAT(sharder.ShardStartsForTesting(), ElementsAre(0, 1, 2, 3, 4, 5));
150  VerifySharder(sharder, 7, {1, 1, 1, 1, 1});
151 }
152 
153 TEST(SharderTest, UniformSharderHugeNumShards) {
154  Sharder sharder(/*num_elements=*/5, /*num_shards=*/1'000'000'000, nullptr);
155  EXPECT_THAT(sharder.ShardStartsForTesting(), ElementsAre(0, 1, 2, 3, 4, 5));
156  VerifySharder(sharder, 7, {1, 1, 1, 1, 1});
157 }
158 
159 TEST(SharderTest, UniformSharderOneShard) {
160  Sharder sharder(/*num_elements=*/5, /*num_shards=*/1, nullptr);
161  EXPECT_THAT(sharder.ShardStartsForTesting(), ElementsAre(0, 5));
162  VerifySharder(sharder, 1, {1, 1, 1, 1, 1});
163 }
164 
165 TEST(SharderTest, UniformSharderOneElementVector) {
166  Sharder sharder(/*num_elements=*/1, /*num_shards=*/5, nullptr);
167  EXPECT_THAT(sharder.ShardStartsForTesting(), ElementsAre(0, 1));
168  VerifySharder(sharder, 5, {1});
169 }
170 
171 TEST(SharderTest, UniformSharderZeroElementVector) {
172  Sharder sharder(/*num_elements=*/0, /*num_shards=*/3, nullptr);
173  EXPECT_THAT(sharder.ShardStartsForTesting(), ElementsAre(0));
174  EXPECT_EQ(sharder.NumShards(), 0);
175  EXPECT_EQ(sharder.NumElements(), 0);
176  sharder.ParallelForEachShard([](const Shard& /*shard*/) {
177  LOG(FATAL) << "There are no shards so this shouldn't be called.";
178  });
179 }
180 
181 TEST(SharderTest, UniformSharderFromOtherZeroElementSharder) {
182  Sharder empty_sharder(/*num_elements=*/0, /*num_shards=*/3, nullptr);
183  EXPECT_THAT(empty_sharder.ShardStartsForTesting(), ElementsAre(0));
184  EXPECT_EQ(empty_sharder.NumShards(), 0);
185  EXPECT_EQ(empty_sharder.NumElements(), 0);
186  Sharder sharder(empty_sharder, /*num_elements=*/5);
187  EXPECT_THAT(sharder.ShardStartsForTesting(), ElementsAre(0, 5));
188  VerifySharder(sharder, 1, {1, 1, 1, 1, 1});
189 }
190 
191 TEST(ParallelSumOverShards, SmallExample) {
192  VectorXd vec(3);
193  vec << 1, 2, 3;
194  Sharder sharder(vec.size(), /*num_shards=*/2, nullptr);
195  const double sum = sharder.ParallelSumOverShards(
196  [&vec](const Shard& shard) { return shard(vec).sum(); });
197  EXPECT_EQ(sum, 6.0);
198 }
199 
200 TEST(ParallelSumOverShards, SmallExampleUsingVectorBlock) {
201  VectorXd vec(3);
202  vec << 1, 2, 3;
203  auto vec_block = vec.segment(1, 2);
204  Sharder sharder(vec_block.size(), /*num_shards=*/2, nullptr);
205  const double sum = sharder.ParallelSumOverShards(
206  [&vec_block](const Shard& shard) { return shard(vec_block).sum(); });
207  EXPECT_EQ(sum, 5.0);
208 }
209 
210 TEST(ParallelSumOverShards, SmallExampleUsingConstVectorBlock) {
211  VectorXd vec(3);
212  vec << 1, 2, 3;
213  const VectorXd& const_vec = vec;
214  auto vec_block = const_vec.segment(1, 2);
215  Sharder sharder(vec_block.size(), /*num_shards=*/2, nullptr);
216  const double sum = sharder.ParallelSumOverShards(
217  [&vec_block](const Shard& shard) { return shard(vec_block).sum(); });
218  EXPECT_EQ(sum, 5.0);
219 }
220 
221 TEST(ParallelSumOverShards, SmallExampleUsingDiagonalMatrix) {
222  DiagonalMatrix<double, Eigen::Dynamic> diag{{1, 2, 3}};
223  Sharder sharder(diag.cols(), /*num_shards=*/2, nullptr);
224  const double sum = sharder.ParallelSumOverShards(
225  [&diag](const Shard& shard) { return shard(diag).diagonal().sum(); });
226  EXPECT_EQ(sum, 6.0);
227 }
228 
229 TEST(ParallelSumOverShards, SmallExampleUsingDiagonalMatrixMultiplication) {
230  DiagonalMatrix<double, Eigen::Dynamic> diag{{1, 2, 3}};
231  VectorXd vec{{1, 1, 1}};
232  VectorXd answer(3);
233  Sharder sharder(diag.cols(), /*num_shards=*/2, nullptr);
234  sharder.ParallelForEachShard(
235  [&](const Shard& shard) { shard(answer) = shard(diag) * shard(vec); });
236  EXPECT_THAT(answer, ElementsAre(1.0, 2.0, 3.0));
237 }
238 
239 TEST(ParallelTrueForAllShards, SmallTrueExample) {
240  VectorXd vec(3);
241  vec << 1, 2, 3;
242  Sharder sharder(vec.size(), /*num_shards=*/2, nullptr);
243  const bool result = sharder.ParallelTrueForAllShards(
244  [&vec](const Shard& shard) { return (shard(vec).array() > 0.0).all(); });
245  EXPECT_TRUE(result);
246 }
247 
248 TEST(ParallelTrueForAllShards, SmallFalseExample) {
249  VectorXd vec(3);
250  vec << 1, 2, 3;
251  Sharder sharder(vec.size(), /*num_shards=*/2, nullptr);
252  const bool result = sharder.ParallelTrueForAllShards(
253  [&vec](const Shard& shard) { return (shard(vec).array() < 2.5).all(); });
254  EXPECT_FALSE(result);
255 }
256 
257 TEST(MatrixVectorProductTest, SmallExample) {
258  Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> mat =
259  TestSparseMatrix();
260  Sharder sharder(mat, /*num_shards=*/3, nullptr);
261  VectorXd vec(3);
262  vec << 1, 2, 3;
263  VectorXd ans = TransposedMatrixVectorProduct(mat, vec, sharder);
264  EXPECT_THAT(ans, ElementsAre(6.0, -0.5, 6.0, 19));
265 }
266 
267 TEST(SetZeroTest, SmallExample) {
268  Sharder sharder(3, /*num_shards=*/2, nullptr);
269  VectorXd vec(2);
270  vec << 1, 7;
271  SetZero(sharder, vec);
272  EXPECT_THAT(vec, ElementsAre(0.0, 0.0, 0.0));
273 }
274 
275 TEST(ZeroVectorTest, SmallExample) {
276  Sharder sharder(3, /*num_shards=*/2, nullptr);
277  EXPECT_THAT(ZeroVector(sharder), ElementsAre(0.0, 0.0, 0.0));
278 }
279 
280 TEST(OnesVectorTest, SmallExample) {
281  Sharder sharder(3, /*num_shards=*/2, nullptr);
282  EXPECT_THAT(OnesVector(sharder), ElementsAre(1.0, 1.0, 1.0));
283 }
284 
285 TEST(AddScaledVectorTest, SmallExample) {
286  Sharder sharder(3, /*num_shards=*/2, nullptr);
287  VectorXd vec1(3), vec2(3);
288  vec1 << 4, 5, 20;
289  vec2 << 1, 7, 3;
290  AddScaledVector(2.0, vec2, sharder, /*dest=*/vec1);
291  EXPECT_THAT(vec1, ElementsAre(6, 19, 26));
292 }
293 
294 TEST(AssignVectorTest, SmallExample) {
295  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
296  VectorXd vec1, vec2(3);
297  vec2 << 1, 7, 3;
298  AssignVector(vec2, sharder, /*dest=*/vec1);
299  EXPECT_THAT(vec1, ElementsAre(1, 7, 3));
300 }
301 
302 TEST(CloneVectorTest, SmallExample) {
303  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
304  VectorXd vec(3);
305  vec << 1, 7, 3;
306  EXPECT_THAT(CloneVector(vec, sharder), ElementsAre(1, 7, 3));
307 }
308 
309 TEST(CoefficientWiseProductInPlaceTest, SmallExample) {
310  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
311  VectorXd vec1(3), vec2(3);
312  vec1 << 4, 5, 20;
313  vec2 << 1, 2, 3;
314  CoefficientWiseProductInPlace(/*scale=*/vec2, sharder,
315  /*dest=*/vec1);
316  EXPECT_THAT(vec1, ElementsAre(4, 10, 60));
317 }
318 
319 TEST(CoefficientWiseQuotientInPlaceTest, SmallExample) {
320  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
321  VectorXd vec1(3), vec2(3);
322  vec1 << 4, 6, 20;
323  vec2 << 1, 2, 5;
324  CoefficientWiseQuotientInPlace(/*scale=*/vec2, sharder,
325  /*dest=*/vec1);
326  EXPECT_THAT(vec1, ElementsAre(4, 3, 4));
327 }
328 
329 TEST(DotTest, SmallExample) {
330  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
331  VectorXd vec1(3), vec2(3);
332  vec1 << 1, 2, 3;
333  vec2 << 4, 5, 6;
334  double ans = Dot(vec1, vec2, sharder);
335  EXPECT_THAT(ans, DoubleNear(4 + 10 + 18, 1.0e-13));
336 }
337 
338 TEST(LInfNormTest, SmallExample) {
339  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
340  VectorXd vec(3);
341  vec << -1, 2, -3;
342  double ans = LInfNorm(vec, sharder);
343  EXPECT_EQ(ans, 3);
344 }
345 
346 TEST(LInfNormTest, EmptyExample) {
347  Sharder sharder(/*num_elements=*/0, /*num_shards=*/2, nullptr);
348  VectorXd vec(0);
349  double ans = LInfNorm(vec, sharder);
350  EXPECT_EQ(ans, 0);
351 }
352 
353 TEST(L1NormTest, SmallExample) {
354  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
355  VectorXd vec(3);
356  vec << -1, 2, -3;
357  double ans = L1Norm(vec, sharder);
358  EXPECT_EQ(ans, 6);
359 }
360 
361 TEST(L1NormTest, EmptyExample) {
362  Sharder sharder(/*num_elements=*/0, /*num_shards=*/2, nullptr);
363  VectorXd vec(0);
364  double ans = L1Norm(vec, sharder);
365  EXPECT_EQ(ans, 0);
366 }
367 
368 TEST(SquaredNormTest, SmallExample) {
369  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
370  VectorXd vec(3);
371  vec << 1, 2, 3;
372  double ans = SquaredNorm(vec, sharder);
373  EXPECT_THAT(ans, DoubleNear(1 + 4 + 9, 1.0e-13));
374 }
375 
376 TEST(NormTest, SmallExample) {
377  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
378  VectorXd vec(3);
379  vec << 1, 2, 3;
380  double ans = Norm(vec, sharder);
381  EXPECT_THAT(ans, DoubleNear(std::sqrt(1 + 4 + 9), 1.0e-13));
382 }
383 
384 TEST(SquaredDistanceTest, SmallExample) {
385  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
386  VectorXd vec1(3);
387  VectorXd vec2(3);
388  vec1 << 1, 1, 1;
389  vec2 << 1, 2, 3;
390  double ans = SquaredDistance(vec1, vec2, sharder);
391  EXPECT_THAT(ans, DoubleNear(5, 1.0e-13));
392 }
393 
394 TEST(DistanceTest, SmallExample) {
395  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
396  VectorXd vec1(3);
397  VectorXd vec2(3);
398  vec1 << 1, 1, 1;
399  vec2 << 1, 2, 3;
400  double ans = Distance(vec1, vec2, sharder);
401  EXPECT_THAT(ans, DoubleNear(std::sqrt(5), 1.0e-13));
402 }
403 
404 TEST(ScaledLInfNormTest, SmallExample) {
405  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
406  VectorXd vec(3);
407  VectorXd scale(3);
408  vec << -1, 2, -3;
409  scale << 4, 6, 1;
410  double ans = ScaledLInfNorm(vec, scale, sharder);
411  EXPECT_EQ(ans, 12);
412 }
413 
414 TEST(ScaledSquaredNormTest, SmallExample) {
415  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
416  VectorXd vec(3);
417  VectorXd scale(3);
418  vec << -1, 2, -3;
419  scale << 4, 6, 1;
420  double ans = ScaledSquaredNorm(vec, scale, sharder);
421  EXPECT_EQ(ans, 169);
422 }
423 
424 TEST(ScaledNormTest, SmallExample) {
425  Sharder sharder(/*num_elements=*/3, /*num_shards=*/2, nullptr);
426  VectorXd vec(3);
427  VectorXd scale(3);
428  vec << -1, 2, -3;
429  scale << 4, 6, 1;
430  double ans = ScaledNorm(vec, scale, sharder);
431  EXPECT_EQ(ans, std::sqrt(169));
432 }
433 
434 TEST(ScaledColLInfNorm, SmallExample) {
435  Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> mat =
436  TestSparseMatrix();
437  Sharder sharder(mat, /*num_shards=*/3, nullptr);
438  VectorXd row_scaling_vec(3);
439  VectorXd col_scaling_vec(4);
440  row_scaling_vec << 1, -2, 1;
441  col_scaling_vec << 1, 2, -1, -1;
442  VectorXd answer =
443  ScaledColLInfNorm(mat, row_scaling_vec, col_scaling_vec, sharder);
444  EXPECT_THAT(answer, ElementsAre(7, 1, 6, 5));
445 }
446 
447 TEST(ScaledColL2Norm, SmallExample) {
448  Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> mat =
449  TestSparseMatrix();
450  Sharder sharder(mat, /*num_shards=*/3, nullptr);
451  VectorXd row_scaling_vec(3);
452  VectorXd col_scaling_vec(4);
453  row_scaling_vec << 1, -2, 1;
454  col_scaling_vec << 1, 2, -1, -1;
455  VectorXd answer =
456  ScaledColL2Norm(mat, row_scaling_vec, col_scaling_vec, sharder);
457  EXPECT_THAT(answer, ElementsAre(std::sqrt(54), 1.0, 6.0, std::sqrt(41)));
458 }
459 
460 class VariousSizesTest : public testing::TestWithParam<int64_t> {};
461 
462 TEST_P(VariousSizesTest, LargeMatVec) {
463  const int64_t size = GetParam();
464  Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t> mat =
465  LargeSparseMatrix(size);
466  const int num_threads = 5;
467  const int shards_per_thread = 3;
468  ThreadPool pool("MatrixVectorProductTest", num_threads);
469  pool.StartWorkers();
470  Sharder sharder(mat, shards_per_thread * num_threads, &pool);
471  VectorXd rhs = VectorXd::Random(size);
472  VectorXd direct = mat.transpose() * rhs;
473  VectorXd threaded = TransposedMatrixVectorProduct(mat, rhs, sharder);
474  EXPECT_LE((direct - threaded).norm(), 1.0e-8);
475 }
476 
477 TEST_P(VariousSizesTest, LargeVectors) {
478  const int64_t size = GetParam();
479  const int num_threads = 5;
480  ThreadPool pool("SquaredNormTest", num_threads);
481  pool.StartWorkers();
482  Sharder sharder(size, num_threads, &pool);
483  VectorXd vec = VectorXd::Random(size);
484  const double direct = vec.squaredNorm();
485  const double threaded = SquaredNorm(vec, sharder);
486  EXPECT_THAT(threaded, DoubleNear(direct, size * 1.0e-14));
487 }
488 
489 INSTANTIATE_TEST_SUITE_P(VariousSizesTestInstantiation, VariousSizesTest,
490  testing::Values(10, 1000, 100 * 1000));
491 
492 } // namespace
493 } // namespace operations_research::pdlp
int64_t max
Definition: alldiff_cst.cc:140
static IntegralType CeilOfRatio(IntegralType numerator, IntegralType denominator)
Definition: mathutil.h:39
int64_t value
ColIndex col
Definition: markowitz.cc:186
RowIndex row
Definition: markowitz.cc:185
double SquaredNorm(const VectorXd &vector, const Sharder &sharder)
Definition: sharder.cc:243
void SetZero(const Sharder &sharder, VectorXd &dest)
Definition: sharder.cc:173
double ScaledNorm(const VectorXd &vector, const VectorXd &scale, const Sharder &sharder)
Definition: sharder.cc:281
double Dot(const VectorXd &v1, const VectorXd &v2, const Sharder &sharder)
Definition: sharder.cc:225
double SquaredDistance(const VectorXd &vector1, const VectorXd &vector2, const Sharder &sharder)
Definition: sharder.cc:252
double LInfNorm(const VectorXd &vector, const Sharder &sharder)
Definition: sharder.cc:230
double Distance(const VectorXd &vector1, const VectorXd &vector2, const Sharder &sharder)
Definition: sharder.cc:259
VectorXd TransposedMatrixVectorProduct(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, const VectorXd &vector, const Sharder &sharder)
Definition: sharder.cc:158
double ScaledLInfNorm(const VectorXd &vector, const VectorXd &scale, const Sharder &sharder)
Definition: sharder.cc:264
double ScaledSquaredNorm(const VectorXd &vector, const VectorXd &scale, const Sharder &sharder)
Definition: sharder.cc:274
VectorXd ScaledColLInfNorm(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, const VectorXd &row_scaling_vec, const VectorXd &col_scaling_vec, const Sharder &sharder)
Definition: sharder.cc:286
void AddScaledVector(const double scale, const VectorXd &increment, const Sharder &sharder, VectorXd &dest)
Definition: sharder.cc:192
void CoefficientWiseProductInPlace(const VectorXd &scale, const Sharder &sharder, VectorXd &dest)
Definition: sharder.cc:211
void CoefficientWiseQuotientInPlace(const VectorXd &scale, const Sharder &sharder, VectorXd &dest)
Definition: sharder.cc:218
VectorXd ScaledColL2Norm(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &matrix, const VectorXd &row_scaling_vec, const VectorXd &col_scaling_vec, const Sharder &sharder)
Definition: sharder.cc:308
double L1Norm(const VectorXd &vector, const Sharder &sharder)
Definition: sharder.cc:238
VectorXd CloneVector(const VectorXd &vec, const Sharder &sharder)
Definition: sharder.cc:205
double Norm(const VectorXd &vector, const Sharder &sharder)
Definition: sharder.cc:248
VectorXd ZeroVector(const Sharder &sharder)
Definition: sharder.cc:179
void AssignVector(const VectorXd &vec, const Sharder &sharder, VectorXd &dest)
Definition: sharder.cc:199
VectorXd OnesVector(const Sharder &sharder)
Definition: sharder.cc:185
TEST(LinearAssignmentTest, NullMatrix)