def test_constructor_full(self): eprint( ">> Continuum.__init__(self, min_value=None, max_value=None, min_included=None, max_included=None)" ) for i in range(self.__nb_unit_test): # Valid continuum #----------------- min = random.uniform(self.__min_value, self.__max_value) max = random.uniform(min, self.__max_value) min_included = random.choice([True, False]) max_included = random.choice([True, False]) c = Continuum(min, max, min_included, max_included) self.assertFalse(c.is_empty()) self.assertEqual(c.get_min_value(), min) self.assertEqual(c.get_max_value(), max) self.assertEqual(c.min_included(), min_included) self.assertEqual(c.max_included(), max_included) # Implicit emptyset #------------------- min = random.uniform(self.__min_value, self.__max_value) c = Continuum(min, min, False, False) self.assertTrue(c.is_empty()) self.assertEqual(c.get_min_value(), None) self.assertEqual(c.get_max_value(), None) self.assertEqual(c.min_included(), None) self.assertEqual(c.max_included(), None) # Invalid Continuum #-------------------- max = random.uniform(self.__min_value, min - 0.001) self.assertRaises(ValueError, Continuum, min, max, min_included, max_included) # Invalid number of arguments #------------------------------- self.assertRaises(ValueError, Continuum, min) self.assertRaises(ValueError, Continuum, min, max) self.assertRaises(ValueError, Continuum, min, max, min_included) self.assertRaises(ValueError, Continuum, min, max, min_included, max_included)
def test_to_string(self): eprint(">> Continuum.to_string(self)") for i in range(self.__nb_unit_test): c = Continuum() self.assertEqual(c.to_string(), u"\u2205") c = Continuum.random(self.__min_value, self.__max_value) if c.is_empty(): self.assertEqual(c.to_string(), u"\u2205") out = "" if c.min_included(): out += "[" else: out += "]" out += str(c.get_min_value()) + "," + str(c.get_max_value()) if c.max_included(): out += "]" else: out += "[" self.assertEqual(c.to_string(), out) self.assertEqual(c.__str__(), out) self.assertEqual(c.__repr__(), out)
def test_constructor_empty(self): eprint(">> Continuum.__init__(self)") for i in range(self.__nb_unit_test): c = Continuum() self.assertTrue(c.is_empty()) self.assertEqual(c.get_min_value(), None) self.assertEqual(c.get_max_value(), None) self.assertEqual(c.min_included(), None) self.assertEqual(c.max_included(), None)
def test_size(self): eprint(">> Continuum.size(self)") for i in range(self.__nb_unit_test): # empty set c = Continuum() self.assertEqual(c.size(), 0.0) # regular c = Continuum.random(self.__min_value, self.__max_value) if not c.is_empty(): self.assertEqual(c.size(), c.get_max_value() - c.get_min_value())
def test__eq__(self): eprint(">> Continuum.__eq__(self, continuum)") for i in range(self.__nb_unit_test): # emptyset c = Continuum() self.assertTrue(Continuum() == Continuum()) self.assertTrue(c == Continuum()) self.assertTrue(c == c) self.assertFalse(Continuum() != Continuum()) self.assertFalse(c != Continuum()) self.assertFalse(c != c) c = Continuum.random(self.__min_value, self.__max_value) self.assertTrue(c == c) self.assertFalse(c != c) self.assertEqual(c == Continuum(), c.is_empty()) c_ = Continuum.random(self.__min_value, self.__max_value) if c.is_empty() and c_.is_empty(): self.assertTrue(c == c_) self.assertTrue(c != c_) if c.is_empty() != c_.is_empty(): self.assertFalse(c == c_) self.assertTrue(c != c_) if c.get_min_value() != c_.get_min_value(): self.assertFalse(c == c_) self.assertTrue(c != c_) if c.get_max_value() != c_.get_max_value(): self.assertFalse(c == c_) self.assertTrue(c != c_) if c.min_included() != c_.min_included(): self.assertFalse(c == c_) self.assertTrue(c != c_) if c.max_included() != c_.max_included(): self.assertFalse(c == c_) self.assertTrue(c != c_) # exaustive modifications if not c.is_empty(): c_ = c.copy() value = random.uniform(1, 100) c_.set_lower_bound(c.get_min_value() - value, True) self.assertFalse(c == c_) self.assertTrue(c != c_) c_.set_lower_bound(c.get_min_value() - value, False) self.assertFalse(c == c_) self.assertTrue(c != c_) c_ = c.copy() c_.set_lower_bound(c.get_min_value(), not c.min_included()) self.assertFalse(c == c_) self.assertTrue(c != c_) c_ = c.copy() value = random.uniform(1, 100) c_.set_upper_bound(c.get_min_value() + value, True) self.assertFalse(c == c_) self.assertTrue(c != c_) c_.set_upper_bound(c.get_min_value() + value, False) self.assertFalse(c == c_) self.assertTrue(c != c_) c_ = c.copy() c_.set_upper_bound(c.get_max_value(), not c.max_included()) self.assertFalse(c == c_) self.assertTrue(c != c_) # different type self.assertFalse(c == "test") self.assertFalse(c == 0) self.assertFalse(c == True) self.assertFalse(c == [])
def test_includes(self): eprint(">> Continuum.includes(self, element)") for i in range(self.__nb_unit_test): # bad argument type c = Continuum.random(self.__min_value, self.__max_value) self.assertRaises(TypeError, c.includes, "test") # float argument #---------------- # empty set includes nothing c = Continuum() value = random.uniform(self.__min_value, self.__max_value) self.assertFalse(c.includes(value)) c = Continuum.random(self.__min_value, self.__max_value) # Before min value = c.get_min_value() while value == c.get_min_value(): value = random.uniform(c.get_min_value() - 100.0, c.get_min_value()) self.assertFalse(c.includes(value)) # on min bound self.assertEqual(c.includes(c.get_min_value()), c.min_included()) # Inside value = c.get_min_value() while value == c.get_min_value() or value == c.get_max_value(): value = random.uniform(c.get_min_value(), c.get_max_value()) self.assertTrue(c.includes(value)) # on max bound self.assertEqual(c.includes(c.get_max_value()), c.max_included()) # after max bound value = c.get_max_value() while value == c.get_max_value(): value = random.uniform(c.get_max_value(), c.get_max_value() + 100.0) self.assertFalse(c.includes(value)) # int argument #-------------- # empty set includes nothing c = Continuum() value = random.randint(int(self.__min_value), int(self.__max_value)) self.assertFalse(c.includes(value)) c = Continuum.random(self.__min_value, self.__max_value) while int(c.get_max_value()) - int(c.get_min_value()) <= 1: min = random.uniform(self.__min_value, self.__max_value) max = random.uniform(min, self.__max_value) c = Continuum.random(min, max) #eprint(c.to_string()) # Before min value = random.randint(int(c.get_min_value() - 100), int(c.get_min_value()) - 1) self.assertFalse(c.includes(value)) # on min bound self.assertEqual(c.includes(c.get_min_value()), c.min_included()) # Inside value = random.randint( int(c.get_min_value()) + 1, int(c.get_max_value()) - 1) #eprint(value) self.assertTrue(c.includes(value)) # on max bound self.assertEqual(c.includes(c.get_max_value()), c.max_included()) # after max bound value = random.randint( int(c.get_max_value()) + 1, int(c.get_max_value() + 100)) self.assertFalse(c.includes(value)) # continuum argument #-------------------- # 0) c is empty set c = Continuum() c_ = Continuum() self.assertTrue(c.includes(c_)) # empty set VS empty set c_ = Continuum.random(self.__min_value, self.__max_value) while c_.is_empty(): c_ = Continuum.random(self.__min_value, self.__max_value) self.assertFalse(c.includes(c_)) # empty set VS non empty # 1) c is non empty c = Continuum.random(self.__min_value, self.__max_value) self.assertTrue(c.includes(Continuum())) # non empty VS empty set self.assertTrue(c.includes(c)) # includes itself # 1.1) Lower bound over c_ = Continuum.random(c.get_min_value(), self.__max_value) while c_.is_empty(): c_ = Continuum.random(c.get_min_value(), self.__max_value) value = c.get_min_value() while value == c.get_min_value(): value = random.uniform(c.get_min_value() - 100, c.get_min_value()) c_.set_lower_bound(value, random.choice([True, False])) self.assertFalse(c.includes(c_)) # 1.2) on min bound c_ = Continuum.random(c.get_min_value(), self.__max_value) while c_.is_empty(): c_ = Continuum.random(c.get_min_value(), self.__max_value) c_.set_lower_bound(c.get_min_value(), random.choice([True, False])) if not c.min_included() and c_.min_included(): # one value over self.assertFalse(c.includes(c_)) # 1.3) upper bound over c_ = Continuum.random(self.__min_value, c.get_max_value()) while c_.is_empty(): c_ = Continuum.random(self.__min_value, c.get_max_value()) value = c.get_max_value() while value == c.get_max_value(): value = random.uniform(c.get_max_value(), c.get_max_value() + 100) c_.set_upper_bound(value, random.choice([True, False])) self.assertFalse(c.includes(c_)) # 1.4) on upper bound c_ = Continuum.random(self.__min_value, c.get_max_value()) while c_.is_empty(): c_ = Continuum.random(self.__min_value, c.get_max_value()) c_.set_upper_bound(c.get_max_value(), random.choice([True, False])) if not c.max_included() and c_.max_included(): # one value over self.assertFalse(c.includes(c_)) # 1.5) inside min = c.get_min_value() while min == c.get_min_value(): min = random.uniform(c.get_min_value(), c.get_max_value()) max = c.get_max_value() while max == c.get_max_value(): max = random.uniform(min, c.get_max_value()) c_ = Continuum(min, max, random.choice([True, False]), random.choice([True, False])) self.assertTrue(c.includes(c_)) self.assertFalse(c_.includes(c))
def random(variables, domains, rule_min_size, rule_max_size, epsilon, delay=1): """ Generate a epsilon-complete ContinuumLogicProgram with a random dynamics. For each variable of the system, each possible epsilon state of the system is matched by at least one rule. Args: variables: list of String variables of the represented system domains: list of Continuum domain of values that each variable can take rule_min_size: int minimal number of conditions in each rule rule_max_size: int maximal number of conditions in each rule epsilon: float in ]0,1] precision of the completness of the program delay: int maximal delay of the conditions of each rule Returns: ContinuumLogicProgram an epsilon-complete CLP with a random dynamics """ #eprint("Start random CLP generation: var ", len(variables), " delay: ", delay) extended_variables = variables.copy() extended_domains = domains.copy() # Delayed logic program: extend local herbrand base if delay > 1: for d in range(1,delay): extended_variables += [var+"_"+str(d) for var in variables] extended_domains += domains rules = [] states = ContinuumLogicProgram.states(extended_domains, epsilon) # aggregated reversed time serie of size delay for s in states: #eprint(s) for var in range(len(variables)): matching = False for r in rules: # check if matched if r.get_head_variable() == var and r.matches(s): matching = True break if not matching: # need new rule val = Continuum() while val.is_empty(): # Enumerate each possible value min = domains[var].get_min_value() max = domains[var].get_max_value() step = epsilon * (max - min) values = [min+(step*i) for i in range( int(1.0 / epsilon) )] if values[-1] != max: values.append(max) min = random.choice(values) max = random.choice(values) while min > max: min = random.choice(values) max = random.choice(values) val = Continuum(min, max, random.choice([True,False]), random.choice([True,False])) body_size = random.randint(rule_min_size, rule_max_size) new_rule = ContinuumRule(var, val, []) # Prevent cross-match # not necessarry, since next(state) assume determinism # Complete the rule body if needed while (new_rule.size() < body_size): # create body cond_var = random.randint(0, len(s)-1) if new_rule.has_condition(cond_var): continue # Enumerate each possible value min = extended_domains[cond_var].get_min_value() max = extended_domains[cond_var].get_max_value() step = epsilon * (max - min) values = [min+(step*i) for i in range( int(1.0 / epsilon) )] if values[-1] != max: values.append(max) cond_val = Continuum() while not cond_val.includes(s[cond_var]): min = random.choice(values) max = random.choice(values) while min > max: min = random.choice(values) max = random.choice(values) cond_val = Continuum(min, max, random.choice([True,False]), random.choice([True,False])) new_rule.set_condition(cond_var, cond_val) rules.append(new_rule) return ContinuumLogicProgram(variables, domains, rules)