Rho Setting

The penalty parameter rho (\(\rho\)) is central to Progressive Hedging (PH) and related decomposition methods. mpi-sppy provides several ways to set and dynamically update rho values. This page consolidates all rho-related options.

Default Rho

The simplest approach is to set a single rho value for all variables:

--default-rho 1.0

This value is used for any variable that does not have a rho set by another mechanism (e.g., a rho setter function or one of the strategies below).

Note

If no _rho_setter function is provided in the model module, then --default-rho is required unless one of --sep-rho, --coeff-rho, or --sensi-rho is specified (in which case default-rho is automatically set to 1 as a fallback).

Rho Setter Function

The model module can define a _rho_setter function that returns per-variable rho values. This function is passed to the hub constructor and is called during setup. See Helper Functions in the Model File for details.

Separation-based Rho (--sep-rho)

Uses the separation between scenario solutions to set rho. Enabled with:

--sep-rho

Coefficient-based Rho (--coeff-rho)

Sets rho based on objective function coefficients. Enabled with:

--coeff-rho

Sensitivity-based Rho (--sensi-rho)

Sets rho based on sensitivity analysis. Enabled with:

--sensi-rho

Note

If existing rho values have been set (e.g., by --sep-rho or --coeff-rho), --sensi-rho will use them as starting points. For this reason, --sensi-rho should typically appear after --sep-rho or --coeff-rho in the workflow.

Reduced-costs-based Rho (--reduced-costs-rho)

Sets rho based on reduced costs from LP relaxations. Enabled with:

--reduced-costs-rho

Like --sensi-rho, this will use existing rho values if available.

Gradient-based Rho (--grad-rho)

Uses gradient information to set rho values. Enabled with:

--grad-rho

A detailed example is in examples.farmer.CI.farmer_rho_demo.py.

The --grad-rho-multiplier option provides a cumulative multiplier applied when rho is set or updated.

Dynamic Rho Updates

Rho can be updated dynamically during PH iterations using convergence criteria:

  • --dynamic-rho-primal-crit: trigger updates based on primal convergence

  • --dynamic-rho-dual-crit: trigger updates based on dual convergence

  • --dynamic-rho-primal-thresh: sensitivity threshold for primal trigger (has a default value)

  • --dynamic-rho-dual-thresh: sensitivity threshold for dual trigger (has a default value)

See dyn_rho_base.py for implementation details on how updates are computed.

Norm Rho Updater (--use-norm-rho-updater)

An adaptive rho strategy based on the norm of primal and dual residuals. Enabled with:

--use-norm-rho-updater

There is also a corresponding converger that can be enabled with --use-norm-rho-converger, which requires --use-norm-rho-updater.

Primal-Dual Rho Updater (--use-primal-dual-rho-updater)

An adaptive rho strategy based on primal-dual balancing. Enabled with:

--use-primal-dual-rho-updater

Additional options:

  • --primal-dual-rho-update-threshold: threshold for triggering updates

  • --primal-dual-rho-primal-bias: bias towards primal residual

W-based Rho

A rho based on W values is supported through mpisppy.utils.find_rho.py, which can compute rho using a cost input file created by the gradient software. If you want to use W values as the cost, you would need to modify the code in mpisppy/utils/w_utils/wxbarwriter.py to write the final W values in the right format (i.e., matching the cost output format used by the gradient software).