Closed pratyai closed 2 months ago
Thanks for using Tulip and for reaching out about this :)
In what follows, all the equations number refer to the arxiv preprint.
KKT.solve!
you're seeing comes from how the Newton systems are solved under the hood. This part is detailed in Section 4. Namely, we reduce the Newton system to a so-called augmented system (63).
hx, hy
in the code correspond to p
, q
in the paper's Eq. (64), and h0
corresponds to the denominator of Eq (66)solve_newton_system!
once, and you'll note that this function is passed hx, hy, h0
as arguments, which were obtained from the solution of (64).The rationale behind most of this was that 1) the code was structured around a KKT module that solves augmented systems, and 2) I tried to minimize the number of redundant linear system solves.
Thank you so much!
Indeed the matter of the number of calls to KKT.solve!
is quite clear after your explanation. I missed the fact that (64) is fixed for all the steps, and the preliminary step is computing just that. The hx, hy, h0
variables are also clear now.
Currently, the reference paper for Tulip is this AFAIK. However, I see some differences in the actual implementation, as follows:
KKT.solve!()
is called is significantly different. There is a "preliminary" solve even before the predictor step to compute the quantityh0
(which is not explained anywhere, and I'm trying to work out its contribution).KKT.solve!()
is called only once in each predictor or corrector step, whereas the paper says the augmented system needs to be solved twice in each solution of the newton step (predictor or corrector).I looked a bit through the commit history and their messages are not particularly insightful on this matter either. I imagine that these differences were introduce organically during the development of Tulip.
Has there been any paper / documentation / publicly accessible communication for the differences or how the current implementation is formulated?
Thanks!