def eval_prox(prox_function_type, prob, v_map, lam=1, epigraph=False): """Evaluate a single proximal operator.""" problem = compiler.compile_problem(cvxpy_expr.convert_problem(prob)) validate.check_sum_of_prox(problem) # Get the first non constant objective term if len(problem.objective.arg) != 1: raise ProblemError("prox does not have single f", problem) if problem.constraint: raise ProblemError("prox has constraints", problem) f_expr = problem.objective.arg[0] if (f_expr.expression_type != Expression.PROX_FUNCTION or f_expr.prox_function.prox_function_type != prox_function_type or f_expr.prox_function.epigraph != epigraph): raise ProblemError("prox did not compile to right type", problem) v_bytes_map = {cvxpy_expr.variable_id(var): numpy.array(val, dtype=numpy.float64).tobytes(order="F") for var, val in v_map.iteritems()} values = _solve.eval_prox( f_expr.SerializeToString(), lam, constant.global_data_map, v_bytes_map) cvxpy_solver.set_solution(prob, values)
def transform_problem(problem, params): validate.check_sum_of_prox(problem) graph = build_graph(problem) if not graph.nodes(VARIABLE): return problem for f in GRAPH_TRANSFORMS: f(graph) log_debug( lambda f, graph: "%s:\n%s" % (f.__name__, tree_format.format_problem(graph.problem)), f, graph) return graph.problem
def format_problem(problem): name_map = NameMap() validate.check_sum_of_prox(problem) output = "objective:\n" output += (" add(\n " + ",\n ".join( format_expr(arg, name_map) for arg in problem.objective.arg) + ")\n") if problem.constraint: output += "\nconstraints:\n" output += "".join(" " + format_expr(constr, name_map) + "\n" for constr in problem.constraint) return output
def transform_problem(problem): validate.check_sum_of_prox(problem) graph = build_graph(problem) if not graph.nodes(VARIABLE): return problem for f in GRAPH_TRANSFORMS: f(graph) log_debug( lambda f, graph: "%s:\n%s" % (f.__name__, tree_format.format_problem(graph.problem)), f, graph) return graph.problem
def eval_prox_impl(prob, v_map, lam=1, prox_function_type=None, epigraph=False): """Evaluate a single proximal operator.""" problem = compiler.compile_problem(cvxpy_expr.convert_problem(prob)) validate.check_sum_of_prox(problem) # Get the first non constant objective term if len(problem.objective.arg) != 1: raise ProblemError("prox does not have single f", problem) if problem.constraint: raise ProblemError("prox has constraints", problem) f_expr = problem.objective.arg[0] if f_expr.expression_type != Expression.PROX_FUNCTION: raise ProblemError("prox did not compile to right type", problem) if prox_function_type is not None and ( f_expr.prox_function.prox_function_type != prox_function_type or f_expr.prox_function.epigraph != epigraph): raise ProblemError("prox did not compile to right type", problem) v_bytes_map = { cvxpy_expr.variable_id(var): numpy.array(val, dtype=numpy.float64).tobytes(order="F") for var, val in v_map.iteritems() } values = _solve.eval_prox(f_expr.SerializeToString(), lam, problem.expression_data(), v_bytes_map) cvxpy_solver.set_solution(prob, values)
def transform_problem(problem): validate.check_sum_of_prox(problem) constrs = [] obj = transform_expr(problem.objective, constrs) return expression.Problem(objective=obj, constraint=constrs)