added convex optimization