public bool NewLink(AtomNode from, AtomNode to) { bool link = from.AtomId != to.AtomId; if (link) { this.LinkEdges.Add(new LinkEdge(from, to)); } return(link); }
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); }
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)); } } }
public LinkEdge(AtomNode from, AtomNode to) { this.From = from; this.To = to; }
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."); } }