import Mathlib
import Optlib


open Filter Topology Set InnerProductSpace Finset

open Finset

theorem extracted_formal_statement_70.{u_1} {E : Type u_1} [inst : NormedAddCommGroup E] [inst_1 : InnerProductSpace ℝ E]
  {f : E → ℝ} (xm x₀ : E) {alg : subgradient_method f x₀} (k : ℕ)
  (h' : ∀ ⦃x g : E⦄, g ∈ SubderivAt f x → ‖g‖ ≤ ↑(subgradient_method.G f x₀)) (k₀ : ¬k = 0)
  (heq :
    (Set.range fun x => f (subgradient_method.x f x₀ ↑x)) =
      {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x})
  (h₁ :
    ∀ ⦃i : ℕ⦄,
      i ≥ 0 ∧ i ≤ k →
        ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 ≤
          ‖subgradient_method.x f x₀ i - xm‖ ^ 2 -
              2 * subgradient_method.a f x₀ i *
                (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm) +
            ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2)
  (h₁' :
    ∀ ⦃i : ℕ⦄,
      i ≥ 0 ∧ i ≤ k →
        subgradient_method.a f x₀ i *
            (2 * (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm)) ≤
          ‖subgradient_method.x f x₀ i - xm‖ ^ 2 - ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 +
            ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2)
  (h_original_goal :
    ∑ i ∈ Finset.range (k + 1),
        subgradient_method.a f x₀ i *
          (2 * (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm)) ≤
      ∑ i ∈ Finset.range (k + 1),
        (‖subgradient_method.x f x₀ i - xm‖ ^ 2 - ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 +
          ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2))
  (i : ℕ) :
  i ∈ Finset.range (k + 1) →
    subgradient_method.a f x₀ i *
        (2 * (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm)) ≤
      ‖subgradient_method.x f x₀ i - xm‖ ^ 2 - ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 +
        ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2 := sorry

Tactic state before:
E : Type u_1
inst✝¹ : NormedAddCommGroup E
inst✝ : InnerProductSpace ℝ E
f : E → ℝ
xm x₀ : E
alg : subgradient_method f x₀
k : ℕ
h' : ∀ ⦃x g : E⦄, g ∈ SubderivAt f x → ‖g‖ ≤ ↑(subgradient_method.G f x₀)
k₀ : ¬k = 0
heq :
  (Set.range fun x => f (subgradient_method.x f x₀ ↑x)) =
    {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x}
h₁ :
  ∀ ⦃i : ℕ⦄,
    i ≥ 0 ∧ i ≤ k →
      ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 ≤
        ‖subgradient_method.x f x₀ i - xm‖ ^ 2 -
            2 * subgradient_method.a f x₀ i *
              (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm) +
          ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2
h₁' :
  ∀ ⦃i : ℕ⦄,
    i ≥ 0 ∧ i ≤ k →
      subgradient_method.a f x₀ i *
          (2 * (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm)) ≤
        ‖subgradient_method.x f x₀ i - xm‖ ^ 2 - ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 +
          ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2
⊢ ∑ i ∈ Finset.range (k + 1),
      subgradient_method.a f x₀ i *
        (2 * (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm)) ≤
    ∑ i ∈ Finset.range (k + 1),
      (‖subgradient_method.x f x₀ i - xm‖ ^ 2 - ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 +
        ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2)

Tactic:
apply Finset.sum_le_sum

Tactic state after:
[case h
 E : Type u_1
 inst✝¹ : NormedAddCommGroup E
 inst✝ : InnerProductSpace ℝ E
 f : E → ℝ
 xm x₀ : E
 alg : subgradient_method f x₀
 k : ℕ
 h' : ∀ ⦃x g : E⦄, g ∈ SubderivAt f x → ‖g‖ ≤ ↑(subgradient_method.G f x₀)
 k₀ : ¬k = 0
 heq :
   (Set.range fun x => f (subgradient_method.x f x₀ ↑x)) =
     {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x}
 h₁ :
   ∀ ⦃i : ℕ⦄,
     i ≥ 0 ∧ i ≤ k →
       ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 ≤
         ‖subgradient_method.x f x₀ i - xm‖ ^ 2 -
             2 * subgradient_method.a f x₀ i *
               (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm) +
           ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2
 h₁' :
   ∀ ⦃i : ℕ⦄,
     i ≥ 0 ∧ i ≤ k →
       subgradient_method.a f x₀ i *
           (2 * (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm)) ≤
         ‖subgradient_method.x f x₀ i - xm‖ ^ 2 - ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 +
           ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2
 ⊢ ∀ i ∈ Finset.range (k + 1),
     subgradient_method.a f x₀ i *
         (2 * (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm)) ≤
       ‖subgradient_method.x f x₀ i - xm‖ ^ 2 - ‖subgradient_method.x f x₀ (i + 1) - xm‖ ^ 2 +
         ↑(subgradient_method.G f x₀) ^ 2 * subgradient_method.a f x₀ i ^ 2]