# Source code for cvxpy.atoms.min

"""

you may not use this file except in compliance with the License.
You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software
[docs]class min(AxisAtom): """:math:\\min{i,j}\\{X_{i,j}\\}. """ def __init__(self, x, axis=None, keepdims=False): super(min, self).__init__(x, axis=axis, keepdims=keepdims) @Atom.numpy_numeric def numeric(self, values): """Returns the smallest entry in x. """ return values[0].min(axis=self.axis, keepdims=self.keepdims) def _grad(self, values): """Gives the (sub/super)gradient of the atom w.r.t. each argument. Matrix expressions are vectorized, so the gradient is a matrix. Args: values: A list of numeric values for the arguments. Returns: A list of SciPy CSC sparse matrices or None. """ return self._axis_grad(values) def _column_grad(self, value): """Gives the (sub/super)gradient of the atom w.r.t. a column argument. Matrix expressions are vectorized, so the gradient is a matrix. Args: value: A numeric value for a column. Returns: A NumPy ndarray or None. """ # Grad: 1 for a largest index. value = np.array(value).ravel(order='F') idx = np.argmin(value) D = np.zeros((value.size, 1)) D[idx] = 1 return D def sign_from_args(self): """Returns sign (is positive, is negative) of the expression. """ # Same as argument. return (self.args[0].is_nonneg(), self.args[0].is_nonpos()) def is_atom_convex(self): """Is the atom convex? """ return False def is_atom_concave(self): """Is the atom concave? """ return True def is_atom_log_log_convex(self): """Is the atom log-log convex? """ return False def is_atom_log_log_concave(self): """Is the atom log-log concave? """ return True def is_incr(self, idx): """Is the composition non-decreasing in argument idx? """ return True def is_decr(self, idx): """Is the composition non-increasing in argument idx? """ return False def is_pwl(self): """Is the atom piecewise linear? """ return self.args[0].is_pwl()