Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions interfaces/AMPL/AMPLModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,21 +217,22 @@ namespace uno {
++this->number_model_evaluations.hessian;
}

void AMPLModel::compute_jacobian_vector_product(const double* /*x*/, const double* /*vector*/, double* /*result*/) const {
void AMPLModel::compute_jacobian_vector_product(View<const double> /*x*/, View<const double> /*vector*/, View<double> /*result*/) const {
throw std::runtime_error("AMPLModel::compute_jacobian_vector_product not implemented");
}

void AMPLModel::compute_jacobian_transposed_vector_product(const double* /*x*/, const double* /*vector*/, double* /*result*/) const {
void AMPLModel::compute_jacobian_transposed_vector_product(View<const double> /*x*/, View<const double> /*vector*/,
View<double> /*result*/) const {
throw std::runtime_error("AMPLModel::compute_jacobian_transposed_vector_product not implemented");
}

void AMPLModel::compute_hessian_vector_product(const double* /*x*/, const double* vector, double objective_multiplier,
const Vector<double>& multipliers, double* result) const {
void AMPLModel::compute_hessian_vector_product(View<const double> /*x*/, View<const double> vector, double objective_multiplier,
const Vector<double>& multipliers, View<double> result) const {
// scale by the objective sign
objective_multiplier *= this->optimization_sense;

// compute the Hessian-vector product
(this->asl->p.Hvcomp)(this->asl, result, const_cast<double*>(vector), -1, &objective_multiplier,
(this->asl->p.Hvcomp)(this->asl, result.data(), const_cast<double*>(vector.data()), -1, &objective_multiplier,
const_cast<double*>(multipliers.data()));
}

Expand Down
8 changes: 4 additions & 4 deletions interfaces/AMPL/AMPLModel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ namespace uno {
double* hessian_values) const override;

// linear operators for Jacobian-, Jacobian^T-, and Hessian-vector products
void compute_jacobian_vector_product(const double* x, const double* vector, double* result) const override;
void compute_jacobian_transposed_vector_product(const double* x, const double* vector, double* result) const override;
void compute_hessian_vector_product(const double* x, const double* vector, double objective_multiplier,
const Vector<double>& multipliers, double* result) const override;
void compute_jacobian_vector_product(View<const double> x, View<const double> vector, View<double> result) const override;
void compute_jacobian_transposed_vector_product(View<const double> x, View<const double> vector, View<double> result) const override;
void compute_hessian_vector_product(View<const double> x, View<const double> vector, double objective_multiplier,
const Vector<double>& multipliers, View<double> result) const override;

[[nodiscard]] const std::vector<double>& get_variables_lower_bounds() const override;
[[nodiscard]] const std::vector<double>& get_variables_upper_bounds() const override;
Expand Down
15 changes: 8 additions & 7 deletions interfaces/C/Uno_C_API.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,10 @@ class UnoModel: public Model {
}
}

void compute_jacobian_vector_product(const double* x, const double* vector, double* result) const override {
void compute_jacobian_vector_product(View<const double> x, View<const double> vector, View<double> result) const override {
if (this->user_model.jacobian_operator != nullptr) {
const uno_int return_code = this->user_model.jacobian_operator(this->user_model.number_variables,
this->user_model.number_constraints, x, true, vector, result, this->user_model.user_data);
this->user_model.number_constraints, x.data(), true, vector.data(), result.data(), this->user_model.user_data);
if (0 < return_code) {
throw GradientEvaluationError();
}
Expand All @@ -197,10 +197,10 @@ class UnoModel: public Model {
}
}

void compute_jacobian_transposed_vector_product(const double* x, const double* vector, double* result) const override {
void compute_jacobian_transposed_vector_product(View<const double> x, View<const double> vector, View<double> result) const override {
if (this->user_model.jacobian_transposed_operator != nullptr) {
const uno_int return_code = this->user_model.jacobian_transposed_operator(this->user_model.number_variables,
this->user_model.number_constraints, x, true, vector, result, this->user_model.user_data);
this->user_model.number_constraints, x.data(), true, vector.data(), result.data(), this->user_model.user_data);
if (0 < return_code) {
throw GradientEvaluationError();
}
Expand All @@ -210,16 +210,17 @@ class UnoModel: public Model {
}
}

void compute_hessian_vector_product(const double* x, const double* vector, double objective_multiplier,
const Vector<double>& multipliers, double* result) const override {
void compute_hessian_vector_product(View<const double> x, View<const double> vector, double objective_multiplier,
const Vector<double>& multipliers, View<double> result) const override {
if (this->user_model.lagrangian_hessian_operator != nullptr) {
objective_multiplier *= this->optimization_sense;
// if the model has a different sign convention for the Lagrangian than Uno, flip the signs of the multipliers
if (this->user_model.lagrangian_sign_convention == UNO_MULTIPLIER_POSITIVE) {
const_cast<Vector<double>&>(multipliers).scale(-1.);
}
const uno_int return_code = this->user_model.lagrangian_hessian_operator(this->user_model.number_variables,
this->user_model.number_constraints, x, true, objective_multiplier, multipliers.data(), vector, result, this->user_model.user_data);
this->user_model.number_constraints, x.data(), true, objective_multiplier, multipliers.data(), vector.data(),
result.data(), this->user_model.user_data);
// flip the signs of the multipliers back
if (this->user_model.lagrangian_sign_convention == UNO_MULTIPLIER_POSITIVE) {
const_cast<Vector<double>&>(multipliers).scale(-1.);
Expand Down
30 changes: 15 additions & 15 deletions interfaces/Python/cpp_classes/PythonModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <pybind11/numpy.h>
#include <functional>
#include "PythonModel.hpp"
#include "linear_algebra/VectorView.hpp"
#include "linear_algebra/View.hpp"
#include "optimization/EvaluationErrors.hpp"
#include "symbolic/Concatenation.hpp"
#include "Uno.hpp"
Expand Down Expand Up @@ -96,7 +96,7 @@ namespace uno {
}
}

void PythonModel::compute_jacobian_sparsity(uno_int * row_indices, uno_int * column_indices, uno_int row_offset,
void PythonModel::compute_jacobian_sparsity(uno_int* row_indices, uno_int* column_indices, uno_int row_offset,
uno_int column_offset, uno_int solver_indexing, MatrixOrder /*matrix_format*/) const {
// copy the indices of the user sparsity patterns to the Uno vectors
for (size_t index: Range(static_cast<size_t>(this->user_model.number_jacobian_nonzeros))) {
Expand Down Expand Up @@ -181,11 +181,11 @@ namespace uno {
}
}

void PythonModel::compute_jacobian_vector_product(const double* x, const double* vector, double* result) const {
void PythonModel::compute_jacobian_vector_product(View<const double> x, View<const double> vector, View<double> result) const {
if (this->user_model.jacobian_operator.has_value()) {
const auto x_py = to_const_array(x, this->number_variables);
const auto vector_py = to_const_array(vector, this->number_variables);
auto result_py = to_array(result, this->number_constraints);
const auto x_py = to_const_array(x.data(), this->number_variables);
const auto vector_py = to_const_array(vector.data(), this->number_variables);
auto result_py = to_array(result.data(), this->number_constraints);

// evaluate Jacobian-vector product
try {
Expand All @@ -200,11 +200,11 @@ namespace uno {
}
}

void PythonModel::compute_jacobian_transposed_vector_product(const double* x, const double* vector, double* result) const {
void PythonModel::compute_jacobian_transposed_vector_product(View<const double> x, View<const double> vector, View<double> result) const {
if (this->user_model.jacobian_transposed_operator.has_value()) {
const auto x_py = to_const_array(x, this->number_variables);
const auto vector_py = to_const_array(vector, this->number_constraints);
auto result_py = to_array(result, this->number_variables);
const auto x_py = to_const_array(x.data(), this->number_variables);
const auto vector_py = to_const_array(vector.data(), this->number_constraints);
auto result_py = to_array(result.data(), this->number_variables);

// evaluate Jacobian^T-vector product
try {
Expand All @@ -219,18 +219,18 @@ namespace uno {
}
}

void PythonModel::compute_hessian_vector_product(const double* x, const double* vector, double objective_multiplier,
const Vector<double>& multipliers, double* result) const {
void PythonModel::compute_hessian_vector_product(View<const double> x, View<const double> vector, double objective_multiplier,
const Vector<double>& multipliers, View<double> result) const {
if (this->user_model.lagrangian_hessian_operator.has_value()) {
objective_multiplier *= this->optimization_sense;
// if the model has a different sign convention for the Lagrangian than Uno, flip the signs of the multipliers
if (this->user_model.lagrangian_sign_convention == UNO_MULTIPLIER_POSITIVE) {
const_cast<Vector<double>&>(multipliers).scale(-1.);
}
const auto x_py = to_const_array(x, this->number_variables);
const auto x_py = to_const_array(x.data(), this->number_variables);
const auto multipliers_py = to_const_array(multipliers.data(), this->number_constraints);
const auto vector_py = to_const_array(vector, this->number_variables);
auto result_py = to_array(result, this->number_variables);
const auto vector_py = to_const_array(vector.data(), this->number_variables);
auto result_py = to_array(result.data(), this->number_variables);

// evaluate Hessian-vector product
try {
Expand Down
8 changes: 4 additions & 4 deletions interfaces/Python/cpp_classes/PythonModel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ namespace uno {
double* hessian_values) const override;

// linear operators for Jacobian-, Jacobian^T-, and Hessian-vector products
void compute_jacobian_vector_product(const double* x, const double* vector, double* result) const override;
void compute_jacobian_transposed_vector_product(const double* x, const double* vector, double* result) const override;
void compute_hessian_vector_product(const double* x, const double* vector, double objective_multiplier,
const Vector<double>& multipliers, double* result) const override;
void compute_jacobian_vector_product(View<const double> x, View<const double> vector, View<double> result) const override;
void compute_jacobian_transposed_vector_product(View<const double> x, View<const double> vector, View<double> result) const override;
void compute_hessian_vector_product(View<const double> x, View<const double> vector, double objective_multiplier,
const Vector<double>& multipliers, View<double> result) const override;

// purely functions
[[nodiscard]] const std::vector<double>& get_variables_lower_bounds() const override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include "ConstraintRelaxationStrategy.hpp"
#include "ingredients/globalization_strategies/GlobalizationStrategy.hpp"
#include "ingredients/subproblem/Subproblem.hpp"
#include "linear_algebra/VectorView.hpp"
#include "linear_algebra/View.hpp"
#include "model/Model.hpp"
#include "optimization/Direction.hpp"
#include "optimization/EvaluationCache.hpp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include "ingredients/inertia_correction_strategies/InertiaCorrectionStrategyFactory.hpp"
#include "ingredients/subproblem/Subproblem.hpp"
#include "ingredients/subproblem_solvers/SubproblemSolverFactory.hpp"
#include "linear_algebra/VectorView.hpp"
#include "linear_algebra/View.hpp"
#include "model/Model.hpp"
#include "optimization/Direction.hpp"
#include "optimization/EvaluationCache.hpp"
Expand Down Expand Up @@ -194,7 +194,7 @@ namespace uno {
// compute the linearized constraint violation
// TODO preallocate
Vector<double> result(model.number_constraints);
current_evaluations.compute_jacobian_vector_product(model, direction.primals.data(), result.data());
current_evaluations.compute_jacobian_vector_product(model, direction.primals.view(), result.view());
const double trial_linearized_constraint_violation = model.constraint_violation(current_evaluations.constraints +
step_length * result, this->residual_norm);
return (trial_linearized_constraint_violation <= this->linear_feasibility_tolerance);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "ingredients/inertia_correction_strategies/InertiaCorrectionStrategyFactory.hpp"
#include "ingredients/subproblem/Subproblem.hpp"
#include "ingredients/subproblem_solvers/SubproblemSolverFactory.hpp"
#include "linear_algebra/VectorView.hpp"
#include "linear_algebra/View.hpp"
#include "optimization/Direction.hpp"
#include "optimization/EvaluationCache.hpp"
#include "optimization/Iterate.hpp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include "l1RelaxedProblem.hpp"
#include "ingredients/hessian_models/HessianModel.hpp"
#include "linear_algebra/VectorView.hpp"
#include "linear_algebra/View.hpp"
#include "model/Model.hpp"
#include "optimization/Evaluations.hpp"
#include "optimization/Iterate.hpp"
Expand Down Expand Up @@ -178,8 +178,8 @@ namespace uno {

// ∇c(x_k) λ_k
evaluations.evaluate_jacobian(this->model, iterate.primals);
evaluations.compute_jacobian_transposed_vector_product(this->model, iterate.multipliers.constraints.data(),
lagrangian_gradient.data());
evaluations.compute_jacobian_transposed_vector_product(this->model, iterate.multipliers.constraints.view(),
lagrangian_gradient.view());
lagrangian_gradient.scale(-1.);

// z_k
Expand Down Expand Up @@ -238,7 +238,8 @@ namespace uno {
}
}

void l1RelaxedProblem::compute_jacobian_vector_product(const double* vector, double* result, const Evaluations& evaluations) const {
void l1RelaxedProblem::compute_jacobian_vector_product(View<const double> vector, View<double> result,
const Evaluations& evaluations) const {
evaluations.compute_jacobian_vector_product(this->model, vector, result);

// add the contribution of the elastic variables
Expand All @@ -250,7 +251,7 @@ namespace uno {
}
}

void l1RelaxedProblem::compute_jacobian_transposed_vector_product(const double* vector, double* result,
void l1RelaxedProblem::compute_jacobian_transposed_vector_product(View<const double> vector, View<double> result,
const Evaluations& evaluations) const {
evaluations.compute_jacobian_transposed_vector_product(this->model, vector, result);

Expand All @@ -263,8 +264,8 @@ namespace uno {
}
}

void l1RelaxedProblem::compute_hessian_vector_product(HessianModel& hessian_model, const double* x, const double* vector,
const Multipliers& multipliers, double* result) const {
void l1RelaxedProblem::compute_hessian_vector_product(HessianModel& hessian_model, View<const double> x, View<const double> vector,
const Multipliers& multipliers, View<double> result) const {
hessian_model.compute_hessian_vector_product(x, vector, this->get_objective_multiplier(), multipliers.constraints, result);

// proximal contribution
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,11 @@ namespace uno {
const Multipliers& multipliers, double* hessian_values) const override;

// linear operators
void compute_jacobian_vector_product(const double* vector, double* result, const Evaluations& evaluations) const override;
void compute_jacobian_transposed_vector_product(const double* vector, double* result, const Evaluations& evaluations) const override;
void compute_hessian_vector_product(HessianModel& hessian_model, const double* x, const double* vector,
const Multipliers& multipliers, double* result) const override;
void compute_jacobian_vector_product(View<const double> vector, View<double> result, const Evaluations& evaluations) const override;
void compute_jacobian_transposed_vector_product(View<const double> vector, View<double> result,
const Evaluations& evaluations) const override;
void compute_hessian_vector_product(HessianModel& hessian_model, View<const double> x, View<const double> vector,
const Multipliers& multipliers, View<double> result) const override;

[[nodiscard]] const std::vector<double>& get_variables_lower_bounds() const override;
[[nodiscard]] const std::vector<double>& get_variables_upper_bounds() const override;
Expand Down
4 changes: 2 additions & 2 deletions uno/ingredients/hessian_models/ExactHessian.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ namespace uno {
++this->evaluation_count;
}

void ExactHessian::compute_hessian_vector_product(const double* x, const double* vector,
double objective_multiplier, const Vector<double>& constraint_multipliers, double* result) {
void ExactHessian::compute_hessian_vector_product(View<const double> x, View<const double> vector,
double objective_multiplier, const Vector<double>& constraint_multipliers, View<double> result) {
this->model.compute_hessian_vector_product(x, vector, objective_multiplier, constraint_multipliers, result);
++this->evaluation_count;
}
Expand Down
4 changes: 2 additions & 2 deletions uno/ingredients/hessian_models/ExactHessian.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ namespace uno {
EvaluationCache& evaluation_cache) override;
void evaluate_hessian(Statistics& statistics, const Vector<double>& primal_variables, double objective_multiplier,
const Vector<double>& constraint_multipliers, double* hessian_values) override;
void compute_hessian_vector_product(const double* x, const double* vector, double objective_multiplier,
const Vector<double>& constraint_multipliers, double* result) override;
void compute_hessian_vector_product(View<const double> x, View<const double> vector, double objective_multiplier,
const Vector<double>& constraint_multipliers, View<double> result) override;

protected:
const Model& model;
Expand Down
5 changes: 3 additions & 2 deletions uno/ingredients/hessian_models/HessianModel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <string>
#include <string_view>
#include "../interfaces/C/uno_int.h"
#include "linear_algebra/View.hpp"

namespace uno {
// forward declarations
Expand Down Expand Up @@ -37,8 +38,8 @@ namespace uno {
EvaluationCache& evaluation_cache) = 0;
virtual void evaluate_hessian(Statistics& statistics, const Vector<double>& primal_variables,
double objective_multiplier, const Vector<double>& constraint_multipliers, double* hessian_values) = 0;
virtual void compute_hessian_vector_product(const double* x, const double* vector, double objective_multiplier,
const Vector<double>& constraint_multipliers, double* result) = 0;
virtual void compute_hessian_vector_product(View<const double> x, View<const double> vector, double objective_multiplier,
const Vector<double>& constraint_multipliers, View<double> result) = 0;
};
} // namespace

Expand Down
4 changes: 2 additions & 2 deletions uno/ingredients/hessian_models/IdentityHessian.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ namespace uno {
}
}

void IdentityHessian::compute_hessian_vector_product(const double* /*x*/, const double* vector,
double /*objective_multiplier*/, const Vector<double>& /*constraint_multipliers*/, double* result) {
void IdentityHessian::compute_hessian_vector_product(View<const double> /*x*/, View<const double> vector,
double /*objective_multiplier*/, const Vector<double>& /*constraint_multipliers*/, View<double> result) {
for (size_t variable_index: Range(this->number_variables)) {
result[variable_index] = vector[variable_index];
}
Expand Down
Loading
Loading