Example #1
0
    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
Example #2
0
    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
Example #3
0
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')
Example #4
0
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')
Example #5
0
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