Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Tests/HeuristicLab.Algorithms.DataAnalysis-3.4/GaussianProcessFunctionsTest.cs @ 8491

Last change on this file since 8491 was 8491, checked in by gkronber, 12 years ago

#1902 fixed test cases, improved performance

File size: 70.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 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.Linq;
23using HeuristicLab.Algorithms.DataAnalysis;
24using Microsoft.VisualStudio.TestTools.UnitTesting;
25
26namespace HeuristicLab.Algorithms.DataAnalysis_34.Tests {
27  [TestClass]
28
29  // reference values calculated with Rasmussen's GPML MATLAB package
30  public class GaussianProcessFunctionsTest {
31    [TestMethod]
32    public void MeanConstTest() {
33      TestMeanFunction(new MeanConst(), 0,
34        new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
35        new double[][] { new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }
36      );
37      TestMeanFunction(new MeanConst(), 1,
38        new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
39        new double[][] { new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }
40      );
41    }
42
43    [TestMethod]
44    public void MeanZeroTest() {
45      TestMeanFunction(new MeanZero(), 0,
46        new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
47        new double[][] { new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
48      );
49      TestMeanFunction(new MeanZero(), 1,
50        new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
51        new double[][] { new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
52      );
53    }
54
55    [TestMethod]
56    public void MeanSumTest() {
57      var sum = new MeanSum();
58      sum.Terms.Add(new MeanConst());
59      sum.Terms.Add(new MeanConst());
60      TestMeanFunction(sum, 0,
61        new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
62        new double[][]
63          {
64            new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
65            new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
66          }
67      );
68      TestMeanFunction(sum, 1,
69        new double[] { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 },
70        new double[][]
71          {
72            new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
73            new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
74          }
75      );
76    }
77    [TestMethod]
78    public void MeanProdTest() {
79      var prod = new MeanProd();
80      prod.Factors.Add(new MeanConst());
81      prod.Factors.Add(new MeanConst());
82      TestMeanFunction(prod, 0,
83        new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
84        new double[][]
85          {
86            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
87            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
88          }
89      );
90      TestMeanFunction(prod, 1,
91        new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
92        new double[][]
93          {
94            new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
95            new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
96          }
97      );
98
99      prod.Factors.Clear();
100      prod.Factors.Add(new MeanZero());
101      prod.Factors.Add(new MeanLinear());
102      TestMeanFunction(prod, 0,
103        new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
104        new double[][]
105          {
106            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
107            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
108            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
109            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
110            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
111          }
112      );
113      TestMeanFunction(prod, 1,
114        new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
115        new double[][]
116          {
117            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
118            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
119            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
120            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
121            new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
122          }
123      );
124
125      prod.Factors.Clear();
126      prod.Factors.Add(new MeanConst());
127      prod.Factors.Add(new MeanLinear());
128      TestMeanFunction(prod, 1,
129  new double[] { 1.843574580675791, 2.127929337522181, 3.116568910281474, 1.688566127130978, 3.250517738447450, 2.961262743634280, 2.326019412613392, 1.729286976436201, 1.769654419215176, 2.398170347588917 },
130  new double[][]
131                {
132                  new double[] { 2.9088,    1.8646,    3.1971,    1.9890,    1.7640,    1.2801,    2.8059,    3.7243,    3.1899    ,1.4978 },
133                  new double[] { 0.4173,    0.0497,    0.9027,    0.9448,    0.4909,    0.4893,    0.3377,    0.9001,    0.3692    ,0.1112 },
134                  new double[] { 0.7803,    0.3897,    0.2417,    0.4039,    0.0965,    0.1320,    0.9421,    0.9561,    0.5752    ,0.0598 },
135                  new double[] { 0.2348,    0.3532,    0.8212,    0.0154,    0.0430,    0.1690,    0.6491,    0.7317,    0.6477    ,0.4509 },
136                  new double[] { 0.5470,    0.2963,    0.7447,    0.1890,    0.6868,    0.1835,    0.3685,    0.6256,    0.7802    ,0.0811 },
137                  new double[] { 0.9294,    0.7757,    0.4868,    0.4359,    0.4468,    0.3063,    0.5085,    0.5108,    0.8176    ,0.7948 }
138                }
139);
140    }
141
142    [TestMethod]
143    public void MeanLinear() {
144      TestMeanFunction(new MeanLinear(), 0,
145        new double[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
146        new double[][]
147          {
148            new double[] { 0.4173, 0.0497, 0.9027, 0.9448, 0.4909, 0.4893, 0.3377, 0.9001, 0.3692, 0.1112 },
149            new double[] { 0.7803, 0.3897, 0.2417, 0.4039, 0.0965, 0.1320, 0.9421, 0.9561, 0.5752, 0.0598 },
150            new double[] { 0.2348, 0.3532, 0.8212, 0.0154, 0.0430, 0.1690, 0.6491, 0.7317, 0.6477, 0.4509 },
151            new double[] { 0.5470, 0.2963, 0.7447, 0.1890, 0.6868, 0.1835, 0.3685, 0.6256, 0.7802, 0.0811 },
152            new double[] { 0.9294, 0.7757, 0.4868, 0.4359, 0.4468, 0.3063, 0.5085, 0.5108, 0.8176, 0.7948 }
153          }
154      );
155      TestMeanFunction(new MeanLinear(), 1,
156        new double[] { 1.8436, 2.1279, 3.1166, 1.6886, 3.2505, 2.9613, 2.3260, 1.7293, 1.7697, 2.3982 },
157        new double[][]
158          {
159            new double[] { 0.4173, 0.0497, 0.9027, 0.9448, 0.4909, 0.4893, 0.3377, 0.9001, 0.3692, 0.1112 },
160            new double[] { 0.7803, 0.3897, 0.2417, 0.4039, 0.0965, 0.1320, 0.9421, 0.9561, 0.5752, 0.0598 },
161            new double[] { 0.2348, 0.3532, 0.8212, 0.0154, 0.0430, 0.1690, 0.6491, 0.7317, 0.6477, 0.4509 },
162            new double[] { 0.5470, 0.2963, 0.7447, 0.1890, 0.6868, 0.1835, 0.3685, 0.6256, 0.7802, 0.0811 },
163            new double[] { 0.9294, 0.7757, 0.4868, 0.4359, 0.4468, 0.3063, 0.5085, 0.5108, 0.8176, 0.7948 }
164          }
165      );
166    }
167
168    [TestMethod]
169    public void CovSeIsoTest() {
170      TestCovarianceFunction(new CovarianceSEiso(), 0,
171        new double[,]
172          {
173{    0.5771,    0.5404,    0.8569,    0.5612,    0.7545,    0.4980,    0.6649,    0.7484,    0.6564,    0.8184},
174{    0.6206,    0.7027,    0.7091,    0.6015,    0.7295,    0.5338,    0.6705,    0.8202,    0.7155,    0.8029},
175{    0.7743,    0.7513,    0.8468,    0.6865,    0.5645,    0.7861,    0.8404,    0.6625,    0.7555,    0.8335},
176{    0.7773,    0.5513,    0.7792,    0.7166,    0.4534,    0.5870,    0.8913,    0.8796,    0.8656,    0.8245},
177{    0.8839,    0.5934,    0.7689,    0.8982,    0.4126,    0.4741,    0.7883,    0.9201,    0.9077,    0.8649},
178{    0.8746,    0.7341,    0.7020,    0.8323,    0.4826,    0.5922,    0.8706,    0.9508,    0.9524,    0.8660},
179{    0.6133,    0.7560,    0.7280,    0.5749,    0.8722,    0.5651,    0.6530,    0.6260,    0.6633,    0.8195},
180{    0.6113,    0.6277,    0.8110,    0.5489,    0.7110,    0.6221,    0.6948,    0.5425,    0.6227,    0.7828},
181{    0.6394,    0.6950,    0.8669,    0.6107,    0.7933,    0.5985,    0.6823,    0.6858,    0.6702,    0.8492},
182{    0.5790,    0.7156,    0.6274,    0.5324,    0.6323,    0.6100,    0.6863,    0.8091,    0.6855,    0.7173},
183          },
184        new double[][,]
185          {
186            new double[,] {
187{         0,    0.3197,    0.6358,    0.5518,    0.5207,    0.5909,    0.3361,    0.4897,    0.2447,    0.5720},
188{    0.3197,         0,    0.6697,    0.6190,    0.4635,    0.4047,    0.4190,    0.6899,    0.3650,    0.1552},
189{    0.6358,    0.6697,         0,    0.6031,    0.5367,    0.5927,    0.6008,    0.4084,    0.4103,    0.6843},
190{    0.5518,    0.6190,    0.6031,         0,    0.4173,    0.2740,    0.6339,    0.6114,    0.6702,    0.6455},
191{    0.5207,    0.4635,    0.5367,    0.4173,         0,    0.2510,    0.6610,    0.6935,    0.5180,    0.5362},
192{    0.5909,    0.4047,    0.5927,    0.2740,    0.2510,         0,    0.6019,    0.6955,    0.6232,    0.3756},
193{    0.3361,    0.4190,    0.6008,    0.6339,    0.6610,    0.6019,         0,    0.3205,    0.3279,    0.6165},
194{    0.4897,    0.6899,    0.4084,    0.6114,    0.6935,    0.6955,    0.3205,         0,    0.4189,    0.7344},
195{    0.2447,    0.3650,    0.4103,    0.6702,    0.5180,    0.6232,    0.3279,    0.4189,         0,    0.5595},
196{    0.5720,    0.1552,    0.6843,    0.6455,    0.5362,    0.3756,    0.6165,    0.7344,    0.5595,         0},
197            },
198            new double[,] {
199{    2.0000,    1.6472,    1.1513,    1.3142,    1.3662,    1.2437,    1.6267,    1.4148,    1.7372,    1.2786},
200{    1.6472,    2.0000,    1.0689,    1.1876,    1.4541,    1.5370,    1.5174,    1.0103,    1.5898,    1.8381},
201{    1.1513,    1.0689,    2.0000,    1.2199,    1.3398,    1.2402,    1.2244,    1.5320,    1.5293,    1.0276},
202{    1.3142,    1.1876,    1.2199,    2.0000,    1.5197,    1.7027,    1.1555,    1.2033,    1.0675,    1.1291},
203{    1.3662,    1.4541,    1.3398,    1.5197,    2.0000,    1.7299,    1.0916,    0.9989,    1.3706,    1.3407},
204{    1.2437,    1.5370,    1.2402,    1.7027,    1.7299,    2.0000,    1.2223,    0.9923,    1.1787,    1.5758},
205{    1.6267,    1.5174,    1.2244,    1.1555,    1.0916,    1.2223,    2.0000,    1.6461,    1.6369,    1.1928},
206{    1.4148,    1.0103,    1.5320,    1.2033,    0.9989,    0.9923,    1.6461,    2.0000,    1.5176,    0.7806},
207{    1.7372,    1.5898,    1.5293,    1.0675,    1.3706,    1.1787,    1.6369,    1.5176,    2.0000,    1.3009},
208{    1.2786,    1.8381,    1.0276,    1.1291,    1.3407,    1.5758,    1.1928,    0.7806,    1.3009,    2.0000},
209          }
210          }
211      );
212      TestCovarianceFunction(new CovarianceSEiso(), 1,
213         new double[,]
214           {
215{    6.8592,    6.7985,    7.2362,    6.8334,    7.1127,    6.7239,    6.9920,    7.1048,    6.9798,    7.1914},
216{    6.9271,    7.0445,    7.0531,    6.8979,    7.0803,    6.7872,    7.0000,    7.1935,    7.0617,    7.1727},
217{    7.1376,    7.1086,    7.2246,    7.0223,    6.8388,    7.1522,    7.2172,    6.9886,    7.1139,    7.2091},
218{    7.1414,    6.8169,    7.1438,    7.0632,    6.6389,    6.8750,    7.2749,    7.2619,    7.2462,    7.1986},
219{    7.2667,    6.8852,    7.1309,    7.2824,    6.5548,    6.6792,    7.1550,    7.3063,    7.2929,    7.2454},
220{    7.2563,    7.0864,    7.0436,    7.2078,    6.6953,    6.8834,    7.2517,    7.3388,    7.3405,    7.2466},
221{    6.9160,    7.1146,    7.0783,    6.8557,    7.2536,    6.8398,    6.9750,    6.9351,    6.9897,    7.1926},
222{    6.9130,    6.9378,    7.1825,    6.8129,    7.0557,    6.9294,    7.0338,    6.8021,    6.9302,    7.1482},
223{    6.9551,    7.0340,    7.2476,    6.9120,    7.1611,    6.8932,    7.0166,    7.0213,    6.9995,    7.2274},
224{    6.8624,    7.0619,    6.9373,    6.7848,    6.9446,    6.9109,    7.0221,    7.1802,    7.0209,    7.0642},
225           },
226         new double[][,]
227          {
228            new double[,] {
229{         0,    0.3781,    1.0250,    0.7934,    0.7239,    0.8910,    0.4018,    0.6606,    0.2764,    0.8421},
230{    0.3781,         0,    1.1512,    0.9715,    0.6106,    0.5082,    0.5320,    1.2453,    0.4451,    0.1669},
231{    1.0250,    1.1512,         0,    0.9248,    0.7589,    0.8960,    0.9183,    0.5143,    0.5175,    1.2171},
232{    0.7934,    0.9715,    0.9248,         0,    0.5292,    0.3149,    1.0188,    0.9487,    1.1534,    1.0583},
233{    0.7239,    0.6106,    0.7589,    0.5292,         0,    0.2845,    1.1157,    1.2640,    0.7182,    0.7577},
234{    0.8910,    0.5082,    0.8960,    0.3149,    0.2845,         0,    0.9214,    1.2749,    0.9845,    0.4616},
235{    0.4018,    0.5320,    0.9183,    1.0188,    1.1157,    0.9214,         0,    0.3793,    0.3899,    0.9638},
236{    0.6606,    1.2453,    0.5143,    0.9487,    1.2640,    1.2749,    0.3793,         0,    0.5318,    1.6567},
237{    0.2764,    0.4451,    0.5175,    1.1534,    0.7182,    0.9845,    0.3899,    0.5318,         0,    0.8116},
238{    0.8421,    0.1669,    1.2171,    1.0583,    0.7577,    0.4616,    0.9638,    1.6567,    0.8116,         0},
239            },
240            new double[,] {
241{   14.7781,   14.3950,   13.7138,   13.9618,   14.0352,   13.8578,   14.3707,   14.1018,   14.4990,   13.9100},
242{   14.3950,   14.7781,   13.5767,   13.7715,   14.1542,   14.2607,   14.2360,   13.4735,   14.3260,   14.6102},
243{   13.7138,   13.5767,   14.7781,   13.8217,   13.9982,   13.8525,   13.8286,   14.2545,   14.2511,   13.5045},
244{   13.9618,   13.7715,   13.8217,   14.7781,   14.2390,   14.4598,   13.7206,   13.7960,   13.5743,   13.6778},
245{   14.0352,   14.1542,   13.9982,   14.2390,   14.7781,   14.4908,   13.6154,   13.4528,   14.0413,   13.9995},
246{   13.8578,   14.2607,   13.8525,   14.4598,   14.4908,   14.7781,   13.8254,   13.4407,   13.7576,   14.3090},
247{   14.3707,   14.2360,   13.8286,   13.7206,   13.6154,   13.8254,   14.7781,   14.3938,   14.3828,   13.7798},
248{   14.1018,   13.4735,   14.2545,   13.7960,   13.4528,   13.4407,   14.3938,   14.7781,   14.2363,   13.0113},
249{   14.4990,   14.3260,   14.2511,   13.5743,   14.0413,   13.7576,   14.3828,   14.2363,   14.7781,   13.9425},
250{   13.9100,   14.6102,   13.5045,   13.6778,   13.9995,   14.3090,   13.7798,   13.0113,   13.9425,   14.7781},
251            },
252          }
253       );
254    }
255
256    [TestMethod]
257    public void CovRQIsoTest() {
258      TestCovarianceFunction(new CovarianceRQiso(), 0,
259        new double[,]
260          {
261{    0.6452,    0.6190,    0.8662,    0.6338,    0.7802,    0.5893,    0.7102,    0.7753,    0.7037,    0.8331},
262{    0.6771,    0.7392,    0.7442,    0.6630,    0.7603,    0.6144,    0.7145,    0.8346,    0.7492,    0.8200},
263{    0.7963,    0.7777,    0.8574,    0.7266,    0.6362,    0.8060,    0.8519,    0.7084,    0.7810,    0.8459},
264{    0.7988,    0.6268,    0.8004,    0.7500,    0.5583,    0.6524,    0.8968,    0.8864,    0.8739,    0.8382},
265{    0.8902,    0.6571,    0.7919,    0.9030,    0.5304,    0.5727,    0.8079,    0.9232,    0.9117,    0.8733},
266{    0.8819,    0.7639,    0.7387,    0.8449,    0.5785,    0.6563,    0.8783,    0.9519,    0.9535,    0.8742},
267{    0.6716,    0.7814,    0.7590,    0.6437,    0.8797,    0.6366,    0.7012,    0.6810,    0.7090,    0.8339},
268{    0.6702,    0.6823,    0.8268,    0.6250,    0.7456,    0.6782,    0.7331,    0.6205,    0.6786,    0.8033},
269{    0.6910,    0.7332,    0.8750,    0.6697,    0.8119,    0.6608,    0.7235,    0.7261,    0.7142,    0.8595},
270{    0.6467,    0.7493,    0.6821,    0.6133,    0.6857,    0.6692,    0.7265,    0.8252,    0.7259,    0.7506},
271          },
272        new double[][,]
273          {
274            new double[,] {
275{         0,    0.2722,    0.4584,    0.4165,    0.3996,    0.4367,    0.2838,    0.3820,    0.2165,    0.4271},
276{    0.2722,         0,    0.4736,    0.4505,    0.3666,    0.3300,    0.3391,    0.4823,    0.3037,    0.1436},
277{    0.4584,    0.4736,         0,    0.4428,    0.4084,    0.4376,    0.4416,    0.3323,    0.3336,    0.4799},
278{    0.4165,    0.4505,    0.4428,         0,    0.3381,    0.2388,    0.4575,    0.4468,    0.4739,    0.4629},
279{    0.3996,    0.3666,    0.4084,    0.3381,         0,    0.2213,    0.4698,    0.4837,    0.3981,    0.4081},
280{    0.4367,    0.3300,    0.4376,    0.2388,    0.2213,         0,    0.4422,    0.4845,    0.4525,    0.3109},
281{    0.2838,    0.3391,    0.4416,    0.4575,    0.4698,    0.4422,         0,    0.2728,    0.2781,    0.4493},
282{    0.3820,    0.4823,    0.3323,    0.4468,    0.4837,    0.4845,    0.2728,         0,    0.3390,    0.4995},
283{    0.2165,    0.3037,    0.3336,    0.4739,    0.3981,    0.4525,    0.2781,    0.3390,         0,    0.4206},
284{    0.4271,    0.1436,    0.4799,    0.4629,    0.4081,    0.3109,    0.4493,    0.4995,    0.4206,         0},
285            },
286            new double[,] {
287{    2.0000,    1.6749,    1.2884,    1.4086,    1.4481,    1.3558,    1.6576,    1.4857,    1.7530,    1.3818},
288{    1.6749,    2.0000,    1.2296,    1.3147,    1.5166,    1.5831,    1.5672,    1.1884,    1.6266,    1.8443},
289{    1.2884,    1.2296,    2.0000,    1.3383,    1.4280,    1.3533,    1.3417,    1.5791,    1.5769,    1.2005},
290{    1.4086,    1.3147,    1.3383,    2.0000,    1.5691,    1.7228,    1.2914,    1.3262,    1.2286,    1.2725},
291{    1.4481,    1.5166,    1.4280,    1.5691,    2.0000,    1.7466,    1.2457,    1.1805,    1.4515,    1.4286},
292{    1.3558,    1.5831,    1.3533,    1.7228,    1.7466,    2.0000,    1.3401,    1.1758,    1.3083,    1.6150},
293{    1.6576,    1.5672,    1.3417,    1.2914,    1.2457,    1.3401,    2.0000,    1.6740,    1.6662,    1.3186},
294{    1.4857,    1.1884,    1.5791,    1.3262,    1.1805,    1.1758,    1.6740,    2.0000,    1.5674,    1.0305},
295{    1.7530,    1.6266,    1.5769,    1.2286,    1.4515,    1.3083,    1.6662,    1.5674,    2.0000,    1.3985},
296{    1.3818,    1.8443,    1.2005,    1.2725,    1.4286,    1.6150,    1.3186,    1.0305,    1.3985,    2.0000},
297          },
298                      new double[,] {
299{         0,   -0.0124,   -0.0541,   -0.0386,   -0.0340,   -0.0452,   -0.0137,   -0.0298,   -0.0073,   -0.0419},
300{   -0.0124,         0,   -0.0623,   -0.0505,   -0.0265,   -0.0200,   -0.0215,   -0.0682,   -0.0162,   -0.0029},
301{   -0.0541,   -0.0623,         0,   -0.0474,   -0.0363,   -0.0455,   -0.0470,   -0.0204,   -0.0206,   -0.0664},
302{   -0.0386,   -0.0505,   -0.0474,         0,   -0.0213,   -0.0091,   -0.0537,   -0.0490,   -0.0624,   -0.0563},
303{   -0.0340,   -0.0265,   -0.0363,   -0.0213,         0,   -0.0077,   -0.0600,   -0.0693,   -0.0336,   -0.0362},
304{   -0.0452,   -0.0200,   -0.0455,   -0.0091,   -0.0077,         0,   -0.0472,   -0.0700,   -0.0514,   -0.0172},
305{   -0.0137,   -0.0215,   -0.0470,   -0.0537,   -0.0600,   -0.0472,         0,   -0.0125,   -0.0131,   -0.0500},
306{   -0.0298,   -0.0682,   -0.0204,   -0.0490,   -0.0693,   -0.0700,   -0.0125,         0,   -0.0215,   -0.0919},
307{   -0.0073,   -0.0162,   -0.0206,   -0.0624,   -0.0336,   -0.0514,   -0.0131,   -0.0215,         0,   -0.0399},
308{   -0.0419,   -0.0029,   -0.0664,   -0.0563,   -0.0362,   -0.0172,   -0.0500,   -0.0919,   -0.0399,         0},
309          }
310          }
311      );
312      TestCovarianceFunction(new CovarianceRQiso(), 1,
313         new double[,]
314           {
315{    6.8660,    6.8070,    7.2367,    6.8409,    7.1145,    6.7347,    6.9959,    7.1068,    6.9839,    7.1923},
316{    6.9324,    7.0474,    7.0559,    6.9038,    7.0827,    6.7961,    7.0038,    7.1944,    7.0644,    7.1739},
317{    7.1392,    7.1106,    7.2253,    7.0255,    6.8461,    7.1536,    7.2179,    6.9926,    7.1158,    7.2099},
318{    7.1429,    6.8249,    7.1453,    7.0658,    6.6525,    6.8816,    7.2752,    7.2623,    7.2467,    7.1995},
319{    7.2671,    6.8913,    7.1326,    7.2827,    6.5716,    6.6915,    7.1564,    7.3065,    7.2931,    7.2459},
320{    7.2567,    7.0886,    7.0466,    7.2086,    6.7069,    6.8897,    7.2522,    7.3388,    7.3405,    7.2471},
321{    6.9215,    7.1164,    7.0807,    6.8626,    7.2540,    6.8471,    6.9792,    6.9401,    6.9937,    7.1935},
322{    6.9185,    6.9428,    7.1836,    6.8210,    7.0584,    6.9346,    7.0369,    6.8105,    6.9354,    7.1496},
323{    6.9598,    7.0372,    7.2481,    6.9176,    7.1623,    6.8992,    7.0200,    7.0247,    7.0033,    7.2280},
324{    6.8692,    7.0646,    6.9424,    6.7937,    6.9495,    6.9165,    7.0254,    7.1813,    7.0242,    7.0668},
325           },
326         new double[][,]
327          {
328            new double[,] {
329{         0,    0.3746,    0.9986,    0.7776,    0.7108,    0.8711,    0.3978,    0.6497,    0.2745,    0.8243},
330{    0.3746,         0,    1.1178,    0.9478,    0.6013,    0.5017,    0.5249,    1.2062,    0.4401,    0.1662},
331{    0.9986,    1.1178,         0,    0.9033,    0.7445,    0.8758,    0.8972,    0.5076,    0.5108,    1.1798},
332{    0.7776,    0.9478,    0.9033,         0,    0.5222,    0.3124,    0.9927,    0.9261,    1.1199,    1.0301},
333{    0.7108,    0.6013,    0.7445,    0.5222,         0,    0.2825,    1.0844,    1.2237,    0.7052,    0.7433},
334{    0.8711,    0.5017,    0.8758,    0.3124,    0.2825,         0,    0.9000,    1.2339,    0.9601,    0.4563},
335{    0.3978,    0.5249,    0.8972,    0.9927,    1.0844,    0.9000,         0,    0.3757,    0.3861,    0.9404},
336{    0.6497,    1.2062,    0.5076,    0.9261,    1.2237,    1.2339,    0.3757,         0,    0.5247,    1.5872},
337{    0.2745,    0.4401,    0.5108,    1.1199,    0.7052,    0.9601,    0.3861,    0.5247,         0,    0.7950},
338{    0.8243,    0.1662,    1.1798,    1.0301,    0.7433,    0.4563,    0.9404,    1.5872,    0.7950,         0},
339            },
340            new double[,] {
341{   14.7781,   14.3968,   13.7277,   13.9699,   14.0420,   13.8682,   14.3727,   14.1074,   14.5000,   13.9192},
342{   14.3968,   14.7781,   13.5943,   13.7839,   14.1589,   14.2640,   14.2397,   13.4942,   14.3286,   14.6106},
343{   13.7277,   13.5943,   14.7781,   13.8329,   14.0057,   13.8630,   13.8396,   14.2579,   14.2545,   13.5242},
344{   13.9699,   13.7839,   13.8329,   14.7781,   14.2426,   14.4610,   13.7342,   13.8078,   13.5920,   13.6926},
345{   14.0420,   14.1589,   14.0057,   14.2426,   14.7781,   14.4918,   13.6319,   13.4742,   14.0479,   14.0069},
346{   13.8682,   14.2640,   13.8630,   14.4610,   14.4918,   14.7781,   13.8365,   13.4625,   13.7703,   14.3117},
347{   14.3727,   14.2397,   13.8396,   13.7342,   13.6319,   13.8365,   14.7781,   14.3956,   14.3848,   13.7920},
348{   14.1074,   13.4942,   14.2579,   13.8078,   13.4742,   13.4625,   14.3956,   14.7781,   14.2399,   13.0490},
349{   14.5000,   14.3286,   14.2545,   13.5920,   14.0479,   13.7703,   14.3848,   14.2399,   14.7781,   13.9510},
350{   13.9192,   14.6106,   13.5242,   13.6926,   14.0069,   14.3117,   13.7920,   13.0490,   13.9510,   14.7781},
351            },
352            new double[,] {
353{         0,   -0.0009,   -0.0068,   -0.0040,   -0.0034,   -0.0051,   -0.0010,   -0.0028,   -0.0005,   -0.0046},
354{   -0.0009,         0,   -0.0086,   -0.0061,   -0.0024,   -0.0016,   -0.0018,   -0.0101,   -0.0013,   -0.0002},
355{   -0.0068,   -0.0086,         0,   -0.0055,   -0.0037,   -0.0052,   -0.0054,   -0.0017,   -0.0017,   -0.0097},
356{   -0.0040,   -0.0061,   -0.0055,         0,   -0.0018,   -0.0006,   -0.0067,   -0.0058,   -0.0087,   -0.0073},
357{   -0.0034,   -0.0024,   -0.0037,   -0.0018,         0,   -0.0005,   -0.0081,   -0.0105,   -0.0033,   -0.0037},
358{   -0.0051,   -0.0016,   -0.0052,   -0.0006,   -0.0005,         0,   -0.0055,   -0.0106,   -0.0063,   -0.0013},
359{   -0.0010,   -0.0018,   -0.0054,   -0.0067,   -0.0081,   -0.0055,         0,   -0.0009,   -0.0010,   -0.0060},
360{   -0.0028,   -0.0101,   -0.0017,   -0.0058,   -0.0105,   -0.0106,   -0.0009,         0,   -0.0018,   -0.0183},
361{   -0.0005,   -0.0013,   -0.0017,   -0.0087,   -0.0033,   -0.0063,   -0.0010,   -0.0018,         0,   -0.0042},
362{   -0.0046,   -0.0002,   -0.0097,   -0.0073,   -0.0037,   -0.0013,   -0.0060,   -0.0183,   -0.0042,         0},
363                           }
364          }
365       );
366    }
367
368
369    [TestMethod]
370    public void CovLinearTest() {
371      TestCovarianceFunction(new CovarianceLinear(), 0,
372        new double[,]
373          {
374{    0.9089,    0.9972,    1.8813,    0.8618,    2.0021,    1.5168,    1.2612,    1.1009,    0.9505,    1.3851},
375{    0.4654,    0.7436,    1.1758,    0.4150,    1.4523,    1.0699,    0.7535,    0.6763,    0.5205,    0.8497},
376{    1.3720,    1.4959,    2.0386,    1.2323,    1.8810,    2.1422,    1.6645,    1.1482,    1.2602,    1.5724},
377{    0.8471,    0.6576,    1.4266,    0.7465,    1.1331,    1.3214,    1.1946,    0.9028,    0.8676,    1.0329},
378{    0.7965,    0.5520,    1.2342,    0.7932,    0.8598,    0.9288,    0.8927,    0.7687,    0.7359,    0.9016},
379{    0.5306,    0.5096,    0.8879,    0.4618,    0.7612,    0.8960,    0.7367,    0.5462,    0.5287,    0.6475},
380{    0.8779,    1.2411,    1.6264,    0.7940,    2.0552,    1.5512,    1.1513,    0.8304,    0.8692,    1.2945},
381{    1.4220,    1.6026,    2.2818,    1.2951,    2.3982,    2.1948,    1.7607,    1.2346,    1.3533,    1.7961},
382{    1.0930,    1.3304,    1.9745,    1.0278,    2.1338,    1.7821,    1.3686,    1.0951,    1.0529,    1.5035},
383{    0.3406,    0.7064,    0.9980,    0.2373,    1.2538,    1.1479,    0.7212,    0.6072,    0.4222,    0.6815},
384          },
385        new double[][,]
386          {           
387          }
388      );
389    }
390
391    [TestMethod]
392    public void CovPeriodicTest() {
393      TestCovarianceFunction(new CovariancePeriodic(), 0,
394        new double[,]
395          {
396{    0.9548,    0.7965,    0.1438,    0.8971,    0.3692,    0.5608,    0.8367,    0.3951,    0.8773,    0.1881},
397{    0.9894,    0.6290,    0.5931,    0.9987,    0.4838,    0.7608,    0.8078,    0.1852,    0.5579,    0.2184},
398{    0.2962,    0.3824,    0.1517,    0.7208,    0.9105,    0.2604,    0.1580,    0.8483,    0.3653,    0.1660},
399{    0.2864,    0.8521,    0.2806,    0.5519,    0.3502,    0.9797,    0.1364,    0.1354,    0.1391,    0.1784},
400{    0.1354,    0.9908,    0.3145,    0.1389,    0.2266,    0.4391,    0.2541,    0.1592,    0.1452,    0.1394},
401{    0.1362,    0.4609,    0.6325,    0.1675,    0.4801,    0.9891,    0.1372,    0.2435,    0.2512,    0.1389},
402{    0.9975,    0.3630,    0.4916,    0.9481,    0.1367,    0.9130,    0.8921,    0.9800,    0.8445,    0.1864},
403{    0.9988,    0.9762,    0.2016,    0.8402,    0.5823,    0.9870,    0.6736,    0.8076,    0.9861,    0.2698},
404{    0.9440,    0.6724,    0.1385,    0.9991,    0.2411,    0.9966,    0.7439,    0.7247,    0.8095,    0.1496},
405{    0.9605,    0.5569,    0.9769,    0.7531,    0.9651,    0.9994,    0.7216,    0.2054,    0.7264,    0.5478},
406          },
407        new double[][,]
408          {     
409            new double[,]
410              {
411{         0,    0.6171,    0.0967,    0.2357,    0.4461,    0.0247,    0.6403,    0.6107,    0.5464,    0.1081},
412{    0.6171,         0,    0.4105,    0.0173,    0.6953,    0.7281,    0.7351,    0.6132,    0.6825,    0.5825},
413{    0.0967,    0.4105,         0,    0.0012,    0.3397,    0.0195,    0.0034,    0.7305,    0.7317,    0.5618},
414{    0.2357,    0.0173,    0.0012,         0,    0.7346,    0.5651,    0.0847,    0.0026,    0.4161,    0.1700},
415{    0.4461,    0.6953,    0.3397,    0.7346,         0,    0.5493,    0.3178,    0.6422,    0.4630,    0.3434},
416{    0.0247,    0.7281,    0.0195,    0.5651,    0.5493,         0,    0.0023,    0.6572,    0.0311,    0.6971},
417{    0.6403,    0.7351,    0.0034,    0.0847,    0.3178,    0.0023,         0,    0.6182,    0.6285,    0.0109},
418{    0.6107,    0.6132,    0.7305,    0.0026,    0.6422,    0.6572,    0.6182,         0,    0.7351,    0.6230},
419{    0.5464,    0.6825,    0.7317,    0.4161,    0.4630,    0.0311,    0.6285,    0.7351,         0,    0.1843},
420{    0.1081,    0.5825,    0.5618,    0.1700,    0.3434,    0.6971,    0.0109,    0.6230,    0.1843,         0},
421              },
422            new double[,]
423              {
424{         0,   -0.4917,    1.9759,   -2.5233,   -2.9038,   -0.9545,   -0.6223,   -2.7396,   -0.0884,   -1.8718},
425{   -0.4917,         0,    3.6663,    0.8377,   -2.3760,   -1.4241,   -1.6437,    3.8424,   -0.9067,    0.2162},
426{    1.9759,    3.6663,         0,   -0.2205,   -2.7933,   -0.8509,   -0.3646,   -1.4789,   -1.5087,    3.8738},
427{   -2.5233,    0.8377,   -0.2205,         0,   -1.6172,   -0.2162,    1.8523,    0.3213,    3.6804,    2.5815},
428{   -2.9038,   -2.3760,   -2.7933,   -1.6172,         0,   -0.1136,    3.3650,    3.7893,   -2.9070,   -2.7998},
429{   -0.9545,   -1.4241,   -0.8509,   -0.2162,   -0.1136,         0,   -0.2974,    3.7478,    1.1265,   -1.0310},
430{   -0.6223,   -1.6437,   -0.3646,    1.8523,    3.3650,   -0.2974,         0,   -0.4977,   -0.5548,    0.6640},
431{   -2.7396,    3.8424,   -1.4789,    0.3213,    3.7893,    3.7478,   -0.4977,         0,   -1.6417,    1.1444},
432{   -0.0884,   -0.9067,   -1.5087,    3.6804,   -2.9070,    1.1265,   -0.5548,   -1.6417,         0,   -2.3160},
433{   -1.8718,    0.2162,    3.8738,    2.5815,   -2.7998,   -1.0310,    0.6640,    1.1444,   -2.3160,         0},
434              },
435            new double[,]
436              {
437{    2.0000,    0.3597,    1.9008,    1.7477,    1.4793,    1.9751,    0.3943,    1.2046,    0.2758,    1.8887},
438{    0.3597,    2.0000,    1.5291,    1.9826,    0.9929,    0.6320,    0.7047,    1.1997,    0.4741,    0.3153},
439{    1.9008,    1.5291,    2.0000,    1.9988,    1.6221,    1.9804,    1.9966,    0.6498,    0.6595,    1.2969},
440{    1.7477,    1.9826,    1.9988,    2.0000,    0.6957,    0.2956,    1.9134,    1.9974,    1.5215,    1.8218},
441{    1.4793,    0.9929,    1.6221,    0.6957,    2.0000,    0.2787,    1.6495,    1.1369,    1.4549,    1.6174},
442{    1.9751,    0.6320,    1.9804,    0.2956,    0.2787,    2.0000,    1.9977,    1.1010,    1.9686,    0.5106},
443{    0.3943,    0.7047,    1.9966,    1.9134,    1.6495,    1.9977,    2.0000,    0.3612,    0.3762,    1.9891},
444{    1.2046,    1.1997,    0.6498,    1.9974,    1.1369,    1.1010,    0.3612,    2.0000,    0.7040,    0.3681},
445{    0.2758,    0.4741,    0.6595,    1.5215,    1.4549,    1.9686,    0.3762,    0.7040,    2.0000,    1.8059},
446{    1.8887,    0.3153,    1.2969,    1.8218,    1.6174,    0.5106,    1.9891,    0.3681,    1.8059,    2.0000},
447              },
448          }
449      , 5e-3);
450      TestCovarianceFunction(new CovariancePeriodic(), 1,
451        new double[,]
452          {
453{    5.8283,    5.7618,    6.7049,    5.7980,    6.3126,    5.7012,    6.0358,    6.2917,    6.0128,    6.5482},
454{    5.9230,    6.1447,    6.1643,    5.8794,    6.2291,    5.7511,    6.0513,    6.5551,    6.1842,    6.4880},
455{    6.3822,    6.3018,    6.6628,    6.0966,    5.8040,    6.4250,    6.6362,    6.0294,    6.3159,    6.6082},
456{    6.3932,    5.7803,    6.4000,    6.1876,    5.6577,    5.8483,    6.8550,    6.8032,    6.7423,    6.5723},
457{    6.8221,    5.8618,    6.3630,    6.8860,    5.6385,    5.6752,    6.4334,    6.9877,    6.9298,    6.7393},
458{    6.7811,    6.2441,    6.1428,    6.6035,    5.6837,    5.8594,    6.7636,    7.1358,    7.1438,    6.7439},
459{    5.9060,    6.3179,    6.2241,    5.8240,    6.7709,    5.8052,    6.0040,    5.9357,    6.0315,    6.5522},
460{    5.9014,    5.9400,    6.5193,    5.7761,    6.1703,    5.9266,    6.1211,    5.7652,    5.9278,    6.4131},
461{    5.9689,    6.1217,    6.7479,    5.9000,    6.4518,    5.8729,    6.0847,    6.0946,    6.0504,    6.6728},
462{    5.8322,    6.1847,    5.9393,    5.7489,    5.9512,    5.8983,    6.0962,    6.5118,    6.0937,    6.1900},
463          },
464        new double[][,]
465          {           
466            new double[,]
467              {
468{         0,    1.5463,    2.7702,    2.4754,    2.3601,    2.6154,    1.6170,    2.2426,    1.2120,    2.5484},
469{    1.5463,         0,    2.8809,    2.7132,    2.1407,    1.9051,    1.9633,    2.9438,    1.7399,    0.7903},
470{    2.7702,    2.8809,         0,    2.6583,    2.4199,    2.6219,    2.6503,    1.9201,    1.9281,    2.9266},
471{    2.4754,    2.7132,    2.6583,         0,    1.9565,    1.3445,    2.7639,    2.6871,    2.8826,    2.8025},
472{    2.3601,    2.1407,    2.4199,    1.9565,         0,    1.2406,    2.8530,    2.9544,    2.3499,    2.4179},
473{    2.6154,    1.9051,    2.6219,    1.3445,    1.2406,         0,    2.6541,    2.9603,    2.7276,    1.7848},
474{    1.6170,    1.9633,    2.6503,    2.7639,    2.8530,    2.6541,         0,    1.5498,    1.5819,    2.7045},
475{    2.2426,    2.9438,    1.9201,    2.6871,    2.9544,    2.9603,    1.5498,         0,    1.9628,    3.0510},
476{    1.2120,    1.7399,    1.9281,    2.8826,    2.3499,    2.7276,    1.5819,    1.9628,         0,    2.5033},
477{    2.5484,    0.7903,    2.9266,    2.8025,    2.4179,    1.7848,    2.7045,    3.0510,    2.5033,         0},
478              },
479            new double[,]
480              {
481{         0,    1.2693,    1.2518,    1.4723,    1.4989,    1.4024,    1.3080,    1.5046,    1.0560,    1.4419},
482{    1.2693,         0,    1.0599,    1.3190,    1.4956,    1.4360,    1.4550,    0.8895,    1.3688,    0.7299},
483{    1.2518,    1.0599,         0,    1.3700,    1.4880,    1.3979,    1.3765,    1.4411,    1.4438,    0.9428},
484{    1.4723,    1.3190,    1.3700,         0,    1.4529,    1.1461,    1.2600,    1.3448,    1.0562,    1.2056},
485{    1.4989,    1.4956,    1.4880,    1.4529,         0,    1.0760,    1.1183,    0.8531,    1.5002,    1.4885},
486{    1.4024,    1.4360,    1.3979,    1.1461,    1.0760,         0,    1.3735,    0.8314,    1.3035,    1.3888},
487{    1.3080,    1.4550,    1.3765,    1.2600,    1.1183,    1.3735,         0,    1.2713,    1.2891,    1.3279},
488{    1.5046,    0.8895,    1.4411,    1.3448,    0.8531,    0.8314,    1.2713,         0,    1.4549,   -0.0705},
489{    1.0560,    1.3688,    1.4438,    1.0562,    1.5002,    1.3035,    1.2891,    1.4549,         0,    1.4621},
490{    1.4419,    0.7299,    0.9428,    1.2056,    1.4885,    1.3888,    1.3279,   -0.0705,    1.4621,         0},
491              },
492            new double[,]
493              {
494{   14.7781,   13.1371,   11.6509,   12.0296,   12.1738,   11.8516,   13.0567,   12.3184,   13.5101,   11.9373},
495{   13.1371,   14.7781,   11.5044,   11.7253,   12.4422,   12.7230,   12.6543,   11.4201,   12.9155,   13.9651},
496{   11.6509,   11.5044,   14.7781,   11.7964,   12.0992,   11.8434,   11.8067,   12.7053,   12.6959,   11.4432},
497{   12.0296,   11.7253,   11.7964,   14.7781,   12.6624,   13.3637,   11.6592,   11.7593,   11.5022,   11.6084},
498{   12.1738,   12.4422,   12.0992,   12.6624,   14.7781,   13.4786,   11.5416,   11.4058,   12.1864,   12.1017},
499{   11.8516,   12.7230,   11.8434,   13.3637,   13.4786,   14.7781,   11.8019,   11.3978,   11.7066,   12.8636},
500{   13.0567,   12.6543,   11.8067,   11.6592,   11.5416,   11.8019,   14.7781,   13.1331,   13.0967,   11.7366},
501{   12.3184,   11.4201,   12.7053,   11.7593,   11.4058,   11.3978,   13.1331,   14.7781,   12.6549,   11.2744},
502{   13.5101,   12.9155,   12.6959,   11.5022,   12.1864,   11.7066,   13.0967,   12.6549,   14.7781,   11.9944},
503{   11.9373,   13.9651,   11.4432,   11.6084,   12.1017,   12.8636,   11.7366,   11.2744,   11.9944,   14.7781},
504              },
505          }
506      , 5e-3);
507    }
508
509    [TestMethod]
510    public void CovSEardTest() {
511      TestCovarianceFunction(new CovarianceSEard(), 0,
512        new double[,]
513          {
514{    0.5771,    0.5404,    0.8569,    0.5612,    0.7545,    0.4980,    0.6649,    0.7484,    0.6564,    0.8184},
515{    0.6206,    0.7027,    0.7091,    0.6015,    0.7295,    0.5338,    0.6705,    0.8202,    0.7155,    0.8029},
516{    0.7743,    0.7513,    0.8468,    0.6865,    0.5645,    0.7861,    0.8404,    0.6625,    0.7555,    0.8335},
517{    0.7773,    0.5513,    0.7792,    0.7166,    0.4534,    0.5870,    0.8913,    0.8796,    0.8656,    0.8245},
518{    0.8839,    0.5934,    0.7689,    0.8982,    0.4126,    0.4741,    0.7883,    0.9201,    0.9077,    0.8649},
519{    0.8746,    0.7341,    0.7020,    0.8323,    0.4826,    0.5922,    0.8706,    0.9508,    0.9524,    0.8660},
520{    0.6133,    0.7560,    0.7280,    0.5749,    0.8722,    0.5651,    0.6530,    0.6260,    0.6633,    0.8195},
521{    0.6113,    0.6277,    0.8110,    0.5489,    0.7110,    0.6221,    0.6948,    0.5425,    0.6227,    0.7828},
522{    0.6394,    0.6950,    0.8669,    0.6107,    0.7933,    0.5985,    0.6823,    0.6858,    0.6702,    0.8492},
523{    0.5790,    0.7156,    0.6274,    0.5324,    0.6323,    0.6100,    0.6863,    0.8091,    0.6855,    0.7173},
524
525          },
526        new double[][,]
527          {     
528            new double[,]
529              {
530{         0,    0.1113,    0.1356,    0.1828,    0.0037,    0.0032,    0.0052,    0.1649,    0.0020,    0.0599},
531{    0.1113,         0,    0.3889,    0.4757,    0.1415,    0.1485,    0.0629,    0.3653,    0.0811,    0.0035},
532{    0.1356,    0.3889,         0,    0.0011,    0.1136,    0.1060,    0.1954,    0.0000,    0.2176,    0.3219},
533{    0.1828,    0.4757,    0.0011,         0,    0.1566,    0.1766,    0.2129,    0.0012,    0.1768,    0.3923},
534{    0.0037,    0.1415,    0.1136,    0.1566,         0,    0.0000,    0.0128,    0.0836,    0.0101,    0.0966},
535{    0.0032,    0.1485,    0.1060,    0.1766,    0.0000,         0,    0.0140,    0.0837,    0.0085,    0.1126},
536{    0.0052,    0.0629,    0.1954,    0.2129,    0.0128,    0.0140,         0,    0.2603,    0.0008,    0.0306},
537{    0.1649,    0.3653,    0.0000,    0.0012,    0.0836,    0.0837,    0.2603,         0,    0.2139,    0.2429},
538{    0.0020,    0.0811,    0.2176,    0.1768,    0.0101,    0.0085,    0.0008,    0.2139,         0,    0.0433},
539{    0.0599,    0.0035,    0.3219,    0.3923,    0.0966,    0.1126,    0.0306,    0.2429,    0.0433,         0},
540              },
541            new double[,]
542              {
543{         0,    0.1257,    0.1670,    0.0931,    0.3194,    0.2613,    0.0213,    0.0219,    0.0365,    0.3319},
544{    0.1257,         0,    0.0117,    0.0001,    0.0625,    0.0510,    0.2315,    0.1621,    0.0274,    0.1000},
545{    0.1670,    0.0117,         0,    0.0160,    0.0141,    0.0075,    0.3003,    0.3909,    0.0850,    0.0170},
546{    0.0931,    0.0001,    0.0160,         0,    0.0718,    0.0629,    0.1673,    0.1835,    0.0157,    0.0668},
547{    0.3194,    0.0625,    0.0141,    0.0718,         0,    0.0011,    0.3903,    0.3690,    0.1570,    0.0009},
548{    0.2613,    0.0510,    0.0075,    0.0629,    0.0011,         0,    0.4011,    0.3369,    0.1158,    0.0041},
549{    0.0213,    0.2315,    0.3003,    0.1673,    0.3903,    0.4011,         0,    0.0002,    0.1102,    0.4643},
550{    0.0219,    0.1621,    0.3909,    0.1835,    0.3690,    0.3369,    0.0002,         0,    0.1101,    0.3135},
551{    0.0365,    0.0274,    0.0850,    0.0157,    0.1570,    0.1158,    0.1102,    0.1101,         0,    0.1728},
552{    0.3319,    0.1000,    0.0170,    0.0668,    0.0009,    0.0041,    0.4643,    0.3135,    0.1728,         0},
553              },
554            new double[,]
555              {
556{         0,    0.0115,    0.1979,    0.0316,    0.0251,    0.0027,    0.1396,    0.1747,    0.1481,    0.0299},
557{    0.0115,         0,    0.1171,    0.0678,    0.0700,    0.0261,    0.0664,    0.0724,    0.0689,    0.0088},
558{    0.1979,    0.1171,         0,    0.3960,    0.4057,    0.2638,    0.0181,    0.0061,    0.0230,    0.0705},
559{    0.0316,    0.0678,    0.3960,         0,    0.0006,    0.0201,    0.2320,    0.3087,    0.2134,    0.1071},
560{    0.0251,    0.0700,    0.4057,    0.0006,         0,    0.0137,    0.2005,    0.2369,    0.2506,    0.1115},
561{    0.0027,    0.0261,    0.2638,    0.0201,    0.0137,         0,    0.1409,    0.1571,    0.1351,    0.0626},
562{    0.1396,    0.0664,    0.0181,    0.2320,    0.2005,    0.1409,         0,    0.0056,    0.0000,    0.0234},
563{    0.1747,    0.0724,    0.0061,    0.3087,    0.2369,    0.1571,    0.0056,         0,    0.0054,    0.0308},
564{    0.1481,    0.0689,    0.0230,    0.2134,    0.2506,    0.1351,    0.0000,    0.0054,         0,    0.0252},
565{    0.0299,    0.0088,    0.0705,    0.1071,    0.1115,    0.0626,    0.0234,    0.0308,    0.0252,         0},
566              },
567            new double[,]
568              {
569{         0,    0.0518,    0.0225,    0.0842,    0.0134,    0.0822,    0.0259,    0.0044,    0.0472,    0.1388},
570{    0.0518,         0,    0.1075,    0.0068,    0.1109,    0.0098,    0.0040,    0.0548,    0.1861,    0.0426},
571{    0.0225,    0.1075,         0,    0.1884,    0.0022,    0.1953,    0.0866,    0.0109,    0.0010,    0.2263},
572{    0.0842,    0.0068,    0.1884,         0,    0.1883,    0.0000,    0.0186,    0.1147,    0.1866,    0.0066},
573{    0.0134,    0.1109,    0.0022,    0.1883,         0,    0.2191,    0.0553,    0.0019,    0.0060,    0.2459},
574{    0.0822,    0.0098,    0.1953,    0.0000,    0.2191,         0,    0.0209,    0.0970,    0.2098,    0.0083},
575{    0.0259,    0.0040,    0.0866,    0.0186,    0.0553,    0.0209,         0,    0.0544,    0.1387,    0.0493},
576{    0.0044,    0.0548,    0.0109,    0.1147,    0.0019,    0.0970,    0.0544,         0,    0.0181,    0.1157},
577{    0.0472,    0.1861,    0.0010,    0.1866,    0.0060,    0.2098,    0.1387,    0.0181,         0,    0.3179},
578{    0.1388,    0.0426,    0.2263,    0.0066,    0.2459,    0.0083,    0.0493,    0.1157,    0.3179,         0},
579              },
580            new double[,]
581              {
582{         0,    0.0195,    0.1128,    0.1600,    0.1591,    0.2414,    0.1441,    0.1240,    0.0109,    0.0116},
583{    0.0195,         0,    0.0446,    0.0686,    0.0786,    0.1693,    0.0542,    0.0354,    0.0014,    0.0003},
584{    0.1128,    0.0446,         0,    0.0016,    0.0011,    0.0202,    0.0003,    0.0004,    0.0837,    0.0487},
585{    0.1600,    0.0686,    0.0016,         0,    0.0001,    0.0143,    0.0030,    0.0034,    0.0778,    0.0727},
586{    0.1591,    0.0786,    0.0011,    0.0001,         0,    0.0171,    0.0021,    0.0020,    0.0942,    0.0812},
587{    0.2414,    0.1693,    0.0202,    0.0143,    0.0171,         0,    0.0250,    0.0207,    0.1541,    0.1880},
588{    0.1441,    0.0542,    0.0003,    0.0030,    0.0021,    0.0250,         0,    0.0000,    0.0782,    0.0489},
589{    0.1240,    0.0354,    0.0004,    0.0034,    0.0020,    0.0207,    0.0000,         0,    0.0714,    0.0315},
590{    0.0109,    0.0014,    0.0837,    0.0778,    0.0942,    0.1541,    0.0782,    0.0714,         0,    0.0003},
591{    0.0116,    0.0003,    0.0487,    0.0727,    0.0812,    0.1880,    0.0489,    0.0315,    0.0003,         0},
592              },
593            new double[,]
594              {
595{    2.0000,    1.6472,    1.1513,    1.3142,    1.3662,    1.2437,    1.6267,    1.4148,    1.7372,    1.2786},
596{    1.6472,    2.0000,    1.0689,    1.1876,    1.4541,    1.5370,    1.5174,    1.0103,    1.5898,    1.8381},
597{    1.1513,    1.0689,    2.0000,    1.2199,    1.3398,    1.2402,    1.2244,    1.5320,    1.5293,    1.0276},
598{    1.3142,    1.1876,    1.2199,    2.0000,    1.5197,    1.7027,    1.1555,    1.2033,    1.0675,    1.1291},
599{    1.3662,    1.4541,    1.3398,    1.5197,    2.0000,    1.7299,    1.0916,    0.9989,    1.3706,    1.3407},
600{    1.2437,    1.5370,    1.2402,    1.7027,    1.7299,    2.0000,    1.2223,    0.9923,    1.1787,    1.5758},
601{    1.6267,    1.5174,    1.2244,    1.1555,    1.0916,    1.2223,    2.0000,    1.6461,    1.6369,    1.1928},
602{    1.4148,    1.0103,    1.5320,    1.2033,    0.9989,    0.9923,    1.6461,    2.0000,    1.5176,    0.7806},
603{    1.7372,    1.5898,    1.5293,    1.0675,    1.3706,    1.1787,    1.6369,    1.5176,    2.0000,    1.3009},
604{    1.2786,    1.8381,    1.0276,    1.1291,    1.3407,    1.5758,    1.1928,    0.7806,    1.3009,    2.0000},
605              },
606          }
607      );
608      TestCovarianceFunction(new CovarianceSEard(), 1,
609        new double[,]
610          {
611{    6.8592,    6.7985,    7.2362,    6.8334,    7.1127,    6.7239,    6.9920,    7.1048,    6.9798,    7.1914},
612{    6.9271,    7.0445,    7.0531,    6.8979,    7.0803,    6.7872,    7.0000,    7.1935,    7.0617,    7.1727},
613{    7.1376,    7.1086,    7.2246,    7.0223,    6.8388,    7.1522,    7.2172,    6.9886,    7.1139,    7.2091},
614{    7.1414,    6.8169,    7.1438,    7.0632,    6.6389,    6.8750,    7.2749,    7.2619,    7.2462,    7.1986},
615{    7.2667,    6.8852,    7.1309,    7.2824,    6.5548,    6.6792,    7.1550,    7.3063,    7.2929,    7.2454},
616{    7.2563,    7.0864,    7.0436,    7.2078,    6.6953,    6.8834,    7.2517,    7.3388,    7.3405,    7.2466},
617{    6.9160,    7.1146,    7.0783,    6.8557,    7.2536,    6.8398,    6.9750,    6.9351,    6.9897,    7.1926},
618{    6.9130,    6.9378,    7.1825,    6.8129,    7.0557,    6.9294,    7.0338,    6.8021,    6.9302,    7.1482},
619{    6.9551,    7.0340,    7.2476,    6.9120,    7.1611,    6.8932,    7.0166,    7.0213,    6.9995,    7.2274},
620{    6.8624,    7.0619,    6.9373,    6.7848,    6.9446,    6.9109,    7.0221,    7.1802,    7.0209,    7.0642},
621          },
622        new double[][,]
623          {           
624            new double[,]
625              {
626{         0,    0.1316,    0.2186,    0.2629,    0.0051,    0.0049,    0.0062,    0.2224,    0.0023,    0.0882},
627{    0.1316,         0,    0.6685,    0.7466,    0.1864,    0.1865,    0.0799,    0.6593,    0.0990,    0.0037},
628{    0.2186,    0.6685,         0,    0.0017,    0.1606,    0.1602,    0.2987,    0.0000,    0.2745,    0.5725},
629{    0.2629,    0.7466,    0.0017,         0,    0.1985,    0.2030,    0.3422,    0.0019,    0.3043,    0.6432},
630{    0.0051,    0.1864,    0.1606,    0.1985,         0,    0.0000,    0.0216,    0.1524,    0.0141,    0.1366},
631{    0.0049,    0.1865,    0.1602,    0.2030,    0.0000,         0,    0.0215,    0.1535,    0.0134,    0.1384},
632{    0.0062,    0.0799,    0.2987,    0.3422,    0.0216,    0.0215,         0,    0.3081,    0.0010,    0.0478},
633{    0.2224,    0.6593,    0.0000,    0.0019,    0.1524,    0.1535,    0.3081,         0,    0.2715,    0.5480},
634{    0.0023,    0.0990,    0.2745,    0.3043,    0.0141,    0.0134,    0.0010,    0.2715,         0,    0.0628},
635{    0.0882,    0.0037,    0.5725,    0.6432,    0.1366,    0.1384,    0.0478,    0.5480,    0.0628,         0},
636              },
637            new double[,]
638              {
639{         0,    0.1486,    0.2692,    0.1339,    0.4441,    0.3941,    0.0255,    0.0295,    0.0413,    0.4886},
640{    0.1486,         0,    0.0201,    0.0002,    0.0823,    0.0641,    0.2940,    0.2925,    0.0334,    0.1076},
641{    0.2692,    0.0201,         0,    0.0246,    0.0200,    0.0113,    0.4590,    0.4923,    0.1073,    0.0302},
642{    0.1339,    0.0002,    0.0246,         0,    0.0910,    0.0723,    0.2689,    0.2847,    0.0270,    0.1096},
643{    0.4441,    0.0823,    0.0200,    0.0910,         0,    0.0012,    0.6588,    0.6726,    0.2177,    0.0013},
644{    0.3941,    0.0641,    0.0113,    0.0723,    0.0012,         0,    0.6140,    0.6177,    0.1829,    0.0050},
645{    0.0255,    0.2940,    0.4590,    0.2689,    0.6588,    0.6140,         0,    0.0002,    0.1310,    0.7259},
646{    0.0295,    0.2925,    0.4923,    0.2847,    0.6726,    0.6177,    0.0002,         0,    0.1398,    0.7073},
647{    0.0413,    0.0334,    0.1073,    0.0270,    0.2177,    0.1829,    0.1310,    0.1398,         0,    0.2506},
648{    0.4886,    0.1076,    0.0302,    0.1096,    0.0013,    0.0050,    0.7259,    0.7073,    0.2506,         0},
649              },
650            new double[,]
651              {
652{         0,    0.0137,    0.3191,    0.0455,    0.0349,    0.0041,    0.1669,    0.2356,    0.1673,    0.0440},
653{    0.0137,         0,    0.2012,    0.1063,    0.0922,    0.0327,    0.0843,    0.1306,    0.0841,    0.0094},
654{    0.3191,    0.2012,         0,    0.6073,    0.5736,    0.3987,    0.0277,    0.0077,    0.0290,    0.1253},
655{    0.0455,    0.1063,    0.6073,         0,    0.0007,    0.0231,    0.3728,    0.4790,    0.3672,    0.1755},
656{    0.0349,    0.0922,    0.5736,    0.0007,         0,    0.0156,    0.3385,    0.4318,    0.3474,    0.1576},
657{    0.0041,    0.0327,    0.3987,    0.0231,    0.0156,         0,    0.2156,    0.2880,    0.2133,    0.0769},
658{    0.1669,    0.0843,    0.0277,    0.3728,    0.3385,    0.2156,         0,    0.0066,    0.0000,    0.0366},
659{    0.2356,    0.1306,    0.0077,    0.4790,    0.4318,    0.2880,    0.0066,         0,    0.0068,    0.0694},
660{    0.1673,    0.0841,    0.0290,    0.3672,    0.3474,    0.2133,    0.0000,    0.0068,         0,    0.0365},
661{    0.0440,    0.0094,    0.1253,    0.1755,    0.1576,    0.0769,    0.0366,    0.0694,    0.0365,         0},
662              },
663            new double[,]
664              {
665{         0,    0.0612,    0.0363,    0.1211,    0.0186,    0.1239,    0.0310,    0.0059,    0.0534,    0.2043},
666{    0.0612,         0,    0.1847,    0.0107,    0.1461,    0.0123,    0.0050,    0.0989,    0.2270,    0.0458},
667{    0.0363,    0.1847,         0,    0.2888,    0.0032,    0.2952,    0.1324,    0.0137,    0.0012,    0.4024},
668{    0.1211,    0.0107,    0.2888,         0,    0.2388,    0.0000,    0.0299,    0.1780,    0.3210,    0.0108},
669{    0.0186,    0.1461,    0.0032,    0.2388,         0,    0.2484,    0.0933,    0.0034,    0.0083,    0.3475},
670{    0.1239,    0.0123,    0.2952,    0.0000,    0.2484,         0,    0.0320,    0.1778,    0.3315,    0.0102},
671{    0.0310,    0.0050,    0.1324,    0.0299,    0.0933,    0.0320,         0,    0.0644,    0.1650,    0.0770},
672{    0.0059,    0.0989,    0.0137,    0.1780,    0.0034,    0.1778,    0.0644,         0,    0.0230,    0.2610},
673{    0.0534,    0.2270,    0.0012,    0.3210,    0.0083,    0.3315,    0.1650,    0.0230,         0,    0.4611},
674{    0.2043,    0.0458,    0.4024,    0.0108,    0.3475,    0.0102,    0.0770,    0.2610,    0.4611,         0},
675              },
676            new double[,]
677              {
678{         0,    0.0230,    0.1818,    0.2301,    0.2212,    0.3641,    0.1723,    0.1672,    0.0123,    0.0171},
679{    0.0230,         0,    0.0767,    0.1076,    0.1036,    0.2126,    0.0688,    0.0640,    0.0017,    0.0004},
680{    0.1818,    0.0767,         0,    0.0024,    0.0015,    0.0305,    0.0004,    0.0006,    0.1055,    0.0867},
681{    0.2301,    0.1076,    0.0024,         0,    0.0001,    0.0164,    0.0049,    0.0052,    0.1338,    0.1192},
682{    0.2212,    0.1036,    0.0015,    0.0001,         0,    0.0194,    0.0035,    0.0037,    0.1306,    0.1147},
683{    0.3641,    0.2126,    0.0305,    0.0164,    0.0194,         0,    0.0382,    0.0380,    0.2434,    0.2311},
684{    0.1723,    0.0688,    0.0004,    0.0049,    0.0035,    0.0382,         0,    0.0000,    0.0930,    0.0764},
685{    0.1672,    0.0640,    0.0006,    0.0052,    0.0037,    0.0380,    0.0000,         0,    0.0907,    0.0710},
686{    0.0123,    0.0017,    0.1055,    0.1338,    0.1306,    0.2434,    0.0930,    0.0907,         0,    0.0005},
687{    0.0171,    0.0004,    0.0867,    0.1192,    0.1147,    0.2311,    0.0764,    0.0710,    0.0005,         0},
688              },
689            new double[,]
690              {
691{   14.7781,   14.3950,   13.7138,   13.9618,   14.0352,   13.8578,   14.3707,   14.1018,   14.4990,   13.9100},
692{   14.3950,   14.7781,   13.5767,   13.7715,   14.1542,   14.2607,   14.2360,   13.4735,   14.3260,   14.6102},
693{   13.7138,   13.5767,   14.7781,   13.8217,   13.9982,   13.8525,   13.8286,   14.2545,   14.2511,   13.5045},
694{   13.9618,   13.7715,   13.8217,   14.7781,   14.2390,   14.4598,   13.7206,   13.7960,   13.5743,   13.6778},
695{   14.0352,   14.1542,   13.9982,   14.2390,   14.7781,   14.4908,   13.6154,   13.4528,   14.0413,   13.9995},
696{   13.8578,   14.2607,   13.8525,   14.4598,   14.4908,   14.7781,   13.8254,   13.4407,   13.7576,   14.3090},
697{   14.3707,   14.2360,   13.8286,   13.7206,   13.6154,   13.8254,   14.7781,   14.3938,   14.3828,   13.7798},
698{   14.1018,   13.4735,   14.2545,   13.7960,   13.4528,   13.4407,   14.3938,   14.7781,   14.2363,   13.0113},
699{   14.4990,   14.3260,   14.2511,   13.5743,   14.0413,   13.7576,   14.3828,   14.2363,   14.7781,   13.9425},
700{   13.9100,   14.6102,   13.5045,   13.6778,   13.9995,   14.3090,   13.7798,   13.0113,   13.9425,   14.7781},
701              },
702          }
703      );
704    }
705
706    [TestMethod]
707    public void CovSumTest() {
708      var cov = new CovarianceSum();
709      cov.Terms.Add(new CovarianceSEiso());
710      cov.Terms.Add(new CovarianceLinear());
711      TestCovarianceFunction(cov, 0,
712        new double[,]
713          {
714{    1.4860,    1.5376,    2.7382,    1.4230,    2.7566,    2.0148,    1.9261,    1.8493,    1.6069,    2.2035},
715{    1.0861,    1.4463,    1.8848,    1.0165,    2.1818,    1.6036,    1.4240,    1.4965,    1.2360,    1.6526},
716{    2.1463,    2.2472,    2.8854,    1.9188,    2.4455,    2.9283,    2.5049,    1.8107,    2.0157,    2.4059},
717{    1.6245,    1.2089,    2.2059,    1.4630,    1.5864,    1.9084,    2.0859,    1.7825,    1.7332,    1.8574},
718{    1.6804,    1.1454,    2.0031,    1.6914,    1.2725,    1.4029,    1.6810,    1.6888,    1.6437,    1.7665},
719{    1.4052,    1.2437,    1.5900,    1.2941,    1.2438,    1.4882,    1.6072,    1.4970,    1.4811,    1.5135},
720{    1.4913,    1.9972,    2.3544,    1.3689,    2.9275,    2.1163,    1.8043,    1.4564,    1.5325,    2.1139},
721{    2.0334,    2.2303,    3.0928,    1.8439,    3.1092,    2.8169,    2.4555,    1.7771,    1.9760,    2.5789},
722{    1.7324,    2.0254,    2.8414,    1.6386,    2.9270,    2.3807,    2.0510,    1.7808,    1.7231,    2.3527},
723{    0.9196,    1.4220,    1.6254,    0.7696,    1.8861,    1.7579,    1.4076,    1.4163,    1.1077,    1.3988},
724          },
725        new double[][,]
726          {     
727            new double[,]
728              {
729{         0,    0.3197,    0.6358,    0.5518,    0.5207,    0.5909,    0.3361,    0.4897,    0.2447,    0.5720},
730{    0.3197,         0,    0.6697,    0.6190,    0.4635,    0.4047,    0.4190,    0.6899,    0.3650,    0.1552},
731{    0.6358,    0.6697,         0,    0.6031,    0.5367,    0.5927,    0.6008,    0.4084,    0.4103,    0.6843},
732{    0.5518,    0.6190,    0.6031,         0,    0.4173,    0.2740,    0.6339,    0.6114,    0.6702,    0.6455},
733{    0.5207,    0.4635,    0.5367,    0.4173,         0,    0.2510,    0.6610,    0.6935,    0.5180,    0.5362},
734{    0.5909,    0.4047,    0.5927,    0.2740,    0.2510,         0,    0.6019,    0.6955,    0.6232,    0.3756},
735{    0.3361,    0.4190,    0.6008,    0.6339,    0.6610,    0.6019,         0,    0.3205,    0.3279,    0.6165},
736{    0.4897,    0.6899,    0.4084,    0.6114,    0.6935,    0.6955,    0.3205,         0,    0.4189,    0.7344},
737{    0.2447,    0.3650,    0.4103,    0.6702,    0.5180,    0.6232,    0.3279,    0.4189,         0,    0.5595},
738{    0.5720,    0.1552,    0.6843,    0.6455,    0.5362,    0.3756,    0.6165,    0.7344,    0.5595,         0},
739              },
740            new double[,]
741              {
742{    2.0000,    1.6472,    1.1513,    1.3142,    1.3662,    1.2437,    1.6267,    1.4148,    1.7372,    1.2786},
743{    1.6472,    2.0000,    1.0689,    1.1876,    1.4541,    1.5370,    1.5174,    1.0103,    1.5898,    1.8381},
744{    1.1513,    1.0689,    2.0000,    1.2199,    1.3398,    1.2402,    1.2244,    1.5320,    1.5293,    1.0276},
745{    1.3142,    1.1876,    1.2199,    2.0000,    1.5197,    1.7027,    1.1555,    1.2033,    1.0675,    1.1291},
746{    1.3662,    1.4541,    1.3398,    1.5197,    2.0000,    1.7299,    1.0916,    0.9989,    1.3706,    1.3407},
747{    1.2437,    1.5370,    1.2402,    1.7027,    1.7299,    2.0000,    1.2223,    0.9923,    1.1787,    1.5758},
748{    1.6267,    1.5174,    1.2244,    1.1555,    1.0916,    1.2223,    2.0000,    1.6461,    1.6369,    1.1928},
749{    1.4148,    1.0103,    1.5320,    1.2033,    0.9989,    0.9923,    1.6461,    2.0000,    1.5176,    0.7806},
750{    1.7372,    1.5898,    1.5293,    1.0675,    1.3706,    1.1787,    1.6369,    1.5176,    2.0000,    1.3009},
751{    1.2786,    1.8381,    1.0276,    1.1291,    1.3407,    1.5758,    1.1928,    0.7806,    1.3009,    2.0000},
752              },
753          }
754      );
755      TestCovarianceFunction(cov, 1,
756        new double[,]
757          {
758{    7.7681,    7.7957,    9.1175,    7.6951,    9.1148,    8.2406,    8.2532,    8.2057,    7.9303,    8.5765},
759{    7.3926,    7.7881,    8.2289,    7.3128,    8.5326,    7.8570,    7.7535,    7.8698,    7.5822,    8.0224},
760{    8.5096,    8.6045,    9.2632,    8.2546,    8.7198,    9.2945,    8.8817,    8.1368,    8.3741,    8.7816},
761{    7.9886,    7.4745,    8.5704,    7.8096,    7.7719,    8.1964,    8.4695,    8.1648,    8.1138,    8.2315},
762{    8.0632,    7.4371,    8.3651,    8.0757,    7.4147,    7.6080,    8.0477,    8.0750,    8.0288,    8.1469},
763{    7.7869,    7.5959,    7.9316,    7.6696,    7.4564,    7.7793,    7.9884,    7.8850,    7.8692,    7.8941},
764{    7.7940,    8.3557,    8.7048,    7.6497,    9.3089,    8.3910,    8.1263,    7.7655,    7.8589,    8.4871},
765{    8.3350,    8.5404,    9.4643,    8.1079,    9.4540,    9.1241,    8.7945,    8.0367,    8.2835,    8.9443},
766{    8.0481,    8.3644,    9.2221,    7.9399,    9.2948,    8.6753,    8.3852,    8.1164,    8.0524,    8.7309},
767{    7.2030,    7.7683,    7.9353,    7.0220,    8.1984,    8.0588,    7.7433,    7.7874,    7.4431,    7.7457},
768          },
769        new double[][,]
770          {           
771            new double[,]
772              {
773{         0,    0.3781,    1.0250,    0.7934,    0.7239,    0.8910,    0.4018,    0.6606,    0.2764,    0.8421},
774{    0.3781,         0,    1.1512,    0.9715,    0.6106,    0.5082,    0.5320,    1.2453,    0.4451,    0.1669},
775{    1.0250,    1.1512,         0,    0.9248,    0.7589,    0.8960,    0.9183,    0.5143,    0.5175,    1.2171},
776{    0.7934,    0.9715,    0.9248,         0,    0.5292,    0.3149,    1.0188,    0.9487,    1.1534,    1.0583},
777{    0.7239,    0.6106,    0.7589,    0.5292,         0,    0.2845,    1.1157,    1.2640,    0.7182,    0.7577},
778{    0.8910,    0.5082,    0.8960,    0.3149,    0.2845,         0,    0.9214,    1.2749,    0.9845,    0.4616},
779{    0.4018,    0.5320,    0.9183,    1.0188,    1.1157,    0.9214,         0,    0.3793,    0.3899,    0.9638},
780{    0.6606,    1.2453,    0.5143,    0.9487,    1.2640,    1.2749,    0.3793,         0,    0.5318,    1.6567},
781{    0.2764,    0.4451,    0.5175,    1.1534,    0.7182,    0.9845,    0.3899,    0.5318,         0,    0.8116},
782{    0.8421,    0.1669,    1.2171,    1.0583,    0.7577,    0.4616,    0.9638,    1.6567,    0.8116,         0},
783              },
784            new double[,]
785              {
786{   14.7781,   14.3950,   13.7138,   13.9618,   14.0352,   13.8578,   14.3707,   14.1018,   14.4990,   13.9100},
787{   14.3950,   14.7781,   13.5767,   13.7715,   14.1542,   14.2607,   14.2360,   13.4735,   14.3260,   14.6102},
788{   13.7138,   13.5767,   14.7781,   13.8217,   13.9982,   13.8525,   13.8286,   14.2545,   14.2511,   13.5045},
789{   13.9618,   13.7715,   13.8217,   14.7781,   14.2390,   14.4598,   13.7206,   13.7960,   13.5743,   13.6778},
790{   14.0352,   14.1542,   13.9982,   14.2390,   14.7781,   14.4908,   13.6154,   13.4528,   14.0413,   13.9995},
791{   13.8578,   14.2607,   13.8525,   14.4598,   14.4908,   14.7781,   13.8254,   13.4407,   13.7576,   14.3090},
792{   14.3707,   14.2360,   13.8286,   13.7206,   13.6154,   13.8254,   14.7781,   14.3938,   14.3828,   13.7798},
793{   14.1018,   13.4735,   14.2545,   13.7960,   13.4528,   13.4407,   14.3938,   14.7781,   14.2363,   13.0113},
794{   14.4990,   14.3260,   14.2511,   13.5743,   14.0413,   13.7576,   14.3828,   14.2363,   14.7781,   13.9425},
795{   13.9100,   14.6102,   13.5045,   13.6778,   13.9995,   14.3090,   13.7798,   13.0113,   13.9425,   14.7781},
796              },
797          }
798      );
799    }
800    [TestMethod]
801    public void CovProdTest() {
802      var cov = new CovarianceProd();
803      cov.Factors.Add(new CovarianceSEiso());
804      cov.Factors.Add(new CovarianceLinear());
805      TestCovarianceFunction(cov, 0,
806        new double[,]
807          {
808{    0.5245,    0.5389,    1.6120,    0.4836,    1.5106,    0.7554,    0.8386,    0.8239,    0.6239,    1.1336},
809{    0.2889,    0.5225,    0.8337,    0.2496,    1.0595,    0.5710,    0.5052,    0.5547,    0.3724,    0.6822},
810{    1.0623,    1.1239,    1.7263,    0.8459,    1.0618,    1.6839,    1.3988,    0.7607,    0.9521,    1.3106},
811{    0.6585,    0.3625,    1.1117,    0.5349,    0.5137,    0.7756,    1.0648,    0.7942,    0.7510,    0.8516},
812{    0.7040,    0.3275,    0.9490,    0.7125,    0.3548,    0.4404,    0.7037,    0.7073,    0.6680,    0.7798},
813{    0.4641,    0.3741,    0.6234,    0.3844,    0.3673,    0.5306,    0.6413,    0.5193,    0.5036,    0.5608},
814{    0.5385,    0.9383,    1.1840,    0.4565,    1.7927,    0.8766,    0.7518,    0.5198,    0.5765,    1.0608},
815{    0.8694,    1.0060,    1.8506,    0.7108,    1.7052,    1.3654,    1.2234,    0.6698,    0.8427,    1.4060},
816{    0.6989,    0.9246,    1.7118,    0.6277,    1.6927,    1.0667,    0.9339,    0.7510,    0.7057,    1.2768},
817{    0.1972,    0.5055,    0.6262,    0.1263,    0.7928,    0.7002,    0.4950,    0.4913,    0.2894,    0.4889},
818
819          },
820        new double[][,]
821          {     
822            new double[,]
823              {
824{         0,    0.4127,    1.0287,    0.6741,    0.5630,    0.4325,    0.5722,    1.0336,    0.4752,    0.5617},
825{    0.4127,         0,    0.6880,    0.3738,    0.2907,    0.1730,    0.4679,    0.8675,    0.4878,    0.1286},
826{    1.0287,    0.6880,         0,    0.7937,    0.6606,    0.5323,    0.9538,    0.9634,    0.8138,    0.6381},
827{    0.6741,    0.3738,    0.7937,         0,    0.3455,    0.1881,    0.6345,    0.9714,    0.7339,    0.3214},
828{    0.5630,    0.2907,    0.6606,    0.3455,         0,    0.1313,    0.5056,    0.8485,    0.6038,    0.2630},
829{    0.4325,    0.1730,    0.5323,    0.1881,    0.1313,         0,    0.3748,    0.6687,    0.4734,    0.1491},
830{    0.5722,    0.4679,    0.9538,    0.6345,    0.5056,    0.3748,         0,    0.6955,    0.5871,    0.5059},
831{    1.0336,    0.8675,    0.9634,    0.9714,    0.8485,    0.6687,    0.6955,         0,    0.9475,    0.6932},
832{    0.4752,    0.4878,    0.8138,    0.7339,    0.6038,    0.4734,    0.5871,    0.9475,         0,    0.6046},
833{    0.5617,    0.1286,    0.6381,    0.3214,    0.2630,    0.1491,    0.5059,    0.6932,    0.6046,         0},
834              },
835            new double[,]
836              {
837{    4.0023,    2.1261,    1.8626,    1.6054,    1.4771,    0.9102,    2.7697,    2.9858,    3.3730,    1.2556},
838{    2.1261,    1.9372,    1.0981,    0.7172,    0.9121,    0.6569,    1.6947,    1.2703,    2.1250,    1.5231},
839{    1.8626,    1.0981,    4.6784,    1.6055,    1.6490,    1.1138,    1.9438,    3.6140,    3.0330,    0.9581},
840{    1.6054,    0.7172,    1.6055,    2.5635,    1.2584,    1.1688,    1.1565,    1.9117,    1.1689,    0.5622},
841{    1.4771,    0.9121,    1.6490,    1.2584,    1.8469,    0.9049,    0.8350,    1.2221,    1.5977,    0.6577},
842{    0.9102,    0.6569,    1.1138,    1.1688,    0.9049,    0.8258,    0.7611,    0.9541,    0.8954,    0.6253},
843{    2.7697,    1.6947,    1.9438,    1.1565,    0.8350,    0.7611,    3.6346,    3.5720,    2.9305,    0.9789},
844{    2.9858,    1.2703,    3.6140,    1.9117,    1.2221,    0.9541,    3.5720,    5.8240,    3.4327,    0.7368},
845{    3.3730,    2.1250,    3.0330,    1.1689,    1.5977,    0.8954,    2.9305,    3.4327,    4.3277,    1.4057},
846{    1.2556,    1.5231,    0.9581,    0.5622,    0.6577,    0.6253,    0.9789,    0.7368,    1.4057,    1.7151},
847              },
848          }
849      );
850      TestCovarianceFunction(cov, 1,
851        new double[,]
852          {
853{    6.2342,    6.7795,   13.6134,    5.8887,   14.2405,   10.1987,    8.8183,    7.8217,    6.6344,    9.9609},
854{    3.2242,    5.2384,    8.2928,    2.8624,   10.2826,    7.2613,    5.2743,    4.8651,    3.6758,    6.0948},
855{    9.7926,   10.6338,   14.7280,    8.6537,   12.8640,   15.3218,   12.0130,    8.0240,    8.9653,   11.3359},
856{    6.0497,    4.4825,   10.1916,    5.2725,    7.5223,    9.0848,    8.6907,    6.5563,    6.2868,    7.4352},
857{    5.7877,    3.8005,    8.8010,    5.7766,    5.6360,    6.2037,    6.3872,    5.6164,    5.3671,    6.5321},
858{    3.8501,    3.6110,    6.2543,    3.3286,    5.0963,    6.1672,    5.3421,    4.0085,    3.8812,    4.6925},
859{    6.0719,    8.8301,   11.5124,    5.4433,   14.9080,   10.6099,    8.0304,    5.7589,    6.0753,    9.3107},
860{    9.8306,   11.1183,   16.3892,    8.8231,   16.9213,   15.2084,   12.3844,    8.3980,    9.3789,   12.8390},
861{    7.6019,    9.3580,   14.3105,    7.1044,   15.2800,   12.2846,    9.6031,    7.6887,    7.3699,   10.8667},
862{    2.3372,    4.9884,    6.9233,    1.6100,    8.7070,    7.9328,    5.0646,    4.3597,    2.9643,    4.8145},
863          },
864        new double[][,]
865          {           
866            new double[,]
867              {
868{         0,    0.4881,    1.6583,    0.9692,    0.7827,    0.6522,    0.6841,    1.3942,    0.5367,    0.8270},
869{    0.4881,         0,    1.1827,    0.5867,    0.3830,    0.2172,    0.5941,    1.5658,    0.5949,    0.1383},
870{    1.6583,    1.1827,         0,    1.2171,    0.9340,    0.8047,    1.4579,    1.2131,    1.0263,    1.1349},
871{    0.9692,    0.5867,    1.2171,         0,    0.4382,    0.2161,    1.0197,    1.5073,    1.2629,    0.5270},
872{    0.7827,    0.3830,    0.9340,    0.4382,         0,    0.1488,    0.8534,    1.5465,    0.8372,    0.3717},
873{    0.6522,    0.2172,    0.8047,    0.2161,    0.1488,         0,    0.5737,    1.2259,    0.7478,    0.1832},
874{    0.6841,    0.5941,    1.4579,    1.0197,    0.8534,    0.5737,         0,    0.8230,    0.6981,    0.7909},
875{    1.3942,    1.5658,    1.2131,    1.5073,    1.5465,    1.2259,    0.8230,         0,    1.2028,    1.5638},
876{    0.5367,    0.5949,    1.0263,    1.2629,    0.8372,    0.7478,    0.6981,    1.2028,         0,    0.8770},
877{    0.8270,    0.1383,    1.1349,    0.5270,    0.3717,    0.1832,    0.7909,    1.5638,    0.8770,         0},
878              },
879            new double[,]
880              {
881{   29.5729,   18.5805,   22.1876,   17.0550,   15.1746,   10.1428,   24.4678,   29.7604,   28.1516,   13.6594},
882{   18.5805,   14.3139,   13.9483,    8.3170,    8.8785,    6.0953,   15.8990,   16.9410,   19.1490,   12.1067},
883{   22.1876,   13.9483,   34.5691,   18.1905,   17.2281,   12.4415,   21.9535,   33.6266,   28.2630,   12.5918},
884{   17.0550,    8.3170,   18.1905,   18.9418,   11.7900,    9.9253,   13.7325,   21.9184,   14.8634,    6.8107},
885{   15.1746,    8.8785,   17.2281,   11.7900,   13.6471,    7.5799,   10.4142,   16.4592,   16.3685,    6.8676},
886{   10.1428,    6.0953,   12.4415,    9.9253,    7.5799,    6.1018,    8.6086,   12.9238,   10.4507,    5.6783},
887{   24.4678,   15.8990,   21.9535,   13.7325,   10.4142,    8.6086,   26.8561,   31.2335,   25.7489,   11.3079},
888{   29.7604,   16.9410,   33.6266,   21.9184,   16.4592,   12.9238,   31.2335,   43.0336,   32.2012,   12.2815},
889{   28.1516,   19.1490,   28.2630,   14.8634,   16.3685,   10.4507,   25.7489,   32.2012,   31.9778,   15.0663},
890{   13.6594,   12.1067,   12.5918,    6.8107,    6.8676,    5.6783,   11.3079,   12.2815,   15.0663,   12.6728},
891              },
892          }
893      , 5e-3);
894    }
895
896
897    private void TestCovarianceFunction(ICovarianceFunction cf, double hypValue, double[,] expectedCov, double[][,] expectedGradients, double delta = 1E-3) {
898      var x = GetData();
899      var xt = GetDataTest();
900
901      int nHyp = cf.GetNumberOfParameters(x.GetLength(1));
902      var hyp = Enumerable.Repeat(hypValue, nHyp).ToArray();
903      cf.SetParameter(hyp);
904
905      int rows0 = x.GetLength(0);
906      int rows1 = xt.GetLength(0);
907      var actualCov = new double[rows0, rows1];
908      for (int i = 0; i < rows0; i++)
909        for (int j = 0; j < rows1; j++)
910          actualCov[i, j] = cf.GetCrossCovariance(x, xt, i, j);
911
912      AssertEqual(expectedCov, actualCov, delta);
913
914      for (int i = 0; i < rows0; i++)
915        for (int j = 0; j < rows1; j++) {
916          var g = cf.GetGradient(x, i, j).ToArray();
917          for (int k = 0; k < nHyp; k++)
918            Assert.AreEqual(expectedGradients[k][i, j], g[k], delta);
919        }
920    }
921
922
923    private void TestMeanFunction(IMeanFunction mf, double hypValue, double[] expectedMean, double[][] expectedGradients) {
924      var x = GetData();
925      var xt = GetDataTest();
926
927      int nHyp = mf.GetNumberOfParameters(x.GetLength(1));
928      var hyp = Enumerable.Repeat(hypValue, nHyp).ToArray();
929      mf.SetParameter(hyp);
930      mf.SetData(x);
931
932      var m = mf.GetMean(xt);
933
934      AssertEqual(expectedMean, m);
935
936      for (int i = 0; i < nHyp; i++) {
937        var g = mf.GetGradients(i, x);
938        AssertEqual(expectedGradients[i], g);
939      }
940    }
941
942
943    private void AssertEqual(double[] expected, double[] actual) {
944      Assert.AreEqual(expected.Length, actual.Length);
945      for (int i = 0; i < expected.Length; i++)
946        Assert.AreEqual(expected[i], actual[i], 1E-3);
947    }
948    private void AssertEqual(double[,] expected, double[,] actual, double delta = 5e-3) {
949      Assert.AreEqual(expected.Length, actual.Length);
950      for (int i = 0; i < expected.GetLength(0); i++)
951        for (int j = 0; j < expected.GetLength(1); j++)
952          Assert.AreEqual(expected[i, j], actual[i, j], delta);
953    }
954
955    private double[,] GetData() {
956      return new double[,]
957               {
958                 {0.4173, 0.7803, 0.2348, 0.5470, 0.9294},
959                 {0.0497, 0.3897, 0.3532, 0.2963, 0.7757},
960                 {0.9027, 0.2417, 0.8212, 0.7447, 0.4868},
961                 {0.9448, 0.4039, 0.0154, 0.1890, 0.4359},
962                 {0.4909, 0.0965, 0.0430, 0.6868, 0.4468},
963                 {0.4893, 0.1320, 0.1690, 0.1835, 0.3063},
964                 {0.3377, 0.9421, 0.6491, 0.3685, 0.5085},
965                 {0.9001, 0.9561, 0.7317, 0.6256, 0.5108},
966                 {0.3692, 0.5752, 0.6477, 0.7802, 0.8176},
967                 {0.1112, 0.0598, 0.4509, 0.0811, 0.7948}
968               };
969    }
970
971    private double[,] GetDataTest() {
972      return new double[,]
973               {
974                 {0.6443, 0.2077, 0.3111, 0.5949, 0.0855},
975                 {0.3786, 0.3012, 0.9234, 0.2622, 0.2625},
976                 {0.8116, 0.4709, 0.4302, 0.6028, 0.8010},
977                 {0.5328, 0.2305, 0.1848, 0.7112, 0.0292},
978                 {0.3507, 0.8443, 0.9049, 0.2217, 0.9289},
979                 {0.9390, 0.1948, 0.9797, 0.1174, 0.7303},
980                 {0.8759, 0.2259, 0.4389, 0.2967, 0.4886},
981                 {0.5502, 0.1707, 0.1111, 0.3188, 0.5785},
982                 {0.6225, 0.2277, 0.2581, 0.4242, 0.2373},
983                 {0.5870, 0.4357, 0.4087, 0.5079, 0.4588}
984               };
985    }
986  }
987}
Note: See TracBrowser for help on using the repository browser.