Exemple #1
0
        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);
        }