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>
42 lines
2.6 KiB
Plaintext
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: */
|