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);
 }