Example #1
0
        public bool NewLink(AtomNode from, AtomNode to)
        {
            bool link = from.AtomId != to.AtomId;

            if (link)
            {
                this.LinkEdges.Add(new LinkEdge(from, to));
            }
            return(link);
        }
Example #2
0
        public List <LinkEdge> GetAllLinksFromAtom(AtomNode atom)
        {
            var links    = this.LinkEdges.Where(x => x.From.AtomId == atom.AtomId).ToList();
            var outLinks = this.LinkEdges.Where(x => x.To.AtomId == atom.AtomId);

            foreach (var link in outLinks)
            {
                links.Add(new LinkEdge(link.To, link.From));
            }
            return(links);
        }
Example #3
0
 private void GenerateRandomLinks()
 {
     if (this.AtomNodes != null)
     {
         while (this.LinkEdges.Count < this.MaxLinksCounter)
         {
             AtomNode fromAtom = null;
             AtomNode toAtom   = null;
             do
             {
                 fromAtom = this.AtomNodes[_random.Next(this.AtomNodes.Count)];
                 toAtom   = this.AtomNodes[_random.Next(this.AtomNodes.Count)];
             } while (!this.NewLink(fromAtom, toAtom));
         }
     }
 }
Example #4
0
 public LinkEdge(AtomNode from, AtomNode to)
 {
     this.From = from;
     this.To   = to;
 }
Example #5
0
        public void ReorganizeLinks()
        {
            var      newLinks     = new List <LinkEdge>();
            var      queue        = new Queue <AtomNode>();
            var      stack        = new Stack <LinkEdge>(this.LinkEdges);
            var      stackedLinks = new List <string>();
            var      fail         = 0;
            AtomNode lastAtom     = null;

            stack.Push(this.LinkEdges.FirstOrDefault());
            while (stack.Count > 0)
            {
                var link = stack.Pop();
                if (!stackedLinks.Contains(link.ToString()))
                {
                    if (lastAtom == null)
                    {
                        lastAtom = link.From;
                        queue.Enqueue(lastAtom);
                    }

                    var sameLinks = this.LinkEdges.Where(x =>
                                                         (x.From.AtomId == link.From.AtomId && x.To.AtomId == link.To.AtomId) ||
                                                         (x.From.AtomId == link.To.AtomId && x.To.AtomId == link.From.AtomId)
                                                         ).ToList();

                    if (link.From.AtomId == lastAtom.AtomId)
                    {
                        fail = 0;
                        foreach (var item in sameLinks)
                        {
                            newLinks.Add(new LinkEdge(link.From, link.To));
                            stackedLinks.Add(item.ToString());
                        }
                        lastAtom = link.To;
                    }
                    else if (link.To.AtomId == lastAtom.AtomId)
                    {
                        fail = 0;
                        foreach (var item in sameLinks)
                        {
                            newLinks.Add(new LinkEdge(link.To, link.From));
                            stackedLinks.Add(item.ToString());
                        }
                        lastAtom = link.From;
                    }
                    else
                    {
                        lastAtom = queue.Dequeue();
                        queue.Enqueue(lastAtom);
                        stack.Push(link);
                        fail++;

                        if (fail >= queue.Count)
                        {
                            var alternativeLink = this.LinkEdges.Where(x => !stackedLinks.Contains(x.ToString())).DefaultIfEmpty()
                                                  .FirstOrDefault(x => x.From.AtomId == lastAtom.AtomId || x.To.AtomId == lastAtom.AtomId);
                            if (alternativeLink != null)
                            {
                                stack.Push(alternativeLink);
                            }
                        }

                        continue;
                    }

                    if (!queue.Any(x => x.AtomId == lastAtom.AtomId))
                    {
                        queue.Enqueue(lastAtom);
                    }

                    var toStack = this.LinkEdges.Where(x => x.From.AtomId == lastAtom.AtomId || x.To.AtomId == lastAtom.AtomId).ToList();
                    toStack.RemoveAll(x =>
                                      (x.From.AtomId == link.From.AtomId && x.To.AtomId == link.To.AtomId) ||
                                      (x.From.AtomId == link.To.AtomId && x.To.AtomId == link.From.AtomId)
                                      );
                    foreach (var item in toStack)
                    {
                        stack.Push(item);
                    }
                }
            }
            if (newLinks.Count == this.LinkEdges.Count)
            {
                this.LinkEdges = newLinks;
            }
            else
            {
                throw new Exception("Erro ao reorganizar links.");
            }
        }