Exemplo n.º 1
0
        public void CreateFromFibTable(FibTable table)
        {
            Root = new FibTreeNode(null);
            Labels.Clear();

            foreach (FibEntry entry in table)
            {
                FibTreeNode node = Root;
                for (int i = 0; i < entry.BinaryForm.Length; i++)
                {
                    int edgeLabel = entry.BinaryForm[i] - (int)'0';
                    if (node.GetChild(edgeLabel) == null)
                    {
                        node.AddChild(edgeLabel);
                    }
                    node = node.GetChild(edgeLabel);
                }

                FibTreeLabel label = Labels.GetLabelByNextHop(entry.NextHop);
                if (label == null)
                {
                    label = Labels.AddLabelForNextHop(entry.NextHop);
                }
                node.Label = label;
            }

            TreeChanged?.Invoke();
        }
Exemplo n.º 2
0
        private void addChildrenWithStride(FibTreeNode to, FibTreeNode from, Dictionary <FibTreeNode, CompressData> compressData)
        {
            if (from.Label != null)
            {
                FibTreeLabel label = Labels.GetLabelByNextHop(from.Label.NextHop);
                if (label == null)
                {
                    label = Labels.AddLabelForNextHop(from.Label.NextHop);
                }
                to.Label = label;
            }

            if (from.Children.Count == 0)
            {
                return;
            }

            List <FibTreeNode> childrenToAdd = from.GetChildrenAtLevel(compressData[from].OptimalStride);

            foreach (FibTreeNode childToAdd in childrenToAdd)
            {
                FibTreeNode newNode = to.AddChild(getConcatenatedEdgeLabelBetweenNodes(from, childToAdd));
                addChildrenWithStride(newNode, childToAdd, compressData);
            }
        }
Exemplo n.º 3
0
 public FibTreeNode AddChild(int edgeLabel, FibTreeLabel nodeLabel = null)
 {
     if ((edgeLabel == 0) || (edgeLabel == 1))
     {
         return(AddChild(string.Format("{0}", edgeLabel), nodeLabel));
     }
     throw new Exception("Invalid integer edge label, only 0 and 1 are supported!");
 }
Exemplo n.º 4
0
        private void copyNodeAndChildrens(FibTreeNode to, FibTreeNode from)
        {
            foreach (KeyValuePair <string, FibTreeNode> child in from.Children)
            {
                FibTreeNode newNode = to.AddChild(child.Key);
                copyNodeAndChildrens(newNode, child.Value);
            }

            if (from.Label != null)
            {
                FibTreeLabel label = Labels.GetLabelByNextHop(from.Label.NextHop);
                if (label == null)
                {
                    label = Labels.AddLabelForNextHop(from.Label.NextHop);
                }
                to.Label = label;
            }
        }
Exemplo n.º 5
0
        public FibTreeNode AddChild(string edgeLabel, FibTreeLabel nodeLabel = null)
        {
            if (Children.ContainsKey(edgeLabel))
            {
                throw new Exception("This node already contains a child with this edge label!");
            }
            if (EdgeLabelLength == null)
            {
                EdgeLabelLength = edgeLabel.Length;
            }
            if (edgeLabel.Length != EdgeLabelLength)
            {
                throw new Exception(string.Format("Edge labels in this node must be {0} character(s) long.", EdgeLabelLength));
            }
            FibTreeNode newNode = new FibTreeNode(this);

            newNode.Label = nodeLabel;
            Children.Add(edgeLabel, newNode);
            return(newNode);
        }
Exemplo n.º 6
0
        private void normalize_CreateLeaves(FibTreeNode node, FibTreeLabel nearestLabel)
        {
            if (node.Children.Count == 0)
            {
                return;
            }

            if (node.Label != null)
            {
                nearestLabel = node.Label;
            }

            if (node.Children.Count == 1)
            {
                string notExistingEdgeLabel = string.Format("{0}", (int)'1' - (int)node.Children.ToList()[0].Key[0]);
                node.AddChild(notExistingEdgeLabel, nearestLabel);
            }

            normalize_CreateLeaves(node.GetChild(0), nearestLabel);
            normalize_CreateLeaves(node.GetChild(1), nearestLabel);
        }