The LADMM class docstring says the algorithm solves
$$\min_x f(Kx) + g(x)$$
but the implementation and update_objective actually solves
$$\min_x f(x) + g(Kx)$$
A user following the docstring will pass f and g the wrong way round.
Also need to checkdocs/source/optimisation.rst.
Why the code (not the docstring) is right
self.f.proximal is applied to self.x, which lives in operator.domain_geometry(); self.g.proximal is applied to self.u, which lives in operator.range_geometry(). So f acts on the domain and g acts on the range.
- The tests assume this convention: In
test_Adaptive_LADMM (Wrappers/Python/test/test_algorithm_convergence.py), with K = alpha*GradientOperator(ig):
I think the issue is that the splitting is written incorrectly or $\min_x f(x) + g(Kx)$, written as $\min f(x) + g(y)$ s.t. $Ax + By = b$, the correct choice is $A = K$, $B = -Id$, $b = 0$ (giving $Kx = y$). The docstring says $A = Id$, $B = -K$, which corresponds to $x = Ky$ and is what produces the swapped objective.
Note - this makes it swapped compared to PDHG where f acts on the range and g on the domain - maybe a question of consistency there?
The
LADMMclass docstring says the algorithm solvesbut the implementation and
update_objectiveactually solvesA user following the docstring will pass
fandgthe wrong way round.Also need to check
docs/source/optimisation.rst.Why the code (not the docstring) is right
self.f.proximalis applied toself.x, which lives inoperator.domain_geometry();self.g.proximalis applied toself.u, which lives inoperator.range_geometry(). Sofacts on the domain andgacts on the range.test_Adaptive_LADMM(Wrappers/Python/test/test_algorithm_convergence.py), withK = alpha*GradientOperator(ig):I think the issue is that the splitting is written incorrectly or$\min_x f(x) + g(Kx)$ , written as $\min f(x) + g(y)$ s.t. $Ax + By = b$ , the correct choice is $A = K$ , $B = -Id$ , $b = 0$ (giving $Kx = y$ ). The docstring says $A = Id$ , $B = -K$ , which corresponds to $x = Ky$ and is what produces the swapped objective.
Note - this makes it swapped compared to PDHG where f acts on the range and g on the domain - maybe a question of consistency there?