An optimization method that updates inputs along gradients while constraining them to stay within a valid range.