示例#1
0
        private void EditorDownGate(FrameworkElement sender)
        {
            FaultTreeNode vertex;

            switch (this.EditorMode)
            {
            case VisualEditorMode.MODE_ADD_AND_GATE:
                vertex = new FaultTreeAndGateNode(this.ViewModel.FaultTree.NextId());
                break;

            case VisualEditorMode.MODE_ADD_OR_GATE:
                vertex = new FaultTreeOrGateNode(this.ViewModel.FaultTree.NextId());
                break;

            case VisualEditorMode.MODE_ADD_BASIC_EVENT:
                FaultTreeTerminalNode node = sender.DataContext as FaultTreeTerminalNode;
                if (node != null)
                {
                    vertex = new FaultTreeTerminalNode(this.ViewModel.FaultTree.NextId(), this.ViewModel.FaultTree.NextBasicEvent());
                    this.ViewModel.FaultTree.MarkovChain.InitialDistribution[(FaultTreeTerminalNode)vertex] = 1.0;
                    this.ViewModel.FaultTree.MarkovChain[node, (FaultTreeTerminalNode)vertex] = 1.0;
                    this.ViewModel.FaultTree.MarkovChain[(FaultTreeTerminalNode)vertex, node] = 1.0;
                    this.ViewModel.RaisePropertyChanged("FaultTree");
                    this.EditorMode = VisualEditorMode.MODE_VIEW_ONLY;
                    return;
                }
                vertex = new FaultTreeTerminalNode(this.ViewModel.FaultTree.NextId(), this.ViewModel.FaultTree.NextBasicEvent());
                this.ViewModel.FaultTree.MarkovChain.InitialDistribution[(FaultTreeTerminalNode)vertex] = 1.0;
                break;

            default:
                return;
            }

            this.ViewModel.NewEdgeStart = (FaultTreeNode)sender.DataContext;
            this.ViewModel.NewEdgeEnd   = vertex;
            this.ViewModel.CreateEdge();
            this.EditorMode = VisualEditorMode.MODE_VIEW_ONLY;
        }
示例#2
0
 /// <summary>
 /// The transform.
 /// </summary>
 /// <param name="terminal">
 /// The terminal.
 /// </param>
 /// <returns>
 /// The <see cref="int"/>.
 /// </returns>
 public override int Transform(FaultTreeTerminalNode terminal)
 {
     return(terminal.Label);
 }
        public override FaultTree Read(FileStream stream)
        {
            var sr = new StreamReader(stream);

            //Preprocess lines to remove .dot structures and split information into single lines
            List <string> lines = sr.ReadToEnd().Split('\n').ToList();

            lines = lines.Where(line => !string.IsNullOrWhiteSpace(line)).ToList().GetRange(1, lines.Count - 2).SelectMany(l => l.Split(';')).Where(l => !l.Trim().Equals("")).ToList();

            //Create datastructures to store parsed tokens
            var symbols = from line in lines
                          from pattern in PatternMatcher
                          where pattern.IsMatch(line.Trim())
                          select new { Token = PatternMatcher.IndexOf(pattern), Information = pattern.Match(line.Trim()) };

            //Group symbols be their token (allows for simplified FT construction)
            var symbolGroup = from symbol in symbols
                              orderby symbol.Token
                              group symbol by symbol.Token;

            Debug.Assert(symbolGroup.Count(g => g.Key == (int)DotParseToken.DOT_ROOT) == 1);

            //Extract different node types
            var rootNode = (from r in symbolGroup.FirstOrDefault(g => g.Key == (int)DotParseToken.DOT_ROOT)
                            select FaultTreeNodeFactory.GetInstance().CreateGateNode(int.Parse(r.Information.Groups["id"].Value), FaultTreeNodeFactory.FaultTreeGateOperator.FAULT_TREE_OPERATOR_AND) as FaultTreeNode).ToList();

            var terminals = (from symbol in symbolGroup.FirstOrDefault(g => g.Key == (int)DotParseToken.DOT_IDENTIFIER)
                             select new FaultTreeTerminalNode(int.Parse(symbol.Information.Groups["id"].Value), int.Parse(symbol.Information.Groups["label"].Value))).ToList();

            var gates = (from symbol in symbolGroup.FirstOrDefault(g => g.Key == (int)DotParseToken.DOT_GATE)
                         select FaultTreeNodeFactory.GetInstance().CreateGateNode(int.Parse(symbol.Information.Groups["id"].Value), symbol.Information.Groups["operator"].Value) as FaultTreeNode).ToList();

            //Union on all nodes
            var nodes = (from t in terminals select new { t.ID, Node = (FaultTreeNode)t }).Union(from g in gates select new { g.ID, Node = g }).Union(from r in rootNode select new { r.ID, Node = r }).OrderBy(n => n.ID).ToList();


            (from trans in symbolGroup.FirstOrDefault(g => g.Key == (int)DotParseToken.DOT_TRANSITION)
             let f = nodes[int.Parse(trans.Information.Groups["from"].Value)]
                     let t = nodes[int.Parse(trans.Information.Groups["to"].Value)]
                             select new { From = f, To = t }).ToList().ForEach(trans => trans.From.Node.Childs.Add(trans.To.Node));

            MarkovChain <FaultTreeTerminalNode> markovChain = new MarkovChain <FaultTreeTerminalNode>(terminals.Count);

            terminals.ForEach(terminal => markovChain.InitialDistribution[terminal] = 0.0d);

            if (symbolGroup.FirstOrDefault(g => g.Key == (int)DotParseToken.DOT_MARKOV_TRANSITION)?.Any() ?? false)
            {
                (from trans in symbolGroup.FirstOrDefault(g => g.Key == (int)DotParseToken.DOT_MARKOV_TRANSITION)
                 let f = nodes[int.Parse(trans.Information.Groups["from"].Value)].Node as FaultTreeTerminalNode
                         let t = nodes[int.Parse(trans.Information.Groups["to"].Value)].Node as FaultTreeTerminalNode
                                 let r = trans.Information.Groups["rate"].Value
                                         select new { From = f, To = t, Rate = r }).ToList().ForEach(trans => markovChain[trans.From, trans.To] = double.Parse(trans.Rate));
            }

            if (symbolGroup.FirstOrDefault(g => g.Key == (int)DotParseToken.DOT_IMPLICIT_CHAIN)?.Any() ?? false)
            {
                int newLabel = terminals.Max(n => n.Label) + 1;
                int newID    = nodes.Max(n => n.ID) + 1;

                var markovChainGroup = symbolGroup.FirstOrDefault(g => g.Key == (int)DotParseToken.DOT_IMPLICIT_CHAIN);
                if (markovChainGroup != null)
                {
                    foreach (var implicitChain in markovChainGroup)
                    {
                        var newNode      = new FaultTreeTerminalNode(newID, newLabel);
                        var existingNode = terminals.First(t => t.ID == int.Parse(implicitChain.Information.Groups["id"].Value));

                        markovChain[newNode, existingNode]       = double.Parse(implicitChain.Information.Groups["lambda"].Value);
                        markovChain[existingNode, newNode]       = double.Parse(implicitChain.Information.Groups["mu"].Value);
                        markovChain.InitialDistribution[newNode] = 1.0d;
                    }
                }
            }


            return(new FaultTree(rootNode.ElementAt(0).Childs.ElementAt(0), markovChain));
        }
 /// <summary>
 /// The transform.
 /// </summary>
 /// <param name="terminal">
 /// The terminal.
 /// </param>
 /// <returns>
 /// The <see cref="FaultTreeNode"/>.
 /// </returns>
 public override FaultTreeNode Transform(FaultTreeTerminalNode terminal)
 {
     return(terminal.Label == this.label ? this.CreateNode(new FaultTreeLiteralNode(terminal, this.value)) : this.CreateNode(new FaultTreeTerminalNode(terminal)));
 }
示例#5
0
 /// <summary>
 /// The transform.
 /// </summary>
 /// <param name="terminal">
 /// The terminal.
 /// </param>
 /// <returns>
 /// The <see cref="FaultTreeNode"/>.
 /// </returns>
 public override FaultTreeNode Transform(FaultTreeTerminalNode terminal)
 {
     return(this.CreateNode(new FaultTreeTerminalNode(terminal)));
 }
 /// <summary>
 /// The transform overwritten by <see cref="FaultTreeTerminalNode"/>.
 /// </summary>
 /// <param name="terminal">
 /// The terminal.
 /// </param>
 /// <returns>
 /// The <see>
 ///         <cref>T</cref>
 ///     </see>
 ///     .
 /// </returns>
 public abstract T Transform(FaultTreeTerminalNode terminal);
示例#7
0
 /// <summary>
 /// The transform.
 /// </summary>
 /// <param name="terminal">
 /// Terminal node to be transformed.
 /// </param>
 /// <returns>
 /// The <see cref="FaultTreeNode"/>.
 /// </returns>
 public override FaultTreeNode Transform(FaultTreeTerminalNode terminal)
 {
     return(this.CreateNode(new FaultTreeTerminalNode(terminal.ID, terminal.Label + this.factor)));
 }