예제 #1
0
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
예제 #2
0
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
예제 #3
0
파일: dp_multvalue.py 프로젝트: rusi/mcdp
    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)
예제 #4
0
 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)
예제 #5
0
파일: corner_case.py 프로젝트: rusi/mcdp
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))
예제 #6
0
def MinusValueNatDP2():
    N = Nat()
    v = N.get_top()
    return MinusValueNatDP(v)
예제 #7
0
파일: primitivedps.py 프로젝트: rusi/mcdp
def MinusValueNatDP2():
    N = Nat()
    v = N.get_top()
    return MinusValueNatDP(v)