Files
Tomaž Vajngerl 1f06d8b421 SLP solver: use a quadratic subproblem so it converges in fewer steps
The solver linearized the objective each step and solved a linear
subproblem. With no curvature the step always landed on a
trust-region corner, so on a larger model it crept toward the
optimum and ran out of time far short of it.

Replace the linear subproblem with a quadratic one. A curvature
matrix built by damped BFGS updates from the history of gradient
changes turns the model from a line into a paraboloid, so the
step aims at the model's minimum rather than a corner. The
constraints stay hard: the quadratic subproblem is solved by
Frank-Wolfe, where each inner step minimizes a linear objective
over the same feasible region with CoinMP, so every step stays
feasible. The outer trust region and the merit-function accept
or reject test are unchanged.

On a 100-period resource model that the linear version left far
from the optimum in the time limit, the quadratic version reaches
it: the curvature cuts the number of expensive finite-difference
samplings by enough to converge. The small linear,
nonlinear-objective, and nonlinear-constraint tests still pass,
the last one now landing on the constraint boundary to nine
digits.

The service keeps the name SLPSolver for continuity. The
user-visible description now says Sequential Quadratic Solver.

Signed-off-by: Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>
Change-Id: I51e1739cb6e2c46e41cc52e6687a796aaf6fcab3
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/4777
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
(cherry picked from commit f0a4bb35743ef0aafdbe6c708666fd1c811e9ea5)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208341
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
2026-07-21 16:24:21 +02:00

42 lines
2.6 KiB
Plaintext

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#pragma once
#define NC_(Context, String) TranslateId(Context, u8##String)
#define RID_SOLVER_COMPONENT NC_("RID_SOLVER_COMPONENT", "%PRODUCTNAME Linear Solver")
#define RID_COINMP_SOLVER_COMPONENT NC_("RID_COINMP_SOLVER_COMPONENT", "%PRODUCTNAME CoinMP Linear Solver")
#define RID_SWARM_SOLVER_COMPONENT NC_("RID_SWARM_SOLVER_COMPONENT", "%PRODUCTNAME Swarm Non-Linear Solver (experimental)")
#define RID_SLP_SOLVER_COMPONENT NC_("RID_SLP_SOLVER_COMPONENT", "Sequential Quadratic Solver (experimental)")
#define RID_PROPERTY_NONNEGATIVE NC_("RID_PROPERTY_NONNEGATIVE", "Assume variables as non-negative")
#define RID_PROPERTY_INTEGER NC_("RID_PROPERTY_INTEGER", "Assume variables as integer")
#define RID_PROPERTY_TIMEOUT NC_("RID_PROPERTY_TIMEOUT", "Solving time limit (seconds)")
#define RID_PROPERTY_EPSILONLEVEL NC_("RID_PROPERTY_EPSILONLEVEL", "Epsilon level (0-3)")
#define RID_PROPERTY_LIMITBBDEPTH NC_("RID_PROPERTY_LIMITBBDEPTH", "Limit branch-and-bound depth")
#define RID_PROPERTY_ALGORITHM NC_("RID_PROPERTY_ALGORITHM", "Swarm algorithm (0 - Differential Evolution, 1 - Particle Swarm Optimization)")
#define RID_PROPERTY_SENSITIVITY NC_("RID_PROPERTY_SENSITIVITY", "Generate sensitivity report")
#define RID_ERROR_NONLINEAR NC_("RID_ERROR_NONLINEAR", "The model is not linear.")
#define RID_ERROR_EPSILONLEVEL NC_("RID_ERROR_EPSILONLEVEL", "The epsilon level is invalid.")
#define RID_ERROR_INFEASIBLE NC_("RID_ERROR_INFEASIBLE", "The model is infeasible. Check limiting conditions.")
#define RID_ERROR_UNBOUNDED NC_("RID_ERROR_UNBOUNDED", "The model is unbounded.")
#define RID_ERROR_TIMEOUT NC_("RID_ERROR_TIMEOUT", "The time limit was reached.")
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */