public void SetAnalysisMode(AnalysisMode mode) { ObserverController.Mode = mode; var agents = ObserverController.Agents; switch (mode) { case AnalysisMode.TolerableFaults: agents.Select(agent => agent.ConfigurationUpdateFailed).SuppressActivations(); Workpieces.Select(workpiece => workpiece.IncorrectlyPositionedFault).SuppressActivations(); Workpieces.Select(workpiece => workpiece.ToolApplicationFailed).SuppressActivations(); Robots.Select(robot => robot.SwitchToWrongToolFault).SuppressActivations(); Carts.Select(cart => cart.Lost).SuppressActivations(); ObserverController.ReconfigurationFailure.SuppressActivation(); break; case AnalysisMode.IntolerableFaults: Faults.SuppressActivations(); agents.Select(agent => agent.ConfigurationUpdateFailed).MakeNondeterministic(); Workpieces.Select(workpiece => workpiece.IncorrectlyPositionedFault).MakeNondeterministic(); Workpieces.Select(workpiece => workpiece.ToolApplicationFailed).MakeNondeterministic(); Robots.Select(robot => robot.SwitchToWrongToolFault).MakeNondeterministic(); Carts.Select(cart => cart.Lost).MakeNondeterministic(); ObserverController.ReconfigurationFailure.MakeNondeterministic(); break; case AnalysisMode.AllFaults: return; default: throw new ArgumentOutOfRangeException(nameof(mode), mode, null); } }
private void CreateWorkpieces(int count, params Capability[] capabilities) { if (capabilities.Length > MaxProductionSteps) { throw new InvalidOperationException($"Too many production steps; increase '{MaxProductionSteps}'."); } var task = new Task(capabilities); Tasks.Add(task); for (var i = 0; i < count; ++i) { var workpiece = new Workpiece(capabilities.OfType <ProcessCapability>().Select(c => c.ProductionAction).ToArray()) { Name = $"W{Workpieces.Count}", IncorrectlyPositionedFault = { Name = $"W{Workpieces.Count}.IncorrectlyPositioned" }, ToolApplicationFailed = { Name = $"W{Workpieces.Count}.ToolApplicationFailed" }, }; Workpieces.Add(workpiece); Resources.Add(new Resource(task, workpiece)); } }