public void DccaTest(string modelFile, HeuristicsUsage heuristicsUsage, FaultActivationBehavior faultActivation) { var model = new ModelSetupParser().Parse($"Analysis/{modelFile}"); IFaultSetHeuristic[] heuristics; switch (heuristicsUsage) { case HeuristicsUsage.None: heuristics = new IFaultSetHeuristic[0]; break; case HeuristicsUsage.Subsumption: heuristics = new[] { new SubsumptionHeuristic(model.Faults) }; break; case HeuristicsUsage.Redundancy: heuristics = new[] { RedundancyHeuristic(model) }; break; default: case HeuristicsUsage.Both: heuristics = new[] { new SubsumptionHeuristic(model.Faults), RedundancyHeuristic(model) }; break; } Dcca(model, faultActivation, heuristics); }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="createModel">The creator for the model that should be checked.</param> /// <param name="hazard">The hazard the analysis was conducated for.</param> /// <param name="suppressedFaults">The faults whose activations have been completely suppressed during analysis.</param> /// <param name="forcedFaults">The faults whose activations have been forced during analysis.</param> /// <param name="heuristics">The heuristics that are used during the analysis.</param> /// <param name="activationBehavior">The fault acitvation behavior used during the analysis.</param> internal SafetyAnalysisResults(CoupledExecutableModelCreator <TExecutableModel> createModel, Formula hazard, IEnumerable <Fault> suppressedFaults, IEnumerable <Fault> forcedFaults, IEnumerable <IFaultSetHeuristic> heuristics, FaultActivationBehavior activationBehavior) { RuntimeModelCreator = createModel; Hazard = hazard; SuppressedFaults = suppressedFaults; ForcedFaults = forcedFaults; Heuristics = heuristics.ToArray(); // make a copy so that later changes to the heuristics don't affect the results FaultActivationBehavior = activationBehavior; }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="model">The <see cref="Model" /> instance the safety analysis was conducted for.</param> /// <param name="hazard">The hazard the analysis was conducated for.</param> /// <param name="suppressedFaults">The faults whose activations have been completely suppressed during analysis.</param> /// <param name="forcedFaults">The faults whose activations have been forced during analysis.</param> /// <param name="heuristics">The heuristics that are used during the analysis.</param> /// <param name="activationBehavior">The fault acitvation behavior used during the analysis.</param> internal SafetyAnalysisResults(ModelBase model, Formula hazard, IEnumerable<Fault> suppressedFaults, IEnumerable<Fault> forcedFaults, IEnumerable<IFaultSetHeuristic> heuristics, FaultActivationBehavior activationBehavior) { Model = model; Hazard = hazard; SuppressedFaults = suppressedFaults; ForcedFaults = forcedFaults; Heuristics = heuristics.ToArray(); // make a copy so that later changes to the heuristics don't affect the results FaultActivationBehavior = activationBehavior; }
private void Dcca(Model model, FaultActivationBehavior activation, params IFaultSetHeuristic[] heuristics) { var modelChecker = new SafetySharpSafetyAnalysis { Configuration = { ModelCapacity = new ModelCapacityByModelDensity(1 << 16, ModelDensityLimit.Medium), CpuCount = 4, GenerateCounterExample = false } }; modelChecker.Heuristics.AddRange(heuristics); modelChecker.FaultActivationBehavior = activation; var result = modelChecker.ComputeMinimalCriticalSets(model, model.ObserverController.Unsatisfiable); Console.WriteLine(result); Assert.AreEqual(0, result.Exceptions.Count); }
public void ForcedActivationIncompleteDcca( [Values(FaultActivationBehavior.ForceOnly, FaultActivationBehavior.Nondeterministic)] FaultActivationBehavior activation) { // create stations var producer = new ContainerLoader(); var commonDispenser = new ParticulateDispenser(); var dispenserTop = new ParticulateDispenser(); var dispenserBottom = new ParticulateDispenser(); var consumerTop = new PalletisationStation(); var consumerBottom = new PalletisationStation(); var stations = new Station[] { producer, commonDispenser, dispenserTop, dispenserBottom, consumerTop, consumerBottom }; // set very limited ingredient amounts commonDispenser.SetStoredAmount(IngredientType.BlueParticulate, 40); dispenserTop.SetStoredAmount(IngredientType.RedParticulate, 100); dispenserBottom.SetStoredAmount(IngredientType.RedParticulate, 100); // create connections producer.Outputs.Add(commonDispenser); commonDispenser.Inputs.Add(producer); commonDispenser.Outputs.Add(dispenserTop); dispenserTop.Inputs.Add(commonDispenser); commonDispenser.Outputs.Add(dispenserBottom); dispenserBottom.Inputs.Add(commonDispenser); dispenserTop.Outputs.Add(consumerTop); consumerTop.Inputs.Add(dispenserTop); dispenserBottom.Outputs.Add(consumerBottom); consumerBottom.Inputs.Add(dispenserBottom); var model = new Model(stations, new FastObserverController(stations)); var recipe = new Recipe(new[] { new Ingredient(IngredientType.BlueParticulate, 30), new Ingredient(IngredientType.RedParticulate, 10) }, 1u); model.ScheduleProduction(recipe); Dcca(model, activation); }
private void Dcca(Model model, FaultActivationBehavior activation, params IFaultSetHeuristic[] heuristics) { var modelChecker = new SafetyAnalysis { Configuration = { StateCapacity = 1 << 16, CpuCount = 4, GenerateCounterExample = false } }; modelChecker.Heuristics.AddRange(heuristics); modelChecker.FaultActivationBehavior = activation; var result = modelChecker.ComputeMinimalCriticalSets(model, model.ObserverController.Unsatisfiable); Console.WriteLine(result); Assert.AreEqual(0, result.Exceptions.Count); }
private static bool IsTestCaseFast(string model, ModelCheckingTests.HeuristicsUsage heuristicsUsage, FaultActivationBehavior faultActivation) { if (model == "complete_network.model" || model == "complex_setup.model" || model == "medium_setup.model") { return(false); } if (model == "medium_setup.model" && heuristicsUsage != ModelCheckingTests.HeuristicsUsage.None) { return(true); } if (model == "simple_setup.model" || model == "duplicate_dispenser.model" || model == "trivial_setup.model" || model == "simple_circle.model") { return(true); } if (faultActivation != FaultActivationBehavior.ForceOnly || heuristicsUsage == ModelCheckingTests.HeuristicsUsage.None) { return(false); } return(true); }