def Nat_mult_antichain_Max(m): """ Returns the set of elements of Nat so that their product is at most m: Max { (a, b) | a * b <= m } """ # top -> [(top, top)] P = Nat() P.belongs(m) top = P.get_top() if is_top(P, m): s = set([(top, top)]) return s assert isinstance(m, int) if m < 1: return set([(0, 0)]) s = set() for o1 in range(1, m + 1): assert o1 >= 1 # We want the minimum x such that o1 * x >= f # x >= f / o1 # x* = ceil(f / o1) x = int(np.floor(m * 1.0 / o1)) assert x * o1 <= m # feasible assert (x + 1) * o1 > m, (x + 1, o1, m) # and minimum s.add((o1, x)) return s
def Nat_mult_antichain_Min(m): """ Returns the Minimal set of elements of Nat so that their product is at least m: Min { (a, b) | a * b >= m } """ # (top, 1) or (1, top) P = Nat() P.belongs(m) top = P.get_top() if is_top(P, m): s = set([(top, 1), (1, top)]) # XXX: return s assert isinstance(m, int) if m == 0: # any (r1,r2) is such that r1*r2 >= 0 return set([(0, 0)]) s = set() for o1 in range(1, m + 1): assert o1 >= 1 # We want the minimum x such that o1 * x >= f # x >= f / o1 # x* = ceil(f / o1) x = int(np.ceil(m * 1.0 / o1)) assert x * o1 >= m assert (x - 1) * o1 < m assert x >= 1 s.add((o1, x)) return s
def __init__(self, value): N = Nat() N.belongs(value) amap = MultValueNatMap(value) # if value = Top: # f |-> f * Top # if is_top(N, value): amap_dual = MultValueNatDPHelper2Map() elif N.equal(0, value): # r |-> Top amap_dual = ConstantPosetMap(N, N, N.get_top()) else: # f * c <= r # f <= r / c # r |-> floor(r/c) amap_dual = MultValueNatDPhelper(value) WrapAMap.__init__(self, amap, amap_dual)
def __init__(self, value): N = Nat() N.belongs(value) amap = MultValueNatMap(value) # if value = Top: # f |-> f * Top # if is_top(N, value): amap_dual = MultValueNatDPHelper2Map() elif N.equal(0, value): # r |-> Top amap_dual = ConstantPosetMap(N, N, N.get_top()) else: # f * c <= r # f <= r / c # r |-> floor(r/c) amap_dual = MultValueNatDPhelper(value) WrapAMap.__init__(self, amap, amap_dual)
def check_join_meet_1(): # test meet # ⟨f₁, f₂⟩ ⟼ { min(f₁, f₂) } # r ⟼ { ⟨r, ⊤⟩, ⟨⊤, r⟩ } N = Nat() dp = MeetNDP(2, N) lf = dp.solve_r(5) #print('lf: {}'.format(lf)) assert_belongs(lf, (10, 5)) assert_belongs(lf, (5, 10)) assert_does_not_belong(lf, (10, 10)) Rtop = N.get_top() lf2 = dp.solve_r(Rtop) #print('lf2: {}'.format(lf2)) assert_belongs(lf2, (10, 10)) assert_belongs(lf2, (Rtop, Rtop)) lf3 = dp.solve_r(0) #print('lf3: {}'.format(lf3)) assert_belongs(lf3, (0, 0)) assert_does_not_belong(lf3, (0, 1)) assert_does_not_belong(lf3, (1, 0)) # Join ("max") of n variables. # ⟨f₁, …, fₙ⟩ ⟼ { max(f₁, …, fₙ⟩ } # r ⟼ ⟨r, …, r⟩ dp = JoinNDP(3, N) ur = dp.solve((10, 3, 3)) assert_belongs(ur, 10) assert_does_not_belong(ur, 9) lf = dp.solve_r(10) assert_does_not_belong(lf, (0, 11, 0)) assert_belongs(lf, (0, 10, 0)) assert_belongs(lf, (0, 9, 0))
def MinusValueNatDP2(): N = Nat() v = N.get_top() return MinusValueNatDP(v)
def MinusValueNatDP2(): N = Nat() v = N.get_top() return MinusValueNatDP(v)