def test_mk_observable_vars(self): enc = master_be_fsm().encoding # if a non existing var name is passed, an exception is thrown with self.assertRaises(ValueError): diagnosability.mk_observable_vars(["a"]) observable = diagnosability.mk_observable_vars(["status"]) self.assertEqual(observable, [enc.by_name["status.1"], enc.by_name["status.0"]])
def test_verify_exactly(self): theta = Node.from_ptr(parse_simple_expression("TRUE")) theta = bmcutils.make_nnf_boolean_wff(theta) sigma_12= Node.from_ptr(parse_ltl_spec("TRUE")) sigma_12= bmcutils.make_nnf_boolean_wff(sigma_12).to_node() obs_names = ["mouse"] obs_vars = diagnosability.mk_observable_vars(obs_names) f1 = Node.from_ptr(parse_simple_expression("status = active")) f2 = Node.from_ptr(parse_simple_expression("status = inactive")) for i in range(5): res = diagnosability.verify_for_size_exactly_k(obs_names, obs_vars, (f1, f2), i, theta, sigma_12, sigma_12) self.assertEqual("No Violation", res) f1 = Node.from_ptr(parse_simple_expression("status = active")) f2 = Node.from_ptr(parse_simple_expression("status = highlight")) res = diagnosability.verify_for_size_exactly_k(obs_names, obs_vars, (f1, f2), 0, theta, sigma_12, sigma_12) self.assertEqual("No Violation", res) res = diagnosability.verify_for_size_exactly_k(obs_names, obs_vars, (f1, f2), 1, theta, sigma_12, sigma_12) self.assertTrue(res.startswith("############### DIAGNOSABILITY VIOLATION")) res = diagnosability.verify_for_size_exactly_k(obs_names, obs_vars, (f1, f2), 2, theta, sigma_12, sigma_12) self.assertTrue(res.startswith("############### DIAGNOSABILITY VIOLATION")) res = diagnosability.verify_for_size_exactly_k(obs_names, obs_vars, (f1, f2), 3, theta, sigma_12, sigma_12) self.assertTrue(res.startswith("############### DIAGNOSABILITY VIOLATION"))
def test_generate_sat_problem(self): theta = Node.from_ptr(parse_simple_expression("TRUE")) theta = bmcutils.make_nnf_boolean_wff(theta) sigma_12= Node.from_ptr(parse_ltl_spec("TRUE")) sigma_12= bmcutils.make_nnf_boolean_wff(sigma_12).to_node() observable = diagnosability.mk_observable_vars(["mouse"]) f1 = Node.from_ptr(parse_simple_expression("status = active")) f2 = Node.from_ptr(parse_simple_expression("status = inactive")) for i in range(5): problem = diagnosability.generate_sat_problem(observable, (f1, f2), i, theta, sigma_12, sigma_12) solver = SatSolverFactory.create() cnf = problem.to_cnf() solver += cnf solver.polarity(cnf, Polarity.POSITIVE) self.assertEqual(SatSolverResult.UNSATISFIABLE, solver.solve()) f1 = Node.from_ptr(parse_simple_expression("status = active")) f2 = Node.from_ptr(parse_simple_expression("status = highlight")) for i in range(1, 4): # length zero has no input => only an initial state and the # diagnosability condition is not checked problem = diagnosability.generate_sat_problem(observable, (f1, f2), i, theta, sigma_12, sigma_12) solver = SatSolverFactory.create() cnf = problem.to_cnf() solver += cnf solver.polarity(cnf, Polarity.POSITIVE) self.assertEqual(SatSolverResult.SATISFIABLE, solver.solve())
def test_constraint_same_observations(self): observable = diagnosability.mk_observable_vars(["mouse"]) constraint = diagnosability.constraint_same_observations(observable, 0, 5, 5) model = bmcutils.BmcModel() manual = Be.true(model._fsm.encoding.manager) for i in range(6): # because we want to go from 0 through 5 for v in model._fsm.encoding.input_variables: v_1 = v.at_time[i].boolean_expression v_2 = v.at_time[5+i].boolean_expression manual &= v_1.iff(v_2) self.assertEqual(manual, constraint)