Skip to content
Draft
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
4fef1ea
initial code for GCP computation
mateuszbaran Nov 21, 2025
8bdd5b1
formatting
mateuszbaran Nov 21, 2025
d428807
expand a little
mateuszbaran Nov 21, 2025
69794c2
Merge remote-tracking branch 'origin/master' into mbaran/gcp
mateuszbaran Nov 27, 2025
435f2a6
add a few more methods
mateuszbaran Nov 27, 2025
2168761
Byrd's way of handling non-positive-definite (s, y) pairs in limited …
mateuszbaran Nov 28, 2025
44b310a
start testing GCP
mateuszbaran Nov 28, 2025
c3a8a68
A few more tests
mateuszbaran Dec 2, 2025
d3bac42
Merge remote-tracking branch 'origin/master' into mbaran/gcp
mateuszbaran Dec 2, 2025
75f7f15
fix "typos"
mateuszbaran Dec 2, 2025
82ac90a
box tests in a separate file
mateuszbaran Dec 3, 2025
b94b0f1
start integration of GCP into quasi_Newton
mateuszbaran Dec 3, 2025
2049c87
integrate GCPFinder into direction update (why doesn't this work right?)
mateuszbaran Dec 8, 2025
c51b0ff
Merge remote-tracking branch 'origin/master' into mbaran/gcp
mateuszbaran Dec 8, 2025
34c796b
return d from fill_rho_i!
mateuszbaran Dec 8, 2025
672e467
fix rho update
mateuszbaran Dec 9, 2025
7b5dfe6
first successful run
mateuszbaran Dec 9, 2025
99d193d
address review, fix bug
mateuszbaran Dec 10, 2025
da8f500
a little bit of docs
mateuszbaran Dec 10, 2025
3c8cc8e
fix extref again?
mateuszbaran Dec 10, 2025
5088950
StopWhenRelativeAPosterioriChangeCostLessOrEqual
mateuszbaran Dec 10, 2025
1183d10
Merge remote-tracking branch 'origin/master' into mbaran/gcp
mateuszbaran Dec 12, 2025
5365a08
improve consistency of stepsize limits
mateuszbaran Dec 12, 2025
93da29f
some fixes and tests around max_stepsize, bound_direction_tweak! and …
mateuszbaran Dec 15, 2025
8268499
fix Base.show for StopWhenRelativeAPosterioriChangeCostLessOrEqual
mateuszbaran Dec 16, 2025
fe28d25
more tests and change one name
mateuszbaran Dec 16, 2025
231989e
formatting
mateuszbaran Dec 16, 2025
5bac94f
more testing
mateuszbaran Dec 16, 2025
22c93d9
improve coverage
mateuszbaran Dec 17, 2025
a4f9fb6
improve coverage a bit more
mateuszbaran Dec 17, 2025
7bd9c3b
improve coverage; circumvent a Julia documenter bug
mateuszbaran Dec 17, 2025
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
6 changes: 4 additions & 2 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ The file was started with Version `0.4`.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## Unreleased

### Added

* `nonpositive_curvature_behavior` for `QuasiNewtonLimitedMemoryDirectionUpdate` that determines how transported (y, s) vector pairs are treated after transport; if their inner product gets too low, it may lead to non-positive-definite Hessians which needs to be avoided. (#554)
* `GCPFinder` for handling direction selection in the presence of box (`Hyperrectangle`) constraints in quasi-Newton methods. This allows for L-BFGS-B-style box constraint handling. (#554)
* add keyword argument `is_feasible_error` to `interior_point_Newton` to control how to handle infeasible starting points (#556)
* add keyword argument `at_init` to some debug options to control whether they print already at the initialisation and hence before the first iteration (#552)

Expand All @@ -29,7 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Removed `atol` from `DebugFeasibility` and instead use the one newly added `atol` from the `ConstrainedManifoldObjective`. (#546)
* Move from CompatHelper to dependabot to keep track of dependency updates in Julia packages. (#547)
* moved the `ManoptTestSuite` module to a sub module `Manopt.Test` within `Manopt.jl`,
so it can be easier reused by others as well (#550)
so it can be easier reused by others as well (#550)
* moved to using a `Project.toml` for tests and an overall `[Workspace]`.
This also allows finally to run single test files without installing all packages manually, but instead just switching to and instantiating the test environment. (#550)
* for compatibility, state also `[source]` entries consistently in the sub `Project.toml` files. (#550)
Expand Down
28 changes: 28 additions & 0 deletions docs/src/references.bib
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,34 @@ @book{Boumal:2023
ISBN = {978-1-00-916616-4}
}

@article{ByrdNocedalSchnabel:1994,
title = {Representations of quasi-{Newton} matrices and their use in limited memory methods},
volume = {63},
issn = {1436-4646},
doi = {10.1007/BF01582063},
number = {1},
urldate = {2025-09-06},
journal = {Mathematical Programming},
author = {Byrd, Richard H. and Nocedal, Jorge and Schnabel, Robert B.},
month = jan,
year = {1994},
pages = {129--156},
}

@article{ByrdLuNocedalZhu:1995,
title = {A {Limited} {Memory} {Algorithm} for {Bound} {Constrained} {Optimization}},
volume = {16},
issn = {1064-8275},
doi = {10.1137/0916069},
number = {5},
journal = {SIAM Journal on Scientific Computing},
author = {Byrd, Richard H. and Lu, Peihuang and Nocedal, Jorge and Zhu, Ciyou},
month = sep,
year = {1995},
note = {Publisher: Society for Industrial and Applied Mathematics},
pages = {1190--1208},
}

% --- C
%
%
Expand Down
31 changes: 31 additions & 0 deletions ext/ManoptManifoldsExt/manifold_functions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,19 @@ Manopt.default_point_distance(::Euclidean, p) = norm(p, Inf)

Manopt.default_vector_norm(::Euclidean, p, X) = norm(p, Inf)


Manopt.get_bounds_index(M::Hyperrectangle) = eachindex(M.lb)

function Manopt.get_bound_t(M::Hyperrectangle, p, d, i)
if d[i] > 0
return (M.ub[i] - p[i]) / d[i]
elseif d[i] < 0
return (M.lb[i] - p[i]) / d[i]
else
return Inf
end
end

"""
max_stepsize(M::TangentBundle, p)

Expand Down Expand Up @@ -169,3 +182,21 @@ function reflect!(
X .*= -1
return retract!(M, q, p, X, retraction_method)
end

function Manopt.set_bound_t_at_index!(::Hyperrectangle, p_cp, t, d, i)
p_cp[i] += t * d[i]
return p_cp
end

function Manopt.set_bound_at_index!(M::Hyperrectangle, p_cp, d, i)
p_cp[i] = d[i] > 0 ? M.ub[i] : M.lb[i]
d[i] = 0
return p_cp
end

function Manopt.bound_direction_tweak!(::Hyperrectangle, d_out, d, p, p_cp)
return d_out .= p_cp .- p
end

Manopt.requires_gcp(::Hyperrectangle) = true
Manopt.get_at_bound_index(::Hyperrectangle, X, b) = X[b]
5 changes: 3 additions & 2 deletions src/Manopt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ import LinearAlgebra: reflect!
import ManifoldsBase: embed!, plot_slope, prepare_check_result, find_best_slope_window
import ManifoldsBase: base_manifold, base_point, get_basis
import ManifoldsBase: project, project!
import LinearAlgebra: cross
import LinearAlgebra: cross, LowerTriangular
using ColorSchemes
using ColorTypes
using Colors
using DataStructures: CircularBuffer, capacity, length, push!, size, isfull
using DataStructures: BinaryHeap, CircularBuffer, capacity, length, push!, size, isfull
using Dates: Millisecond, Nanosecond, Period, canonicalize, value
using LinearAlgebra:
cond,
Expand Down Expand Up @@ -567,6 +567,7 @@ export StopAfter,
StopWhenGradientChangeLess,
StopWhenGradientMappingNormLess,
StopWhenGradientNormLess,
StopWhenProjectedMinusGradientNormLess,
StopWhenFirstOrderProgress,
StopWhenIterateNaN,
StopWhenKKTResidualLess,
Expand Down
3 changes: 2 additions & 1 deletion src/helpers/LineSearchesTypes.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ Wrapper for line searches available in the `LineSearches.jl` library.

Wrap `linesearch` (for example [`HagerZhang`](https://julianlsolvers.github.io/LineSearches.jl/latest/reference/linesearch.html#LineSearches.HagerZhang)
or [`MoreThuente`](https://julianlsolvers.github.io/LineSearches.jl/latest/reference/linesearch.html#LineSearches.MoreThuente)).
The initial step selection from Linesearches.jl is not yet supported and the value 1.0 is used.
The initial step selection from Linesearches.jl is not yet supported and `initial_guess` is
always used (by default [`ConstantInitialGuess`](@ref)).

# Keyword Arguments

Expand Down
Loading
Loading