Primal-dual algorithms for distributed optimization