def test_localize_two_ass_one_gua(self): """ forall(i,j) a_i_j -> forall(i) b_i replaced by forall(i,j) (a_i_j -> b_i) """ a_i_j_is_true, b_j_is_true = _get_is_true('a', 'i', 'j'), _get_is_true('b', 'j') b_i_is_true = _get_is_true('b', 'i') prop = SpecProperty([ForallExpr(['i', 'j'], a_i_j_is_true)], [ForallExpr(['j'], b_j_is_true)]) localized_prop = localize(prop) expected_prop_i_j1 = SpecProperty( [Bool(True)], [ForallExpr(['i', 'j'], BinOp('->', a_i_j_is_true, b_j_is_true))]) expected_prop_i_j2 = SpecProperty( [Bool(True)], [ForallExpr(['i', 'j'], BinOp('->', a_i_j_is_true, b_i_is_true))]) assert str(localized_prop) == str(expected_prop_i_j1) or \ str(localized_prop) == str(expected_prop_i_j2), \ str(localized_prop)
def test_localize_zero_ass(self): """ true -> forall(i) b_i replaced by forall(i) (true -> b_i) """ b_i_is_true = _get_is_true("b", "i") prop = SpecProperty([Bool(True)], [ForallExpr(["i"], b_i_is_true)]) localized_prop = localize(prop) expected_prop = SpecProperty([Bool(True)], [ForallExpr(["i"], BinOp("->", Bool(True), b_i_is_true))]) assert str(localized_prop) == str(expected_prop), str(localized_prop)
def test_localize_zero_ass(self): """ true -> forall(i) b_i replaced by forall(i) (true -> b_i) """ b_i_is_true = _get_is_true('b', 'i') prop = SpecProperty([Bool(True)], [ForallExpr(['i'], b_i_is_true)]) localized_prop = localize(prop) expected_prop = SpecProperty( [Bool(True)], [ForallExpr(['i'], BinOp('->', Bool(True), b_i_is_true))]) assert str(localized_prop) == str(expected_prop), str(localized_prop)
def test_localize_one_ass_one_gua(self): """ forall(i) a_i -> forall(j) b_j replaced by forall(i) (a_i -> b_i) """ prop = SpecProperty([parse_expr("Forall (i) a_i=1")], [parse_expr("Forall (j) b_j=1")]) localized_prop = localize(prop) expected_prop_i = SpecProperty([Bool(True)], [parse_expr("Forall (i) a_i=1 -> b_i=1")]) expected_prop_j = SpecProperty([Bool(True)], [parse_expr("Forall (j) a_j=1 -> b_j=1")]) expected_prop_str_i = str(expected_prop_i) expected_prop_str_j = str(expected_prop_j) localized_prop_str = str(localized_prop) assert localized_prop_str == expected_prop_str_i or localized_prop_str == expected_prop_str_j, str( localized_prop_str )
def test_localize_one_ass_one_gua(self): """ forall(i) a_i -> forall(j) b_j replaced by forall(i) (a_i -> b_i) """ prop = SpecProperty([parse_expr('Forall (i) a_i=1')], [parse_expr('Forall (j) b_j=1')]) localized_prop = localize(prop) expected_prop_i = SpecProperty( [Bool(True)], [parse_expr('Forall (i) a_i=1 -> b_i=1')]) expected_prop_j = SpecProperty( [Bool(True)], [parse_expr('Forall (j) a_j=1 -> b_j=1')]) expected_prop_str_i = str(expected_prop_i) expected_prop_str_j = str(expected_prop_j) localized_prop_str = str(localized_prop) assert localized_prop_str == expected_prop_str_i \ or localized_prop_str == expected_prop_str_j, str(localized_prop_str)
def test_localize_one_ass_two_gua(self): """ forall(i,j) a_i -> forall(i,j) b_i_j replaced by forall(i,j) (a_i -> b_i_j) """ a_i_is_true, a_k_is_true, a_j_is_true = _get_is_true("a", "i"), _get_is_true("a", "k"), _get_is_true("a", "j") b_k_j_is_true = _get_is_true("b", "k", "j") prop = SpecProperty([ForallExpr(["i"], a_i_is_true)], [ForallExpr(["k", "j"], b_k_j_is_true)]) localized_prop = localize(prop) expected_prop_k_j1 = SpecProperty( [Bool(True)], [ForallExpr(["k", "j"], BinOp("->", a_k_is_true, b_k_j_is_true))] ) expected_prop_k_j2 = SpecProperty( [Bool(True)], [ForallExpr(["k", "j"], BinOp("->", a_j_is_true, b_k_j_is_true))] ) assert str(localized_prop) == str(expected_prop_k_j1) or str(localized_prop) == str(expected_prop_k_j2), str( localized_prop )
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
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