/// <summary> /// Thread a sequence of integer through an ABruijn Graph /// </summary> /// <param name="sequence">sequence wanted to thread</param> public void ThreadSequence(IList <int> sequence) { _sequence = sequence; _workingSequence.AddList(sequence); //把List转换成单链表 _sourceSequence.AddList(sequence); //把List转换成单链表 IList <Node <int> > _workingMembers = _workingSequence.GetMembers(); IList <Node <int> > _sourceMembers = _sourceSequence.GetMembers(); IList <IList <Node <int> > > sourceSequencesChrs = new List <IList <Node <int> > >(); //获得原序列对应的坐标 IList <Node <int> > chr = new List <Node <int> >(); for (int i = 1; i < _sourceMembers.Count - 1; i++) { if (_sourceMembers[i].Value >= 0) { chr.Add(_sourceMembers[i]); } else { sourceSequencesChrs.Add(chr); chr = new List <Node <int> >(); while (i < _sourceMembers.Count && _sourceMembers[i].Value < 0) { i++; } i--; } } sourceSequencesChrs.Add(chr); //拆分成Chrs for (int i = 0; i < sourceSequencesChrs.Count; i++) { for (int j = 0; j < sourceSequencesChrs[i].Count; j++) { _nodeToIndex.Add(sourceSequencesChrs[i][j], new Pair <int>(i, j)); } } for (int i = 0; i < _workingMembers.Count; i++) //生成map { _workToSource.Add(_workingMembers[i], _sourceMembers[i]); } _graph = GenerateGraph(_workingSequence); _graphTool.setWorkToSource(_workToSource); }
/// <summary> /// Generate a mapping from NodeValue to all nodes that has that value. /// </summary> /// <param name="sequence">An Eulerian sequences of programmed Nodes</param> /// <returns></returns> private static IDictionary <int, IList <Node <int> > > GenerateGraph(SimpleLinkList <int> sequence) { IDictionary <int, IList <Node <int> > > nodeListByValue = new Dictionary <int, IList <Node <int> > >(); foreach (Node <int> node in sequence.GetMembers()) //反射获取sequence的成员是个list的keyValue对,遍历这个list { if (nodeListByValue.ContainsKey(node.Value)) //键是node的值,也就是sequence的值,就是基因 { nodeListByValue[node.Value].Add(node); //字典把相同基因,加入list变成一条链 } else { nodeListByValue.Add(node.Value, new List <Node <int> > { node }); } } Console.Out.WriteLine("Nodes: " + nodeListByValue.Count); //统计一共多少基因 return(nodeListByValue); }