def do_cmp(x1, x2): real1, real2 = x1.get_real_value(), x2.get_real_value() inf1 = inf2 = None if x1.has_form('DirectedInfinity', 1): inf1 = x1.leaves[0].get_int_value() if x2.has_form('DirectedInfinity', 1): inf2 = x2.leaves[0].get_int_value() if real1 is not None and get_type(real1) != 'f': real1 = sympy.Float(real1) if real2 is not None and get_type(real2) != 'f': real2 = sympy.Float(real2) # Bus error when not converting to mpf if real1 is not None and real2 is not None: if x1 == x2: return 0 elif x1 < x2: return -1 else: return 1 elif inf1 is not None and inf2 is not None: return cmp(inf1, inf2) elif inf1 is not None and real2 is not None: return inf1 elif real1 is not None and inf2 is not None: return -inf2 else: return None
def apply(self, items, evaluation): 'Times[items___]' items = items.numerify(evaluation).get_sequence() number = mpz(1) leaves = [] for item in items: if isinstance(item, Number): if get_type(item.value) == 'z' and item.value == 0: return Integer('0') number = mul(number, item.value) elif leaves and item == leaves[-1]: leaves[-1] = Expression('Power', leaves[-1], Integer(2)) elif leaves and item.has_form('Power', 2) and leaves[-1].has_form('Power', 2) and item.leaves[0].same(leaves[-1].leaves[0]): leaves[-1].leaves[1] = Expression('Plus', item.leaves[1], leaves[-1].leaves[1]) elif leaves and item.has_form('Power', 2) and item.leaves[0].same(leaves[-1]): leaves[-1] = Expression('Power', leaves[-1], Expression('Plus', item.leaves[1], Integer(1))) elif leaves and leaves[-1].has_form('Power', 2) and leaves[-1].leaves[0].same(item): leaves[-1] = Expression('Power', item, Expression('Plus', Integer(1), leaves[-1].leaves[1])) else: leaves.append(item) if get_type(number) == 'z': if number == 1: number = None elif number == -1 and leaves and leaves[0].has_form('Plus', None): leaves[0].leaves = [Expression('Times', Integer(-1), leaf) for leaf in leaves[0].leaves] number = None if number is not None: leaves.insert(0, Number.from_mp(number)) if not leaves: return Integer(1) elif len(leaves) == 1: return leaves[0] else: return Expression('Times', *leaves)
def do_cmp(x1, x2): real1, real2 = x1.get_real_value(), x2.get_real_value() inf1 = inf2 = None if x1.has_form('DirectedInfinity', 1): inf1 = x1.leaves[0].get_int_value() if x2.has_form('DirectedInfinity', 1): inf2 = x2.leaves[0].get_int_value() if real1 is not None and get_type(real1) != 'f': real1 = sympy.Float(real1) if real2 is not None and get_type(real2) != 'f': real2 = sympy.Float(real2) # Bus error when not converting to mpf if real1 is not None and real2 is not None: if x1 == x2: return 0 elif x1 < x2: return -1 else: return 1 elif inf1 is not None and inf2 is not None: if inf1 == inf2: return 0 elif inf1 < inf2: return -1 else: return 1 elif inf1 is not None and real2 is not None: return inf1 elif real1 is not None and inf2 is not None: return -inf2 else: return None
def apply(self, items, evaluation): 'Times[items___]' items = items.numerify(evaluation).get_sequence() number = mpz(1) leaves = [] for item in items: if isinstance(item, Number): if get_type(item.value) == 'z' and item.value == 0: return Integer('0') number = mul(number, item.value) elif leaves and item == leaves[-1]: leaves[-1] = Expression('Power', leaves[-1], Integer(2)) elif leaves and item.has_form('Power', 2) and leaves[-1].has_form( 'Power', 2) and item.leaves[0].same(leaves[-1].leaves[0]): leaves[-1].leaves[1] = Expression('Plus', item.leaves[1], leaves[-1].leaves[1]) elif leaves and item.has_form('Power', 2) and item.leaves[0].same( leaves[-1]): leaves[-1] = Expression( 'Power', leaves[-1], Expression('Plus', item.leaves[1], Integer(1))) elif leaves and leaves[-1].has_form( 'Power', 2) and leaves[-1].leaves[0].same(item): leaves[-1] = Expression( 'Power', item, Expression('Plus', Integer(1), leaves[-1].leaves[1])) else: leaves.append(item) if get_type(number) == 'z': if number == 1: number = None elif number == -1 and leaves and leaves[0].has_form('Plus', None): leaves[0].leaves = [ Expression('Times', Integer(-1), leaf) for leaf in leaves[0].leaves ] number = None if number is not None: leaves.insert(0, Number.from_mp(number)) if not leaves: return Integer(1) elif len(leaves) == 1: return leaves[0] else: return Expression('Times', *leaves)
def apply(self, items, evaluation): 'Plus[items___]' items = items.numerify(evaluation).get_sequence() number = mpz(0) leaves = [] last_item = last_count = None def append_last(): if last_item is not None: if last_count == 1: leaves.append(last_item) else: if last_item.has_form('Times', None): last_item.leaves.insert(0, Number.from_mp(last_count)) leaves.append(last_item) else: leaves.append( Expression('Times', Number.from_mp(last_count), last_item)) for item in items: if isinstance(item, Number): number = add(number, item.value) else: count = rest = None if item.has_form('Times', None): for leaf in item.leaves: if isinstance(leaf, Number): count = leaf.value rest = item.leaves[:] rest.remove(leaf) if len(rest) == 1: rest = rest[0] else: rest.sort() rest = Expression('Times', *rest) break if count is None: count = mpz(1) rest = item if last_item is not None and last_item == rest: last_count = add(last_count, count) else: append_last() last_item = rest last_count = count append_last() if not (get_type(number) == 'z' and number == 0): leaves.insert(0, Number.from_mp(number)) if not leaves: return Integer(0) elif len(leaves) == 1: return leaves[0] else: leaves.sort() return Expression('Plus', *leaves)
def apply(self, items, evaluation): 'Plus[items___]' items = items.numerify(evaluation).get_sequence() number = mpz(0) leaves = [] last_item = last_count = None def append_last(): if last_item is not None: if last_count == 1: leaves.append(last_item) else: if last_item.has_form('Times', None): last_item.leaves.insert(0, Number.from_mp(last_count)) leaves.append(last_item) else: leaves.append(Expression('Times', Number.from_mp(last_count), last_item)) for item in items: if isinstance(item, Number): number = add(number, item.value) else: count = rest = None if item.has_form('Times', None): for leaf in item.leaves: if isinstance(leaf, Number): count = leaf.value rest = item.leaves[:] rest.remove(leaf) if len(rest) == 1: rest = rest[0] else: rest.sort() rest = Expression('Times', *rest) break if count is None: count = mpz(1) rest = item if last_item is not None and last_item == rest: last_count = add(last_count, count) else: append_last() last_item = rest last_count = count append_last() if not (get_type(number) == 'z' and number == 0): leaves.insert(0, Number.from_mp(number)) if not leaves: return Integer(0) elif len(leaves) == 1: return leaves[0] else: leaves.sort() return Expression('Plus', *leaves)