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); } }
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; } }
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); }
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); }