Ejemplo n.º 1
0
        private void Initialize(int N, int Dims, List <int>[] ids, double[][] P, double[] Y)
        {
            this.N    = N;
            this.Dims = Dims;
            this.ids  = ids;
            this.P    = P;
            this.Y    = Y;

            // initialize reusable allocations
            Grad   = new double[N * Dims];
            GradT  = new double[N * Dims];
            Ydelta = new double[N * Dims];
            gains  = new double[N * Dims];
            for (int i = N * Dims - 1; i >= 0; i--)
            {
                gains[i] = 1;
            }

            //initialize repulsion methods
            ChosenRepulsionMethod = GradientConfig.RepulsionMethod;
            if (ChosenRepulsionMethod == RepulsionMethods.auto || ChosenRepulsionMethod == RepulsionMethods.barnes_hut)
            {
                HST = new HashSpatialTree(N, Dims, Y);
            }
            if (ChosenRepulsionMethod == RepulsionMethods.auto || ChosenRepulsionMethod == RepulsionMethods.fft)
            {
                InitializeFFTRepulsion(Y, GradT);
            }
        }
Ejemplo n.º 2
0
        private void ChooseRepulsionMethod(long[] test_repulsion)
        {
            long min_time = long.MaxValue;

            for (int i = 1; i < test_repulsion.Length; i++)
            {
                if (min_time > test_repulsion[i])
                {
                    min_time = test_repulsion[i];
                    ChosenRepulsionMethod = (RepulsionMethods)i;
                }
            }

            Console.WriteLine("Chosen repulsion method:\t{0}", ChosenRepulsionMethod);

            if (ChosenRepulsionMethod != RepulsionMethods.barnes_hut)
            {
                HST = null;
            }
            if (ChosenRepulsionMethod != RepulsionMethods.fft)
            {
                FFTR = null;
            }
        }
Ejemplo n.º 3
0
        private static RepulsionMethods UpdateRepulsionMethod(Dictionary <string, object> param, RepulsionMethods value)
        {
            string parameter = "RepulsionMethod";

            if (param.TryGetValue(parameter, out object val))
            {
                param.Remove(parameter);
                switch (Convert.ToString(val))
                {
                case "auto":
                    value = RepulsionMethods.auto;
                    break;

                case "barnes_hut":
                    value = RepulsionMethods.barnes_hut;
                    break;

                case "fft":
                    value = RepulsionMethods.fft;
                    break;

                default:
                    Console.WriteLine("\tUnknown value {} for RepulsionMethod!");
                    break;
                }
                Console.WriteLine("\tSet {0} to:\t{1}", parameter, value);
            }
            return(value);
        }
Ejemplo n.º 4
0
        private double[] GradientStep(double exagg, RepulsionMethods method)
        {
            Task ATask = Task.Run(() =>
            {
                switch (Dims)
                {
                case 1:
                    Grad = GradientAttractive1(Grad, exagg);
                    break;

                case 2:
                    Grad = GradientAttractive2(Grad, exagg);
                    break;

                case 3:
                    Grad = GradientAttractive3(Grad, exagg);
                    break;

                default:
                    Grad = GradientAttractive(Grad, exagg);
                    break;
                }
            });

            double Z     = 0;
            Task   RTask = Task.Run(() =>
            {
                switch (method)
                {
                case RepulsionMethods.barnes_hut:
                    HST.RebuildTree(BarnesHutConfig.Presort);
                    Array.Clear(GradT, 0, GradT.Length);
                    Z = HST.EstimateRepulsion(GradT, BarnesHutConfig.theta2);
                    break;

                case RepulsionMethods.fft:
                    FFTR.ComputeFFTGradient();
                    break;
                }
            });

            Task.WaitAll(new Task[] { RTask, ATask });

            switch (method)
            {
            case RepulsionMethods.barnes_hut:
                Z = 1.0 / Z;
                for (int i = N * Dims - 1; i >= 0; i--)
                {
                    Grad[i] += GradT[i] * Z;
                }
                break;

            case RepulsionMethods.fft:
                for (int i = N * Dims - 1; i >= 0; i--)
                {
                    Grad[i] += GradT[i];
                }
                break;
            }

            return(Grad);
        }