Theory Strong_Convex

theory Strong_Convex
  imports Projected_Gradient_Mapping
begin

section ‹Strong convexity for smooth first-order methods›

text ‹
This theory introduces a first-order lower-bound interface for strong convexity.

The main interface is
@{text ‹f y >= f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2›}.
This formulation is well suited to the existing development because it uses
the same named gradient field @{text ‹G›} as the smooth-convex and
projected-gradient layers.

The file proves three kinds of consequences:
strong convexity implies the ordinary convex first-order lower bound; at a
first-order optimal point, the function-value gap controls squared distance;
under positive strong convexity, global minimizers are unique.

These results are intended to feed into later linear-convergence proofs for
gradient descent and projected gradient descent.
›


subsection ‹First-order strong convexity lower bounds›

definition strong_convex_lower_bound_on ::
  "real  'a::real_inner set  ('a  real)  ('a  'a)  bool"
where
  "strong_convex_lower_bound_on mu S f G 
     0  mu 
     (xS. yS.
        f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2  f y)"

lemma strong_convex_lower_bound_onI:
  assumes "0  mu"
    and "x y. x  S  y  S 
      f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2  f y"
  shows "strong_convex_lower_bound_on mu S f G"
  using assms
  unfolding strong_convex_lower_bound_on_def
  by auto

lemma strong_convex_lower_bound_onD_nonneg:
  assumes "strong_convex_lower_bound_on mu S f G"
  shows "0  mu"
  using assms
  unfolding strong_convex_lower_bound_on_def
  by auto

lemma strong_convex_lower_bound_onD:
  assumes "strong_convex_lower_bound_on mu S f G"
    and "x  S"
    and "y  S"
  shows
    "f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2  f y"
  using assms
  unfolding strong_convex_lower_bound_on_def
  by auto

lemma strong_convex_lower_bound_on_subset:
  assumes strong: "strong_convex_lower_bound_on mu T f G"
    and subset: "S  T"
  shows "strong_convex_lower_bound_on mu S f G"
proof (rule strong_convex_lower_bound_onI)
  show "0  mu"
    using strong
    by (rule strong_convex_lower_bound_onD_nonneg)
next
  fix x y
  assume xS: "x  S" and yS: "y  S"

  have xT: "x  T"
    using subset xS by auto

  have yT: "y  T"
    using subset yS by auto

  show
    "f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2  f y"
    by (rule strong_convex_lower_bound_onD[OF strong xT yT])
qed

lemma strong_convex_lower_bound_on_mono_mu:
  assumes strong: "strong_convex_lower_bound_on mu S f G"
    and nu_nonneg: "0  nu"
    and nu_le_mu: "nu  mu"
  shows "strong_convex_lower_bound_on nu S f G"
proof (rule strong_convex_lower_bound_onI)
  show "0  nu"
    using nu_nonneg .
next
  fix x y
  assume x: "x  S" and y: "y  S"

  have strong_est:
    "f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2  f y"
    by (rule strong_convex_lower_bound_onD[OF strong x y])

  have coeff:
    "nu / 2  mu / 2"
    using nu_le_mu by simp

  have term_mono:
    "(nu / 2) * norm (y - x) ^ 2
       (mu / 2) * norm (y - x) ^ 2"
    using coeff
    by (intro mult_right_mono) simp_all

  show
    "f x + inner (G x) (y - x) + (nu / 2) * norm (y - x) ^ 2  f y"
    using strong_est term_mono by linarith
qed

lemma strong_convex_lower_bound_on_imp_gradient_lower_bound_on:
  assumes strong: "strong_convex_lower_bound_on mu S f G"
  shows "gradient_lower_bound_on S f G"
proof (rule gradient_lower_bound_onI)
  fix x y
  assume x: "x  S" and y: "y  S"

  have strong_est:
    "f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2  f y"
    by (rule strong_convex_lower_bound_onD[OF strong x y])

  have mu_nonneg: "0  mu"
    using strong
    by (rule strong_convex_lower_bound_onD_nonneg)

  have term_nonneg:
    "0  (mu / 2) * norm (y - x) ^ 2"
  proof -
    have "0  mu / 2"
      using mu_nonneg by simp
    moreover have "0  norm (y - x) ^ 2"
      by simp
    ultimately show ?thesis
      by (rule mult_nonneg_nonneg)
  qed

  show "f x + inner (G x) (y - x)  f y"
    using strong_est term_nonneg by linarith
qed

lemma strong_convex_lower_bound_on_imp_supports_on:
  assumes strong: "strong_convex_lower_bound_on mu S f G"
  shows "supports_on S f G"
  using gradient_lower_bound_on_imp_supports_on[
      OF strong_convex_lower_bound_on_imp_gradient_lower_bound_on[OF strong]] .


subsection ‹Strongly convex differentiable functions›

definition strongly_convex_differentiable_on ::
  "real  'a::real_inner set  ('a  real)  ('a  'a)  bool"
where
  "strongly_convex_differentiable_on mu S f G 
     convex_differentiable_on S f G  strong_convex_lower_bound_on mu S f G"

lemma strongly_convex_differentiable_onI:
  assumes "convex_differentiable_on S f G"
    and "strong_convex_lower_bound_on mu S f G"
  shows "strongly_convex_differentiable_on mu S f G"
  using assms
  unfolding strongly_convex_differentiable_on_def
  by auto

lemma strongly_convex_differentiable_onD_convex_differentiable:
  assumes "strongly_convex_differentiable_on mu S f G"
  shows "convex_differentiable_on S f G"
  using assms
  unfolding strongly_convex_differentiable_on_def
  by auto

lemma strongly_convex_differentiable_onD_strong:
  assumes "strongly_convex_differentiable_on mu S f G"
  shows "strong_convex_lower_bound_on mu S f G"
  using assms
  unfolding strongly_convex_differentiable_on_def
  by auto

lemma strongly_convex_differentiable_onD_nonneg:
  assumes "strongly_convex_differentiable_on mu S f G"
  shows "0  mu"
  using strongly_convex_differentiable_onD_strong[OF assms]
  by (rule strong_convex_lower_bound_onD_nonneg)

lemma strongly_convex_differentiable_onD_convex_on:
  assumes "strongly_convex_differentiable_on mu S f G"
  shows "convex_on S f"
  using strongly_convex_differentiable_onD_convex_differentiable[OF assms]
  by (rule convex_differentiable_onD_convex_on)

lemma strongly_convex_differentiable_onD_has_gradient_on:
  assumes "strongly_convex_differentiable_on mu S f G"
  shows "has_gradient_on f S G"
  using strongly_convex_differentiable_onD_convex_differentiable[OF assms]
  by (rule convex_differentiable_onD_has_gradient_on)

lemma strongly_convex_differentiable_on_subset:
  assumes strong: "strongly_convex_differentiable_on mu T f G"
    and subset: "S  T"
    and convex: "convex S"
  shows "strongly_convex_differentiable_on mu S f G"
proof (rule strongly_convex_differentiable_onI)
  show "convex_differentiable_on S f G"
    by (rule convex_differentiable_on_subset[
        OF strongly_convex_differentiable_onD_convex_differentiable[
          OF strong] subset convex])
next
  show "strong_convex_lower_bound_on mu S f G"
    by (rule strong_convex_lower_bound_on_subset[
        OF strongly_convex_differentiable_onD_strong[OF strong] subset])
qed

lemma strongly_convex_differentiable_on_imp_gradient_lower_bound_on:
  assumes strong: "strongly_convex_differentiable_on mu S f G"
  shows "gradient_lower_bound_on S f G"
  using strongly_convex_differentiable_onD_strong[OF strong]
  by (rule strong_convex_lower_bound_on_imp_gradient_lower_bound_on)

lemma strongly_convex_differentiable_on_imp_supports_on:
  assumes strong: "strongly_convex_differentiable_on mu S f G"
  shows "supports_on S f G"
  using strongly_convex_differentiable_onD_strong[OF strong]
  by (rule strong_convex_lower_bound_on_imp_supports_on)


subsection ‹Strongly smooth convex functions›

definition strongly_smooth_convex_on ::
  "real  real  'a::real_inner set  ('a  real)  ('a  'a)  bool"
where
  "strongly_smooth_convex_on L mu S f G 
     smooth_convex_on L S f G  strong_convex_lower_bound_on mu S f G"

lemma strongly_smooth_convex_onI:
  assumes "smooth_convex_on L S f G"
    and "strong_convex_lower_bound_on mu S f G"
  shows "strongly_smooth_convex_on L mu S f G"
  using assms
  unfolding strongly_smooth_convex_on_def
  by auto

lemma strongly_smooth_convex_onD_smooth:
  assumes "strongly_smooth_convex_on L mu S f G"
  shows "smooth_convex_on L S f G"
  using assms
  unfolding strongly_smooth_convex_on_def
  by auto

lemma strongly_smooth_convex_onD_strong:
  assumes "strongly_smooth_convex_on L mu S f G"
  shows "strong_convex_lower_bound_on mu S f G"
  using assms
  unfolding strongly_smooth_convex_on_def
  by auto

lemma strongly_smooth_convex_onD_convex_differentiable:
  assumes "strongly_smooth_convex_on L mu S f G"
  shows "convex_differentiable_on S f G"
  using strongly_smooth_convex_onD_smooth[OF assms]
  by (rule smooth_convex_onD_convex_differentiable)

lemma strongly_smooth_convex_onD_smooth_upper_bound:
  assumes "strongly_smooth_convex_on L mu S f G"
  shows "smooth_upper_bound_on L S f G"
  using strongly_smooth_convex_onD_smooth[OF assms]
  by (rule smooth_convex_onD_smooth_upper_bound)

lemma strongly_smooth_convex_onD_strongly_convex_differentiable:
  assumes "strongly_smooth_convex_on L mu S f G"
  shows "strongly_convex_differentiable_on mu S f G"
proof (rule strongly_convex_differentiable_onI)
  show "convex_differentiable_on S f G"
    by (rule strongly_smooth_convex_onD_convex_differentiable[OF assms])
next
  show "strong_convex_lower_bound_on mu S f G"
    by (rule strongly_smooth_convex_onD_strong[OF assms])
qed

lemma strongly_smooth_convex_on_subset:
  assumes strong: "strongly_smooth_convex_on L mu T f G"
    and subset: "S  T"
    and convex: "convex S"
  shows "strongly_smooth_convex_on L mu S f G"
proof (rule strongly_smooth_convex_onI)
  show "smooth_convex_on L S f G"
    by (rule smooth_convex_on_subset[
        OF strongly_smooth_convex_onD_smooth[OF strong] subset convex])
next
  show "strong_convex_lower_bound_on mu S f G"
    by (rule strong_convex_lower_bound_on_subset[
        OF strongly_smooth_convex_onD_strong[OF strong] subset])
qed


subsection ‹Global minimizers and first-order conditions›

lemma global_min_on_value_eq:
  assumes min_x: "global_min_on S f x"
    and min_y: "global_min_on S f y"
  shows "f x = f y"
proof -
  have x_mem: "x  S"
    using min_x
    by (rule global_min_onD_mem)

  have y_mem: "y  S"
    using min_y
    by (rule global_min_onD_mem)

  have xy: "f x  f y"
    by (rule global_min_onD[OF min_x y_mem])

  have yx: "f y  f x"
    by (rule global_min_onD[OF min_y x_mem])

  show ?thesis
    using xy yx by linarith
qed

lemma global_min_on_has_gradient_imp_first_order_condition:
  fixes f :: "'a::real_inner  real"
  assumes convex: "convex S"
    and minimizer: "global_min_on S f x"
    and grad: "has_gradient f x g"
  shows "first_order_condition_at S g x"
proof -
  have x_mem: "x  S"
    using minimizer
    by (rule global_min_onD_mem)

  show ?thesis
  proof (rule first_order_condition_atI)
    show "x  S"
      using x_mem .
  next
    fix y
    assume y_mem: "y  S"

    define d where "d = y - x"

    have ev01:
      "eventually (λt::real. t  {0<..<1}) (at_right 0)"
      using eventually_at_right_real[OF zero_less_one] .

    have ev_nonneg:
      "eventually
        (λt::real. 0  (f (x + t *R d) - f x) / t)
        (at_right 0)"
      using ev01
    proof eventually_elim
      fix t :: real
      assume t: "t  {0<..<1}"

      have tpos: "0 < t"
        using t by simp

      have tle: "t  1"
        using t by simp

      have z_mem: "x + t *R d  S"
        unfolding d_def
        by (rule convex_contains_affine_line[
            OF convex x_mem y_mem, of t]) (use tpos tle in simp_all)

      have min_bound: "f x  f (x + t *R d)"
        by (rule global_min_onD[OF minimizer z_mem])

      show "0  (f (x + t *R d) - f x) / t"
        using min_bound tpos
        by (simp add: field_simps)
    qed

    have nontriv: "¬ trivial_limit (at_right (0::real))"
      by simp

    have zero_tendsto:
      "((λt::real. 0)  (0::real)) (at_right 0)"
      by simp

    have slope_tendsto:
      "((λt::real. (f (x + t *R d) - f x) / t)  inner d g)
        (at_right 0)"
      using has_gradient_line_slope_tendsto[OF grad, of d] .

    have ev_le:
      "eventually
        (λt::real. (λt::real. 0) t 
          (f (x + t *R d) - f x) / t)
        (at_right 0)"
      using ev_nonneg by simp

    have "0  inner d g"
      by (rule tendsto_le[
          OF nontriv slope_tendsto zero_tendsto ev_le])

    then show "0  inner g (y - x)"
      unfolding d_def
      by (simp add: inner_commute)
  qed
qed

lemma convex_differentiable_on_global_min_imp_first_order_condition:
  assumes cd: "convex_differentiable_on S f G"
    and minimizer: "global_min_on S f x"
  shows "first_order_condition_at S (G x) x"
proof -
  have x_mem: "x  S"
    using minimizer
    by (rule global_min_onD_mem)

  have convex: "convex S"
    using cd
    by (rule convex_differentiable_on_convex)

  have grad: "has_gradient f x (G x)"
    using cd x_mem
    by (rule convex_differentiable_on_gradientD)

  show ?thesis
    by (rule global_min_on_has_gradient_imp_first_order_condition[
        OF convex minimizer grad])
qed


subsection ‹Distance-gap lower bounds›

lemma strong_convex_foc_distance_gap:
  fixes f :: "'a::real_inner  real"
  assumes strong: "strong_convex_lower_bound_on mu S f G"
    and foc: "first_order_condition_at S (G xstar) xstar"
    and x_mem: "x  S"
  shows
    "(mu / 2) * norm (x - xstar) ^ 2  f x - f xstar"
proof -
  have xstar_mem: "xstar  S"
    using foc
    by (rule first_order_condition_atD_mem)

  have lower:
    "f xstar + inner (G xstar) (x - xstar)
      + (mu / 2) * norm (x - xstar) ^ 2  f x"
    by (rule strong_convex_lower_bound_onD[
        OF strong xstar_mem x_mem])

  have foc_nonneg:
    "0  inner (G xstar) (x - xstar)"
    by (rule first_order_condition_atD[OF foc x_mem])

  show ?thesis
    using lower foc_nonneg by linarith
qed

lemma strongly_convex_global_min_distance_gap:
  fixes f :: "'a::real_inner  real"
  assumes strong: "strongly_convex_differentiable_on mu S f G"
    and minimizer: "global_min_on S f xstar"
    and x_mem: "x  S"
  shows
    "(mu / 2) * norm (x - xstar) ^ 2  f x - f xstar"
proof -
  have cd: "convex_differentiable_on S f G"
    by (rule strongly_convex_differentiable_onD_convex_differentiable[
        OF strong])

  have strong_lb: "strong_convex_lower_bound_on mu S f G"
    by (rule strongly_convex_differentiable_onD_strong[OF strong])

  have foc: "first_order_condition_at S (G xstar) xstar"
    by (rule convex_differentiable_on_global_min_imp_first_order_condition[
        where G = G and x = xstar,
        OF cd minimizer])

  show ?thesis
    by (rule strong_convex_foc_distance_gap[
        where G = G and xstar = xstar,
        OF strong_lb foc x_mem])
qed

lemma strongly_smooth_convex_global_min_distance_gap:
  fixes f :: "'a::real_inner  real"
  assumes strong: "strongly_smooth_convex_on L mu S f G"
    and minimizer: "global_min_on S f xstar"
    and x_mem: "x  S"
  shows
    "(mu / 2) * norm (x - xstar) ^ 2  f x - f xstar"
proof -
  have scd: "strongly_convex_differentiable_on mu S f G"
    by (rule strongly_smooth_convex_onD_strongly_convex_differentiable[
        OF strong])

  show ?thesis
    by (rule strongly_convex_global_min_distance_gap[
        where G = G and xstar = xstar,
        OF scd minimizer x_mem])
qed

lemma strong_convex_foc_distance_gap_nonnegative:
  fixes f :: "'a::real_inner  real"
  assumes strong: "strong_convex_lower_bound_on mu S f G"
    and foc: "first_order_condition_at S (G xstar) xstar"
    and x_mem: "x  S"
  shows "0  f x - f xstar"
proof -
  have gap:
    "(mu / 2) * norm (x - xstar) ^ 2  f x - f xstar"
    by (rule strong_convex_foc_distance_gap[
        where G = G and xstar = xstar,
        OF strong foc x_mem])

  have mu_nonneg: "0  mu"
    using strong
    by (rule strong_convex_lower_bound_onD_nonneg)

  have lhs_nonneg:
    "0  (mu / 2) * norm (x - xstar) ^ 2"
  proof -
    have "0  mu / 2"
      using mu_nonneg by simp
    moreover have "0  norm (x - xstar) ^ 2"
      by simp
    ultimately show ?thesis
      by (rule mult_nonneg_nonneg)
  qed

  show ?thesis
    using lhs_nonneg gap by linarith
qed


subsection ‹Uniqueness of minimizers›

lemma strongly_convex_global_min_unique:
  fixes f :: "'a::real_inner  real"
  assumes strong: "strongly_convex_differentiable_on mu S f G"
    and mu_pos: "0 < mu"
    and min_x: "global_min_on S f x"
    and min_y: "global_min_on S f y"
  shows "x = y"
proof -
  have y_mem: "y  S"
    using min_y
    by (rule global_min_onD_mem)

  have gap:
    "(mu / 2) * norm (y - x) ^ 2  f y - f x"
    by (rule strongly_convex_global_min_distance_gap[
        where G = G and xstar = x,
        OF strong min_x y_mem])

  have value_eq: "f x = f y"
    by (rule global_min_on_value_eq[OF min_x min_y])

  have term_nonpos:
    "(mu / 2) * norm (y - x) ^ 2  0"
    using gap value_eq by simp

  have term_nonneg:
    "0  (mu / 2) * norm (y - x) ^ 2"
  proof -
    have "0  mu / 2"
      using mu_pos by simp
    moreover have "0  norm (y - x) ^ 2"
      by simp
    ultimately show ?thesis
      by (rule mult_nonneg_nonneg)
  qed

  have term_zero:
    "(mu / 2) * norm (y - x) ^ 2 = 0"
    using term_nonneg term_nonpos by linarith

  have norm_zero:
    "norm (y - x) ^ 2 = 0"
    using term_zero mu_pos by simp

  have "y - x = 0"
    using norm_zero by simp

  then show "x = y"
    by simp
qed

lemma strongly_smooth_convex_global_min_unique:
  fixes f :: "'a::real_inner  real"
  assumes strong: "strongly_smooth_convex_on L mu S f G"
    and mu_pos: "0 < mu"
    and min_x: "global_min_on S f x"
    and min_y: "global_min_on S f y"
  shows "x = y"
proof -
  have scd: "strongly_convex_differentiable_on mu S f G"
    by (rule strongly_smooth_convex_onD_strongly_convex_differentiable[
        OF strong])

  show ?thesis
    by (rule strongly_convex_global_min_unique[
        where G = G,
        OF scd mu_pos min_x min_y])
qed


subsection ‹Consequences for projected-gradient optimality›

lemma strongly_smooth_projected_mapping_zero_distance_gap:
  fixes f :: "'a::{real_inner,heine_borel}  real"
  assumes strong: "strongly_smooth_convex_on L mu C f G"
    and closed: "closed C"
    and convex: "convex C"
    and xstar_mem: "xstar  C"
    and alpha_pos: "0 < alpha"
    and zero: "projected_gradient_mapping C alpha G xstar = 0"
    and x_mem: "x  C"
  shows
    "(mu / 2) * norm (x - xstar) ^ 2  f x - f xstar"
proof -
  have smooth: "smooth_convex_on L C f G"
    by (rule strongly_smooth_convex_onD_smooth[OF strong])

  have min_xstar: "global_min_on C f xstar"
    by (rule projected_gradient_mapping_zero_imp_global_min_on[
        where L = L and alpha = alpha and G = G and x = xstar,
        OF smooth closed convex xstar_mem alpha_pos zero])

  show ?thesis
    by (rule strongly_smooth_convex_global_min_distance_gap[
        where G = G and xstar = xstar,
        OF strong min_xstar x_mem])
qed

lemma strongly_smooth_projected_mapping_zero_unique_global_min:
  fixes f :: "'a::{real_inner,heine_borel}  real"
  assumes strong: "strongly_smooth_convex_on L mu C f G"
    and mu_pos: "0 < mu"
    and closed: "closed C"
    and convex: "convex C"
    and x_mem: "x  C"
    and alpha_pos: "0 < alpha"
    and zero: "projected_gradient_mapping C alpha G x = 0"
    and minimizer: "global_min_on C f y"
  shows "x = y"
proof -
  have smooth: "smooth_convex_on L C f G"
    by (rule strongly_smooth_convex_onD_smooth[OF strong])

  have min_x: "global_min_on C f x"
    by (rule projected_gradient_mapping_zero_imp_global_min_on[
        where L = L and alpha = alpha and G = G and x = x,
        OF smooth closed convex x_mem alpha_pos zero])

  show ?thesis
    by (rule strongly_smooth_convex_global_min_unique[
        where G = G,
        OF strong mu_pos min_x minimizer])
qed


subsection ‹Locale form: strongly convex differentiable functions›

locale strongly_convex_differentiable =
  convex_differentiable S f G
  for S :: "'a::real_inner set"
    and f :: "'a  real"
    and G :: "'a  'a" +
  fixes mu :: real
  assumes strong_lower_bound: "strong_convex_lower_bound_on mu S f G"
begin

lemma strong_nonneg:
  "0  mu"
  using strong_lower_bound
  by (rule strong_convex_lower_bound_onD_nonneg)

lemma strong_lower:
  assumes "x  S"
    and "y  S"
  shows
    "f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2  f y"
  by (rule strong_convex_lower_bound_onD[
      OF strong_lower_bound assms])

lemma strongly_convex_differentiable_on_self:
  "strongly_convex_differentiable_on mu S f G"
proof (rule strongly_convex_differentiable_onI)
  show "convex_differentiable_on S f G"
    by (rule convex_differentiable_onI[OF convex_f gradient_f])
next
  show "strong_convex_lower_bound_on mu S f G"
    by (rule strong_lower_bound)
qed

lemma gradient_lower_bound:
  "gradient_lower_bound_on S f G"
  by (rule strong_convex_lower_bound_on_imp_gradient_lower_bound_on[
      OF strong_lower_bound])

lemma supports:
  "supports_on S f G"
  by (rule strong_convex_lower_bound_on_imp_supports_on[
      OF strong_lower_bound])

lemma global_min_imp_first_order_condition:
  assumes minimizer: "global_min_on S f x"
  shows "first_order_condition_at S (G x) x"
proof -
  have cd: "convex_differentiable_on S f G"
    by (rule convex_differentiable_onI[OF convex_f gradient_f])

  show ?thesis
    by (rule convex_differentiable_on_global_min_imp_first_order_condition[
        where G = G and x = x,
        OF cd minimizer])
qed

lemma foc_distance_gap:
  assumes foc: "first_order_condition_at S (G xstar) xstar"
    and x_mem: "x  S"
  shows
    "(mu / 2) * norm (x - xstar) ^ 2  f x - f xstar"
  by (rule strong_convex_foc_distance_gap[
      where G = G and xstar = xstar,
      OF strong_lower_bound foc x_mem])

lemma global_min_distance_gap:
  assumes minimizer: "global_min_on S f xstar"
    and x_mem: "x  S"
  shows
    "(mu / 2) * norm (x - xstar) ^ 2  f x - f xstar"
  by (rule strongly_convex_global_min_distance_gap[
      where G = G and xstar = xstar,
      OF strongly_convex_differentiable_on_self minimizer x_mem])

lemma global_min_unique:
  assumes mu_pos: "0 < mu"
    and min_x: "global_min_on S f x"
    and min_y: "global_min_on S f y"
  shows "x = y"
  by (rule strongly_convex_global_min_unique[
      where G = G,
      OF strongly_convex_differentiable_on_self mu_pos min_x min_y])

end


subsection ‹Locale form: strongly smooth convex functions›

locale strongly_smooth_convex =
  smooth_convex S f G L
  for S :: "'a::real_inner set"
    and f :: "'a  real"
    and G :: "'a  'a"
    and L :: real +
  fixes mu :: real
  assumes strong_lower_bound: "strong_convex_lower_bound_on mu S f G"
begin

lemma strong_nonneg:
  "0  mu"
  using strong_lower_bound
  by (rule strong_convex_lower_bound_onD_nonneg)

lemma strongly_smooth_convex_on_self:
  "strongly_smooth_convex_on L mu S f G"
proof (rule strongly_smooth_convex_onI)
  show "smooth_convex_on L S f G"
  proof (rule smooth_convex_onI)
    show "convex_differentiable_on S f G"
      by (rule convex_differentiable_onI[OF convex_f gradient_f])
  next
    show "smooth_upper_bound_on L S f G"
      by (rule smooth_bound)
  qed
next
  show "strong_convex_lower_bound_on mu S f G"
    by (rule strong_lower_bound)
qed

lemma strongly_convex_differentiable_on_self:
  "strongly_convex_differentiable_on mu S f G"
  by (rule strongly_smooth_convex_onD_strongly_convex_differentiable[
      OF strongly_smooth_convex_on_self])

lemma strong_lower:
  assumes "x  S"
    and "y  S"
  shows
    "f x + inner (G x) (y - x) + (mu / 2) * norm (y - x) ^ 2  f y"
  by (rule strong_convex_lower_bound_onD[
      OF strong_lower_bound assms])

lemma global_min_distance_gap:
  assumes minimizer: "global_min_on S f xstar"
    and x_mem: "x  S"
  shows
    "(mu / 2) * norm (x - xstar) ^ 2  f x - f xstar"
  by (rule strongly_smooth_convex_global_min_distance_gap[
      where L = L and G = G and xstar = xstar,
      OF strongly_smooth_convex_on_self minimizer x_mem])

lemma global_min_unique:
  assumes mu_pos: "0 < mu"
    and min_x: "global_min_on S f x"
    and min_y: "global_min_on S f y"
  shows "x = y"
  by (rule strongly_smooth_convex_global_min_unique[
      where L = L and G = G,
      OF strongly_smooth_convex_on_self mu_pos min_x min_y])

end


text ‹
The main reusable theorem for later convergence arguments is
@{thm strongly_smooth_convex_global_min_distance_gap}.  It says that, for a
strongly smooth convex objective, the function-value gap to a global minimizer
controls the squared distance to that minimizer.

This is the key ingredient needed to turn the existing O(1/N) convergence
arguments into linear-convergence arguments under positive strong convexity.
›

end