def test_parameters(self): program = stormpy.parse_prism_program( get_example_path("pdtmc", "brp16_2.pm")) formulas = stormpy.parse_properties_for_prism_program( "P=? [F s=5]", program) model = stormpy.build_parametric_model(program, formulas) model_parameters = model.collect_probability_parameters() reward_parameters = model.collect_reward_parameters() all_parameters = model.collect_all_parameters() assert len(model_parameters) == 2 assert len(reward_parameters) == 0 assert len(all_parameters) == 2 program_reward = stormpy.parse_prism_program( get_example_path("pdtmc", "brp_rewards16_2.pm")) formulas_reward = stormpy.parse_properties_for_prism_program( "Rmin=? [ F \"target\" ]", program_reward) model = stormpy.build_parametric_model(program_reward, formulas_reward) model_parameters = model.collect_probability_parameters() reward_parameters = model.collect_reward_parameters() all_parameters = model.collect_all_parameters() assert len(model_parameters) == 2 assert len(reward_parameters) == 2 assert len(all_parameters) == 4 model = stormpy.build_symbolic_parametric_model(program, formulas) assert len(model.get_parameters()) == 4 model = stormpy.build_symbolic_parametric_model( program_reward, formulas_reward) assert len(model.get_parameters()) == 4
def build_model(file, hybrid=False, sylvan_threads=1, sylvan_memory=4096): """ Build model from file and apply bisimulation. :param file: File. :param hybrid: If true, the model is built symbolically with BDDs and in the end converted to a sparse model. If false, the model is built as a sparse model from the beginning. :param sylvan_threads: Number of threads to use in Sylvan library. :param sylvan_memory: Memory available to Sylvan. :return: Tuple (sparse model, prism program, property, time (s) for building , time (s) for bisimulation). """ logging.debug("Build ({}) model for file {}".format("symbolic" if hybrid else "sparse", file)) # Build model build_start = time.time() program = stormpy.parse_prism_program(file) prop = "R=? [F \"stable\"]" properties = stormpy.parse_properties(prop, program) assert (len(properties) == 1) program, properties = stormpy.preprocess_prism_program(program, properties, "") program = program.as_prism_program() if hybrid: # Set number of Sylvan threads to use stormpy.set_settings(["--sylvan:threads", str(sylvan_threads)]) # Set memory for Sylvan stormpy.set_settings(["--sylvan:maxmem", str(sylvan_memory)]) model = stormpy.build_symbolic_parametric_model(program, properties) else: model = stormpy.build_parametric_model(program, properties) logging.info("Built ({}) model with {} states and {} transitions.".format("symbolic" if hybrid else "sparse", model.nr_states, model.nr_transitions)) build_end = time.time() time_build = build_end - build_start logging.info("Building model took {}s".format(time_build)) # Bisimulation if hybrid: # Extract bisimulation quotient as sparse model stormpy.set_settings(["--bisimulation:quot", "sparse"]) model = stormpy.perform_symbolic_bisimulation(model, properties) else: model = stormpy.perform_bisimulation(model, properties, stormpy.BisimulationType.STRONG) assert type(model) is stormpy.SparseParametricDtmc logging.info("Model after bisimulation: {} states and {} transitions.".format(model.nr_states, model.nr_transitions)) time_bisim = time.time() - build_end logging.info("Computing bisimulation quotient took {}s".format(time_bisim)) prop = properties[0] # Simplify model (by eliminating constant transitions) # Disabled for the moment as this leads to significantly more transitions in Herman if False: model, formula = stormpy.pars.simplify_model(model, prop.raw_formula) logging.info("Model after simplification: {} states and {} transitions.".format(model.nr_states, model.nr_transitions)) return model, program, prop, time_build, time_bisim
def test_build_parametric_mdp(self): program = stormpy.parse_prism_program( get_example_path("pmdp", "two_dice.nm")) formulas = stormpy.parse_properties_for_prism_program( "P=? [ F \"two\" ]", program) model = stormpy.build_symbolic_parametric_model(program, formulas) assert model.nr_states == 169 assert model.nr_transitions == 435 assert model.model_type == stormpy.ModelType.MDP assert model.supports_parameters assert type(model) is stormpy.SymbolicSylvanParametricMdp
def test_parametric_model_checking_dd(self): program = stormpy.parse_prism_program(get_example_path("pdtmc", "parametric_die.pm")) prop = "P=? [F s=5]" formulas = stormpy.parse_properties_for_prism_program(prop, program) model = stormpy.build_symbolic_parametric_model(program, formulas) assert model.nr_states == 11 assert model.nr_transitions == 17 assert model.model_type == stormpy.ModelType.DTMC assert model.has_parameters result = stormpy.check_model_dd(model, formulas[0]) assert type(result) is stormpy.SymbolicParametricQuantitativeCheckResult
def test_build_dtmc_supporting_parameters(self): program = stormpy.parse_prism_program( get_example_path("dtmc", "die.pm")) formulas = stormpy.parse_properties_for_prism_program( "P=? [ F \"one\" ]", program) model = stormpy.build_symbolic_parametric_model(program, formulas) assert model.nr_states == 13 assert model.nr_transitions == 20 assert model.model_type == stormpy.ModelType.DTMC assert model.supports_parameters assert not model.has_parameters assert type(model) is stormpy.SymbolicSylvanParametricDtmc
def test_build_parametric_dtmc(self): program = stormpy.parse_prism_program( get_example_path("pdtmc", "brp16_2.pm")) formulas = stormpy.parse_properties_for_prism_program( "P=? [ F s=5 ]", program) model = stormpy.build_symbolic_parametric_model(program, formulas) assert model.nr_states == 613 assert model.nr_transitions == 803 assert model.model_type == stormpy.ModelType.DTMC assert model.supports_parameters assert model.has_parameters assert type(model) is stormpy.SymbolicSylvanParametricDtmc
def test_transform_symbolic_parametric_dtmc_to_sparse(self): program = stormpy.parse_prism_program( get_example_path("pdtmc", "parametric_die.pm")) model = stormpy.build_symbolic_parametric_model(program) assert model.nr_states == 13 assert model.nr_transitions == 20 assert model.model_type == stormpy.ModelType.DTMC assert model.supports_parameters assert type(model) is stormpy.SymbolicSylvanParametricDtmc symbolic_model = stormpy.transform_to_sparse_model(model) assert symbolic_model.nr_states == 13 assert symbolic_model.nr_transitions == 20 assert symbolic_model.model_type == stormpy.ModelType.DTMC assert symbolic_model.supports_parameters assert type(symbolic_model) is stormpy.SparseParametricDtmc
def test_symbolic_parametric_bisimulation(self): program = stormpy.parse_prism_program( get_example_path("pdtmc", "brp16_2.pm")) prop = "P=? [F \"error\"]" properties = stormpy.parse_properties_for_prism_program(prop, program) model = stormpy.build_symbolic_parametric_model(program, properties) assert model.nr_states == 613 assert model.nr_transitions == 803 assert model.model_type == stormpy.ModelType.DTMC assert model.has_parameters model_bisim = stormpy.perform_symbolic_bisimulation(model, properties) assert model_bisim.nr_states == 326 assert model_bisim.nr_transitions == 454 assert model_bisim.model_type == stormpy.ModelType.DTMC assert model_bisim.has_parameters
def test_build_parametric_dtmc_preprocess(self): program = stormpy.parse_prism_program( get_example_path("pdtmc", "herman5.pm")) formulas = stormpy.parse_properties_for_prism_program( "R=? [ F \"stable\" ]", program) trans_program, trans_formulas = stormpy.preprocess_symbolic_input( program, formulas, "") trans_prism = trans_program.as_prism_program() model = stormpy.build_symbolic_parametric_model( trans_prism, trans_formulas) assert model.nr_states == 33 assert model.nr_transitions == 266 assert model.model_type == stormpy.ModelType.DTMC assert model.supports_parameters assert model.has_parameters assert type(model) is stormpy.SymbolicSylvanParametricDtmc