using HeuristicLab.Common; using System; using System.Collections.Generic; using System.Linq; namespace HeuristicLab.Algorithms.DataAnalysis.FastFunctionExtraction { internal static class Utils { // return the nth row of a matrix public static T[] GetRow(this T[,] matrix, int n) { var columns = matrix.GetLength(1); var array = new T[columns]; for (int i = 0; i < columns; ++i) array[i] = matrix[n, i]; return array; } public static IEnumerable FindAllIndices(this IEnumerable values, Predicate match) { return values.Select((b, i) => match(b) ? i : -1).Where(i => i != -1).ToArray(); } public static int[] Argsort(T[] vals) where T : IComparable { var indices = Enumerable.Range(0, vals.Length).ToArray(); Array.Sort(indices, (idx1, idx2) => vals[idx1].CompareTo(vals[idx2])); return indices; } public static IEnumerable Linspace(double start, double end, int n) { if (end < start) throw new ArgumentException("end must be higher that start"); if (n <= 0) return Enumerable.Empty(); if (n == 1) return new double[1] { start }; var range = end - start; return Enumerable.Range(0, n).Select(idx => start + range * idx / (n - 1)); } public static double[] Normalize(double[] vals) => Transform(vals, mean: 0, stdDev: 1); public static double[] Transform(double[] vals, double mean, double stdDev) { var result = new double[vals.Length]; var scale = vals.StandardDeviationPop() / stdDev; for (int i = 0; i < vals.Length; i++) { result[i] = vals[i] / scale; } var offset = result.Average() - mean; for (int i = 0; i < vals.Length; i++) { result[i] = result[i] - offset; } return result; } } }