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)
def apply_iter(self, expr, i, imin, imax, di, evaluation): '%(name)s[expr_, {i_Symbol, imin_, imax_, di_}]' index = imin.evaluate(evaluation).get_real_value() imax = imax.evaluate(evaluation).get_real_value() di = di.evaluate(evaluation).get_real_value() if index is None or imax is None or di is None: if self.throw_iterb: evaluation.message(self.get_name(), 'iterb') return result = [] while index <= imax: evaluation.check_stopped() try: item = dynamic_scoping(expr.evaluate, {i.name: Number.from_mp(index)}, evaluation) result.append(item) except ContinueInterrupt: if self.allow_loopcontrol: pass else: raise except BreakInterrupt: if self.allow_loopcontrol: break else: raise index = add(index, di) return self.get_result(result)
def apply_iter(self, expr, i, imin, imax, di, evaluation): '%(name)s[expr_, {i_Symbol, imin_, imax_, di_}]' index = imin.evaluate(evaluation).get_real_value() imax = imax.evaluate(evaluation).get_real_value() di = di.evaluate(evaluation).get_real_value() if index is None or imax is None or di is None: if self.throw_iterb: evaluation.message(self.get_name(), 'iterb') return result = [] while index <= imax: evaluation.check_stopped() try: item = dynamic_scoping(expr.evaluate, {i.name: Number.from_mp(index)}, evaluation) result.append(item) except ContinueInterrupt: if self.allow_loopcontrol: pass else: raise except BreakInterrupt: if self.allow_loopcontrol: break else: raise index = add(index, di) return self.get_result(result)
def apply_iter(self, expr, i, imin, imax, di, evaluation): '%(name)s[expr_, {i_Symbol, imin_, imax_, di_}]' if di.get_int_value() == 1 and isinstance(self, SageFunction): whole_expr = Expression(self.get_name(), expr, Expression('List', i, imin, imax)) sympy_expr = whole_expr.to_sympy() # apply Together to produce results similar to Mathematica result = sympy.together(sympy_expr) result = from_sympy(result) result = cancel(result) if not result.same(whole_expr): return result index = imin.evaluate(evaluation).get_real_value() imax = imax.evaluate(evaluation).get_real_value() di = di.evaluate(evaluation).get_real_value() if index is None or imax is None or di is None: if self.throw_iterb: evaluation.message(self.get_name(), 'iterb') return result = [] while index <= imax: evaluation.check_stopped() try: item = dynamic_scoping(expr.evaluate, {i.name: Number.from_mp(index)}, evaluation) result.append(item) except ContinueInterrupt: if self.allow_loopcontrol: pass else: raise except BreakInterrupt: if self.allow_loopcontrol: break else: raise index = add(index, di) return self.get_result(result)
def apply(self, items, evaluation): 'Plus[items___]' items = items.numerify(evaluation).get_sequence() leaves = [] last_item = last_count = None prec = min_prec(*items) is_real = all([not isinstance(i, Complex) for i in items]) if prec is None: number = (sympy.Integer(0), sympy.Integer(0)) else: number = (sympy.Float('0.0', dps(prec)), sympy.Float('0.0', dps(prec))) 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): # TODO: Optimise this for the case of adding many real numbers if isinstance(item, Complex): sym_real, sym_imag = item.real.to_sympy( ), item.imag.to_sympy() else: sym_real, sym_imag = item.to_sympy(), sympy.Integer(0) if prec is not None: sym_real = sym_real.n(dps(prec)) sym_imag = sym_imag.n(dps(prec)) number = (number[0] + sym_real, number[1] + sym_imag) else: count = rest = None if item.has_form('Times', None): for leaf in item.leaves: if isinstance(leaf, Number): count = leaf.to_sympy() 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 = sympy.Integer(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 prec is not None or number != (0, 0): if number[1].is_zero and is_real: leaves.insert(0, Number.from_mp(number[0], prec)) elif number[1].is_zero and number[1].is_Integer and prec is None: leaves.insert(0, Number.from_mp(number[0], prec)) else: leaves.insert(0, Complex(number[0], number[1], prec)) 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() leaves = [] last_item = last_count = None prec = min_prec(*items) is_real = all([not isinstance(i, Complex) for i in items]) if prec is None: number = (sympy.Integer(0), sympy.Integer(0)) else: number = (sympy.Float("0.0", dps(prec)), sympy.Float("0.0", dps(prec))) 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): # TODO: Optimise this for the case of adding many real numbers if isinstance(item, Complex): sym_real, sym_imag = item.real.to_sympy(), item.imag.to_sympy() else: sym_real, sym_imag = item.to_sympy(), sympy.Integer(0) if prec is not None: sym_real = sym_real.n(dps(prec)) sym_imag = sym_imag.n(dps(prec)) number = (number[0] + sym_real, number[1] + sym_imag) else: count = rest = None if item.has_form("Times", None): for leaf in item.leaves: if isinstance(leaf, Number): count = leaf.to_sympy() 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 = sympy.Integer(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 prec is not None or number != (0, 0): if number[1].is_zero and is_real: leaves.insert(0, Number.from_mp(number[0], prec)) elif number[1].is_zero and number[1].is_Integer and prec is None: leaves.insert(0, Number.from_mp(number[0], prec)) else: leaves.insert(0, Complex(number[0], number[1], prec)) if not leaves: return Integer(0) elif len(leaves) == 1: return leaves[0] else: leaves.sort() return Expression("Plus", *leaves)