예제 #1
0
        /// <summary>
        /// Gets sequence 1, the first vertices right after the start vertex with a maximum of n.
        /// </summary>
        public static uint[] GetSequence1 <T>(this EdgePath <T> path, DirectedDynamicGraph.EdgeEnumerator enumerator, int n)
            where T : struct
        {
            if (path.From == null)
            {
                return(Constants.EMPTY_SEQUENCE);
            }

            var s = new List <uint>();

            s.Add(path.Vertex);
            while (true)
            {
                if (path.IsOriginal(enumerator))
                { // current segment is original.
                    if (s == null)
                    {
                        s = new List <uint>();
                    }
                    if (path.From.From != null)
                    { // we need more vertices and there are some more available.
                        s.Add(path.From.Vertex);
                        path = path.From;
                    }
                    else
                    { // we have enough.
                        var result = s.ToArray();
                        if (n < result.Length)
                        { // TODO: this can be way more efficient by creating only one array.
                            result = result.SubArray(result.Length - n, n);
                        }
                        result.Reverse();
                        return(result);
                    }
                }
                else
                { // not an original edge, just return the start sequence.
                    var sequence = enumerator.GetSequence1();
                    if (path.From.From == null)
                    {
                        if (sequence.Length > n)
                        {
                            sequence = sequence.SubArray(sequence.Length - n, n);
                        }
                        return(sequence);
                    }
                    s.Clear();
                    sequence.Reverse();
                    s.AddRange(sequence);
                    s.Add(path.From.Vertex);
                    path = path.From;
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Gets sequence 2, the last vertices right before the end vertex with a maximum of n.
        /// </summary>
        public static uint[] GetSequence2 <T>(this EdgePath <T> path, DirectedDynamicGraph.EdgeEnumerator enumerator, int n)
            where T : struct
        {
            if (path.From == null)
            {
                return(Constants.EMPTY_SEQUENCE);
            }

            List <uint> s = null;

            while (true)
            {
                if (path.IsOriginal(enumerator))
                { // current segment is original.
                    if (s == null)
                    {
                        s = new List <uint>();
                    }
                    s.Add(path.From.Vertex);
                    if (s.Count < n && path.From.From != null)
                    { // we need more vertices and there are some more available.
                        path = path.From;
                    }
                    else
                    { // we have enough.
                        var result = s.ToArray();
                        result.Reverse();
                        return(result);
                    }
                }
                else
                { // not an original edge, just return the start sequence.
                    if (s != null)
                    {
                        var s2     = enumerator.GetSequence2();
                        var result = new uint[s.Count + s2.Length];
                        for (var i = 0; i < s.Count; i++)
                        {
                            result[result.Length - 1 - i] = s[i];
                        }
                        for (var i = 0; i < s2.Length; i++)
                        {
                            result[i] = s2[i];
                        }
                        return(result);
                    }
                    return(enumerator.GetSequence2());
                }
            }
        }