示例#1
0
def calc_set_image_range(map_idx, map_set, array_range):
    image = []
    for a_range in array_range:
        new_range = list(a_range)
        for m_idx, m_range in zip(map_idx, map_set):
            symbol = symbolic.pystr_to_symbolic(m_idx)
            for i in range(3):
                if isinstance(m_range[i], SymExpr):
                    exact = m_range[i].expr
                    approx = m_range[i].approx
                else:
                    exact = m_range[i]
                    approx = overapproximate(m_range[i])
                if isinstance(new_range[i], SymExpr):
                    new_range[i] = SymExpr(
                        new_range[i].expr.subs([(symbol, exact)]),
                        new_range[i].approx.subs([(symbol, approx)]))
                elif issymbolic(new_range[i]):
                    new_range[i] = SymExpr(
                        new_range[i].subs([(symbol, exact)]),
                        new_range[i].subs([(symbol, approx)]))
                else:
                    new_range[i] = SymExpr(new_range[i], new_range[i])
        image.append(new_range)
    return subsets.Range(image)
示例#2
0
def calc_set_union(set_a, set_b):
    if isinstance(set_a, subsets.Indices) or isinstance(set_b, subsets.Indices):
        raise NotImplementedError('Set union with indices is not implemented.')
    if not (isinstance(set_a, subsets.Range) and isinstance(set_b, subsets.Range)):
        raise TypeError('Can only compute the union of ranges.')
    if len(set_a) != len(set_b):
        raise ValueError('Range dimensions do not match')
    union = []
    for range_a, range_b in zip(set_a, set_b):
        r_union = []
        for i in range(3):
            if isinstance(range_a[i], SymExpr):
                a_exact = range_a[i].expr
                a_approx = range_a[i].approx
            else:
                a_exact = range_a[i]
                a_approx = range_a[i]
            if isinstance(range_b[i], SymExpr):
                b_exact = range_b[i].expr
                b_approx = range_b[i].approx
            else:
                b_exact = range_b[i]
                b_approx = range_b[i]
            if i in {0, 2}:
                r_union.append(SymExpr(sympy.Min(a_exact, b_exact), sympy.Min(a_approx, b_approx)))
            else:
                r_union.append(SymExpr(sympy.Max(a_exact, b_exact), sympy.Max(a_approx, b_approx)))
        union.append(r_union)
        # union.append([
        #     sympy.Min(range_a[0], range_b[0]),
        #     sympy.Max(range_a[1], range_b[1]),
        #     sympy.Min(range_a[2], range_b[2]),
        # ])
    return subsets.Range(union)
示例#3
0
def calc_set_image_range(map_idx, map_set, array_range):
    image = []
    for a_range in array_range:
        new_range = list(a_range)
        for m_idx, m_range in zip(map_idx, map_set):
            symbol = symbolic.pystr_to_symbolic(m_idx)
            for i in range(3):
                if isinstance(m_range[i], SymExpr):
                    exact = m_range[i].expr
                    approx = m_range[i].approx
                else:
                    exact = m_range[i]
                    approx = overapproximate(m_range[i])
                if isinstance(new_range[i], SymExpr):
                    new_range[i] = SymExpr(
                        new_range[i].expr.subs([(symbol, exact)]),
                        new_range[i].approx.subs([(symbol, approx)]))
                elif issymbolic(new_range[i]):
                    new_range[i] = SymExpr(
                        new_range[i].subs([(symbol, exact)]),
                        new_range[i].subs([(symbol, approx)]))
                else:
                    new_range[i] = SymExpr(new_range[i], new_range[i])
            if isinstance(new_range[0], SymExpr):
                start = new_range[0].approx
            else:
                start = new_range[0]
            if isinstance(new_range[1], SymExpr):
                stop = new_range[1].approx
            else:
                stop = new_range[1]
            if isinstance(new_range[2], SymExpr):
                step = new_range[2].approx
            else:
                step = new_range[2]
            descending = (start > stop) == True
            posstep = (step > 0) == True
            if descending and posstep:
                new_range[0], new_range[1] = new_range[1], new_range[0]
        image.append(new_range)
    return subsets.Range(image)