def _binary_simplify(self, left, right): """ See :meth:`pybamm.BinaryOperator.simplify()`. """ # anything multiplied by a scalar zero returns a scalar zero if is_scalar_zero(left): if isinstance(right, pybamm.Array): return pybamm.Array(np.zeros(right.shape)) else: return pybamm.Scalar(0) if is_scalar_zero(right): if isinstance(left, pybamm.Array): return pybamm.Array(np.zeros(left.shape)) else: return pybamm.Scalar(0) # if one of the children is a zero matrix, we have to be careful about shapes if is_matrix_zero(left) or is_matrix_zero(right): shape = (left * right).shape if len(shape) == 1 or shape[1] == 1: return pybamm.Vector(np.zeros(shape)) else: return pybamm.Matrix(csr_matrix(shape)) # anything multiplied by a scalar one returns itself if is_one(left): return right if is_one(right): return left return pybamm.simplify_multiplication_division(self.__class__, left, right)
def _binary_simplify(self, left, right): """ See :meth:`pybamm.BinaryOperator.simplify()`. """ # zero divided by zero returns nan scalar if is_scalar_zero(left) and is_scalar_zero(right): return pybamm.Scalar(np.nan) # zero divided by anything returns zero if is_scalar_zero(left): if right.shape_for_testing == (): return pybamm.Scalar(0) else: return pybamm.Array(np.zeros(right.shape_for_testing)) # anything divided by zero returns inf if is_scalar_zero(right): if left.shape_for_testing == (): return pybamm.Scalar(np.inf) else: return pybamm.Array(np.inf * np.ones(left.shape_for_testing)) # anything divided by one is itself if is_one(right): return left return pybamm.simplify_multiplication_division(self.__class__, left, right)
def _binary_simplify(self, left, right): """ See :meth:`pybamm.BinaryOperator._binary_simplify()`. """ # zero divided by zero returns nan scalar if is_scalar_zero(left) and is_scalar_zero(right): return pybamm.Scalar(np.nan) # zero divided by anything returns zero (being careful about shape) if is_scalar_zero(left): return zeros_of_shape(right.shape_for_testing) # matrix zero divided by anything returns matrix zero (i.e. itself) if is_matrix_zero(left): return left # anything divided by zero returns inf if is_scalar_zero(right): if left.shape_for_testing == (): return pybamm.Scalar(np.inf) else: return pybamm.Array(np.inf * np.ones(left.shape_for_testing)) # anything divided by one is itself if is_scalar_one(right): return left return pybamm.simplify_multiplication_division(self.__class__, left, right)
def _binary_simplify(self, left, right): """ See :meth:`pybamm.BinaryOperator._binary_simplify()`. """ if is_matrix_zero(left) or is_matrix_zero(right): shape = (left @ right).shape return zeros_of_shape(shape) return pybamm.simplify_multiplication_division(self.__class__, left, right)
def _binary_simplify(self, left, right): """ See :meth:`pybamm.BinaryOperator.simplify()`. """ # anything multiplied by a scalar zero returns a scalar zero if is_scalar_zero(left) or is_scalar_zero(right): return pybamm.Scalar(0) return pybamm.simplify_multiplication_division(self.__class__, left, right)
def _binary_simplify(self, left, right): """ See :meth:`pybamm.BinaryOperator._binary_simplify()`. """ # simplify multiply by scalar zero, being careful about shape if is_scalar_zero(left): return zeros_of_shape(right.shape_for_testing) if is_scalar_zero(right): return zeros_of_shape(left.shape_for_testing) # if one of the children is a zero matrix, we have to be careful about shapes if is_matrix_zero(left) or is_matrix_zero(right): shape = (left * right).shape return zeros_of_shape(shape) # anything multiplied by a scalar one returns itself if is_scalar_one(left): return right if is_scalar_one(right): return left return pybamm.simplify_multiplication_division(self.__class__, left, right)