class ADMM(Job): def map_reader(fd, url, size, params): i = Task.id z = params.z yi = params.y[i] + params.rho * (params.x[i] - z) for A, b in iter: xi = argmin(fi(x) + dot(yi, x - z) + (params.rho / 2.) * dot(x - z, x - z)) yield str(i), (xi, yi) def reduce(iter, params): for n, (i, (xi, yi)) in enumerate(iter): zhat += xi + yi / float(params.rho) yield zhat / n # first run a job to put records into A, b format # and also calculate a first z if __name__ == '__main__': params = Params(rho=1., z=0., objective=) while True: job = ADMM() results = job.wait() z = old_z params.z = list(RecordIter(job.results()))[0] if params.rho * sqrt(n) * pnorm(z - params.z, p=2) <= eta_conv: if sum(dot(xi - params.z, xi - params.z) for xi, yi in RecordIter(results)) <= (eta_feas ** 2): break