/// <summary> /// Generates a <see cref="MarkovDecisionProcess" /> for the model created by <paramref name="createModel" />. /// </summary> public NestedMarkovDecisionProcess GenerateMarkovDecisionProcess(Formula terminateEarlyCondition = null) { Requires.That(IntPtr.Size == 8, "Model checking is only supported in 64bit processes."); ProbabilityMatrixCreationStarted = true; CollectStateFormulasVisitor stateFormulaCollector; if (Configuration.UseAtomarPropositionsAsStateLabels) { stateFormulaCollector = new CollectAtomarPropositionFormulasVisitor(); } else { stateFormulaCollector = new CollectMaximalCompilableFormulasVisitor(); } foreach (var stateFormula in _formulasToCheck) { stateFormulaCollector.VisitNewTopLevelFormula(stateFormula); } if (terminateEarlyCondition) { stateFormulaCollector.VisitNewTopLevelFormula(terminateEarlyCondition); } var stateFormulas = stateFormulaCollector.CollectedStateFormulas.ToArray(); ExecutedModel <TExecutableModel> model = null; var modelCreator = _runtimeModelCreator.CreateCoupledModelCreator(stateFormulas); Func <AnalysisModel <TExecutableModel> > createAnalysisModelFunc = () => model = new LtmdpExecutedModel <TExecutableModel>(modelCreator, 0, Configuration.SuccessorCapacity); var createAnalysisModel = new AnalysisModelCreator <TExecutableModel>(createAnalysisModelFunc); return(GenerateMarkovDecisionProcess(createAnalysisModel, terminateEarlyCondition, stateFormulas)); }
/// <summary> /// Generates a <see cref="MarkovDecisionProcess" /> for the model created by <paramref name="createModel" />. /// </summary> public LabeledTransitionMarkovDecisionProcess GenerateLabeledTransitionMarkovDecisionProcess() { Requires.That(IntPtr.Size == 8, "Model checking is only supported in 64bit processes."); ProbabilityMatrixCreationStarted = true; FormulaManager.Calculate(Configuration); var stateFormulasToCheckInBaseModel = FormulaManager.StateFormulasToCheckInBaseModel.ToArray(); ExecutedModel <TExecutableModel> model = null; var modelCreator = _runtimeModelCreator.CreateCoupledModelCreator(stateFormulasToCheckInBaseModel); Func <AnalysisModel> createAnalysisModelFunc = () => model = new LtmdpExecutedModel <TExecutableModel>(modelCreator, Configuration); var createAnalysisModel = new AnalysisModelCreator(createAnalysisModelFunc); var ltmdp = GenerateLtmdp(createAnalysisModel); return(ltmdp); }
/// <summary> /// Initializes a new instance. /// </summary> public ProbabilisticSimulator(ExecutableModelCreator <TExecutableModel> modelCreator, IEnumerable <Formula> formulas, AnalysisConfiguration configuration) { // TODO: Set Mode WithCustomSeed (each thread must have its own seed) or RealRandom Requires.NotNull(modelCreator, nameof(modelCreator)); RuntimeModel = modelCreator.CreateCoupledModelCreator(formulas.ToArray()).Create(0); NormalizedFormulas = RuntimeModel.Formulas.ToArray(); NormalizedFormulaLabels = NormalizedFormulas.Select(stateFormula => stateFormula.Label).ToArray(); NormalizedFormulaSatisfactionCount = new int[NormalizedFormulas.Length]; _compiledNormalizedFormulas = NormalizedFormulas.Select(formula => FormulaCompilationVisitor <TExecutableModel> .Compile(RuntimeModel, formula)).ToArray(); _allowFaultsOnInitialTransitions = configuration.AllowFaultsOnInitialTransitions; _choiceResolver = new ProbabilisticSimulatorChoiceResolver(configuration.UseOptionProbabilitiesInSimulation, (int)DateTime.Now.Ticks); RuntimeModel.SetChoiceResolver(_choiceResolver); SavedActivations = RuntimeModel.NondeterministicFaults.Select(fault => fault.Activation).ToArray(); }