Skip to content

Commit aeb41eb

Browse files
committed
Added class DenseMatrix that will be used LBFGSHessian
1 parent a0edbfd commit aeb41eb

File tree

7 files changed

+76
-8
lines changed

7 files changed

+76
-8
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ file(GLOB TESTS_UNO_SOURCE_FILES
7878
unotest/unit_tests/ConcatenationTests.cpp
7979
unotest/unit_tests/COOSparseStorageTests.cpp
8080
unotest/unit_tests/CSCSparseStorageTests.cpp
81+
unotest/unit_tests/DenseMatrixTests.cpp
8182
unotest/unit_tests/MatrixVectorProductTests.cpp
8283
unotest/unit_tests/RangeTests.cpp
8384
unotest/unit_tests/ScalarMultipleTests.cpp

uno/ingredients/hessian_models/HessianModelFactory.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
#include "HessianModel.hpp"
77
#include "ConvexifiedHessian.hpp"
88
#include "ExactHessian.hpp"
9-
#include "LBFGSHessian.hpp"
109
#include "ZeroHessian.hpp"
1110
#include "ingredients/subproblem_solvers/DirectSymmetricIndefiniteLinearSolver.hpp"
11+
#ifdef HAS_LAPACK
12+
#include "LBFGSHessian.hpp"
13+
#include "options/Options.hpp"
14+
#endif
1215

1316
namespace uno {
1417
std::unique_ptr<HessianModel> HessianModelFactory::create(const std::string& hessian_model, size_t dimension, size_t number_nonzeros,
@@ -22,8 +25,8 @@ namespace uno {
2225
}
2326
}
2427
#ifdef HAS_LAPACK
25-
else if (true || hessian_model == "L-BFGS") {
26-
return std::make_unique<LBFGSHessian>(dimension);
28+
else if (hessian_model == "L-BFGS") {
29+
return std::make_unique<LBFGSHessian>(dimension, options.get_unsigned_int("quasi_newton_memory_size"));
2730
}
2831
#endif
2932
else if (hessian_model == "zero") {

uno/ingredients/hessian_models/LBFGSHessian.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@ extern "C" {
1313
#endif
1414

1515
namespace uno {
16-
LBFGSHessian::LBFGSHessian(size_t dimension): HessianModel(), dimension(dimension) {
16+
LBFGSHessian::LBFGSHessian(size_t dimension, size_t memory_size):
17+
HessianModel(),
18+
dimension(dimension),
19+
memory_size(memory_size),
20+
S_matrix(dimension, memory_size),
21+
Y_matrix(dimension, memory_size),
22+
M_matrix(memory_size, memory_size) {
1723
}
1824

1925
void LBFGSHessian::initialize_statistics(Statistics& /*statistics*/, const Options& /*options*/) const {

uno/ingredients/hessian_models/LBFGSHessian.hpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
// Copyright (c) 2025 Charlie Vanaret
22
// Licensed under the MIT license. See LICENSE file in the project directory for details.
33

4-
#include "HessianModel.hpp"
5-
64
#ifndef UNO_LBFGSHESSIAN_H
75
#define UNO_LBFGSHESSIAN_H
86

7+
#include "HessianModel.hpp"
8+
#include "linear_algebra/DenseMatrix.hpp"
9+
910
namespace uno {
1011
class LBFGSHessian : public HessianModel {
1112
public:
12-
explicit LBFGSHessian(size_t dimension);
13+
LBFGSHessian(size_t dimension, size_t memory_size);
1314
~LBFGSHessian() override = default;
1415

1516
void initialize_statistics(Statistics& statistics, const Options& options) const override;
@@ -21,6 +22,10 @@ namespace uno {
2122

2223
protected:
2324
const size_t dimension;
25+
const size_t memory_size;
26+
DenseMatrix<double> S_matrix;
27+
DenseMatrix<double> Y_matrix;
28+
DenseMatrix<double> M_matrix;
2429
};
2530
} // namespace
2631

uno/linear_algebra/CSCSparseStorage.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include <vector>
99
#include "SparseStorage.hpp"
1010
#include "linear_algebra/Vector.hpp"
11-
#include "tools/Infinity.hpp"
1211
#include "symbolic/VectorView.hpp"
1312

1413
namespace uno {

uno/linear_algebra/DenseMatrix.hpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (c) 2025 Charlie Vanaret
2+
// Licensed under the MIT license. See LICENSE file in the project directory for details.
3+
4+
#ifndef UNO_DENSEMATRIX_H
5+
#define UNO_DENSEMATRIX_H
6+
7+
#include <cstddef>
8+
#include <vector>
9+
10+
namespace uno {
11+
template <typename ElementType>
12+
class DenseMatrix {
13+
public:
14+
DenseMatrix(size_t number_rows, size_t number_columns);
15+
~DenseMatrix() = default;
16+
17+
ElementType& get(size_t row_index, size_t column_index);
18+
ElementType* data() const;
19+
20+
protected:
21+
const size_t number_rows, number_columns;
22+
std::vector<ElementType> matrix; // column-major ordering
23+
};
24+
25+
template <typename ElementType>
26+
DenseMatrix<ElementType>::DenseMatrix(size_t number_rows, size_t number_columns):
27+
number_rows(number_rows), number_columns(number_columns),
28+
matrix(number_rows * number_columns, ElementType(0)) {
29+
}
30+
31+
template <typename ElementType>
32+
ElementType& DenseMatrix<ElementType>::get(size_t row_index, size_t column_index) {
33+
return this->matrix[column_index * this->number_rows + row_index];
34+
}
35+
36+
template <typename ElementType>
37+
ElementType* DenseMatrix<ElementType>::data() const {
38+
return this->matrix.data();
39+
}
40+
} // namespace
41+
42+
#endif // UNO_DENSEMATRIX_H
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright (c) 2025 Charlie Vanaret
2+
// Licensed under the MIT license. See LICENSE file in the project directory for details.
3+
4+
#include <gtest/gtest.h>
5+
#include "linear_algebra/DenseMatrix.hpp"
6+
7+
using namespace uno;
8+
9+
TEST(DenseMatrix, Access) {
10+
DenseMatrix<double> M(5, 2);
11+
ASSERT_EQ(M.get(1, 1), 0.);
12+
}

0 commit comments

Comments
 (0)