コード例 #1
0
        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);
        }
コード例 #2
0
        protected override void Check()
        {
            var components = Enumerable.Range(0, componentCount).Select(i => new C()).ToArray();
            var model      = TestModel.InitializeModel(components);

            // heuristics are called appropriately
            var counter = new CountingHeuristic();

            Heuristics = new[] { counter };

            var result = Dcca(model, false);

            result.IsComplete.ShouldBe(true);
            result.Exceptions.ShouldBeEmpty();
            result.MinimalCriticalSets.ShouldBeEmpty();
            result.CheckedSets.Count.ShouldBe(1 << model.Faults.Length);
            counter.setCounter.ShouldBe((ulong)result.CheckedSets.Count);
            counter.cardinalityCounter.ShouldBe(model.Faults.Length + 1);

            // redundancy heuristic works properly
            Heuristics = new[] { new MinimalRedundancyHeuristic(
                                     model.Faults,
                                     components.Select(c => c.F1),
                                     components.Select(c => c.F2)
                                     ) };

            result = Dcca(model, false);
            result.IsComplete.ShouldBe(true);
            result.Exceptions.ShouldBeEmpty();
            result.MinimalCriticalSets.ShouldBeEmpty();
            result.CheckedSets.Count.ShouldBe(47);
            ((ulong)result.CheckedSets.Count).ShouldBeLessThan(counter.setCounter);

            // subsumption heuristic is effective
            Heuristics = new[] { new SubsumptionHeuristic(model.Faults) };

            foreach (var c in components)
            {
                c.F1.Subsumes(c.F2);
            }

            result = Dcca(model, false);
            result.IsComplete.ShouldBe(true);
            result.Exceptions.ShouldBeEmpty();
            result.MinimalCriticalSets.ShouldBeEmpty();
            result.CheckedSets.Count.ShouldBe(81);
            ((ulong)result.CheckedSets.Count).ShouldBeLessThan(counter.setCounter);             // heuristic has effect

            // heuristics are called appropriately when combined
            counter    = new CountingHeuristic();
            Heuristics = new IFaultSetHeuristic[] { counter, new SubsumptionHeuristic(model.Faults) };

            result = Dcca(model, false);
            result.IsComplete.ShouldBe(true);
            result.Exceptions.ShouldBeEmpty();
            result.MinimalCriticalSets.ShouldBeEmpty();
            counter.cardinalityCounter.ShouldBe(model.Faults.Length + 1);
            result.CheckedSets.Count.ShouldBeLessThan(1 << model.Faults.Length);
            counter.setCounter.ShouldBeGreaterThanOrEqualTo((ulong)result.CheckedSets.Count);
        }
コード例 #3
0
		protected override void Check()
		{
			var components = Enumerable.Range(0, componentCount).Select(i => new C()).ToArray();
			var model = TestModel.InitializeModel(components);

			// heuristics are called appropriately
			var counter = new CountingHeuristic();
			Heuristics = new[] { counter };

			var result = Dcca(model, false);
			result.IsComplete.ShouldBe(true);
			result.Exceptions.ShouldBeEmpty();
			result.MinimalCriticalSets.ShouldBeEmpty();
			result.CheckedSets.Count.ShouldBe(1 << model.Faults.Length);
			counter.setCounter.ShouldBe((ulong)result.CheckedSets.Count);
			counter.cardinalityCounter.ShouldBe(model.Faults.Length + 1);

			// redundancy heuristic works properly
			Heuristics = new[] { new MinimalRedundancyHeuristic(
				model,
					components.Select(c => c.F1),
					components.Select(c => c.F2)
				)
			};

			result = Dcca(model, false);
			result.IsComplete.ShouldBe(true);
			result.Exceptions.ShouldBeEmpty();
			result.MinimalCriticalSets.ShouldBeEmpty();
			result.CheckedSets.Count.ShouldBe(47);
			((ulong)result.CheckedSets.Count).ShouldBeLessThan(counter.setCounter);

			// subsumption heuristic is effective
			Heuristics = new[] { new SubsumptionHeuristic(model) };

			foreach (var c in components)
				c.F1.Subsumes(c.F2);

			result = Dcca(model, false);
			result.IsComplete.ShouldBe(true);
			result.Exceptions.ShouldBeEmpty();
			result.MinimalCriticalSets.ShouldBeEmpty();
			result.CheckedSets.Count.ShouldBe(81);
			((ulong)result.CheckedSets.Count).ShouldBeLessThan(counter.setCounter); // heuristic has effect

			// heuristics are called appropriately when combined
			counter = new CountingHeuristic();
			Heuristics = new IFaultSetHeuristic[] { counter, new SubsumptionHeuristic(model) };

			result = Dcca(model, false);
			result.IsComplete.ShouldBe(true);
			result.Exceptions.ShouldBeEmpty();
			result.MinimalCriticalSets.ShouldBeEmpty();
			counter.cardinalityCounter.ShouldBe(model.Faults.Length + 1);
			result.CheckedSets.Count.ShouldBeLessThan(1 << model.Faults.Length);
			counter.setCounter.ShouldBeGreaterThanOrEqualTo((ulong)result.CheckedSets.Count);
		}
コード例 #4
0
		public void DccaTest(
			[Values("complete_network.model", "bidirectional_circle.model", "duplicate_dispenser.model", "simple_circle.model", "trivial_setup.model",
				"simple_setup.model", "simple_setup3.model", "simple_setup2.model", "medium_setup.model", "complex_setup.model")]
				string modelFile,
			[Values(HeuristicsUsage.None, HeuristicsUsage.Subsumption, HeuristicsUsage.Redundancy, HeuristicsUsage.Both)]
				HeuristicsUsage heuristicsUsage,
			[Values(FaultActivationBehavior.ForceOnly, FaultActivationBehavior.ForceThenFallback, FaultActivationBehavior.Nondeterministic)]
				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) };
					break;
				case HeuristicsUsage.Redundancy:
					heuristics = new[] { RedundancyHeuristic(model) };
					break;
				default:
				case HeuristicsUsage.Both:
					heuristics = new[] { new SubsumptionHeuristic(model), RedundancyHeuristic(model) };
					break;
			}
			Dcca(model, faultActivation, heuristics);
		}