Ejemplo n.º 1
0
        static public double RayleighQuotient(Digraph G, double[] xs)
        {
            Debug.Assert(xs.Length == G.n);

            double denominator = Vector.L2Norm(xs);
            double numerator   = 0;

            for (int u = 0; u < G.n; u++)
            {
                foreach (var v in G.OutNeighbors[u])
                {
                    if (xs [u] > xs [v])
                    {
                        numerator += (xs [u] - xs [v]) * (xs [u] - xs [v]);
                    }
                }
            }
            return(numerator / denominator);
        }
Ejemplo n.º 2
0
        static public double[] Gradient(Digraph G, double[] xs)
        {
            Debug.Assert(xs.Length == G.n);

            var ys = Enumerable.Range(0, G.n).Select(
                u => xs [u] / Math.Sqrt(G.Degree(u))
                ).ToArray();

            var res = new double[G.n];

            for (int u = 0; u < G.n; u++)
            {
                res [u] = xs [u];
                foreach (var v in G.OutNeighbors[u])
                {
                    if (ys [u] > ys [v])
                    {
                        res [u] -= xs [v] / Math.Sqrt(G.Degree(u) * G.Degree(v));
                    }
                    else
                    {
                        res [u] -= xs [u] / G.Degree(u);
                    }
                }
                foreach (var v in G.InNeighbors[u])
                {
                    if (ys [u] < ys [v])
                    {
                        res [u] -= xs [v] / Math.Sqrt(G.Degree(u) * G.Degree(v));
                    }
                    else
                    {
                        res [u] -= xs [u] / G.Degree(u);
                    }
                }
            }
            for (int u = 0; u < G.n; u++)
            {
                res [u] = -res [u];
            }
            return(res);
        }
Ejemplo n.º 3
0
        static public double[] Iterate(Digraph G, double[] xs, double dt, List <double[]> Pi = null)
        {
            var dx = Gradient(G, xs);

            for (int u = 0; u < G.n; u++)
            {
                xs [u] = xs [u] + dx [u] * dt;
            }

            if (Pi != null)
            {
                foreach (var p in Pi)
                {
                    var dot = Vector.Dot(xs, p);
                    xs = Vector.Subtract(xs, Vector.Multiply(dot, p));
                }
            }
            xs = Vector.L2Normalize(xs);
            return(xs);
        }
Ejemplo n.º 4
0
        static public double[] Gradient(Digraph G, double[] xs)
        {
            Debug.Assert(xs.Length == G.n);

            var res = new double[G.n];

            for (int u = 0; u < G.n; u++)
            {
                res [u] = xs [u] * G.Degree(u);
                foreach (var v in G.OutNeighbors[u])
                {
                    if (xs [u] > xs [v])
                    {
                        res [u] -= xs [v];
                    }
                    else
                    {
                        res [u] -= xs [u];
                    }
                }
                foreach (var v in G.InNeighbors[u])
                {
                    if (xs [u] < xs [v])
                    {
                        res [u] -= xs [v];
                    }
                    else
                    {
                        res [u] -= xs [u];
                    }
                }
            }
            for (int u = 0; u < G.n; u++)
            {
                res [u] = -res [u];
            }
            return(res);
        }
Ejemplo n.º 5
0
        static public double RayleighQuotient(Digraph G, double[] xs)
        {
            Debug.Assert(xs.Length == G.n);

            double denominator = Vector.L2Norm(xs);
            double numerator   = 0;

            var ys = Enumerable.Range(0, G.n).Select(
                u => xs [u] / Math.Sqrt(G.Degree(u))
                ).ToArray();

            for (int u = 0; u < G.n; u++)
            {
                foreach (var v in G.OutNeighbors[u])
                {
                    if (ys [u] > ys [v])
                    {
                        numerator += (ys [u] - ys [v]) * (ys [u] - ys [v]);
                    }
                }
            }
            return(numerator / denominator);
        }
Ejemplo n.º 6
0
        static public double[] FirstEigenvector(Digraph G)
        {
            var res = Enumerable.Range(0, G.n).Select(u => Math.Sqrt(G.Degree(u))).ToArray();

            return(Vector.L2Normalize(res));
        }
Ejemplo n.º 7
0
        static public double[] FirstEigenvector(Digraph G)
        {
            var res = Enumerable.Repeat(1.0, G.n).ToArray();

            return(Vector.L2Normalize(res));
        }