1 /* _______________________________________________________________________
2
3 DAKOTA: Design Analysis Kit for Optimization and Terascale Applications
4 Copyright 2014-2020 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
5 This software is distributed under the GNU Lesser General Public License.
6 For more information, see the README file in the top Dakota directory.
7 _______________________________________________________________________ */
8
9
10 #include "ExperimentData.hpp"
11 #include "dakota_data_io.hpp"
12
13 #include <string>
14
15 #include <Teuchos_UnitTestHarness.hpp>
16
17
18 using namespace Dakota;
19
20 namespace {
21
22 // Base case specifications
23 const int NUM_EXPTS = 1;
24 const int NUM_CONFIG_VARS = 3;
25 const size_t NUM_FIELDS = 1;
26 const size_t NUM_FIELD_VALUES = 401;
27 const int FIELD_DIM = 1;
28
29 ActiveSet mock_as(0); // arg specifies num scalar values
30 SharedResponseData mock_srd(mock_as);
31
32 }
33
34 //----------------------------------------------------------------
35
TEUCHOS_UNIT_TEST(expt_data,basic)36 TEUCHOS_UNIT_TEST(expt_data, basic)
37 {
38 // create an SRD with 0 scalars and 1 field of length NUM_FIELD_VALUES
39 IntVector field_lengths(NUM_FIELDS);
40 field_lengths[0] = NUM_FIELD_VALUES;
41 mock_srd.field_lengths(field_lengths);
42
43 StringArray variance_types(NUM_FIELDS);
44 variance_types[0] = "diagonal";
45
46 // convention appears to be field label is filename ?
47 const std::string base_name = "new_voltage";
48 const std::string working_dir = "expt_data_test_files";
49 StringArray field_labels(NUM_FIELDS);
50 field_labels[0] = base_name;
51 mock_srd.field_group_labels(field_labels);
52
53 ExperimentData expt_data(NUM_EXPTS, NUM_CONFIG_VARS, working_dir,
54 mock_srd, variance_types, 0 /* SILENT_OUTPUT */);
55
56 // const std::string config_vars_basename = base_name;
57 expt_data.load_data("expt_data unit test call");
58
59 // Test general correctness
60 TEST_EQUALITY( expt_data.num_experiments(), NUM_EXPTS );
61 TEST_EQUALITY( expt_data.num_scalar_primary(), 0 );
62 TEST_EQUALITY( expt_data.num_fields(), NUM_FIELDS );
63
64 // Test data correctness
65 RealVector field_vals_view = expt_data.field_data_view(0, 0);
66 std::string filename = working_dir + "/" + base_name;
67 RealVector gold_dat;
68 read_field_values(filename, 1, gold_dat);
69 TEST_EQUALITY( gold_dat.length(), field_vals_view.length() );
70 for( int i=0; i<field_vals_view.length(); ++i )
71 TEST_FLOATING_EQUALITY( gold_dat[i], field_vals_view[i], 1.e-14 );
72
73 // Test coords correctness
74 const RealMatrix field_coords_view = expt_data.field_coords_view(0, 0);
75 RealMatrix gold_coords;
76 read_coord_values(filename, 1, gold_coords);
77 TEST_EQUALITY( gold_coords.numRows(), field_coords_view.numRows() );
78 TEST_EQUALITY( gold_coords.numCols(), field_coords_view.numCols() );
79 for( int i=0; i<field_coords_view.numRows(); ++i )
80 for( int j=0; j<field_coords_view.numCols(); ++j )
81 TEST_FLOATING_EQUALITY( gold_coords(i,j), field_coords_view(i,j), 1.e-14 );
82
83 // Test config vars correctness
84 const RealVector& config_vars = expt_data.config_vars()[0];
85 TEST_EQUALITY( config_vars.length(), NUM_CONFIG_VARS );
86
87 // Test covariance correctness
88 RealVector resid_vals(field_vals_view.length());
89 resid_vals = 1.0;
90 Real triple_prod = expt_data.apply_covariance(resid_vals, 0);
91 //std::cout << "triple_prod = " << triple_prod << std::endl;
92 TEST_FLOATING_EQUALITY( triple_prod, 3.06251e+14, 1.e9 );
93 }
94
95 //----------------------------------------------------------------
96
TEUCHOS_UNIT_TEST(expt_data,twofield)97 TEUCHOS_UNIT_TEST(expt_data, twofield)
98 {
99 const size_t SECOND_NUM_FIELD_VALUES = 9;
100
101 IntVector field_lengths(NUM_FIELDS+1);
102 field_lengths[0] = NUM_FIELD_VALUES;
103 field_lengths[1] = SECOND_NUM_FIELD_VALUES;
104 mock_srd.field_lengths(field_lengths);
105
106 StringArray variance_types(NUM_FIELDS+1);
107 variance_types[0] = "diagonal";
108 variance_types[1] = "matrix";
109
110 // convention appears to be field label is filename ?
111 const std::string first_base_name = "new_voltage";
112 const std::string second_base_name = "pressure";
113 const std::string working_dir = "expt_data_test_files";
114 StringArray field_labels(NUM_FIELDS+1);
115 field_labels[0] = first_base_name;
116 field_labels[1] = second_base_name;
117 mock_srd.field_group_labels(field_labels);
118
119 ExperimentData expt_data(NUM_EXPTS, NUM_CONFIG_VARS, working_dir,
120 mock_srd, variance_types, 0 /* SILENT_OUTPUT */);
121
122 // const std::string config_vars_basename = first_base_name;
123 expt_data.load_data("expt_data unit test call");
124
125 // Test general correctness
126 TEST_EQUALITY( expt_data.num_experiments(), NUM_EXPTS );
127 TEST_EQUALITY( expt_data.num_scalar_primary(), 0 );
128 TEST_EQUALITY( expt_data.num_fields(), NUM_FIELDS+1 );
129
130 // Test data correctness
131 RealVector voltage_vals_view = expt_data.field_data_view(0 /* response */, 0 /* experiment */);
132 RealVector pressure_vals_view = expt_data.field_data_view(1 /* response */, 0 /* experiment */);
133 std::string filename1= working_dir + "/" + first_base_name;
134 std::string filename2= working_dir + "/" + second_base_name;
135 RealVector gold_dat1;
136 RealVector gold_dat2;
137 read_field_values(filename1, 1, gold_dat1);
138 read_field_values(filename2, 1, gold_dat2);
139 TEST_EQUALITY( gold_dat1.length(), voltage_vals_view.length() );
140 TEST_EQUALITY( gold_dat2.length(), pressure_vals_view.length() );
141 for( int i=0; i<voltage_vals_view.length(); ++i )
142 TEST_FLOATING_EQUALITY( gold_dat1[i], voltage_vals_view[i], 1.e-14 );
143 for( int i=0; i<pressure_vals_view.length(); ++i )
144 TEST_FLOATING_EQUALITY( gold_dat2[i], pressure_vals_view[i], 1.e-14 );
145
146 // Test coords correctness
147 RealMatrix field_coords_view1 = expt_data.field_coords_view(0, 0);
148 RealMatrix field_coords_view2 = expt_data.field_coords_view(1, 0);
149 RealMatrix gold_coords1;
150 RealMatrix gold_coords2;
151 read_coord_values(filename1, 1, gold_coords1);
152 read_coord_values(filename2, 1, gold_coords2);
153 TEST_EQUALITY( gold_coords1.numRows(), field_coords_view1.numRows() );
154 TEST_EQUALITY( gold_coords1.numCols(), field_coords_view1.numCols() );
155 TEST_EQUALITY( gold_coords2.numRows(), field_coords_view2.numRows() );
156 TEST_EQUALITY( gold_coords2.numCols(), field_coords_view2.numCols() );
157 for( int i=0; i<field_coords_view1.numRows(); ++i )
158 for( int j=0; j<field_coords_view1.numCols(); ++j )
159 TEST_FLOATING_EQUALITY( gold_coords1(i,j), field_coords_view1(i,j), 1.e-14 );
160 for( int i=0; i<field_coords_view2.numRows(); ++i )
161 for( int j=0; j<field_coords_view2.numCols(); ++j )
162 TEST_FLOATING_EQUALITY( gold_coords2(i,j), field_coords_view2(i,j), 1.e-14 );
163
164 // Test config vars correctness
165 const RealVector& config_vars = expt_data.config_vars()[0];
166 TEST_EQUALITY( config_vars.length(), NUM_CONFIG_VARS );
167 //
168 // Test covariance correctness
169 RealVector resid_vals(voltage_vals_view.length() + pressure_vals_view.length());
170 resid_vals = 1.0;
171 Real triple_prod = expt_data.apply_covariance(resid_vals, 0);
172 //std::cout << "triple_prod = " << triple_prod << std::endl;
173 TEST_FLOATING_EQUALITY( triple_prod, 3.06251e+14, 1.e9 );
174 }
175
176 //----------------------------------------------------------------
177
TEUCHOS_UNIT_TEST(expt_data,allowNoConfigFile)178 TEUCHOS_UNIT_TEST(expt_data, allowNoConfigFile)
179 {
180 // Create an ExperimentData object that expects NUM_CONFIG_VARS > 0 but
181 // that does not have a corresponding experiment.1.confif file.
182 StringArray variance_types;
183 const std::string working_dir = "no_such_dir";
184 ExperimentData expt_data(NUM_EXPTS, NUM_CONFIG_VARS, working_dir,
185 mock_srd, variance_types, 0 /* SILENT_OUTPUT */);
186 TEST_THROW(
187 expt_data.load_data("expt_data unit test call"),
188 std::runtime_error );
189 }
190