You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
2.4 KiB

  1. import stormpy
  2. import stormpy.simulator
  3. newline = "\n"
  4. def printFrame(streetLength, lanes, carPos, pedPos):
  5. sidewalk = "#" * (streetLength+1)
  6. frame = list(sidewalk + (lanes-2)*("_"*(streetLength+1)) + sidewalk)
  7. frame[(int(carPos[0])-1)*(streetLength+1)+int(carPos[1])+1] = "C"
  8. frame[(int(pedPos[0])-1)*(streetLength+1)+int(pedPos[1])+1] = "P"
  9. for i in range(lanes):
  10. frame[i*(streetLength+1)] = newline
  11. return "".join(frame)
  12. def mdp():
  13. options = stormpy.BuilderOptions([])
  14. options.set_build_state_valuations(True)
  15. options.set_build_choice_labels(True)
  16. options.set_build_all_labels()
  17. prism_program = stormpy.parse_prism_program("/media/car_pedestrian_mdp.prism")
  18. streetLength = int(str(prism_program.get_constant("streetLength").definition))
  19. lanes = int(str(prism_program.get_constant("lanes").definition))
  20. formula_str = "Pmax=? [G !\"crashed\" ];"
  21. #formula_str = "Pmax=? [F \"crashed\" ];"
  22. print(stormpy.build_model(prism_program))
  23. formulas = stormpy.parse_properties_for_prism_program(formula_str, prism_program)
  24. model = stormpy.build_sparse_model_with_options(prism_program, options)
  25. initial_state = model.initial_states[0]
  26. assert initial_state == 0
  27. result = stormpy.model_checking(model, formulas[0], extract_scheduler=True)
  28. assert result.has_scheduler
  29. scheduler = result.scheduler
  30. assert scheduler.memoryless
  31. assert scheduler.deterministic
  32. dtmc = model.apply_scheduler(scheduler)
  33. print(dtmc)
  34. simulator = stormpy.simulator.create_simulator(dtmc, seed=42)
  35. simulator.set_observation_mode(stormpy.simulator.SimulatorObservationMode.PROGRAM_LEVEL)
  36. i=0
  37. while True:
  38. observation, reward, labels = simulator.step()
  39. print(observation, labels)
  40. frame = printFrame(int(streetLength), int(lanes), (observation["car_lane_pos"], observation["car_street_pos"]), (observation["ped_lane_pos"], observation["ped_street_pos"]))
  41. print(frame)
  42. if simulator.is_done() or "pedCrossed" in labels:
  43. print("Pedestrian arrived on the other side!")
  44. break
  45. input("")
  46. with open(f"/media/frame{i:03}.txt", "w") as text_file:
  47. text_file.write(frame)
  48. i+=1
  49. if "crashed" in labels:
  50. print("Pedestrian did not arrive on the other side!")
  51. break
  52. if __name__ == '__main__':
  53. mdp()