private void CollapsCluster(ClusterNodeModel clusterNodeModel)
        {
            // if(!clusterNodeModel.IsExpanded || clusterNodeModel.ParrentCluster == null) { return; }

            ClusterNodeModel clusterNode;

            if (clusterNodeModel.IsExpanded && !clusterNodeModel.IsLiefNode)
            {
                clusterNode = clusterNodeModel;
            }
            else
            {
                clusterNode = clusterNodeModel.ParrentCluster;
            }

            clusterNode.IsExpanded = false;
            clusterNode.IsLiefNode = true;

            var clusterChildren = clusterNode.Cluster.Children == null? clusterNode.Cluster.FlattenChildren:  clusterNode.Cluster.FlattenChildren.Concat(clusterNode.Cluster.Children);

            if (!clusterChildren.IsNullOrEmpty())
            {
                foreach (var node in this.Nodes.ToArray())
                {
                    if (clusterChildren.Contains(node.Cluster))
                    {
                        this.Nodes.Remove(node);
                    }
                }
            }
            this.UpdatePrecMeter();
        }
        private void InitializeClusters(ApplicationProtocolClassificationStatisticsMeter precMeasure)
        {
            if (this.PrecMeasure == precMeasure)
            {
                return;
            }
            var cluesters = this.AppIdentMainVm.AppProtoModelEval.ApplicationProtocolModelsHierachivalClustering();

            this.Nodes.Clear();

            if (cluesters == null)
            {
                return;
            }

            foreach (var cluster in cluesters)
            {
                cluster.UpdateStatistics(precMeasure);
                var clusterNode = new ClusterNodeModel
                {
                    Cluster = cluster
                };
                clusterNode.ParrentCluster = clusterNode;
                this.Nodes.Add(clusterNode);
            }
        }
        private void ExpandCluster(ClusterNodeModel clusterNodeModel)
        {
            if (clusterNodeModel.IsExpanded)
            {
                return;
            }
            clusterNodeModel.IsExpanded = true;
            clusterNodeModel.IsLiefNode = false;


            var clusterChildren = clusterNodeModel.Cluster.Children;

            if (!clusterChildren.IsNullOrEmpty())
            {
                var newClusterNodes = new List <ClusterNodeModel>();
                foreach (var cluster in clusterChildren)
                {
                    var clusterNode = new ClusterNodeModel
                    {
                        Cluster        = cluster,
                        ParrentCluster = clusterNodeModel
                    };
                    this.Nodes.Add(clusterNode);
                    newClusterNodes.Add(clusterNode);
                }
                foreach (var clusterNode in newClusterNodes)
                {
                    clusterNode.Connections.Add(new ConnectionModel
                    {
                        Target = clusterNodeModel
                    });
                    clusterNodeModel.Connections.Add(new ConnectionModel
                    {
                        Target = clusterNode
                    });
                }
            }

            this.UpdatePrecMeter();
        }
        private void RecalculateNodes(ClusterNodeModel parrent, ITrieNode <char, SIPMsg> current, int depth)
        {
            if (depth <= 0)
            {
                return;
            }
            var node = new ClusterNodeModel();

            while (true)
            {
                node.Label += current.KeyBit;
                if (current.Count == 1)
                {
                    current = current.Children.First();
                }
                else
                {
                    break;
                }
            }
            node.Label = ReverseString(node.Label);
            if (parrent != null)
            {
                node.Connections.Add(new ConnectionModel
                {
                    Target = parrent
                });
                parrent.Connections.Add(new ConnectionModel
                {
                    Target = node
                });
            }
            this.PrepareNodes.Add(node);
            foreach (var descendant in current.Children)
            {
                this.RecalculateNodes(node, descendant, depth - 1);
            }
        }