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