src/subproblem.rs

Thu, 23 Jan 2025 23:39:40 +0100

author
Tuomo Valkonen <tuomov@iki.fi>
date
Thu, 23 Jan 2025 23:39:40 +0100
branch
dev
changeset 43
aacd9af21b3a
parent 39
6316d68b58af
permissions
-rw-r--r--

bump version

/*!
Iterative algorithms for solving the finite-dimensional subproblem.
*/

use serde::{Serialize, Deserialize};
use numeric_literals::replace_float_literals;
use alg_tools::iterate::{
    AlgIteratorOptions,
    Verbose,

};

use crate::types::*;

pub mod nonneg;
pub mod unconstrained;
pub mod l1squared_unconstrained;
pub mod l1squared_nonneg;


/// Method for solving finite-dimensional subproblems.
/// Not all outer methods necessarily support all options.
#[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)]
#[allow(dead_code)]
pub enum InnerMethod {
    /// Forward-backward
    FB,
    /// Semismooth Newton
    SSN,
    /// PDPS
    PDPS,
}

/// Settings for the solution of finite-dimensional subproblems
#[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)]
pub struct InnerSettings<F : Float> {
    /// Method
    pub method : InnerMethod,
    /// Proportional step length ∈ [0, 1) for `InnerMethod::FB`.
    pub fb_τ0 : F,
    /// Proportional primal and dual step lengths for `InnerMethod::PDPS`.
    pub pdps_τσ0 : (F, F),
    /// Fraction of `tolerance` given to inner algorithm
    pub tolerance_mult : F,
    /// Iterator options
    #[serde(flatten)]
    pub iterator_options : AlgIteratorOptions,
}

#[replace_float_literals(F::cast_from(literal))]
impl<F : Float> Default for InnerSettings<F> {
    fn default() -> Self {
        InnerSettings {
            fb_τ0 : 0.99,
            pdps_τσ0 : (1.98, 0.5),
            iterator_options : AlgIteratorOptions {
                // max_iter cannot be very small, as initially FB needs many iterations, although
                // on later invocations even one or two tends to be enough
                max_iter : 2000,
                // verbose_iter affects testing of sufficient convergence, so we set it to
                // a small value…
                verbose_iter : Verbose::Every(1),
                // … but don't print out anything
                quiet : true,
                .. Default::default()
            },
            method : InnerMethod::SSN,
            tolerance_mult : 0.01,
        }
    }
}

mercurial