Esempio n. 1
0
class Type_B_Interval_III(object):
    def __init__(self):
        self.set_str = ""
        self.interval = FiniteSet()
        self.val1 = None
        self.val2 = None
        self.left_border = True
        self.right_border = True
        self.interval_rep = 0
        self.val_lst = []
        
    def generate_interval(self, A, OP):
        if OP == '\setminus':
            if len(A.interval) == 1:
                self.interval_rep = 1
                self.val1 = choice([A.val_lst[0], -oo, oo])
                if self.val1 == -oo or self.val1 == oo:
                    self.val2 = A.val_lst[0]
                else:
                    self.val2 = choice([-oo, oo])
            else:
                self.interval_rep = 0
                self.val1 = choice(A.val_lst)
                self.val2 = self.val1
            self.left_border = choice([True, False])
            self.left_border = choice([True, False])
                
        elif OP == '\cap':
            self.interval_rep = 0
            if len(A.val_lst) == 1:
                if randint(0, 1) == 0:
                    self.val1 = randint(-25, A.val_lst[0])
                    self.val2 = A.val_lst[0] + randint(0, 2)
                else:
                    self.val1 = A.val_lst[-1]-randint(0, 2)
                    self.val2 = randint(A.val_lst[-1], 25)
            else:
                if randint(0, 1) == 0:
                    self.val1 = randint(-25, A.val_lst[1])
                    self.val2 = A.val_lst[1] + randint(0, 2)
                else:
                    self.val1 = A.val_lst[-1] - randint(0, 2)
                    self.val2 = randint(A.val_lst[-1], 25)
        else:
            self.interval_rep = 2
            tmp_lst = [-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]
            tmp_lst.extend(A.val_lst)
            for i in range(0, randint(1, 5)):
                self.val_lst.append(choice(tmp_lst))
        
        if self.interval_rep == 0:
            self.interval = Interval(self.val1, self.val2, self.left_border, self.right_border)
            self.set_str += "\{r \ | \ r \in \mathbb{R} \wedge \ "+str(self.val1)
            self.set_str += '<' if self.left_border == True else '\leq'
            self.set_str += ' \ r'
            self.set_str += '<' if self.right_border == True else '\leq'
            self.set_str += str(self.val2)
            self.set_str += '\}'
            if isinstance(self.interval, EmptySet):
                self.interval = FiniteSet(self.val1)
                self.set_str = '\{'+str(self.val1)+'\}'
        elif self.interval_rep == 1:
            self.interval = Interval(self.val1, self.val2, self.left_border, self.right_border)
            self.set_str +=  "\{r \ | \ r \in \mathbb{R} \wedge \ r"
            if self.val1 == -oo or self.val1 == oo:
                if self.val1 == -oo:
                    self.set_str += '<' if self.left_border == True else '\leq'
                else: 
                    self.set_str += '>' if self.left_border == True else '\geq'
                #if self.val1 == oo:
                #    self.set_str += '<' if self.left_border == True else '\leq'
                #else: 
                #    self.set_str += '>' if self.left_border == True else '\geq'
                self.set_str += str(self.val2)+'\}'
            else:
                if self.val2 == -oo:
                    self.set_str += '<' if self.left_border == True else '\leq'
                else: 
                    self.set_str += '>' if self.left_border == True else '\geq'
                #if self.val2 == oo:
                #    self.set_str += '<' if self.left_border == True else '\leq'
                #else:
                #    self.set_str += '>' if self.left_border == True else '\geq'
                self.set_str += str(self.val1)+'\}'

        else:
            for i in range(len(self.val_lst)):
                self.interval = self.interval.union(FiniteSet(self.val_lst[i]))
            self.set_str = '\{'+str(self.interval)+'\}'
Esempio n. 2
0
def inequation_to_interval(inequation):
    """
    Devuelve un intervalo a partir de una inequación
    Parte del supuesto de que de un lado de la inecuación
    se encuentra "x", sin operaciones.
    """

    args = inequation.args

    less = [LessThan, StrictLessThan]
    greater = [GreaterThan, StrictGreaterThan]

    if inequation.__class__ in greater + less:  # [StrictGreaterThan, GreaterThan, StrictLessThan, LessThan]
        inequation = _adapt(inequation)

        args = inequation.args
        a = args[0]
        b = args[1]

        if inequation.__class__ in greater:
            if inequation.__class__ == StrictGreaterThan:
                # Ejemplo: x > b
                # Intervalo: (b, +oo)
                return Interval.open(b, oo)

            elif inequation.__class__ == GreaterThan:
                # Ejemplo: x >= b
                # Intervalo: [b, +oo)
                return Interval(b, oo)  # Cerrado por izquierda

        elif inequation.__class__ in less:
            if inequation.__class__ == StrictLessThan:
                # Ejemplo: x < b
                # Intervalo: (-oo, b)
                return Interval.open(-oo, b)

            elif inequation.__class__ == LessThan:
                # Ejemplo: x <= b
                # Intervalo: (-oo, b]
                return Interval(-oo, b)  # Cerrado por derecha

    elif inequation.__class__ == And:
        # El primer valor en args siempre es una inequación

        _args = []
        for arg in args:
            _args.append(_adapt(arg))

        args = _args

        d = {1: [], 2: []}

        for arg in args:
            # FIXME: Y si hay otro And o un Or ?
            if arg.__class__ in less:
                d[1].append(inequation_to_interval(arg))

            elif arg.__class__ in greater:
                d[2].append(inequation_to_interval(arg))

        if d[1]:
            __less = True
            _less = d[1][0]
            for _i in d[1][1:]:
                _less = Interval.union(_less, _i)

        else:
            __less = False
            _less = EmptySet()

        if d[2]:
            __greater = True
            _greater = d[2][0]
            for _i in d[2][1:]:
                _greater = Interval.union(_greater, _i)

        else:
            __greater = False
            _greater = EmptySet()

        if __greater and __less:
            return _less.intersect(_greater)

        elif __less and not __greater:
            return _less

        elif __greater and not __less:
            return _greater

    elif inequation.__class__ == Or:
        interval = inequation_to_interval(args[0])

        for arg in args[1:]:
            interval = Union(interval, inequation_to_interval(arg))

        return interval

    elif inequation.__class__ == BooleanTrue:
        # Por ejemplo: 4 > 2, todos los x pertenecientes
        # a los reales cumplen esta inecuación
        return REALS

    elif inequation.__class__ == BooleanFalse:
        # Por ejemplo: 2 > 4, ningún x perteneciente a los
        # reales cumple con esta inecuación
        return EmptySet()

    else:
        print inequation, inequation.__class__
Esempio n. 3
0
 def create_ui_set(self, X):
     result = None
     nums = []
     allowed = "-0123456789{},()[]o"
     if not all(c in allowed for c in X):
         return False
     if len(X) < 3 and X != '{}':
         return False
     if (X[0] == '(' or X[0] == '[') and  (X[-1] == ')' or X[-1] == ']'):
         nums = re.findall("[-\d]+", X)
         if '-' in nums:
             nums.remove('-')
         if len(nums) == 1:
             if '-oo' in X or 'oo' in X:
                 if '-oo' in X:
                     nums.append(nums[0])
                     nums[0] = -oo
                 elif 'oo' in X:
                     nums.append(oo)
                 else:
                     return False
         if len(nums) != 2:
             return False
         commata = re.findall(",", X)
         if len(commata) != 1:
             return False
         for i in range(len(X)):
             if X[i] == ',' and not (((X[i-1].isdigit() or X[i+1].isdigit()) or (X[i-1] == 'o' or X[i+1] == 'o'))): 
                 return False
         left = True if X[0] == '(' else False
         right = True if X[-1] == ')' else False
         if oo in nums or -oo in nums:
             if oo in nums:
                 result = Interval(int(nums[0]), oo, left, right)
                 return result
             else:
                 result = Interval(-oo, int(nums[1]), left, right)
                 return result
         else:
             if nums[0] <= nums[1]:
                 result = Interval(int(nums[0]), int(nums[1]), left, right)
                 return result
             else:
                 return False
         
     elif X[0] == '{' and X[-1] == '}':
         if len(X) == 2:
             return EmptySet()
         else:
             nums = re.findall("[-\d]+", X)
             if len(re.findall(",", X)) != len(nums)-1:
                 return False
             num_count = 0    
             for i in range(len(nums)):
                 if X[i] == ',' and not X.index(nums[num_count]) < i and X[i+1]  == ',':
                     return False
                 num_count += 1
             result = FiniteSet()
             for i in range(len(nums)):
                 result = result.union(FiniteSet(int(nums[i])))
             return result
     else:
         return False