def linearize(expr): """Returns the tangent approximation to the expression. Gives an elementwise lower (upper) bound for convex (concave) expressions. No guarantees for non-DCP expressions. Returns None if cannot be linearized. Args: expr: An expression. Returns: An affine expression or None. """ expr = Constant.cast_to_const(expr) if expr.is_affine(): return expr else: tangent = expr.value if tangent is None: raise ValueError( "Cannot linearize non-affine expression with missing variable values." ) grad_map = expr.grad for var in expr.variables(): if grad_map[var] is None: return None elif var.is_matrix(): flattened = Constant(grad_map[var]).T*vec(var - var.value) tangent = tangent + reshape(flattened, *expr.size) else: tangent = tangent + Constant(grad_map[var]).T*(var - var.value) return tangent
def linearize(expr): """Returns the tangent approximation to the expression. Gives an elementwise lower (upper) bound for convex (concave) expressions. No guarantees for non-DCP expressions. Returns None if cannot be linearized. Args: expr: An expression. Returns: An affine expression or None. """ expr = Constant.cast_to_const(expr) if expr.is_affine(): return expr else: tangent = expr.value if tangent is None: raise ValueError( "Cannot linearize non-affine expression with missing variable values." ) grad_map = expr.grad for var in expr.variables(): if grad_map[var] is None: return None elif var.is_matrix(): flattened = Constant(grad_map[var]).T * vec(var - var.value) tangent = tangent + reshape(flattened, *expr.size) else: tangent = tangent + Constant( grad_map[var]).T * (var - var.value) return tangent
def linearize(expr): """Returns an affine approximation to the expression computed at the variable/parameter values. Gives an elementwise lower (upper) bound for convex (concave) expressions that is tight at the current variable/parameter values. No guarantees for non-DCP expressions. If f and g are convex, the objective f - g can be (heuristically) minimized using the implementation below of the convex-concave method: .. code :: python for iters in range(N): Problem(Minimize(f - linearize(g))).solve() Returns None if cannot be linearized. Args: expr: An expression. Returns: An affine expression or None. """ expr = Constant.cast_to_const(expr) if expr.is_affine(): return expr else: tangent = expr.value if tangent is None: raise ValueError( "Cannot linearize non-affine expression with missing variable values." ) grad_map = expr.grad for var in expr.variables(): if grad_map[var] is None: return None elif var.is_matrix(): flattened = Constant(grad_map[var]).T * vec(var - var.value) tangent = tangent + reshape(flattened, expr.shape) else: tangent = tangent + Constant( grad_map[var]).T * (var - var.value) return tangent