def convert(self, expr: Expr) -> Automaton: # self._logger.info('Ltl2UCW: converting..\n' + ConverterToWringVisitor().dispatch(expr)) #make sure we don't have Weak Until since ltl2ba does not accept it.. expr = WeakToUntilConverterVisitor().dispatch(expr) self._logger.info('Ltl2UCW: converting..(non-negated version)\n' + ConverterToWringVisitor().dispatch(expr)) format_converter = ConverterToLtl2BaFormatVisitor() property_in_ltl2ba_format = format_converter.dispatch(_negate(expr)) rc, ba, err = execute_shell('{0} "{1}"'.format( self._execute_cmd, property_in_ltl2ba_format)) assert rc == 0, str(rc) + ', err: ' + str(err) + ', out: ' + str(ba) assert (err == '') or err is None, err self._logger.debug(ba) initial_nodes, rejecting_nodes, nodes = parse_ltl2ba_ba( ba, format_converter.signal_by_name) _assert_are_signals_in_labels( list(chain(*initial_nodes)) + rejecting_nodes + nodes) automaton = Automaton(initial_nodes, rejecting_nodes, nodes, name=str(property_in_ltl2ba_format)) self._logger.debug(to_dot(automaton)) return automaton
def convert(self, expr:Expr) -> Automaton: # self._logger.info('Ltl2UCW: converting..\n' + ConverterToWringVisitor().dispatch(expr)) #make sure we don't have Weak Until since ltl2ba does not accept it.. expr = WeakToUntilConverterVisitor().dispatch(expr) self._logger.info('Ltl2UCW: converting..(non-negated version)\n' + ConverterToWringVisitor().dispatch(expr)) format_converter = ConverterToLtl2BaFormatVisitor() property_in_ltl2ba_format = format_converter.dispatch(_negate(expr)) rc, ba, err = execute_shell('{0} "{1}"'.format(self._execute_cmd, property_in_ltl2ba_format)) assert rc == 0, str(rc) + ', err: ' + str(err) + ', out: ' + str(ba) assert (err == '') or err is None, err self._logger.debug(ba) initial_nodes, rejecting_nodes, nodes = parse_ltl2ba_ba(ba, format_converter.signal_by_name) _assert_are_signals_in_labels(list(chain(*initial_nodes)) + rejecting_nodes + nodes) automaton = Automaton(initial_nodes, rejecting_nodes, nodes, name=str(property_in_ltl2ba_format)) self._logger.debug(to_dot(automaton)) return automaton
def _log_automatae(logger, global_automatae_pairs, sync_automaton): logger.info('# of global automatae %i', len(global_automatae_pairs)) for glob_automaton, cutoff in global_automatae_pairs: logger.info('global automaton %s', glob_automaton.name) logger.info('..corresponding cutoff=%i', cutoff) logger.info('..nof_nodes=%i', len(glob_automaton.nodes)) logger.debug('..corresponding dot:\n%s', automata_helper.to_dot(glob_automaton)) logger.info('\n') if sync_automaton: logger.info('local automaton %s', sync_automaton.name) logger.info('nof_nodes=%i', len(sync_automaton.nodes)) else: logger.info('no local automaton')
def search(automaton:Automaton, is_mealy:bool, input_signals, output_signals, sizes, underlying_solver:SolverInterface, logic): logger = logging.getLogger() logger.debug(automaton) logger.debug('search: automaton (dot) is:\n' + to_dot(automaton)) spec_states_type = 'Q' sys_states_type = 'T' impl = SolitaryImpl(automaton, is_mealy, input_signals, output_signals, list(sizes)[-1], sys_states_type, underlying_solver) encoding_solver = GenericEncoder(logic, spec_states_type, '', impl.state_types_by_process, underlying_solver) encoding_solver.encode_sys_model_functions(impl) # TODO: emulator cannot advantage of knowing the current bound? encoding_solver.encode_sys_aux_functions(impl) encoding_solver.encode_run_graph_headers(impl) #: :type: EncodingSolver encoding_solver = encoding_solver last_size = 0 for size in sizes: logger.info('searching a model of size {0}..'.format(size)) cur_all_states = impl.states_by_process[0][:size] new_states = cur_all_states[last_size:] last_size = size encoding_solver.encode_run_graph(impl, list((s,) for s in new_states)) encoding_solver.push() encoding_solver.encode_model_bound(cur_all_states, impl) model = encoding_solver.solve(impl) if model: return model encoding_solver.pop() return None