Optimization
Exercises Notebook
Converted from
exercises.ipynbfor web reading.
Convex Optimization - Exercises
Ten graded exercises. Each exercise has a problem, scaffold, and solution cell.
Code cell 2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
try:
import seaborn as sns
sns.set_theme(style="whitegrid", palette="colorblind")
HAS_SNS = True
except ImportError:
plt.style.use("seaborn-v0_8-whitegrid")
HAS_SNS = False
mpl.rcParams.update({
"figure.figsize": (10, 6),
"figure.dpi": 120,
"font.size": 13,
"axes.titlesize": 15,
"axes.labelsize": 13,
"xtick.labelsize": 11,
"ytick.labelsize": 11,
"legend.fontsize": 11,
"legend.framealpha": 0.85,
"lines.linewidth": 2.0,
"axes.spines.top": False,
"axes.spines.right": False,
"savefig.bbox": "tight",
"savefig.dpi": 150,
})
np.random.seed(42)
print("Plot setup complete.")
Exercise 1 [*]: Convex Functions
- State the relevant definition for convex functions.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 4
# Your Solution
print("Exercise 1 scaffold: fill in the missing computation for convex functions.")
answer = None
print("answer =", answer)
Code cell 5
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 1: Convex Functions")
vector = np.array([1.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 4.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: convex functions is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 2 [*]: First-Order Characterization
- State the relevant definition for first-order characterization.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 7
# Your Solution
print("Exercise 2 scaffold: fill in the missing computation for first-order characterization.")
answer = None
print("answer =", answer)
Code cell 8
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 2: First-Order Characterization")
vector = np.array([2.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 7.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: first-order characterization is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 3 [*]: Smoothness
- State the relevant definition for smoothness.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 10
# Your Solution
print("Exercise 3 scaffold: fill in the missing computation for smoothness.")
answer = None
print("answer =", answer)
Code cell 11
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 3: Smoothness")
vector = np.array([3.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 12.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: smoothness is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 4 [**]: Condition Number
- State the relevant definition for condition number.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 13
# Your Solution
print("Exercise 4 scaffold: fill in the missing computation for condition number.")
answer = None
print("answer =", answer)
Code cell 14
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 4: Condition Number")
vector = np.array([4.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 19.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: condition number is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 5 [**]: Linear Programs
- State the relevant definition for linear programs.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 16
# Your Solution
print("Exercise 5 scaffold: fill in the missing computation for linear programs.")
answer = None
print("answer =", answer)
Code cell 17
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 5: Linear Programs")
vector = np.array([5.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 28.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: linear programs is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 6 [**]: Semidefinite Programs
- State the relevant definition for semidefinite programs.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 19
# Your Solution
print("Exercise 6 scaffold: fill in the missing computation for semidefinite programs.")
answer = None
print("answer =", answer)
Code cell 20
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 6: Semidefinite Programs")
vector = np.array([6.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 39.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: semidefinite programs is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 7 [**]: Proximal Operators
- State the relevant definition for proximal operators.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 22
# Your Solution
print("Exercise 7 scaffold: fill in the missing computation for proximal operators.")
answer = None
print("answer =", answer)
Code cell 23
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 7: Proximal Operators")
vector = np.array([7.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 52.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: proximal operators is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 8 [***]: Weak Duality
- State the relevant definition for weak duality.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 25
# Your Solution
print("Exercise 8 scaffold: fill in the missing computation for weak duality.")
answer = None
print("answer =", answer)
Code cell 26
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 8: Weak Duality")
vector = np.array([8.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 67.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: weak duality is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 9 [***]: Slater Condition
- State the relevant definition for Slater condition.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 28
# Your Solution
print("Exercise 9 scaffold: fill in the missing computation for Slater condition.")
answer = None
print("answer =", answer)
Code cell 29
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 9: Slater Condition")
vector = np.array([9.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 84.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: Slater condition is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")
Exercise 10 [***]: Logistic Regression Convexity
- State the relevant definition for logistic regression convexity.
- Compute the requested toy quantity.
- Explain the optimization diagnostic you would log in a real model-training run.
Code cell 31
# Your Solution
print("Exercise 10 scaffold: fill in the missing computation for logistic regression convexity.")
answer = None
print("answer =", answer)
Code cell 32
# Solution
import numpy as np
def header(title):
print("\n" + "=" * 72)
print(title)
print("=" * 72)
def check_close(name, value, target, tol=1e-8):
ok = abs(float(value) - float(target)) <= tol
print(f"{'PASS' if ok else 'FAIL'} - {name}: value={value:.8f}, target={target:.8f}")
if not ok:
raise AssertionError(name)
def check_true(name, condition):
ok = bool(condition)
print(f"{'PASS' if ok else 'FAIL'} - {name}")
if not ok:
raise AssertionError(name)
header("Exercise 10: Logistic Regression Convexity")
vector = np.array([10.0, 1.0, -1.0])
answer = float(vector[0] ** 2 + 3.0)
check_close("toy scalar computation", answer, 103.0)
check_true("finite answer", np.isfinite(answer))
print("Definition anchor: logistic regression convexity is interpreted through the objective, update, or diagnostic in Convex Optimization.")
print("\nTakeaway: a tiny verified computation is the fastest way to test intuition before scaling an optimizer experiment.")