def test_explain(self): fsm = self.init_model() initState = fsm.pick_one_state(fsm.init) adminNone = eval_ctl_spec(fsm, atom("admin = none")) adminAlice = eval_ctl_spec(fsm, atom("admin = alice")) egAlice = eval_ctl_spec(fsm, eg(atom("admin = alice"))) euNoneUAlice = eval_ctl_spec(fsm, eu(atom("admin = none"), atom("admin = alice"))) spec = Spec(parse_ctl_spec("EX admin = none")) path = explain(fsm, initState, spec) self.assertEqual(initState, path[0]) self.assertTrue(path[2] <= adminNone) state = fsm.pick_one_state(egAlice) spec = Spec(parse_ctl_spec("EG admin = alice")) path = explain(fsm, state, spec) self.assertEqual(state, path[0]) self.assertIn(path[-1], path[:-1]) for i in range(0,len(path), 2): self.assertTrue(path[i] <= adminAlice) self.assertTrue(path[-1] <= adminAlice) self.assertTrue(initState <= euNoneUAlice) spec = Spec(parse_ctl_spec("E[admin = none U admin = alice]")) path = explain(fsm, initState, spec) self.assertEqual(initState, path[0]) for i in range(2,len(path)-2,2): self.assertTrue(path[i] <= adminNone) self.assertTrue(path[-1] <= adminAlice)
def test_explain_atom(self): fsm = self.init_model() manager = fsm.bddEnc.DDmanager init = fsm.init initState = fsm.pick_one_state(init) spec = Spec(parse_ctl_spec("admin = none")) path = explain(fsm, initState, spec) self.assertEqual(initState, path[0]) self.assertEqual(len(path), 1)
def run_model_in_nusmv(filename, get_path=False): init_nusmv() load_from_file(filename) compute_model(keep_single_enum=True) fsm = prop_database().master.bddFsm propDb = prop_database() for prop in propDb: spec = prop.expr status = check_ctl_spec( fsm, spec) if prop.type == propTypes['CTL'] else check_ltl_spec(spec) if status is False: print('Specification', str(spec), 'is', str(status)) if get_path: explanation = explain(fsm, fsm.init, spec) print_specification_explanation(explanation) deinit_nusmv()
spec = prop.expr print(spec) # print(fsm.count_states(fsm.init)) # for state in fsm.pick_all_states(fsm.init): # print(state.get_str_values()) # for state in fsm.pick_all_states(fsm.post(fsm.init)): # print(state.get_str_values()) # trans = BddTrans.from_string(fsm.bddEnc.symbTable,"next(time) = 0") # for state in fsm.pick_all_states(trans.post(fsm.init)): # print(state.get_str_values()) bdd = pynusmv.mc.eval_ctl_spec(fsm, spec) # & fsm.reachable_states explanation = explain(fsm, fsm.init & ~eval_ctl_spec(fsm, spec), spec) # print(explanation) for state, inputs in zip(explanation[::2], explanation[1::2]): if state == explanation[-1]: print("-- Loop starts here") print(state.get_str_values()) print(inputs.get_str_values()) # satstates = fsm.pick_all_states(bdd) # # print(satstates) # # for state in satstates: # print(state.get_str_values()) # trans = BddTrans.from_string(fsm.bddEnc.symbTable) # for state in fsm.pick_all_states(trans.post(fsm.init)):