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)
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)
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)