source: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/Util.cs @ 13119

Last change on this file since 13119 was 12012, checked in by ascheibe, 7 years ago

#2212 merged r12008, r12009, r12010 back into trunk

File size: 4.9 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using HeuristicLab.Core;
26using HeuristicLab.Data;
27
28namespace HeuristicLab.Algorithms.DataAnalysis {
29  internal static class Util {
30    public static double ScalarProd(IEnumerable<double> v, IEnumerable<double> u) {
31      return v.Zip(u, (vi, ui) => vi * ui).Sum();
32    }
33
34    public static double SqrDist(IEnumerable<double> x, IEnumerable<double> y) {
35      return x.Zip(y, (a, b) => (a - b) * (a - b)).Sum();
36    }
37
38    public static double SqrDist(double x, double y) {
39      double d = x - y;
40      return d * d;
41    }
42
43    public static double SqrDist(double[,] x, int i, int j, double scale = 1.0, IEnumerable<int> columnIndices = null) {
44      return SqrDist(x, i, x, j, scale, columnIndices);
45    }
46
47    public static double SqrDist(double[,] x, int i, double[,] xt, int j, double scale = 1.0, IEnumerable<int> columnIndices = null) {
48      double ss = 0.0;
49      if (columnIndices == null) columnIndices = Enumerable.Range(0, x.GetLength(1));
50      foreach (int columnIndex in columnIndices) {
51        double d = x[i, columnIndex] - xt[j, columnIndex];
52        ss += d * d;
53      }
54      return scale * scale * ss;
55    }
56
57    public static double SqrDist(double[,] x, int i, int j, double[] scale, IEnumerable<int> columnIndices = null) {
58      return SqrDist(x, i, x, j, scale, columnIndices);
59    }
60
61    public static double SqrDist(double[,] x, int i, double[,] xt, int j, double[] scale, IEnumerable<int> columnIndices = null) {
62      double ss = 0.0;
63      if (columnIndices == null) columnIndices = Enumerable.Range(0, x.GetLength(1));
64      int scaleIndex = 0;
65      foreach (int columnIndex in columnIndices) {
66        double d = x[i, columnIndex] - xt[j, columnIndex];
67        ss += d * d * scale[scaleIndex] * scale[scaleIndex];
68        scaleIndex++;
69      }
70      // must be at the end of scale after iterating over columnIndices
71      if (scaleIndex != scale.Length)
72        throw new ArgumentException("Lengths of scales and covariance functions does not match.");
73      return ss;
74    }
75    public static double ScalarProd(double[,] x, int i, int j, double scale = 1.0, IEnumerable<int> columnIndices = null) {
76      return ScalarProd(x, i, x, j, scale, columnIndices);
77    }
78
79    public static double ScalarProd(double[,] x, int i, double[,] xt, int j, double scale = 1.0, IEnumerable<int> columnIndices = null) {
80      double sum = 0.0;
81      if (columnIndices == null) columnIndices = Enumerable.Range(0, x.GetLength(1));
82      foreach (int columnIndex in columnIndices) {
83        sum += x[i, columnIndex] * xt[j, columnIndex];
84      }
85      return scale * scale * sum;
86    }
87    public static double ScalarProd(double[,] x, int i, int j, double[] scale, IEnumerable<int> columnIndices = null) {
88      return ScalarProd(x, i, x, j, scale, columnIndices);
89    }
90
91    public static double ScalarProd(double[,] x, int i, double[,] xt, int j, double[] scale, IEnumerable<int> columnIndices = null) {
92      double sum = 0.0;
93      if (columnIndices == null) columnIndices = Enumerable.Range(0, x.GetLength(1));
94      int scaleIndex = 0;
95      foreach (int columnIndex in columnIndices) {
96        sum += x[i, columnIndex] * scale[scaleIndex] * xt[j, columnIndex] * scale[scaleIndex];
97        scaleIndex++;
98      }
99      // must be at the end of scale after iterating over columnIndices
100      if (scaleIndex != scale.Length)
101        throw new ArgumentException("Lengths of scales and covariance functions does not match.");
102
103      return sum;
104    }
105
106    public static IEnumerable<double> GetRow(double[,] x, int r) {
107      int cols = x.GetLength(1);
108      return GetRow(x, r, Enumerable.Range(0, cols));
109    }
110    public static IEnumerable<double> GetRow(double[,] x, int r, IEnumerable<int> columnIndices) {
111      return columnIndices.Select(c => x[r, c]);
112    }
113    public static IEnumerable<double> GetCol(double[,] x, int c) {
114      int rows = x.GetLength(0);
115      return Enumerable.Range(0, rows).Select(r => x[r, c]);
116    }
117  }
118}
Note: See TracBrowser for help on using the repository browser.