first-order methods