Example #1
0
File: bosy.py Project: 5nizza/Party
def _get_acacia_spec(ltl_text:str, part_text:str, logger:logging.Logger) -> (list, list, SpecProperty):
    input_signals, output_signals, data_by_name = acacia_parser.parse(ltl_text, part_text, logger)

    if data_by_name is None:
        return None, None, None

    spec_properties = []
    for (unit_name, unit_data) in data_by_name.items():
        assumptions = unit_data[0]
        guarantees = unit_data[1]
        spec_properties.append(SpecProperty(assumptions, guarantees))

    spec_property = and_properties(spec_properties)

    return input_signals, output_signals, spec_property
Example #2
0
def _get_acacia_spec(ltl_text: str, part_text: str,
                     logger: logging.Logger) -> (list, list, SpecProperty):
    input_signals, output_signals, data_by_name = acacia_parser.parse(
        ltl_text, part_text, logger)

    if data_by_name is None:
        return None, None, None

    spec_properties = []
    for (unit_name, unit_data) in data_by_name.items():
        assumptions = unit_data[0]
        guarantees = unit_data[1]
        spec_properties.append(SpecProperty(assumptions, guarantees))

    spec_property = and_properties(spec_properties)

    return input_signals, output_signals, spec_property
Example #3
0
def _get_automatae(assumptions, guarantees, optimization, cutoff,
                   ltl2ucw_converter: Ltl2UCW, logger):
    #TODO: check which optimizations are used

    properties = [SpecProperty(assumptions, [g]) for g in guarantees]
    logger.info('original properties:\n%s\n', '\n'.join(map(str, properties)))

    archi = TokRingArchitecture()
    archi_properties = [
        SpecProperty(assumptions, [g]) for g in archi.guarantees()
    ]
    logger.info('architecture properties:\n%s\n',
                '\n'.join(map(str, archi_properties)))

    if OPTS[optimization] >= OPTS[STRENGTH]:
        # we don't need this in case of async_hub since its assumptions implies GF(tok), put it is here for simplicity
        properties = [
            SpecProperty(p.assumptions + archi.implications(), p.guarantees)
            for p in properties
        ]

    properties = properties + archi_properties

    scheduler = InterleavingScheduler()
    properties = [
        SpecProperty(p.assumptions + scheduler.assumptions, p.guarantees)
        for p in properties
    ]
    logger.info('after updating with scheduling assumptions:\n%s\n',
                '\n'.join(map(str, properties)))

    #TODO: add support of using other options without using strengthening
    if OPTS[optimization] >= OPTS[STRENGTH]:
        logger.info('strengthening properties..')

        pseudo_safety_properties, pseudo_liveness_properties = strengthen_many(
            properties, ltl2ucw_converter)
        properties = pseudo_safety_properties + pseudo_liveness_properties

        logger.info(
            'strengthening resulted in pseudo_safety_properties (a_s -> g_s):\n%s\n',
            '\n'.join(map(str, pseudo_safety_properties)))
        logger.info(
            '..and in pseudo_liveness_properties (a_s&a_l -> g_l):\n%s\n',
            '\n'.join(map(str, pseudo_liveness_properties)))

    if OPTS[optimization] >= OPTS[STRENGTH]:
        properties = [localize(p) for p in properties]
        logger.info('properties after localizing:\n%s\n',
                    '\n'.join(map(str, properties)))

    prop_real_cutoff_pairs = [(p, archi.get_cutoff(p)) for p in properties]

    par_global_property_pairs = [(p, c) for (p, c) in prop_real_cutoff_pairs
                                 if c != 2]
    par_local_property_pairs = [(p, c) for (p, c) in prop_real_cutoff_pairs
                                if c == 2]
    for (p, c) in par_local_property_pairs:
        assert p.assumptions == [Bool(True)]
        assert c == 2

    if optimization == SYNC_HUB:  # removing GF(sch) from one-indexed properties
        par_local_property_pairs = [(_replace_sched_by_true(p, scheduler), c)
                                    for (p, c) in par_local_property_pairs]

    if optimization == SYNC_HUB:
        pass  # TODO: should add sync_hub assumptions -- but currently they are added on SMT (Impl) level

    if optimization == ASYNC_HUB:
        # by definition async_hub_assumptions are one-indexed
        async_hub_assumptions = archi.get_async_hub_assumptions()
        par_local_property_pairs = [
            (localize(SpecProperty(async_hub_assumptions, p.guarantees)), c)
            for (p, c) in par_local_property_pairs
        ]

    inst_property_cutoff_pairs = []
    for (p, c) in par_global_property_pairs + par_local_property_pairs:
        inst_c = min(c, cutoff)
        inst_p = inst_property(p, inst_c)
        opt_inst_p = apply_log_bit_scheduler_optimization(
            inst_p, scheduler, SCHED_ID_PREFIX, inst_c)

        inst_property_cutoff_pairs.append((opt_inst_p, c))

    local_properties = [p for (p, c) in inst_property_cutoff_pairs if c == 2]
    global_property_cutoff_pairs = [(p, min(c, cutoff))
                                    for (p, c) in inst_property_cutoff_pairs
                                    if p not in local_properties]

    logger.info('instantiated local properties:\n%s\n', local_properties)
    logger.info('instantiated global properties:\n%s\n',
                global_property_cutoff_pairs)

    local_automaton = None
    if len(local_properties) > 0:
        local_property = and_properties(local_properties)
        local_automaton = ltl2ucw_converter.convert(
            expr_from_property(local_property))

    glob_automatae_pairs = []
    if len(global_property_cutoff_pairs) > 0:
        glob_automatae_pairs = [
            (ltl2ucw_converter.convert(expr_from_property(p)), c)
            for (p, c) in global_property_cutoff_pairs
        ]

    if OPTS[optimization] < OPTS[SYNC_HUB] and local_automaton:
        if optimization == ASYNC_HUB:
            glob_automatae_pairs += [(local_automaton, 1)]
        else:
            glob_automatae_pairs += [(local_automaton, 2)]

    sync_automaton = None
    if OPTS[optimization] >= OPTS[SYNC_HUB]:
        sync_automaton = local_automaton

    return sync_automaton, glob_automatae_pairs
Example #4
0
def _get_automatae(assumptions, guarantees,
                   optimization,
                   cutoff,
                   ltl2ucw_converter:Ltl2UCW,
                   logger):
    #TODO: check which optimizations are used

    properties = [SpecProperty(assumptions, [g]) for g in guarantees]
    logger.info('original properties:\n%s\n', '\n'.join(map(str, properties)))

    archi = TokRingArchitecture()
    archi_properties = [SpecProperty(assumptions, [g]) for g in archi.guarantees()]
    logger.info('architecture properties:\n%s\n', '\n'.join(map(str, archi_properties)))

    if OPTS[optimization] >= OPTS[STRENGTH]:
        # we don't need this in case of async_hub since its assumptions implies GF(tok), put it is here for simplicity
        properties = [SpecProperty(p.assumptions + archi.implications(), p.guarantees) for p in properties]

    properties = properties + archi_properties

    scheduler = InterleavingScheduler()
    properties = [SpecProperty(p.assumptions + scheduler.assumptions, p.guarantees)
                  for p in properties]
    logger.info('after updating with scheduling assumptions:\n%s\n', '\n'.join(map(str, properties)))

    #TODO: add support of using other options without using strengthening
    if OPTS[optimization] >= OPTS[STRENGTH]:
        logger.info('strengthening properties..')

        pseudo_safety_properties, pseudo_liveness_properties = strengthen_many(properties, ltl2ucw_converter)
        properties = pseudo_safety_properties + pseudo_liveness_properties

        logger.info('strengthening resulted in pseudo_safety_properties (a_s -> g_s):\n%s\n',
                    '\n'.join(map(str, pseudo_safety_properties)))
        logger.info('..and in pseudo_liveness_properties (a_s&a_l -> g_l):\n%s\n',
                    '\n'.join(map(str, pseudo_liveness_properties)))

    if OPTS[optimization] >= OPTS[STRENGTH]:
        properties = [localize(p) for p in properties]
        logger.info('properties after localizing:\n%s\n', '\n'.join(map(str, properties)))

    prop_real_cutoff_pairs = [(p, archi.get_cutoff(p)) for p in properties]

    par_global_property_pairs = [(p, c) for (p, c) in prop_real_cutoff_pairs if c != 2]
    par_local_property_pairs = [(p, c) for (p, c) in prop_real_cutoff_pairs if c == 2]
    for (p, c) in par_local_property_pairs:
        assert p.assumptions == [Bool(True)]
        assert c == 2

    if optimization == SYNC_HUB:  # removing GF(sch) from one-indexed properties
        par_local_property_pairs = [(_replace_sched_by_true(p, scheduler), c)
                                    for (p, c) in par_local_property_pairs]

    if optimization == SYNC_HUB:
        pass   # TODO: should add sync_hub assumptions -- but currently they are added on SMT (Impl) level

    if optimization == ASYNC_HUB:
        # by definition async_hub_assumptions are one-indexed
        async_hub_assumptions = archi.get_async_hub_assumptions()
        par_local_property_pairs = [(localize(SpecProperty(async_hub_assumptions, p.guarantees)), c)
                                    for (p, c) in par_local_property_pairs]

    inst_property_cutoff_pairs = []
    for (p, c) in par_global_property_pairs + par_local_property_pairs:
        inst_c = min(c, cutoff)
        inst_p = inst_property(p, inst_c)
        opt_inst_p = apply_log_bit_scheduler_optimization(inst_p, scheduler, SCHED_ID_PREFIX, inst_c)

        inst_property_cutoff_pairs.append((opt_inst_p, c))

    local_properties = [p for (p, c) in inst_property_cutoff_pairs if c == 2]
    global_property_cutoff_pairs = [(p, min(c, cutoff))
                                    for (p, c) in inst_property_cutoff_pairs
                                    if p not in local_properties]

    logger.info('instantiated local properties:\n%s\n', local_properties)
    logger.info('instantiated global properties:\n%s\n', global_property_cutoff_pairs)

    local_automaton = None
    if len(local_properties) > 0:
        local_property = and_properties(local_properties)
        local_automaton = ltl2ucw_converter.convert(expr_from_property(local_property))

    glob_automatae_pairs = []
    if len(global_property_cutoff_pairs) > 0:
        glob_automatae_pairs = [(ltl2ucw_converter.convert(expr_from_property(p)), c)
                                for (p, c) in global_property_cutoff_pairs]

    if OPTS[optimization] < OPTS[SYNC_HUB] and local_automaton:
        if optimization == ASYNC_HUB:
            glob_automatae_pairs += [(local_automaton, 1)]
        else:
            glob_automatae_pairs += [(local_automaton, 2)]

    sync_automaton = None
    if OPTS[optimization] >= OPTS[SYNC_HUB]:
        sync_automaton = local_automaton

    return sync_automaton, glob_automatae_pairs