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
Exemple #2
0
 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)
Exemple #3
0
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
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
 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)