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 "dakota_data_util.hpp"
11 #include "DakotaTraitsBase.hpp"
12 #include "DakotaIterator.hpp"
13 #include "DataMethod.hpp"
14 #include "DataModel.hpp"
15
16 #ifdef DAKOTA_HOPS
17 #include "APPSOptimizer.hpp"
18 #endif
19 #ifdef HAVE_ACRO
20 #include "COLINOptimizer.hpp"
21 #include "PEBBLMinimizer.hpp"
22 #endif
23 #ifdef HAVE_JEGA
24 #include "JEGAOptimizer.hpp"
25 #endif
26 #ifdef HAVE_NOMAD
27 #include "NomadOptimizer.hpp"
28 #endif
29 #ifdef HAVE_OPTPP
30 #include "SNLLOptimizer.hpp"
31 #endif
32 #include "SurrBasedGlobalMinimizer.hpp"
33
34 #include <limits>
35 #include <string>
36 #include <map>
37
38 #include <Teuchos_UnitTestHarness.hpp>
39
40
41 using namespace Dakota;
42
43
44 //----------------------------------------------------------------
45
46 namespace {
47
check_variables(unsigned short methodName,int num_cont_vars,int num_disc_int_vars,int num_disc_real_vars,int num_disc_string_vars,bool & continuous_only)48 bool check_variables( unsigned short methodName,
49 int num_cont_vars,
50 int num_disc_int_vars,
51 int num_disc_real_vars,
52 int num_disc_string_vars,
53 bool & continuous_only )
54 {
55 if (methodName == MOGA || methodName == SOGA ||
56 methodName == COLINY_EA || methodName == SURROGATE_BASED_GLOBAL ||
57 methodName == COLINY_BETA || methodName == MESH_ADAPTIVE_SEARCH ||
58 methodName == ASYNCH_PATTERN_SEARCH || methodName == BRANCH_AND_BOUND)
59 {
60 continuous_only = false;
61 if (!num_cont_vars && !num_disc_int_vars && !num_disc_real_vars && !num_disc_string_vars)
62 return false;
63 }
64 else
65 { // methods supporting only continuous design variables
66 continuous_only = true;
67 if (!num_cont_vars)
68 return false;
69 }
70 return true;
71 }
72
73 //----------------------------------
74
check_variables(std::shared_ptr<TraitsBase> traits,int num_cont_vars,int num_disc_int_vars,int num_disc_real_vars,int num_disc_string_vars,bool & continuous_only)75 bool check_variables( std::shared_ptr<TraitsBase> traits,
76 int num_cont_vars,
77 int num_disc_int_vars,
78 int num_disc_real_vars,
79 int num_disc_string_vars,
80 bool & continuous_only )
81 {
82 if( traits->supports_continuous_variables() &&
83 traits->supports_discrete_variables())
84 {
85 continuous_only = false;
86 if (!num_cont_vars && !num_disc_int_vars && !num_disc_real_vars && !num_disc_string_vars)
87 return false;
88 }
89 else { // methods supporting only continuous design variables
90 continuous_only = true;
91 if (!num_cont_vars)
92 return false;
93 }
94 return true;
95 }
96
97 //----------------------------------
98
check_variable_consistency(unsigned short methodName,std::shared_ptr<TraitsBase> traits,Teuchos::FancyOStream & out,bool & success)99 void check_variable_consistency( unsigned short methodName,
100 std::shared_ptr<TraitsBase> traits,
101 Teuchos::FancyOStream &out,
102 bool & success )
103 {
104 bool continuous_only_enum = false;
105 bool continuous_only_traits = false;
106 bool is_consistent_enums = false;
107 bool is_consistent_traits = false;
108
109 std::shared_ptr<Iterator> method_iter;
110
111 // Test Traits
112 method_iter.reset( new Iterator(traits) );
113 TEST_ASSERT( method_iter->traits()->is_derived() );
114
115 for( int i=0; i<2; ++i )
116 for( int j=0; j<2; ++j )
117 for( int k=0; k<2; ++k )
118 for( int l=0; l<2; ++l )
119 {
120 is_consistent_enums = check_variables(methodName, i, j, k, l, continuous_only_enum);
121 is_consistent_traits = check_variables(method_iter->traits(), i, j, k, l, continuous_only_traits);
122 TEST_ASSERT( is_consistent_enums == is_consistent_traits );
123 TEST_ASSERT( continuous_only_enum == continuous_only_traits );
124 }
125 }
126 }
127
128
TEUCHOS_UNIT_TEST(opt_api_traits,var_consistency)129 TEUCHOS_UNIT_TEST(opt_api_traits, var_consistency)
130 {
131 // Test various TPL Traits as they become available
132 #ifdef DAKOTA_HOPS
133 check_variable_consistency( ASYNCH_PATTERN_SEARCH , std::shared_ptr<TraitsBase>(new AppsTraits()) , out, success );
134 #endif
135 #ifdef HAVE_JEGA
136 check_variable_consistency( MOGA , std::shared_ptr<TraitsBase>(new JEGATraits()) , out, success );
137 check_variable_consistency( SOGA , std::shared_ptr<TraitsBase>(new JEGATraits()) , out, success );
138 #endif
139 check_variable_consistency( SURROGATE_BASED_GLOBAL, std::shared_ptr<TraitsBase>(new SurrBasedGlobalTraits()), out, success );
140 #ifdef HAVE_NOMAD
141 check_variable_consistency( MESH_ADAPTIVE_SEARCH , std::shared_ptr<TraitsBase>(new NomadTraits()) , out, success );
142 #endif
143 #ifdef HAVE_ACRO
144 check_variable_consistency( BRANCH_AND_BOUND , std::shared_ptr<TraitsBase>(new PebbldTraits()) , out, success );
145 #endif
146 }
147
148 //----------------------------------------------------------------
149