StructuredOptimization-related changes + new algorithms - #100
Conversation
- separate default_iteration_summary function from default_display function and allow overriding them separately through general IterativeAlgorithm interface - improve default display function by showing header and automatically figuring out optimal column width - add override_parameters function - get_addumptions function return AssumptionGroup instead of a Tuple - improve ADMM type stability - fix errors in CG - introduce CGNR algorithm as a variation of CG algorithm - preallocate more in DavisYin, DouglasRachford, and FastForwardBackward - minor fixes in docstrings
|
@hakkelt I see that you're attempting various changes in different packages, all motivated by StructuredOptimization. I think it might be fine to move some core definitions to ProximalCore, but I would encourage you to:
|
|
Thanks for the feedback, and sorry for the messy PRs. Would it help if I discard this PR and break the changes included in it into multiple smaller pull requests, submitting them one by one? Concerning |
|
Instead of this large PR, I'll make multiple smaller, more focused PRs, starting with #101 |
|
Thanks @hakkelt, I’ll take a look at it asap |
…Order#103) The current compat of the package is ```txt julia 1.6 [47edcb42] ADTypes 1.5.3 [a0c0ee7d] DifferentiationInterface 0.6.2 [37e2e46d] LinearAlgebra 1.2 [de0858da] Printf 1.2 [dc4f5ac2] ProximalCore 0.1 ``` The restriction on DifferentiationInterface.jl precludes using version 0.7.x that is required by other packages (like version 2.x of Optimjl). I tested ProximalAlgorithms.jl, changing compat to ```txt julia 1.6 [47edcb42] ADTypes 1.5.3 [a0c0ee7d] DifferentiationInterface 0.6.2,0.7 [37e2e46d] LinearAlgebra 1.2 [de0858da] Printf 1.2 [dc4f5ac2] ProximalCore 0.1 ``` All tests passed. Hence, it seems possible to use 0.7.x version of DifferentiationInterface.jl.
The x-update solves (AᴴA + ∑ᵢ ρᵢ BᵢᴴBᵢ) x = rhs with an inner CG loop. The system operator was rebuilt from scratch as a sum of operators every time the adaptive penalty sequence changed a ρᵢ. That rebuilt operator was never written back into the state, so once ρ stabilised CG silently reverted to running against the initial ρ; and the rebuild allocated a fresh operator tree per iteration. Replace it with ADMMNormalOp, a small struct holding AᴴA, the tuple of BᵢᴴB, and a reference to penalty_sequence.rho. Its mul! computes the combined action directly into a single scratch buffer. Because every PenaltySequence mutates seq.rho in place and never reassigns the field, the operator tracks ρ live with nothing to rebuild and nothing to write back. Built once in ADMMState; the per-iteration rebuild branch in Base.iterate is removed, along with the now-unused rho_changed return value.
This PR is part of the effort to make StructuredOptimization as general as possible (see the PR on OperatorCore: JuliaFirstOrder/ProximalCore.jl#5).
Changes:
get_assumptionsfunction defined for all algorithms that allows querying the requirements for the algorithm's parameters (e.g.,fmust beis_smooth,gmust beis_proximable). The function returns a dict-like object that has the names of the parameters as keys and a tuple of functions that are expected to returntruefor all allowed inputs as values. The concept is to enable automatic decisions on how to feed functions of the ProximalOperators package and operators of AbstractOperators to the algorithms.default_iteration_summaryfunction fromdefault_displayfunction and allow overriding them separately through the generalIterativeAlgorithminterface.override_parametersfunction that allows overwriting values of fields inIterativeAlgorithmstruct by creating a copy with changed values. I use this in a high-level package to inject defaultmaxitandatolvalues into the user-provided algorithm.This PR contains no breaking changes (as far as I know), only introduces new features.