def _run(default_models, is_moore, anon_inputs, anon_outputs, sync_automaton: Automaton, global_automatae_pairs, bounds, solver_creater: Z3SolverFactory, logic, logger) -> Bool: _log_automatae(logger, global_automatae_pairs, sync_automaton) if default_models: logger.info('model is given: checking it..') underlying_solver = solver_creater.create('_check') model_checker = par_model_searcher.ParModelSearcher() models = model_checker.check( logic, is_moore, global_automatae_pairs, sync_automaton, anon_inputs, anon_outputs, underlying_solver, BaseNames(SCHED_ID_PREFIX, ACTIVE_NAME, SENDS_NAME, SENDS_PREV_NAME, HAS_TOK_NAME), default_models[0]) underlying_solver.die() if models: logger.info('the model passed checking!') return models logger.info( 'the model did not pass the check - searching another one..') underlying_solver = solver_creater.create() model_searcher = par_model_searcher.ParModelSearcher() models = model_searcher.search( logic, is_moore, global_automatae_pairs, sync_automaton, anon_inputs, anon_outputs, bounds, underlying_solver, BaseNames(SCHED_ID_PREFIX, ACTIVE_NAME, SENDS_NAME, SENDS_PREV_NAME, HAS_TOK_NAME)) underlying_solver.die() return models
def check_unreal( ltl_text, part_text, is_moore, ltl3ba: LTL3BA, solver_factory: Z3SolverFactory, min_size, max_size, ltl3ba_timeout_sec=None, opt_level=0, ) -> LTS: """ :raise: subprocess.TimeoutException :arg opt_level: Note that opt_level > 0 may introduce unsoundness (returns unrealizable while it is) """ timer = Timer() outputs, inputs, expr = parse_acacia_and_build_expr(ltl_text, part_text, ltl3ba, opt_level) timer.sec_restart() automaton = ltl3ba.convert(expr, timeout=ltl3ba_timeout_sec) # note no negation logging.info("(unreal) automaton size is: %i" % len(automaton.nodes)) logging.debug("(unreal) automaton (dot) is:\n" + automaton2dot.to_dot(automaton)) logging.debug("(unreal) automaton translation took (sec): %i" % timer.sec_restart()) encoder = create_encoder(inputs, outputs, not is_moore, automaton, solver_factory.create()) model = model_searcher.search(min_size, max_size, encoder) logging.debug("(unreal) model_searcher.search took (sec): %i" % timer.sec_restart()) return model
def _run(default_models, is_moore, anon_inputs, anon_outputs, sync_automaton:Automaton, global_automatae_pairs, bounds, solver_creater:Z3SolverFactory, logic, logger) -> Bool: _log_automatae(logger, global_automatae_pairs, sync_automaton) if default_models: logger.info('model is given: checking it..') underlying_solver = solver_creater.create('_check') model_checker = par_model_searcher.ParModelSearcher() models = model_checker.check(logic, is_moore, global_automatae_pairs, sync_automaton, anon_inputs, anon_outputs, underlying_solver, BaseNames(SCHED_ID_PREFIX, ACTIVE_NAME, SENDS_NAME, SENDS_PREV_NAME, HAS_TOK_NAME), default_models[0]) underlying_solver.die() if models: logger.info('the model passed checking!') return models logger.info('the model did not pass the check - searching another one..') underlying_solver = solver_creater.create() model_searcher = par_model_searcher.ParModelSearcher() models = model_searcher.search(logic, is_moore, global_automatae_pairs, sync_automaton, anon_inputs, anon_outputs, bounds, underlying_solver, BaseNames(SCHED_ID_PREFIX, ACTIVE_NAME, SENDS_NAME, SENDS_PREV_NAME, HAS_TOK_NAME)) underlying_solver.die() return models
def check_real(spec: Spec, min_size, max_size, ltl_to_atm: LTLToAutomaton, solver_factory: Z3SolverFactory, use_direct_encoding: bool) -> LTS or None: shared_aht, dstFormPropMgr = SharedAHT(), DstFormulaPropMgr() # normalize formula (negations appear only in front of basic propositions) spec.formula = NNFNormalizer().dispatch(spec.formula) logging.info("CTL* formula size: %i", expr_size(spec.formula)) if use_direct_encoding: top_formula, atm_by_p, UCWs = automize_ctl(spec.formula, ltl_to_atm) logging.info("Total number of states in sub-automata: %i", sum([len(a.nodes) for a in atm_by_p.values()])) for p, atm in atm_by_p.items(): logging.debug(str(p) + ', atm: \n' + automaton_to_dot.to_dot(atm)) encoder = CTLEncoderDirect( top_formula, atm_by_p, UCWs, build_tau_desc(spec.inputs), spec.inputs, dict((o, build_output_desc(o, True, spec.inputs)) for o in spec.outputs), range(max_size)) else: aht_automaton = ctl2aht.ctl2aht(spec, ltl_to_atm, shared_aht, dstFormPropMgr) aht_nodes, aht_transitions = get_reachable_from( aht_automaton.init_node, shared_aht.transitions, dstFormPropMgr) logging.info('The AHT automaton size (nodes/transitions) is: %i/%i' % (len(aht_nodes), len(aht_transitions))) if not aht_transitions: logging.info('AHT is empty => the spec is unrealizable!') return None if logging.getLogger().isEnabledFor( logging.DEBUG): # aht2dot takes long time logging.debug('AHT automaton (dot) is...\n') logging.debug( aht2dot.convert(aht_automaton, shared_aht, dstFormPropMgr)) encoder = CTLEncoderViaAHT( aht_automaton, aht_transitions, dstFormPropMgr, build_tau_desc(spec.inputs), spec.inputs, dict((o, build_output_desc(o, True, spec.inputs)) for o in spec.outputs), range(max_size)) model = model_searcher.search(min_size, max_size, encoder, solver_factory.create()) return model
def check_real( ltl_text, part_text, is_moore, ltl3ba, solver_factory: Z3SolverFactory, min_size, max_size, opt_level=2 ) -> LTS: """ :param opt_level: values > 0 introduce incompleteness (but it is sound: if returns REAL, then REAL) """ timer = Timer() inputs, outputs, expr = parse_acacia_and_build_expr(ltl_text, part_text, ltl3ba, opt_level) timer.sec_restart() automaton = ltl3ba.convert(~expr) logging.info("(real) automaton size is: %i" % len(automaton.nodes)) logging.debug("(real) automaton (dot) is:\n" + automaton2dot.to_dot(automaton)) logging.debug("(real) automaton translation took (sec): %i" % timer.sec_restart()) encoder = create_encoder(inputs, outputs, is_moore, automaton, solver_factory.create()) model = model_searcher.search(min_size, max_size, encoder) logging.debug("(real) model_searcher.search took (sec): %i" % timer.sec_restart()) return model