PIPS-IPM++ Solver and Tools
a parallel interior-point method for doubly bordered block diagonal linear programs
Running PIPS-IPM++

Executing gmspips

The actual PIPS-IPM++ executable is gmspips. Consult PIPS-IPM++ Input: Format and Generation in order to learn on how to annotate models in GAMS and how to split them into multiple files so that PIPS-IPM++ can handle them.

Assuming one already has split a model instance in SOMEFOLDER with files named model0.gdx, model1.gdx, ..., modelN.gdx, where N is the number of blocks in your problem, a typical call to PIPS-IPM++ running on n processes to solve the model looks like:

mpirun -np n /path/to/gmspips N+1 SOMEFOLDER/model

Note that the actual MPI command mpirun might differ depending on your system and MPI installation (it could be srun etc.). One can also run PIPS-IPM++ sequentially (leaving out the mpirun -np n part), but that would somehow defeat its purpose.

The number of threads used by each MPI process in PIPS-IPM++ can be controlled by setting the environment variable OMP_NUM_THREADS. PIPS-IPM++ will complain if this variable is not set. Best performance (from our point of view) can currently be achieved by setting:

export OMP_NUM_THREADS=2

However, a value of 1 is also fine and generally performance will depend on the instance.

Option files

Upon starting, PIPS-IPM++ will look for an options file called PIPSIPMpp.opt in the current working directory and read in its options. Each line has the following structure:

PARAMETERNAME VALUE

where PARAMETERNAME is the name of the parameter to set and VALUE the value to set it to.

The interested user can find numerous parameters and short descriptions in Available Options, but expert knowledge of PIPS-IPM++ is currently required here and if in doubt, one should contact the developers (until a concise guide is available).

We recommend setting the following options:

SCALER geometricmean
IP_METHOD primal-dual

These enable geometric mean scaling and the use of primal and dual step lengths in the interior-point method.

Options can also be set on the command line by using argument --PARAMETERNAME=VALUE.

Available Options

Output

Name Default Range Type Description
FILTER_VERBOSE false boolean whether to be verbose in Filter strategy
LINEARSOLVER_LEAF_VERBOSE 0 ≥ 0 integer log verbosity level for linear solver for leaf system
LINEARSOLVER_ROOT_VERBOSE 0 ≥ 0 integer log verbosity level for linear solver for root system
OUTER_BICG_PRINT_STATISTICS false boolean whether to print BiCGStab statistics (system and residual norms)
PRESOLVE_PRINT_PROBLEM false boolean whether to write the problem to stdout before and after presolve
PRESOLVE_VERBOSITY 1 ≥ 0 integer verbosity of log output of presolve
PRINT_TREESIZES_ON_READ false boolean whether to print matrix sizes when initializing problem
REGULARIZATION_VERBOSE false boolean whether to enable verbose output of regularization
SCALER_OUTPUT true boolean whether scaler should print ratios after scaling
SILENT false boolean whether to suppress some output in DistributedTreeCallbacks
XYZS_SOLVE_PRINT_RESISDUAL false boolean whether to print residuals in XYZS solve

Presolve

Name Default Range Type Description
PRESOLVE true boolean whether to apply presolve
PRESOLVE_ABORTFRAC 0.0005 real required row/column reductions as a fraction of rows/columns to start another presolving round
PRESOLVE_AGGREGATION true boolean whether to enable the aggregation presolver
PRESOLVE_BOUND_STRENGTHENING true boolean whether to enable the bound strengthening presolver
PRESOLVE_BOUND_STR_MAX_ITER 2 ≥ 0 integer maximal number of bound strengthening rounds per presolve round
PRESOLVE_BOUND_STR_MAX_PARTIAL_ACTIVITY 1.79769e+308 ≥ 0 real maximal partial activity to be divided to derive a bound
PRESOLVE_BOUND_STR_NUMERIC_LIMIT_BOUNDS 1e+12 ≥ 1 real maximum absolute value of newly found bound in block matrix to be accepted by bounds strengthening presolver
PRESOLVE_BOUND_STR_NUMERIC_LIMIT_ENTRY 1e-07 ≥ 0 real minimal entry to divide by in order to derive a bound
PRESOLVE_COLUMN_FIXATION true boolean whether to enable the column fixation presolver
PRESOLVE_COLUMN_FIXATION_MAX_FIXING_IMPACT 1e-12 ≥ 0 real maximal impact column fixing can have on the problem (currently ub-lb)
PRESOLVE_DUAL_TIGHTENING true boolean whether to enable the dual bound tightening presolver
PRESOLVE_INFINITY ∞ real value for infinity in presolvers
PRESOLVE_LINEAR_DEPENDENCIES true boolean whether to enable the linear dependencies presolver
PRESOLVE_MAX_BOUND_ACCEPTED 1e+10 ≥ 1 real maximal absolute value of newly found bound to be propagated on the row by bounds strengthening presolver
PRESOLVE_MAX_ROUNDS 50 ≥ 0 integer maximal number of rounds to apply all presolvers
PRESOLVE_MODEL_CLEANUP_MATRIX_ENTRY_IMPACT_FEASDIST 0.01 ≥ 0 real maximal fraction between absolute value of matrix entry, multiplied by corresponding variables domain width and number of nonzeros in row, and feastol to remove the matrix entry due to having a low impact
PRESOLVE_MODEL_CLEANUP_MAX_MATRIX_ENTRY_IMPACT 0.001 ≥ 0 real maximal absolute value of a matrix entry that is removed from the problem due to having low impact
PRESOLVE_MODEL_CLEANUP_MIN_MATRIX_ENTRY 1e-10 ≥ 0 real maximal absolute value of a matrix entry that is removed from the problem
PRESOLVE_PARALLEL_COLUMNS true boolean whether to enable the parallel columns presolver
PRESOLVE_PARALLEL_COLUMNS_TOL_COMPARE_ENTRIES 1e-08 ≥ 0 real tolerance for considering entries in two different columns to be equal
PRESOLVE_PARALLEL_ROWS true boolean whether to enable the parallel rows presolver
PRESOLVE_PARALLEL_ROWS_TOL_COMPARE_ENTRIES 1e-08 ≥ 0 real tolerance for considering entries in two different rows to be equal
PRESOLVE_PERMUTATION true boolean whether to enable the permutation presolver
PRESOLVE_RESET_FREE_VARIABLES false boolean whether to reset free variables' bounds after presolve (given the row implying these bounds was not removed)
PRESOLVE_SINGLETON_COLUMNS true boolean whether to enable the singleton columns presolver
PRESOLVE_SINGLETON_COLUMNS_MAX_ROUNDS 2 ≥ 0 integer maximum removal rounds in the singleton column presolver
PRESOLVE_SINGLETON_ROWS true boolean whether to enable the singleton rows presolver
PRESOLVE_SINGLETON_ROWS_MAX_ROUNDS 2 ≥ 0 integer maximum removal rounds in the singleton row presolver
PRESOLVE_TRACK_COL false boolean whether to track a column through presolve
PRESOLVE_TRACK_COL_INDEX -1 integer the index of the column to track
PRESOLVE_TRACK_COL_NODE -1 integer the node of the column to track
PRESOLVE_TRACK_ROW false boolean whether to track a row through presolve
PRESOLVE_TRACK_ROW_INDEX -1 integer the index of the row to track
PRESOLVE_TRACK_ROW_LINKING false boolean whether the row to track is in the linking part
PRESOLVE_TRACK_ROW_NODE -1 integer the node of the row to track
PRESOLVE_TRACK_ROW_SYSTEM equalities equalities, inequalities string the system of the row; equalities: equality system; inequalities: inequality system
PRESOLVE_TRANSFROM_INEQUALITIES_INTO_EQUALITIES false boolean whether to transform inequalities into equalities at the end of presolve
STOP_AFTER_PRESOLVE false boolean whether to abort PIPS after presolve

Postsolve

Name Default Range Type Description
POSTSOLVE true boolean whether to apply postsolve
POSTSOLVE_PRINT_RESIDS true boolean whether to print the residuals before and after unscaling and before and after postsolve
POSTSOLVE_TOLERANCE 0.0001 ≥ 0 real tolerance used for checking residuals after postsolve

Scaling

Name Default Range Type Description
SCALER none none, equilibrium, geometricmean, geometricequ, curtisreid string type of scaler to use; none: No scaling; equilibrium: Equilibrium scaling; geometricmean: Geometric Mean scaling; geometricequ: Geometric Mean and Equlibrium scaling; curtisreid: Curtis Reid scaling

Interior-Point Method

Name Default Range Type Description
IPM_MAX_ITER 300 ≥ 0 integer iteration limit for interior point method
IPM_PRINT_LINEAR_SYSTEM_DIAGONAL_STATISTICS false boolean whether to print statistics on diagonal of linear system
IPM_TIMELIMIT -1 ≥ -1 real time limit in seconds for interior point method, or -1 for no limit
IP_ACCURACY_REDUCED false boolean whether to use reduced termination tolerance (mu and residual) for interior point method
IP_METHOD primal primal, primal-dual string interior point method to use; primal: primal method; primal-dual: primal-dual method
IP_PRINT_TIMESTAMP true boolean whether to print timestamp when reporting interior point status
IP_STEPLENGTH_CONSERVATIVE false boolean whether to use a more conservative steplength heuristic (smaller steplength_factor and gamma_f)

Regularization

Name Default Range Type Description
FRIEDLANDER_ORBAN_REGULARIZATION_DUAL_MIN 1e-10 ≥ 0 real minimal FriedlanderOrban regularization for dual part
FRIEDLANDER_ORBAN_REGULARIZATION_INITIAL_DUAL_Y 1 ≥ 0 real initial FriedlanderOrban regularization for dual equalities part
FRIEDLANDER_ORBAN_REGULARIZATION_INITIAL_DUAL_Z 1 ≥ 0 real initial FriedlanderOrban regularization for dual inequalities part
FRIEDLANDER_ORBAN_REGULARIZATION_INITIAL_PRIMAL 1 ≥ 0 real initial FriedlanderOrban regularization for primal part
FRIEDLANDER_ORBAN_REGULARIZATION_PRIMAL_MIN 1e-10 ≥ 0 real minimal FriedlanderOrban regularization for primal part
IPOPT_REGULARIZATION_MAX_PRIMAL 1e+40 ≥ 1 real maximal Ipopt regularization
IPOPT_REGULARIZATION_MIN_PRIMAL 1e-20 ≥ 0 real minimal Ipopt regularization
REGULARIZATION false boolean whether to apply regularization to the linear system
REGULARIZATION_STRATEGY friedlander ipopt, friedlander string regularization strategy; ipopt: Ipopt's strategy; friedlander: strategy of Friedlander and Orban

Schur Complement

Name Default Range Type Description
ALLREDUCE_SCHUR_COMPLEMENT false boolean whether the Schur-Complement should be allreduced to all processes instead of only a single one
PARDISO_PRECONDITION_SPARSE false boolean whether to use sparse Preconditioner in Pardiso indefinite solver
PRECONDITION_SPARSIFY false boolean whether to use distributed sparsification Preconditioner
PRECONDITION_SPARSIFY_FAKE false boolean whether to run distributed Schur complement computation but also deactivate the distributed preconditioner (for debugging only)
SCHUR_COMPLEMENT_FORCE_SPARSE_COMPUTATIONS false boolean whether to force sparse computations for Schur-Complement
SC_BLOCKWISE_BLOCKSIZE_MAX 20 ≥ 0 integer maximal blocksize in blockwise Schur-Complement
SC_COMPUTE_BLOCKWISE false boolean whether to use block-wise Schur-Complement computation
SC_ELIMINATE_C0 true boolean whether to eliminate C from the Schur complement

Outer Solve

Name Default Range Type Description
OUTER_BICG_DYNAMIC_TOL true boolean whether to choose BiCGStab tolerance dynamically (according to iteration number)
OUTER_BICG_EPSILON 1e-15 ≥ 0 real minimal convergence tolerance for BiCGStab
OUTER_BICG_MAX_ITER 75 ≥ 0 integer limit on BiCGStab iterations
OUTER_BICG_MAX_NORMR_DIVERGENCES 4 ≥ 0 integer number of consecutive BiCGStab iterations without improvement in residual norm; BiCGStab stops with DIVERGED status if this is reached
OUTER_BICG_MAX_STAGNATIONS 4 ≥ 0 integer number of consecutive BiCGStab iterations with tiny step length (determined by OUTER_BICG_EPSILON); BiCGStab stops with STAGNATION status if this is reached
OUTER_BICG_TOL 1e-10 ≥ 0 real BiCGStab tolerance if OUTER_BICG_DYNAMIC_TOL is disabled
OUTER_SOLVE bicgstab none, iterref, bicgstab string controls the type of error absorption at the outer level of the linear system; none: no error absorption (OOQP works just fine); iterref: iterative refinement (used when error absorption is also done at a lower level, for example in the solve with the dense Schur complement); bicgstab: BiCGStab with the factorization as preconditioner
OUTER_SOLVE_REFINE_ORIGINAL_SYSTEM false boolean whether to compute residuals for the original instead of the regularized system for refinement at the outer level

Inner Solve

Name Default Range Type Description
INNER_SC_SOLVE none none, iterref, bicgstab string controls the type of error absorption/correction at the inner level when solving with the dense Schur complement; currently must be left at none (#51); none: no error correction; iterref: iterative refinement; bicgstab: BiCGStab

Linear Solver

Name Default Range Type Description
LINEAR_DENSE_SOLVER indefinite indefinite, saddle, psd string solver for dense linear systems; indefinite: solver for symmetric indefinite systems; saddle: specialized LDL^T solver for saddle point systems; psd: solver for symmetric positive-definite systems
LINEAR_LEAF_SOLVER ma57 ma57, ma27 string solver for linear systems in leafs; ma57: HSL MA57; ma27: HSL MA27
LINEAR_ROOT_SOLVER ma57 ma57, ma27 string solver for linear system in root; ma57: HSL MA57; ma27: HSL MA27
LINEAR_SUB_ROOT_SOLVER ma57 ma57, ma27 string solver for linear system in sub-root; ma57: HSL MA57; ma27: HSL MA27
PARDISO_FOR_GLOBAL_SC true boolean whether to use PARDISO to exploit the linking structure of the global Schur-Complement
PARDISO_NITERATIVE_REFINS -1 ≥ -1 integer number of iterative refinements (PARDISO iparm[7]); -1 for automatic choice (currently 8)
PARDISO_NITERATIVE_REFINS_ROOT -1 ≥ -1 integer number of iterative refinements for root system (PARDISO iparm[7]); -1 for automatic choice (currently 8)
PARDISO_PIVOT_PERTURBATION -1 ≥ -1 integer exponent x for pivot perturbation 10^{-x} * |A|_inf (PARDISO iparm[9]); -1 for automatic choice (currently 8)
PARDISO_PIVOT_PERTURBATION_ROOT -1 ≥ -1 integer exponent x for pivot perturbation 10^{-x} * |A|_inf for root system (PARDISO iparm[9]); -1 for automatic choice (currently 8)
PARDISO_SPARSE_RHS_LEAF false boolean whether to pass RHS in sparse form to PARDISO for leaf solves
PARDISO_SYMB_INTERVAL -1 ≥ -1 integer trigger PARDISO symbolic analysis any so many iterations; -1 for automatic choice (currently 8)

Line Search

Name Default Range Type Description
GONDZIO_MAX_CORRECTORS 3 ≥ 0 integer limit on number of computed Gondzio correctors
GONDZIO_STOCH_ADAPTIVE_LINESEARCH true boolean whether adaptive linesearch should be applied in the GondzioStoch solvers
GONDZIO_STOCH_ADDITIONAL_CORRECTORS_MAX 1 ≥ 0 integer maximal number of additional corrector steps to apply (in addition to the still existing gondzio corrector limit)
GONDZIO_STOCH_ADDITIONAL_CORRECTORS_SMALL_VARS true boolean whether to apply additional corrector steps for small complementarity pairs
GONDZIO_STOCH_FIRST_ITER_SMALL_CORRECTORS 10 ≥ 0 integer first iteration at which to look for small corrector steps
GONDZIO_STOCH_FREQUENCY_PUSH_CONVERGED_VARS 4 ≥ 0 integer frequency by which converged variables should be pushed away from their bounds
GONDZIO_STOCH_MAX_ALPHA_SMALL_CORRECTORS 0.95 ≥ 0 real maximal alpha for the IPM to try and apply small corrector steps
GONDZIO_STOCH_MU_LIMIT_PUSH_CONVERGED_VARS 0.001 ≥ 0 real from which value of mu on should converged variables be pushed away from their bounds
GONDZIO_STOCH_N_LINESEARCH 10 ≥ 0 integer number of linesearch points if GONDZIO adaptive linesearch is enabled
GONDZIO_STOCH_PUSH_CONVERGED_VARS_FROM_BOUND false boolean whether to push relatively early converged variables away from their bounds artificially
GONDZIO_STOCH_USE_DYNAMIC_CORRECTOR_SCHEDULE false boolean whether to schedule the amount of Gondzio correctors dynamically; invalidates the max correctors setting

Hierarchical Approach

Name Default Range Type Description
HIERARCHICAL false boolean whether to use the hierarchical approach
HIERARCHICAL_APPLY_SPLIT true boolean whether to apply splits in the hierarchical approach
HIERARCHICAL_APPROACH_N_LAYERS 2 ≥ 1 integer number of layers in hierarchical approach; 1: only dense border, 2: dense border + 1 additional layer, ...
HIERARCHICAL_FORCE_N_SUBROOTS -1 ≥ -1 integer force a number of subroots for the hierarchical approach instead of the automatic detection; do not use
HIERARCHICAL_MOVE_A0_TO_DENSE_LAYER false boolean whether to move matrix A0 to the dense layer in the hierarchical approach
HIERARCHICAL_PRINT_HIER_DATA false boolean whether to print hierarchical approach problem data
HIERARCHICAL_TESTING false boolean whether to activate some debugging of the hierarchical approach
SC_BLOCKSIZE_HIERARCHICAL 20 ≥ 0 integer columns to solve for at once when computing the hierarchical Schur-Complements
SC_HIERARCHICAL_COMPUTE_BLOCKWISE true boolean whether all columns should be computed at once when computing the hierarchical Schur-Complements

Miscellaneous

Name Default Range Type Description
WRITE_ORIGINAL_PROBLEM_TO_LP "" string name of file to which to write original problem in LP format (requires one MPI process)
WRITE_PRESOLVED_PROBLEM_TO_LP "" string name of file to which to write presolved problem in LP format (requires one MPI process and presolve enabled)