Multi-precision

Solving precision

You can use RipQP in several floating-point systems. The algorithm will run in the precision of the input QuadraticModel. For example, if you have a QuadraticModel qm32 in Float32, then

stats = ripqp(qm32)

will solve this problem in Float32. The stopping criteria of RipQP.InputTol will be adapted to the preicison of the QuadraticModel to solve.

Multi-precision

You can use the multi-precision mode to solve a problem with a warm-start in a lower floating-point system. RipQP.InputTol contains intermediate parameters that are used to decide when to transition from a lower precision to a higher precision.

stats = ripqp(qm, mode = :multi, itol = InputTol(ϵ_pdd1 = 1.0e-2))

ϵ_pdd1 is used for the transition from Float32 to Float64, while ϵ_pdd is used at the end of the algorithm.

Refinement of the Quadratic Problem

Instead of just increasing the precision of the algorithm for the transition between precisions, it is possible to solve a refined quadratic problem.

References:

stats = ripqp(qm, mode = :multiref, itol = InputTol(ϵ_pdd1 = 1.0e-2))
stats = ripqp(qm, mode = :multizoom, itol = InputTol(ϵ_pdd1 = 1.0e-2))

The two presented algorithms follow the procedure described in each of the two above references.

Switching solvers when increasing precision

Instead of using the same solver after the transition between two floating-point systems, it is possible to switch to another solver, if a conversion function from the old solver to the new solvers is implemented.

stats = ripqp(qm, mode = :multiref, solve_method = IPF(),
              sp = K2LDLParams(),
              sp2 = K2KrylovParams(uplo = :U, preconditioner = LDL(T = Float32)))
# start with K2LDL in Float32, then transition to Float64, 
# then use K2Krylov in Float64 with a LDL preconditioner in Float32.