def if_eq_zero(condition, if_result, else_result): """ A short expression which can be compiled quickly. :type condition: Union[float, Symbol] :type if_result: Union[float, Symbol] :type else_result: Union[float, Symbol] :return: if_result if condition == 0 else else_result :rtype: Union[float, Symbol] """ condition = se.Abs(sign(condition)) return (1 - condition) * if_result + condition * else_result
def if_greater_zero(condition, if_result, else_result): """ :type condition: Union[float, Symbol] :type if_result: Union[float, Symbol] :type else_result: Union[float, Symbol] :return: if_result if condition > 0 else else_result :rtype: Union[float, Symbol] """ _condition = sign(condition) # 1 or -1 _if = Max(0, _condition) * if_result # 0 or if_result _else = -Min(0, _condition) * else_result # 0 or else_result return _if + _else + (1 - Abs(_condition)) * else_result # if_result or else_result
def test_sign(): assert sign(1.2) == 1 assert sign(-1.2) == -1 assert sign(3 * I) == I assert sign(-3 * I) == -I assert sign(0) == 0 assert sign(nan) == nan
def fmod(a, b): s = sign(a) a = Abs(a) b = Abs(b) f1 = a - (b * floor(a / b)) return s * se.Piecewise([0, Abs(a - b) < SMALL_NUMBER], [f1, True])