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