Skip to content

Commit b3cc74e

Browse files
committed
Some progress on L-BFGS
1 parent aeb41eb commit b3cc74e

File tree

15 files changed

+91
-22
lines changed

15 files changed

+91
-22
lines changed

uno/ingredients/constraint_relaxation_strategies/FeasibilityRestoration.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ namespace uno {
178178
}
179179
ConstraintRelaxationStrategy::set_progress_statistics(statistics, trial_iterate);
180180
if (accept_iterate) {
181-
this->inequality_handling_method->notify_accepted_iterate(trial_iterate);
181+
this->inequality_handling_method->notify_accepted_iterate(current_iterate, trial_iterate);
182182
user_callbacks.notify_acceptable_iterate(trial_iterate.primals,
183183
this->current_phase == Phase::OPTIMALITY ? trial_iterate.multipliers : trial_iterate.feasibility_multipliers,
184184
this->current_problem().get_objective_multiplier());

uno/ingredients/constraint_relaxation_strategies/l1Relaxation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ namespace uno {
262262
if (accept_iterate) {
263263
this->check_exact_relaxation(trial_iterate);
264264
// this->set_dual_residuals_statistics(statistics, trial_iterate);
265-
this->inequality_handling_method->notify_accepted_iterate(trial_iterate);
265+
this->inequality_handling_method->notify_accepted_iterate(current_iterate, trial_iterate);
266266
user_callbacks.notify_acceptable_iterate(trial_iterate.primals, trial_iterate.multipliers, this->penalty_parameter);
267267
}
268268
this->set_progress_statistics(statistics, trial_iterate);

uno/ingredients/hessian_models/ConvexifiedHessian.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace uno {
2525
statistics.add_column("regulariz", Statistics::double_width - 4, options.get_int("statistics_regularization_column_order"));
2626
}
2727

28-
void ConvexifiedHessian::notify_accepted_iterate(const Iterate& /*iterate*/) {
28+
void ConvexifiedHessian::notify_accepted_iterate(const Iterate& /*current_iterate*/, const Iterate& /*trial_iterate*/) {
2929
// do nothing
3030
}
3131

uno/ingredients/hessian_models/ConvexifiedHessian.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace uno {
1616
ConvexifiedHessian(size_t dimension, size_t number_nonzeros, const Options& options);
1717

1818
void initialize_statistics(Statistics& statistics, const Options& options) const override;
19-
void notify_accepted_iterate(const Iterate& iterate) override;
19+
void notify_accepted_iterate(const Iterate& current_iterate, const Iterate& trial_iterate) override;
2020
void evaluate_hessian(Statistics& statistics, const OptimizationProblem& problem, const Vector<double>& primal_variables,
2121
const Vector<double>& constraint_multipliers, SymmetricMatrix<size_t, double>& hessian) override;
2222
void compute_hessian_vector_product(const OptimizationProblem& problem, const Vector<double>& vector,

uno/ingredients/hessian_models/ExactHessian.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace uno {
1414
// do nothing
1515
}
1616

17-
void ExactHessian::notify_accepted_iterate(const Iterate& /*iterate*/) {
17+
void ExactHessian::notify_accepted_iterate(const Iterate& /*current_iterate*/, const Iterate& /*trial_iterate*/) {
1818
// do nothing
1919
}
2020

uno/ingredients/hessian_models/ExactHessian.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace uno {
1010
ExactHessian();
1111

1212
void initialize_statistics(Statistics& statistics, const Options& options) const override;
13-
void notify_accepted_iterate(const Iterate& iterate) override;
13+
void notify_accepted_iterate(const Iterate& current_iterate, const Iterate& trial_iterate) override;
1414
void evaluate_hessian(Statistics& statistics, const OptimizationProblem& problem, const Vector<double>& primal_variables,
1515
const Vector<double>& constraint_multipliers, SymmetricMatrix<size_t, double>& hessian) override;
1616
void compute_hessian_vector_product(const OptimizationProblem& problem, const Vector<double>& vector,

uno/ingredients/hessian_models/HessianModel.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace uno {
2525
size_t evaluation_count{0};
2626

2727
virtual void initialize_statistics(Statistics& statistics, const Options& options) const = 0;
28-
virtual void notify_accepted_iterate(const Iterate& iterate) = 0;
28+
virtual void notify_accepted_iterate(const Iterate& current_iterate, const Iterate& trial_iterate) = 0;
2929
virtual void evaluate_hessian(Statistics& statistics, const OptimizationProblem& problem, const Vector<double>& primal_variables,
3030
const Vector<double>& constraint_multipliers, SymmetricMatrix<size_t, double>& hessian) = 0;
3131
virtual void compute_hessian_vector_product(const OptimizationProblem& problem, const Vector<double>& vector,

uno/ingredients/hessian_models/LBFGSHessian.cpp

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
#include <stdexcept>
55
#include "LBFGSHessian.hpp"
6+
#include "optimization/Iterate.hpp"
7+
#include "symbolic/Range.hpp"
68

79
#ifdef WITH_LAPACK
810
#include "fortran_interface.h"
@@ -16,18 +18,50 @@ namespace uno {
1618
LBFGSHessian::LBFGSHessian(size_t dimension, size_t memory_size):
1719
HessianModel(),
1820
dimension(dimension),
19-
memory_size(memory_size),
21+
memory_capacity(memory_size),
2022
S_matrix(dimension, memory_size),
2123
Y_matrix(dimension, memory_size),
24+
L_matrix(memory_size, memory_size),
25+
D_matrix(memory_size),
2226
M_matrix(memory_size, memory_size) {
2327
}
2428

2529
void LBFGSHessian::initialize_statistics(Statistics& /*statistics*/, const Options& /*options*/) const {
2630
// do nothing
2731
}
2832

29-
void LBFGSHessian::notify_accepted_iterate(const Iterate& /*iterate*/) {
33+
void LBFGSHessian::notify_accepted_iterate(const Iterate& current_iterate, const Iterate& trial_iterate) {
34+
std::cout << "Adding vector to L-BFGS memory at slot " << this->current_available_slot << '\n';
35+
// this->current_available_slot lives in [0, this->memory_capacity)
3036

37+
// TODO figure out if we're extending or replacing in memory
38+
39+
// fill the S matrix
40+
for (size_t variable_index: Range(this->dimension)) {
41+
this->S_matrix.entry(variable_index, this->current_available_slot) = trial_iterate.primals[variable_index] -
42+
current_iterate.primals[variable_index];
43+
}
44+
std::cout << "S:\n" << this->S_matrix;
45+
46+
// fill the Y matrix
47+
// TODO
48+
49+
// fill the D matrix (diagonal)
50+
this->D_matrix[this->current_available_slot] = 1.; // TODO dot(s_new, y_new)
51+
52+
// fill the L matrix (lower triangular with a zero diagonal)
53+
for (size_t column_index: Range(this->current_memory_size)) {
54+
for (size_t row_index: Range(column_index+1, this->current_memory_size)) {
55+
this->L_matrix.entry(row_index, column_index) = 1.; // TODO dot(s_i, y_j)
56+
}
57+
}
58+
std::cout << "L:\n" << this->L_matrix;
59+
60+
// if we exceed the size of the memory, we start over and replace the older point in memory
61+
this->current_available_slot = (this->current_available_slot + 1) % this->memory_capacity;
62+
this->current_memory_size = std::min(current_memory_size + 1, this->memory_capacity);
63+
std::cout << "There are now " << this->current_memory_size << " iterates in memory (capacity " <<
64+
this->memory_capacity << ")\n";
3165
}
3266

3367
void LBFGSHessian::evaluate_hessian(Statistics& /*statistics*/, const OptimizationProblem& /*problem*/,
@@ -36,8 +70,11 @@ namespace uno {
3670
throw std::runtime_error("LBFGSHessian::evaluate_hessian not implemented");
3771
}
3872

39-
void LBFGSHessian::compute_hessian_vector_product(const OptimizationProblem& /*problem*/, const Vector<double>& /*vector*/,
40-
const Vector<double>& /*constraint_multipliers*/, Vector<double>& /*result*/) {
41-
throw std::runtime_error("LBFGSHessian::compute_hessian_vector_product not implemented");
73+
void LBFGSHessian::compute_hessian_vector_product(const OptimizationProblem& /*problem*/, const Vector<double>& vector,
74+
const Vector<double>& /*constraint_multipliers*/, Vector<double>& result) {
75+
//throw std::runtime_error("LBFGSHessian::compute_hessian_vector_product not implemented");
76+
for (size_t variable_index: Range(vector.size())) {
77+
result[variable_index] = vector[variable_index];
78+
}
4279
}
4380
} // namespace

uno/ingredients/hessian_models/LBFGSHessian.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,21 @@ namespace uno {
1414
~LBFGSHessian() override = default;
1515

1616
void initialize_statistics(Statistics& statistics, const Options& options) const override;
17-
void notify_accepted_iterate(const Iterate& iterate) override;
17+
void notify_accepted_iterate(const Iterate& current_iterate, const Iterate& trial_iterate) override;
1818
void evaluate_hessian(Statistics& statistics, const OptimizationProblem& problem, const Vector<double>& primal_variables,
1919
const Vector<double>& constraint_multipliers, SymmetricMatrix<size_t, double>& hessian) override;
2020
void compute_hessian_vector_product(const OptimizationProblem& problem, const Vector<double>& vector,
2121
const Vector<double>& constraint_multipliers, Vector<double>& result) override;
2222

2323
protected:
2424
const size_t dimension;
25-
const size_t memory_size;
25+
const size_t memory_capacity;
26+
size_t current_memory_size{0};
27+
size_t current_available_slot{0};
2628
DenseMatrix<double> S_matrix;
2729
DenseMatrix<double> Y_matrix;
30+
DenseMatrix<double> L_matrix;
31+
std::vector<double> D_matrix; // D is diagonal
2832
DenseMatrix<double> M_matrix;
2933
};
3034
} // namespace

uno/ingredients/hessian_models/ZeroHessian.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace uno {
99
void ZeroHessian::initialize_statistics(Statistics& /*statistics*/, const Options& /*options*/) const { }
1010

11-
void ZeroHessian::notify_accepted_iterate(const Iterate& /*iterate*/) {
11+
void ZeroHessian::notify_accepted_iterate(const Iterate& /*current_iterate*/, const Iterate& /*trial_iterate*/) {
1212
// do nothing
1313
}
1414

0 commit comments

Comments
 (0)