diff --git a/docs/src/tutorial.md b/docs/src/tutorial.md index b9910829..b7f933be 100644 --- a/docs/src/tutorial.md +++ b/docs/src/tutorial.md @@ -1,114 +1,3 @@ # Tutorial -## Input - -RipQP uses the package [QuadraticModels.jl](https://github.com/JuliaSmoothOptimizers/QuadraticModels.jl) to model -convex quadratic problems. - -Here is a basic example: - -```@example QM -using QuadraticModels, LinearAlgebra, SparseMatricesCOO -Q = [6. 2. 1. - 2. 5. 2. - 1. 2. 4.] -c = [-8.; -3; -3] -A = [1. 0. 1. - 0. 2. 1.] -b = [0.; 3] -l = [0.;0;0] -u = [Inf; Inf; Inf] -QM = QuadraticModel(c, SparseMatrixCOO(tril(Q)), A=SparseMatrixCOO(A), lcon=b, ucon=b, - lvar=l, uvar=u, c0=0., name="QM") -``` - -Once your `QuadraticModel` is loaded, you can simply solve it RipQP: - -```@example QM -using RipQP -stats = ripqp(QM) -println(stats) -``` - -The `stats` output is a -[GenericExecutionStats](https://juliasmoothoptimizers.github.io/SolverCore.jl/dev/reference/#SolverCore.GenericExecutionStats). - -It is also possible to use the package [QPSReader.jl](https://github.com/JuliaSmoothOptimizers/QPSReader.jl) in order to -read convex quadratic problems in MPS or SIF formats: - -```julia -using QPSReader, QuadraticModels -QM = QuadraticModel(readqps("QAFIRO.SIF")) -``` - -## Logging - -RipQP displays some logs at each iterate. - -You can deactivate logging with - -```julia -stats = ripqp(QM, display = false) -``` - -It is also possible to get a history of several quantities such as the primal and dual residuals and the relative primal-dual gap. -These quantites are available in the dictionnary `solver_specific` of the `stats`. - -```julia -stats = ripqp(QM, history = true) -pddH = stats.solver_specific[:pddH] -``` - -## Change configuration and tolerances - -You can use `RipQP` without scaling with: - -```julia -stats = ripqp(QM, scaling = false) -``` - -You can also change the [`RipQP.InputTol`](@ref) type to change the tolerances for the stopping criteria: - -```julia -stats = ripqp(QM, itol = InputTol(max_iter = 100, ϵ_rb = 1.0e-4), scaling = false) -``` - -## Save the Interior-Point system - -At every iteration, RipQP solves two linear systems with the default Predictor-Corrector method (the affine system and the corrector-centering system), or one linear system with the Infeasible Path-Following method. - -To save these systems, you can use: - -```julia -w = SystemWrite(write = true, name="test_", kfirst = 4, kgap=3) -stats1 = ripqp(QM, w = w) -``` - -This will save one matrix and the associated two right-hand sides of the PC method every three iterations starting at iteration four. -Then, you can read the saved files with: - -```julia -using DelimitedFiles, MatrixMarket -K = MatrixMarket.mmread("test_K_iter4.mtx") -rhs_aff = readdlm("test_rhs_iter4_aff.rhs", Float64)[:] -rhs_cc = readdlm("test_rhs_iter4_cc.rhs", Float64)[:] -``` - -## Timers - -You can see the elapsed time with: - -```julia -stats1.elapsed_time -``` - -For more advanced timers you can use [`TimerOutputs.jl`](https://github.com/KristofferC/TimerOutputs.jl): - -```julia -using TimerOutputs -TimerOutputs.enable_debug_timings(RipQP) -reset_timer!(RipQP.to) -stats = ripqp(QM) -TimerOutputs.complement!(RipQP.to) # print complement of timed sections -show(RipQP.to, sortby = :firstexec) -``` +Check an [introduction to RipQP](https://jso-docs.github.io/introduction-to-ripqp/) and more tutorials on the [JSO tutorials page](https://juliasmoothoptimizers.github.io/tutorials/).