def epigraph(expr): f_expr, t_expr = get_epigraph(expr) if f_expr: for rule in BASE_RULES: result = rule(f_expr) if result.match: epi_function = result.prox_expr.prox_function epi_function.epigraph = True epi_function.arg_size.add().CopyFrom(Size(dim=dims(t_expr))) linear_t_expr = linear.transform_expr(t_expr) if linear_t_expr.affine_props.scalar: constrs = [] else: linear_t_expr, constrs = epi_transform( linear_t_expr, "scalar") return MatchResult( True, expression.prox_function( epi_function, *(result.prox_expr.arg + [linear_t_expr])), result.raw_exprs + constrs) # No epigraph transform found, do conic transformation obj, constrs = conic.transform_expr(f_expr) return MatchResult( True, None, [expression.leq_constraint(obj, t_expr)] + constrs) # Not in epigraph form return MatchResult(False)
def epigraph(expr): f_expr, t_expr = get_epigraph(expr) if f_expr: for rule in BASE_RULES: result = rule(f_expr) if result.match: epi_function = result.prox_expr.prox_function epi_function.epigraph = True return MatchResult( True, expression.prox_function(epi_function, *(result.prox_expr.arg + [t_expr])), result.raw_exprs ) # No epigraph transform found, do conic transformation obj, constrs = conic.transform_expr(f_expr) return MatchResult(True, None, [expression.leq_constraint(obj, t_expr)] + constrs) # Not in epigraph form return MatchResult(False)
def transform_cone(expr): obj, constrs = conic.transform_expr(expr) return MatchResult(True, None, [obj] + constrs)