public void Simulate() { var model = new ExampleModelBase(); var tc = SafetySharpModelChecker.TraversalConfiguration; tc.AllowFaultsOnInitialTransitions = false; tc.UseOptionProbabilitiesInSimulation = false; SafetySharpProbabilisticSimulator.Configuration = tc; var is3Formula = new ExecutableStateFormula(() => model.ModelComponent.Value == 3); var f1Formula = new FaultFormula(model.ModelComponent.F1); var loopRequestBugFormula = new ExecutableStateFormula(() => model.ModelComponent.LoopRequestBug); SafetySharpProbabilisticSimulator simulator = new SafetySharpProbabilisticSimulator(model, is3Formula, f1Formula, loopRequestBugFormula); for (var i = 0; i < 100; i++) { simulator.SimulateSteps(5); var noIs3 = simulator.GetCountOfSatisfiedOnTrace(is3Formula); var noF1 = simulator.GetCountOfSatisfiedOnTrace(f1Formula); var probabilityOfTrace = simulator.TraceProbability; Console.WriteLine($"No of Is3: {noIs3}"); Console.WriteLine($"No of f1 {noF1}: {noF1}"); Console.WriteLine($"Probability of trace: {probabilityOfTrace}"); Console.WriteLine(); } }
public string GenerateSimulationData(ICollection <FaultRandomVariable> faults, ICollection <McsRandomVariable> mcs, ICollection <BooleanRandomVariable> states, BooleanRandomVariable hazard, int numberOfSimulations) { _faults = faults; _mcs = mcs; _hazard = hazard; _states = states; _numberOfSimulations = numberOfSimulations; Console.Out.WriteLine("Create simulation data..."); var allVariables = AllRandomVariables(); var allFormulas = CreateAllFormulas(); SafetySharpProbabilisticSimulator.Configuration.UseOptionProbabilitiesInSimulation = _config.UseRealProbabilitiesForSimulation; var simulator = new SafetySharpProbabilisticSimulator(_model, allFormulas.Values.ToArray()); using (var w = new StreamWriter(DataPath)) { w.WriteLine(string.Join(",", allVariables.Select(randomVariable => randomVariable.Name))); for (var currentStep = 0; currentStep < _numberOfSimulations; currentStep++) { if (_numberOfSimulations > 100 && currentStep % (_numberOfSimulations / 100) == 0) { Console.Out.WriteLine($"{(double)currentStep / _numberOfSimulations:P0} done."); } simulator.SimulateSteps(_stepBounds); var results = new bool[allVariables.Count]; for (var varIndex = 0; varIndex < allVariables.Count; varIndex++) { var currentVariable = allVariables[varIndex]; // cut sets cannot be checked for a given state, so check the occurence of its faults if (currentVariable is McsRandomVariable) { var cutSet = (McsRandomVariable)currentVariable; results[varIndex] = cutSet.FaultVariables.All(fault => simulator.GetCountOfSatisfiedOnTrace(allFormulas[fault]) > 0); } // check the occurence of the random variable else { results[varIndex] = simulator.GetCountOfSatisfiedOnTrace(allFormulas[currentVariable]) > 0; } } w.WriteLine(string.Join(",", results.Select(res => res ? 'T' : 'F'))); } w.Flush(); } return(DataPath); }