/// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public Digraph Extract()
        {
            if (_model == null)
            {
                Initialize();
            }

            var g0 = _tileGraph.Graph;
            var g1 = new Digraph(g0.VertexCount);

            for (int v0 = 0; v0 < g0.VertexCount; v0++)
            {
                g1.AddVertex();
            }
            var n = _map.TileDegree;

            for (int v0 = 0; v0 < g0.VertexCount; v0++)
            {
                var tile = _model.GetAssigned(v0);

                for (int i = 0; i < n; i++)
                {
                    var label = _map.GetLabel(i, tile);

                    if (label != "0")
                    {
                        int v1 = g0.GetVertexNeighborOut(v0, i);
                        g1.AddEdge(v0, v1);
                    }
                }
            }

            return(g1);
        }
        /// <summary>
        ///
        /// </summary>
        public Digraph Extract()
        {
            // https://en.wikipedia.org/wiki/Single_responsibility_principle

            if (_model == null)
            {
                Initialize();
            }

            var g0 = _tileGraph.Graph;
            var g1 = new Digraph(g0.VertexCount);
            var n  = _map.TileDegree;

            for (int v0 = 0; v0 < g0.VertexCount; v0++)
            {
                g1.AddVertex();
                var tile = _model.GetAssigned(v0);

                for (int i = 0; i < n; i++)
                {
                    var label = _map.GetLabel(i, tile);

                    if (_labelSet.Contains(label))
                    {
                        var v1 = _tileGraph.Graph.GetVertexNeighborOut(v0, i);
                        if (v0 != v1)
                        {
                            g1.AddEdge(v0, v1);
                        }
                    }
                }
            }

            return(g1);
        }
        /// <summary>
        ///
        /// </summary>
        public Digraph Extract()
        {
            if (_model == null)
            {
                Initialize();
            }

            var g0 = _tileGraph.Graph;
            var g1 = new Digraph(g0.VertexCount);

            for (int i = 0; i < g0.VertexCount; i++)
            {
                var tile = _model.GetAssigned(i);
                var n    = _map.TileDegree;

                for (int j = 0; j < n; j++)
                {
                    var label = _map.GetLabel(j, tile);

                    if (_labelSet.Contains(label))
                    {
                        g1.AddEdge(i, j);
                    }
                }
            }

            return(g0);
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public Digraph Extract()
        {
            if (_model == null)
            {
                Initialize();
            }

            var g0 = _tileGraph.Graph;
            var g1 = new Digraph(g0.VertexCount);

            for (int v0 = 0; v0 < g0.VertexCount; v0++)
            {
                g1.AddVertex();
            }
            var n = _map.TileDegree;

            for (int v0 = 0; v0 < g0.VertexCount; v0++)
            {
                var tile = _model.GetAssigned(v0);

                if (_applyTileFilter == true && _ignoreTiles.Contains(tile))
                {
                    continue;
                }

                for (int i = 0; i < n; i++)
                {
                    var label = _map.GetLabel(i, tile);

                    if (_labelSet.Contains(label))
                    {
                        int v1 = g0.GetVertexNeighborOut(v0, i);
                        g1.AddEdge(v0, v1);
                    }
                }
            }

            return(g1);
        }