예제 #1
0
 def __init__(self, c_value):
     """ Give a positive constant here """
     N = Nat()
     N.belongs(c_value)
     amap = MinusValueNatMap(c_value)
     amap_dual = PlusValueNatMap(c_value)
     WrapAMap.__init__(self, amap, amap_dual)
예제 #2
0
파일: dp_minus.py 프로젝트: rusi/mcdp
 def __init__(self, c_value):
     """ Give a positive constant here """
     N = Nat()
     N.belongs(c_value)
     amap = MinusValueNatMap(c_value)
     amap_dual = PlusValueNatMap(c_value)
     WrapAMap.__init__(self, amap, amap_dual)
예제 #3
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
예제 #4
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
예제 #5
0
파일: dp_multvalue.py 프로젝트: rusi/mcdp
    def __init__(self, value):
        N = Nat()
        N.belongs(value)

        amap = InvMultValueNatMap(value)
        amap_dual = InvMultDualValueNatMap(value)

        WrapAMap.__init__(self, amap, amap_dual)
예제 #6
0
 def __init__(self, value):
     N = Nat()
     N.belongs(value)
     
     amap = InvMultValueNatMap(value)
     amap_dual = InvMultDualValueNatMap(value)
         
     WrapAMap.__init__(self, amap, amap_dual)
예제 #7
0
파일: plus_value_map.py 프로젝트: rusi/mcdp
class PlusValueNatMap(Map):

    def __init__(self, value):
        self.value = value
        self.N = Nat()
        self.N.belongs(value)
        Map.__init__(self, dom=self.N, cod=self.N)

    def _call(self, x):
        return Nat_add(x, self.value) 

    def diagram_label(self):  
        return self.__str__()

    def repr_map(self, letter):
        return plusvaluemap_repr(letter, self.N, self.value)

    def __str__(self):
        return '+ %s' % self.N.format(self.value)
예제 #8
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)
예제 #9
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)