import Mathlib
import Optlib


open Filter Topology Set InnerProductSpace Finset

open Finset

theorem extracted_formal_statement_264.{u_1} {E : Type u_1} [inst : NormedAddCommGroup E] [inst_1 : InnerProductSpace ℝ E]
  {f : E → ℝ} (xm x₀ : E) {alg : subgradient_method f x₀} (hm : IsMinOn f Set.univ xm)
  (ha'' :
    ∀ (s : Set ℝ) (x : ℝ),
      (∀ (b : ℝ), x ≤ b → b ∈ s) → ∃ a, ∀ (b : ℕ), a ≤ b → (Finset.range (b + 1)).sum (subgradient_method.a f x₀) ∈ s)
  (s : Set ℝ)
  (ha' :
    ∀ (s x : Set ℝ),
      x ⊆ s →
        (∀ x_1 ∈ x, ∃ ε, 0 < ε ∧ Metric.ball x_1 ε ⊆ x) →
          0 ∈ x → ∃ a, ∀ (b : ℕ), a ≤ b → subgradient_method.a f x₀ b ∈ s)
  (t : Set ℝ) (hs₁ : t ⊆ s) (hs₂ : ∀ x ∈ t, ∃ ε, 0 < ε ∧ Metric.ball x ε ⊆ t) (hs₀ : 0 ∈ t) (ε : ℝ) (εpos : 0 < ε)
  (hs₂₀ : Metric.ball 0 ε ⊆ t) (a₁ : ℕ)
  (ha₁ : ∀ (b : ℕ), a₁ ≤ b → ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2)
  (a₂ : ℕ)
  (ha₂ :
    ∀ (b : ℕ),
      a₂ ≤ b →
        (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
            (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
          ε / 2)
  (b : ℕ) (hb : a₁ ⊔ a₂ ≤ b) (hba₁ : b ≥ a₁) (hba₂ : b ≥ a₂)
  (hne : sInf {x | ∃ i < b + 1, f (subgradient_method.x f x₀ i) = x} - f xm ≥ 0)
  (h₁ :
    ∀ (k : ℕ),
      2 * (Finset.range (k + 1)).sum (subgradient_method.a f x₀) *
          (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm) ≤
        ‖x₀ - xm‖ ^ 2 + ↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (k + 1), subgradient_method.a f x₀ i ^ 2)
  (hb₁ :
    2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀) *
        (sInf {x | ∃ i ∈ Finset.range (b + 1), f (subgradient_method.x f x₀ i) = x} - f xm) ≤
      ‖x₀ - xm‖ ^ 2 + ↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2)
  (hba₁' : ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2)
  (hba₂' :
    (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
        (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
      ε / 2)
  (hpos : 2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀) > 0)
  (h_original_goal :
    ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) +
        (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
          (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
      ε / 2 + ε / 2) :
  ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 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₀
hm : IsMinOn f Set.univ xm
ha'' :
  ∀ (s : Set ℝ) (x : ℝ),
    (∀ (b : ℝ), x ≤ b → b ∈ s) → ∃ a, ∀ (b : ℕ), a ≤ b → (Finset.range (b + 1)).sum (subgradient_method.a f x₀) ∈ s
s : Set ℝ
ha' :
  ∀ (s x : Set ℝ),
    x ⊆ s →
      (∀ x_1 ∈ x, ∃ ε, 0 < ε ∧ Metric.ball x_1 ε ⊆ x) → 0 ∈ x → ∃ a, ∀ (b : ℕ), a ≤ b → subgradient_method.a f x₀ b ∈ s
t : Set ℝ
hs₁ : t ⊆ s
hs₂ : ∀ x ∈ t, ∃ ε, 0 < ε ∧ Metric.ball x ε ⊆ t
hs₀ : 0 ∈ t
ε : ℝ
εpos : 0 < ε
hs₂₀ : Metric.ball 0 ε ⊆ t
a₁ : ℕ
ha₁ : ∀ (b : ℕ), a₁ ≤ b → ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2
a₂ : ℕ
ha₂ :
  ∀ (b : ℕ),
    a₂ ≤ b →
      (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
          (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
        ε / 2
b : ℕ
hb : a₁ ⊔ a₂ ≤ b
hba₁ : b ≥ a₁
hba₂ : b ≥ a₂
hne : sInf {x | ∃ i < b + 1, f (subgradient_method.x f x₀ i) = x} - f xm ≥ 0
h₁ :
  ∀ (k : ℕ),
    2 * (Finset.range (k + 1)).sum (subgradient_method.a f x₀) *
        (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm) ≤
      ‖x₀ - xm‖ ^ 2 + ↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (k + 1), subgradient_method.a f x₀ i ^ 2
hb₁ :
  2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀) *
      (sInf {x | ∃ i ∈ Finset.range (b + 1), f (subgradient_method.x f x₀ i) = x} - f xm) ≤
    ‖x₀ - xm‖ ^ 2 + ↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2
hba₁' : ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2
hba₂' :
  (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
      (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
    ε / 2
hpos : 2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀) > 0
⊢ ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) +
      (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
        (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
    ε / 2 + ε / 2

Tactic:
apply add_lt_add

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₀
 hm : IsMinOn f Set.univ xm
 ha'' :
   ∀ (s : Set ℝ) (x : ℝ),
     (∀ (b : ℝ), x ≤ b → b ∈ s) → ∃ a, ∀ (b : ℕ), a ≤ b → (Finset.range (b + 1)).sum (subgradient_method.a f x₀) ∈ s
 s : Set ℝ
 ha' :
   ∀ (s x : Set ℝ),
     x ⊆ s →
       (∀ x_1 ∈ x, ∃ ε, 0 < ε ∧ Metric.ball x_1 ε ⊆ x) → 0 ∈ x → ∃ a, ∀ (b : ℕ), a ≤ b → subgradient_method.a f x₀ b ∈ s
 t : Set ℝ
 hs₁ : t ⊆ s
 hs₂ : ∀ x ∈ t, ∃ ε, 0 < ε ∧ Metric.ball x ε ⊆ t
 hs₀ : 0 ∈ t
 ε : ℝ
 εpos : 0 < ε
 hs₂₀ : Metric.ball 0 ε ⊆ t
 a₁ : ℕ
 ha₁ : ∀ (b : ℕ), a₁ ≤ b → ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2
 a₂ : ℕ
 ha₂ :
   ∀ (b : ℕ),
     a₂ ≤ b →
       (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
           (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
         ε / 2
 b : ℕ
 hb : a₁ ⊔ a₂ ≤ b
 hba₁ : b ≥ a₁
 hba₂ : b ≥ a₂
 hne : sInf {x | ∃ i < b + 1, f (subgradient_method.x f x₀ i) = x} - f xm ≥ 0
 h₁ :
   ∀ (k : ℕ),
     2 * (Finset.range (k + 1)).sum (subgradient_method.a f x₀) *
         (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm) ≤
       ‖x₀ - xm‖ ^ 2 + ↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (k + 1), subgradient_method.a f x₀ i ^ 2
 hb₁ :
   2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀) *
       (sInf {x | ∃ i ∈ Finset.range (b + 1), f (subgradient_method.x f x₀ i) = x} - f xm) ≤
     ‖x₀ - xm‖ ^ 2 + ↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2
 hba₁' : ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2
 hba₂' :
   (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
       (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
     ε / 2
 hpos : 2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀) > 0
 ⊢ ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2,
 case h₂
 E : Type u_1
 inst✝¹ : NormedAddCommGroup E
 inst✝ : InnerProductSpace ℝ E
 f : E → ℝ
 xm x₀ : E
 alg : subgradient_method f x₀
 hm : IsMinOn f Set.univ xm
 ha'' :
   ∀ (s : Set ℝ) (x : ℝ),
     (∀ (b : ℝ), x ≤ b → b ∈ s) → ∃ a, ∀ (b : ℕ), a ≤ b → (Finset.range (b + 1)).sum (subgradient_method.a f x₀) ∈ s
 s : Set ℝ
 ha' :
   ∀ (s x : Set ℝ),
     x ⊆ s →
       (∀ x_1 ∈ x, ∃ ε, 0 < ε ∧ Metric.ball x_1 ε ⊆ x) → 0 ∈ x → ∃ a, ∀ (b : ℕ), a ≤ b → subgradient_method.a f x₀ b ∈ s
 t : Set ℝ
 hs₁ : t ⊆ s
 hs₂ : ∀ x ∈ t, ∃ ε, 0 < ε ∧ Metric.ball x ε ⊆ t
 hs₀ : 0 ∈ t
 ε : ℝ
 εpos : 0 < ε
 hs₂₀ : Metric.ball 0 ε ⊆ t
 a₁ : ℕ
 ha₁ : ∀ (b : ℕ), a₁ ≤ b → ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2
 a₂ : ℕ
 ha₂ :
   ∀ (b : ℕ),
     a₂ ≤ b →
       (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
           (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
         ε / 2
 b : ℕ
 hb : a₁ ⊔ a₂ ≤ b
 hba₁ : b ≥ a₁
 hba₂ : b ≥ a₂
 hne : sInf {x | ∃ i < b + 1, f (subgradient_method.x f x₀ i) = x} - f xm ≥ 0
 h₁ :
   ∀ (k : ℕ),
     2 * (Finset.range (k + 1)).sum (subgradient_method.a f x₀) *
         (sInf {x | ∃ i ∈ Finset.range (k + 1), f (subgradient_method.x f x₀ i) = x} - f xm) ≤
       ‖x₀ - xm‖ ^ 2 + ↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (k + 1), subgradient_method.a f x₀ i ^ 2
 hb₁ :
   2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀) *
       (sInf {x | ∃ i ∈ Finset.range (b + 1), f (subgradient_method.x f x₀ i) = x} - f xm) ≤
     ‖x₀ - xm‖ ^ 2 + ↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2
 hba₁' : ‖x₀ - xm‖ ^ 2 / (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) < ε / 2
 hba₂' :
   (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
       (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
     ε / 2
 hpos : 2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀) > 0
 ⊢ (↑(subgradient_method.G f x₀) ^ 2 * ∑ i ∈ Finset.range (b + 1), subgradient_method.a f x₀ i ^ 2) /
       (2 * (Finset.range (b + 1)).sum (subgradient_method.a f x₀)) <
     ε / 2]