Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }