/// <summary> /// Generates a <see cref="StateGraph{TExecutableModel}" /> for the model created by <paramref name="createModel" />. /// </summary> internal StateGraph <TExecutableModel> GenerateStateGraph() { // We have to track the state vector layout here; this will nondeterministically store some model instance of // one of the workers; but since all state vectors are the same, we don't care ExecutedModel <TExecutableModel> model = null; Func <AnalysisModel> createAnalysisModelFunc = () => model = new ActivationMinimalExecutedModel <TExecutableModel>(ModelCreator, 0, Configuration); var createAnalysisModel = new AnalysisModelCreator(createAnalysisModelFunc); using (var checker = new StateGraphGenerator <TExecutableModel>(createAnalysisModel, Configuration)) { var stateGraph = checker.GenerateStateGraph(); return(stateGraph); } }
/// <summary> /// Generates a <see cref="StateGraph" /> for the model created by <paramref name="createModel" />. /// </summary> internal StateGraph GenerateStateGraph(Func<AnalysisModel> createModel, Formula[] stateFormulas) { Requires.That(IntPtr.Size == 8, "State graph generation is only supported in 64bit processes."); var stopwatch = new Stopwatch(); stopwatch.Start(); using (var checker = new StateGraphGenerator(createModel, stateFormulas, OutputWritten, Configuration)) { var stateGraph = default(StateGraph); var initializationTime = stopwatch.Elapsed; stopwatch.Restart(); try { stateGraph = checker.GenerateStateGraph(); return stateGraph; } finally { stopwatch.Stop(); if (!Configuration.ProgressReportsOnly) { OutputWritten?.Invoke(String.Empty); OutputWritten?.Invoke("==============================================="); OutputWritten?.Invoke($"Initialization time: {initializationTime}"); OutputWritten?.Invoke($"State graph generation time: {stopwatch.Elapsed}"); if (stateGraph != null) { OutputWritten?.Invoke($"{(int)(stateGraph.StateCount / stopwatch.Elapsed.TotalSeconds):n0} states per second"); OutputWritten?.Invoke($"{(int)(stateGraph.TransitionCount / stopwatch.Elapsed.TotalSeconds):n0} transitions per second"); } OutputWritten?.Invoke("==============================================="); OutputWritten?.Invoke(String.Empty); } } } }