def generate_transitive_assumptions(self):
        trans_assumpts = list()
        for symbol in self.symbol_assumptions:
            assumpt_dict = self.symbol_assumptions[symbol]
            if '>' in assumpt_dict:
                for assump1 in assumpt_dict['>']:
                    if '<' in assumpt_dict:
                        for assump2 in assumpt_dict['<']:
                            trans_assumpts.append(assumption(assump1, '<', assump2))
                    if '<=' in assumpt_dict:
                        for assump2 in assumpt_dict['<=']:
                            trans_assumpts.append(assumption(assump1, '<=', assump2))
            if '>=' in assumpt_dict:
                for assump1 in assumpt_dict['>=']:
                    if '<' in assumpt_dict:
                        for assump2 in assumpt_dict['<']:
                            trans_assumpts.append(assumption(assump1, '<=', assump2))
                    if '<=' in assumpt_dict:
                        for assump2 in assumpt_dict['<=']:
                            trans_assumpts.append(assumption(assump1, '<=', assump2))
            if '==' in assumpt_dict:
                for assump1 in assumpt_dict['==']:
                    for assump2 in assumpt_dict['==']:
                        if assump1 != assump2:
                            trans_assumpts.append(assumption(assump1, '==', assump2))

        dedup(trans_assumpts)
        return trans_assumpts
def assumption_not_equal_ratio_to_linear(assumpt, pot):
    variations = variations_for_pot(pot)

    num_mults = list()

    assumpt.exp = assumpt.exp.simplify()
    (num, denom) = assumpt.exp.as_numer_denom()

    if denom.is_number and denom.is_zero:
        return variations.get_linear_assumption_list()

    if not num.is_number:
        num_dict = num.combsimp().as_powers_dict()
        for m in num_dict:
            if not m.is_number:
                num_mults.append(m)
            elif m.is_zero:
                return variations.get_linear_assumption_list()
    else:
        if num.is_zero:
            return variations.get_linear_assumption_list()
        else:
            variations.add_assumption(assumption(Number(0), '==', Number(0)))
            return variations.get_linear_assumption_list()

    variations.new_variation()
    for m in num_mults:
        if not variations.add_assumption(assumption(m, '!=', Number(0))):
            break

    return variations.get_linear_assumption_list()
Esempio n. 3
0
    def get_next_tables_multi(self):
        doubt_assumpts = list()

        for (j, targ) in enumerate(self.target):
            assumpt = assumption(targ, '<', Number(0))
            res = self.test_assumtions([assumpt, ])
            if res == result.not_possible: continue
            doubt_assumpts.append((j, targ))

        for j, targ in doubt_assumpts:
            if j in self.basis: continue
            assumpts = list()
            for i, a in doubt_assumpts:
                if i < j:
                    assumpts.append(assumption(targ, '<', a ) )
                elif i == j:
                    assumpts.append(assumption(targ, '<', Number(0) ) )
                else:
                    assumpts.append(assumption(targ, '<=', a ) )

            yield( (j, assumpts) )

        if len(doubt_assumpts) > 0:
            assumpts = list()
            for i, a in doubt_assumpts:
                assumpts.append(assumption(a, '>=', Number(0) ) )

            yield ( (-1, assumpts) )
Esempio n. 4
0
 def get_assumptions(self, symbol):
     ret = list()
     if self.right_value != float("inf"):
         if self.right_strong:
             ret.append(assumption(symbol, "<", Number(self.right_value)))
         else:
             ret.append(assumption(symbol, "<=", Number(self.right_value)))
     if self.left_value != float("-inf"):
         if self.left_strong:
             ret.append(assumption(symbol, ">", Number(self.left_value)))
         else:
             ret.append(assumption(symbol, ">=", Number(self.left_value)))
     return ret
def prepare_decomposed_assumptions(assumpt, assumpt_deps):
    variants = decomposed_assumption()
    for symbol in assumpt_deps:
        res = try_assumpt_linear(assumpt, symbol)
        if not res: continue
        a, b = res

        sign = assumpt.sign

        variants.new_variant_group()

        if sign == '==':
            variants.new_variant()
            variants.add_assumption( assumption(a, '!=', Number(0)) )
            variants.add_symbol_assumption( (symbol, '==', Number(-1)*b/a ) )

            variants.new_variant()
            variants.add_assumption( assumption(a, '==', Number(0)) )
            variants.add_assumption( assumption(b, '==', Number(0)) )

        elif sign == '!=':
            variants.new_variant()
            variants.add_assumption( assumption(a, '!=', Number(0)) )
            variants.add_symbol_assumption( (symbol, '!=', Number(-1)*b/a) )

            variants.new_variant()
            variants.add_assumption( assumption(a, '==', Number(0)) )
            variants.add_assumption( assumption(b, '!=', Number(0)) )

        else:
            if sign == '>': neg_sign = '<'
            elif sign == '>=': neg_sign = '<='
            elif sign == '<': neg_sign = '>'
            else: neg_sign = '>='

            variants.new_variant()
            variants.add_assumption( assumption(a, '>', Number(0)) )
            variants.add_symbol_assumption( (symbol, sign, Number(-1)*b/a) )

            variants.new_variant()
            variants.add_assumption( assumption(a, '<', Number(0)) )
            variants.add_symbol_assumption( (symbol, neg_sign, Number(-1)*b/a) )

            variants.new_variant()
            variants.add_assumption( assumption(a, '==', Number(0)) )
            variants.add_assumption( assumption(b, sign, Number(0)) )

    variants.new_variant_group()
    return variants
Esempio n. 6
0
    def get_next_tables(self):
        doubt_assumpts = list()

        for (j, targ) in enumerate(self.target):
            assumpt = assumption(targ, '<', Number(0))
            res = self.test_assumtions([assumpt, ])
            if res == result.not_possible: continue
            doubt_assumpts.append((j, targ))

        for j, targ in doubt_assumpts:
            if j in self.basis: continue
            assumpts = list()
            for i, a in doubt_assumpts:
                if i < j:
                    assumpts.append(assumption(targ, '<', a ) )
                elif i == j:
                    assumpts.append(assumption(targ, '<', Number(0) ) )
                else:
                    assumpts.append(assumption(targ, '<=', a ) )

            res = self.test_assumtions(assumpts)
            if res == result.not_possible: continue
            for table in self.get_next_tables_by_row(j, assumpts):
                yield table

        if len(doubt_assumpts) > 0:
            assumpts = list()
            for i, a in doubt_assumpts:
                assumpts.append(assumption(a, '>=', Number(0) ) )

            next = simplex_table()
            next.amount_of_vars = self.amount_of_vars
            next.amount_of_equations = self.amount_of_equations
            next.basis = self.basis[:]
            next.free = self.free[:]
            next.limits = deepcopy(self.limits)
            next.target = self.target[:]
            next.target_free = self.target_free

            res, pot = self.test_and_add_assumptions(assumpts)
            if res != result.not_possible:
                next.pots = pot
                next.path = self.path + [(-1,-1,-1)]
                yield next
Esempio n. 7
0
    def get_next_tables_multi_by_column_and_row(self, assumpts, j, i):
        #if i in self.basis: return None
        assumps2 = list()
        assumps2.append(assumption(self.limits[i][j], '>', Number(0)))

        or_assumps = self.prepare_or_assumptions(i, j)

        total_assumps = list()
        for a in or_assumps:
            total_assumps.append(assumpts + assumps2 + a)

        #res, pot, orass = self.test_and_add_or_assumptions(total_assumps)
        res, pot = self.test_and_add_or_assumptions(total_assumps)
        if res == result.not_possible: return None
        ret = self.get_next_table(i, j, pot)
        return ret
Esempio n. 8
0
    def set(self, limits, free, target_free, target, basis, assumptions):

        er = self.check(limits, free, target_free, target, basis, assumptions)
        if not (isinstance(er, bool) and er == True):
            return er

        self.root_table = simplex.simplex_table()
        self.root_table.limits = limits
        self.root_table.free = free
        self.root_table.target_free = target_free
        self.root_table.target = target
        self.root_table.basis = basis
        self.root_table.amount_of_vars = len(target)
        self.root_table.amount_of_equations = len(free)
        for i in free:
            assumptions.append(assumption(i, '>', parse_expr('0')))
        res, pot = self.root_table.test_and_add_assumptions(assumptions)
        self.root_table.pots = pot
Esempio n. 9
0
    def get_next_tables_by_row(self, j, assumps):
        for i in range(self.amount_of_equations):
            #if j in self.basis: continue
            assumps2 = list()
            assumps2.append(assumption(self.limits[i][j], '>', Number(0)))

            or_assumps = self.prepare_or_assumptions(i, j)

            total_assumps = list()
            for a in or_assumps:
                total_assumps.append(assumps + assumps2 + a)

            #res, pot, orass = self.test_and_add_or_assumptions(total_assumps)
            res, pot = self.test_and_add_or_assumptions(total_assumps)
            if res == result.not_possible: continue
            ret = self.get_next_table(i, j, pot)
            #ret.debug_assumps = orass
            yield ret
Esempio n. 10
0
    def set_from_yaml(self, filename):
        try:
            cfg = yaml.load(open(filename))
        except:
            raise 'cannot load or parse: ' + filename

        if 'matrix' not in cfg:
            raise('no matrix in file: ' + filename)

        limits = []
        for row in cfg['matrix']:
            temp = []
            for column in row:
                temp.append(parse_expr(str(column)))
            limits.append(temp)

        if 'free' not in cfg:
            raise('no free in file: ' + filename)

        free = []
        for e in cfg['free']:
            free.append(parse_expr(str(e)))

        if 'target' not in cfg or len(cfg['target']) < 2:
            raise('no valid target in file: ' + filename)

        target_free = parse_expr(str(cfg['target'][0]))

        target = []
        for e in cfg['target'][1:]:
            target.append(parse_expr(str(e)))

        if 'basis' not in cfg:
            raise('no basis in file: ' + filename)

        basis = cfg['basis']

        assumptions = []
        if 'assumptions' in cfg:
            for a, b, c in cfg['assumptions']:
                assumptions.append(assumption(parse_expr(str(a)), b, parse_expr(str(c))))

        self.set(limits, free, target_free, target, basis, assumptions)
Esempio n. 11
0
    print(decompose(assumption(linear(4)*linear('x')*linear('x')*linear('x') , '<', linear(2))))
    print(decompose(assumption(linear(4)*linear('x')*linear('x')*linear('x') , '<', linear(-2))))"""
    a = Number(-1)
    b = Number(20)
    c = Number(11)
    d = Number(-100)
    x = Symbol("x")
    """print(decompose(assumption(a*x*x*x + b*x*x + c*x + d, '>', linear(0.))))
    print(decompose(assumption(a*x*x*x + b*x*x + c*x + d, '>=', linear(0.))))
    print(decompose(assumption(a*x*x*x + b*x*x + c*x + d, '<', linear(0.))))
    print(decompose(assumption(a*x*x*x + b*x*x + c*x + d, '<=', linear(0.))))"""

    a = Number(1)
    b = Number(2000)
    c = Number(1999)
    print(decompose(assumption(a * x * x + b * x + c, ">", Number(0.0))))
    print(decompose(assumption(a * x * x + b * x + c, ">=", Number(0.0))))
    print(decompose(assumption(a * x * x + b * x + c, "<", Number(0.0))))
    print(decompose(assumption(a * x * x + b * x + c, "<=", Number(0.0))))

    a = Number(-1)
    b = Number(-1999)
    c = Number(2000)
    print(decompose(assumption(a * x * x + b * x + c, ">", Number(0.0))))
    print(decompose(assumption(a * x * x + b * x + c, ">=", Number(0.0))))
    print(decompose(assumption(a * x * x + b * x + c, "<", Number(0.0))))
    print(decompose(assumption(a * x * x + b * x + c, "<=", Number(0.0))))

    a = Number(1)
    b = Number(0)
    c = Number(0)
def assumption_signed_ratio_to_linear(assumpt, pot):
    variations = variations_for_pot(pot)

    num_possible_neg_mults = list()
    num_possible_zero_mults = list()
    denom_mults = list()
    denom_possible_zero = list()

    assumpt.exp = assumpt.exp.simplify()
    (num, denom) = assumpt.exp.as_numer_denom()

    if num.is_number and denom.is_number:
        if denom.is_zero:
            return variations.get_linear_assumption_list()
        if num.is_zero:
            if assumpt.sign == '>': return variations.get_linear_assumption_list()
            else: return variations.add_assumption(assumption(Number(0), '==', Number(0)))
        sign = 1
        if num.is_negative: sign *= -1
        if denom.is_negative: sign *= -1
        variations.add_assumption(assumption(Number(sign), assumpt.sign, Number(0)))
        return variations.get_linear_assumption_list()

    sign = 1
    if not num.is_number:
        coef, other = num.combsimp().as_coeff_mul()
        if coef.is_negative: sign *= -1
        for o in other:
            ods = o.as_powers_dict()
            for od in ods:
                if ods[od].is_even:
                    num_possible_zero_mults.append(od)
                else:
                    num_possible_neg_mults.append(od)
    elif num.is_negative: sign *= -1

    if not denom.is_number:
        coef, other = denom.combsimp().as_coeff_mul()
        if coef.is_negative: sign *= -1
        for o in other:
            ods = o.as_powers_dict()
            for od in ods:
                if ods[od].is_even:
                    denom_possible_zero.append(od)
                else:
                    denom_mults.append(od)
    elif denom.is_negative: sign *= -1

    if assumpt.sign == '>': strong_sign = True
    else: strong_sign = False

    global_assumpts = list()
    for dpz in denom_possible_zero + denom_mults:
        global_assumpts.append(assumption(dpz, '!=', Number(0)))

    if strong_sign == False and len(num_possible_zero_mults) > 0:
        for npzm in num_possible_zero_mults:
            if not variations.add_assumption(assumption(npzm, '==', Number(0))):
                continue
            if not variations.add_assumptions(global_assumpts):
                continue
            variations.new_variation()

    s = len(num_possible_neg_mults) + len(denom_mults)
    if s == 0: return variations.get_linear_assumption_list()

    if sign > 0: all_signs = get_signs(s, 0)
    else: all_signs = get_signs(s, 1)

    for signs in all_signs:
        num_signs = signs[:len(num_possible_neg_mults)]
        denom_signs = signs[len(num_possible_neg_mults):]

        bad_variation = False
        for (m, s) in zip(num_possible_neg_mults, num_signs):
            if not strong_sign:
                if s == '>': s = '>='
                else: s = '<='
            if not variations.add_assumption(assumption(m, s, Number(0))):
                bad_variation = True
                break
        if bad_variation: continue

        for (m, s) in zip(denom_mults, denom_signs):
            if not variations.add_assumption(assumption(m, s, Number(0))):
                bad_variation = True
                break
        if bad_variation: continue

        if not variations.add_assumptions(global_assumpts):
            continue

        variations.new_variation()

    return variations.get_linear_assumption_list()
Esempio n. 13
0
    def prepare_or_assumptions(self, i, j):
        non_alternate = list()
        alternate1 = list()
        alternate2 = list()

        for e in range(i):
            assumpts1 = [assumption(self.limits[e][j], '>', Number(0)),
                  assumption(self.free[i] / self.limits[i][j] ,'<=', self.free[e] / self.limits[e][j]) ]
            possib1, assumpts1 = _filter_possible(assumpts1)

            assumpts2 = [ assumption(self.limits[e][j], '<=', Number(0)) ]
            possib2, assumpts2 = _filter_possible(assumpts2)

            if possib1 == result.correct:
                if possib2 != result.not_possible:
                    raise "WTF?"
                else:
                    continue
            elif possib2 == result.correct:
                if possib1 != result.not_possible:
                    raise "WTF?"
                else:
                    continue
            elif possib1 == result.possible and possib2 == result.possible:
                alternate1.append( assumpts1 )
                alternate2.append( assumpts2 )
            elif possib1 == result.possible:
                non_alternate.extend( assumpts1 )
            elif possib2 == result.possible:
                non_alternate.extend( assumpts2 )
            elif possib1 == result.not_possible and possib2 == result.not_possible:
                return list()
            else:
                raise "WTF?"


        for e in range(i + 1, self.amount_of_equations):
            assumpts1 = [assumption(self.limits[e][j], '>', Number(0)),
                  assumption(self.free[i] / self.limits[i][j] ,'<', self.free[e] / self.limits[e][j]) ]
            possib1, assumpts1 = _filter_possible(assumpts1)

            assumpts2 = [ assumption(self.limits[e][j], '<=', Number(0)) ]
            possib2, assumpts2 = _filter_possible(assumpts2)

            if possib1 == result.correct:
                if possib2 != result.not_possible:
                    raise "WTF?"
                else:
                    continue
            elif possib2 == result.correct:
                if possib1 != result.not_possible:
                    raise "WTF?"
                else:
                    continue
            elif possib1 == result.possible and possib2 == result.possible:
                alternate1.append( assumpts1 )
                alternate2.append( assumpts2 )
            elif possib1 == result.possible:
                non_alternate.extend( assumpts1 )
            elif possib2 == result.possible:
                non_alternate.extend( assumpts2 )
            elif possib1 == result.not_possible and possib2 == result.not_possible:
                return list()
            else:
                raise "WTF?"


        or_assumps = list()
        size = len(alternate1)

        if size == 0:
            or_assumps.append(non_alternate)
            return or_assumps

        s = "{0:0>" + str(size) + "b}"
        for i in range(0, 2**size):
            ret = list(s.format(i))
            current = list()
            for i, r in enumerate(ret):
                if r == '0': current += deepcopy(alternate1[i])
                else: current += deepcopy(alternate2[i])

            current.extend(deepcopy(non_alternate))
            or_assumps.append(current)

        #or_assumps = [deepcopy(non_alternate) + l for l in _or_assumps]

        return or_assumps