TEST_F(AnalysisFixture, MeasureGroup_Constructors) { MeasureVector measures; // At most one null measure is allowed. measures.push_back(NullMeasure()); measures.push_back(NullMeasure()); measures.push_back(NullMeasure()); measures.push_back(NullMeasure()); MeasureGroup variable("Variable",measures); EXPECT_EQ(1u,variable.numMeasures(false)); // deserialization constructor UUID uuid = createUUID(); UUID versionUUID = createUUID(); measures = variable.measures(false); variable = MeasureGroup(uuid,versionUUID,"Variable","","",boost::none,measures); EXPECT_EQ("Variable",variable.name()); EXPECT_TRUE(variable.uuid() == uuid); EXPECT_TRUE(variable.versionUUID() == versionUUID); EXPECT_TRUE(variable.measures(false) == measures); // Inconsistent file types in measures (should throw) measures.clear(); openstudio::path rubyScriptPath = toPath(rubyLibDir()) / toPath("openstudio/runmanager/rubyscripts/PerturbObject.rb"); measures.push_back(NullMeasure()); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::OSM, FileReferenceType::IDF)); EXPECT_THROW(MeasureGroup("Variable 2",measures),std::exception); // Inconsistent file types in measures (should throw) measures.clear(); measures.push_back(NullMeasure()); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::IDF, FileReferenceType::IDF)); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::OSM, FileReferenceType::OSM)); EXPECT_THROW(MeasureGroup("Variable",measures),std::exception); }
TEST_F(AnalysisFixture,DDACEAlgorithm_CompatibleProblemType) { // continuous problem with five variables VariableVector variables; BCLMeasure bclMeasure(resourcesPath() / toPath("utilities/BCL/Measures/v2/SetWindowToWallRatioByFacade")); RubyMeasure measure(bclMeasure); variables.push_back(RubyContinuousVariable("Var 1",OSArgument::makeDoubleArgument("wwr1"),measure)); variables.push_back(RubyContinuousVariable("Var 2",OSArgument::makeDoubleArgument("wwr2"),measure)); variables.push_back(RubyContinuousVariable("Var 3",OSArgument::makeDoubleArgument("wwr3"),measure)); variables.push_back(RubyContinuousVariable("Var 4",OSArgument::makeDoubleArgument("wwr4"),measure)); variables.push_back(RubyContinuousVariable("Var 5",OSArgument::makeDoubleArgument("wwr5"),measure)); Problem cProblem("Continuous Problem",variables,runmanager::Workflow()); EXPECT_EQ(5,cProblem.numVariables()); EXPECT_EQ(5,cProblem.numContinuousVariables()); variables.clear(); // mixed problem with three variables, ignorable discrete variable MeasureVector measures; variables.push_back(RubyContinuousVariable("Var 1",OSArgument::makeDoubleArgument("wwr1"),measure)); measures.push_back(RubyMeasure(toPath("script.rb"),FileReferenceType::OSM,FileReferenceType::OSM)); variables.push_back(MeasureGroup("Var 2",measures)); measures.clear(); variables.push_back(RubyContinuousVariable("Var 3",OSArgument::makeDoubleArgument("wwr3"),measure)); Problem mProblem("Mixed Problem",variables,runmanager::Workflow()); EXPECT_EQ(3,mProblem.numVariables()); EXPECT_EQ(2,mProblem.numContinuousVariables()); EXPECT_EQ(1,mProblem.numDiscreteVariables()); EXPECT_EQ(1,mProblem.numStaticTransformations()); variables.clear(); // discrete problem measures.push_back(NullMeasure()); measures.push_back(RubyMeasure(toPath("script1.rb"),FileReferenceType::OSM,FileReferenceType::OSM)); measures.back().cast<RubyMeasure>().addArgument("wwr","0.2"); measures.push_back(RubyMeasure(toPath("script1.rb"),FileReferenceType::OSM,FileReferenceType::OSM)); measures.back().cast<RubyMeasure>().addArgument("wwr","0.4"); variables.push_back(MeasureGroup("Var 1",measures)); measures.clear(); measures.push_back(NullMeasure()); measures.push_back(RubyMeasure(toPath("script2.rb"),FileReferenceType::OSM,FileReferenceType::OSM)); measures.back().cast<RubyMeasure>().addArgument("cop","3.0"); measures.back().cast<RubyMeasure>().addArgument("fan_eff","0.3"); measures.push_back(RubyMeasure(toPath("script2.rb"),FileReferenceType::OSM,FileReferenceType::OSM)); measures.back().cast<RubyMeasure>().addArgument("cop","3.5"); measures.back().cast<RubyMeasure>().addArgument("fan_eff","0.3"); measures.push_back(RubyMeasure(toPath("script2.rb"),FileReferenceType::OSM,FileReferenceType::OSM)); measures.back().cast<RubyMeasure>().addArgument("cop","3.0"); measures.back().cast<RubyMeasure>().addArgument("fan_eff","0.5"); measures.push_back(RubyMeasure(toPath("script2.rb"),FileReferenceType::OSM,FileReferenceType::OSM)); measures.back().cast<RubyMeasure>().addArgument("cop","3.5"); measures.back().cast<RubyMeasure>().addArgument("fan_eff","0.5"); variables.push_back(MeasureGroup("Var 2",measures)); measures.clear(); Problem dProblem("Discrete Problem",variables,runmanager::Workflow()); EXPECT_EQ(2,dProblem.numVariables()); EXPECT_EQ(2,dProblem.numDiscreteVariables()); EXPECT_EQ(0,dProblem.numStaticTransformations()); variables.clear(); // box-behnken DDACEAlgorithmOptions options(DDACEAlgorithmType::box_behnken); DDACEAlgorithm algorithm(options); EXPECT_TRUE(algorithm.isCompatibleProblemType(cProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(mProblem)); EXPECT_FALSE(algorithm.isCompatibleProblemType(dProblem)); options.setSamples(DDACEAlgorithmOptions::samplesForBoxBehnken(cProblem)); ASSERT_TRUE(algorithm.ddaceAlgorithmOptions().samples()); EXPECT_EQ(81,algorithm.ddaceAlgorithmOptions().samples().get()); EXPECT_EQ(5,DDACEAlgorithmOptions::samplesForBoxBehnken(mProblem)); EXPECT_EQ(0,DDACEAlgorithmOptions::samplesForBoxBehnken(dProblem)); // central-composite options = DDACEAlgorithmOptions(DDACEAlgorithmType::central_composite); algorithm = DDACEAlgorithm(options); EXPECT_TRUE(algorithm.isCompatibleProblemType(cProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(mProblem)); EXPECT_FALSE(algorithm.isCompatibleProblemType(dProblem)); options.setSamples(DDACEAlgorithmOptions::samplesForCentralComposite(cProblem)); ASSERT_TRUE(algorithm.ddaceAlgorithmOptions().samples()); EXPECT_EQ(43,algorithm.ddaceAlgorithmOptions().samples().get()); EXPECT_EQ(9,DDACEAlgorithmOptions::samplesForCentralComposite(mProblem)); EXPECT_EQ(0,DDACEAlgorithmOptions::samplesForCentralComposite(dProblem)); // grid options = DDACEAlgorithmOptions(DDACEAlgorithmType::grid); algorithm = DDACEAlgorithm(options); EXPECT_TRUE(algorithm.isCompatibleProblemType(cProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(mProblem)); EXPECT_FALSE(algorithm.isCompatibleProblemType(dProblem)); EXPECT_TRUE(options.setSamplesForGrid(3,cProblem)); ASSERT_TRUE(algorithm.ddaceAlgorithmOptions().symbols()); ASSERT_TRUE(algorithm.ddaceAlgorithmOptions().samples()); EXPECT_EQ(3,algorithm.ddaceAlgorithmOptions().symbols().get()); EXPECT_EQ(243,algorithm.ddaceAlgorithmOptions().samples().get()); EXPECT_TRUE(algorithm.ddaceAlgorithmOptions().setSamplesForGrid(5,mProblem)); ASSERT_TRUE(algorithm.ddaceAlgorithmOptions().symbols()); ASSERT_TRUE(algorithm.ddaceAlgorithmOptions().samples()); EXPECT_EQ(5,algorithm.ddaceAlgorithmOptions().symbols().get()); EXPECT_EQ(25,algorithm.ddaceAlgorithmOptions().samples().get()); EXPECT_FALSE(options.setSamplesForGrid(2,dProblem)); // lhs options = DDACEAlgorithmOptions(DDACEAlgorithmType::lhs); algorithm = DDACEAlgorithm(options); EXPECT_TRUE(algorithm.isCompatibleProblemType(cProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(mProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(dProblem)); // oa_lhs options = DDACEAlgorithmOptions(DDACEAlgorithmType::oa_lhs); algorithm = DDACEAlgorithm(options); EXPECT_TRUE(algorithm.isCompatibleProblemType(cProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(mProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(dProblem)); // oas options = DDACEAlgorithmOptions(DDACEAlgorithmType::oas); algorithm = DDACEAlgorithm(options); EXPECT_TRUE(algorithm.isCompatibleProblemType(cProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(mProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(dProblem)); // random options = DDACEAlgorithmOptions(DDACEAlgorithmType::random); algorithm = DDACEAlgorithm(options); EXPECT_TRUE(algorithm.isCompatibleProblemType(cProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(mProblem)); EXPECT_TRUE(algorithm.isCompatibleProblemType(dProblem)); }
TEST_F(AnalysisFixture, Problem_Constructors) { VariableVector variables; MeasureVector measures; runmanager::Workflow workflow; // almost-default constructor Problem problem("Problem",variables,workflow); EXPECT_EQ(0,problem.numVariables()); OptionalInt combinatorialSize = problem.combinatorialSize(true); ASSERT_TRUE(combinatorialSize); EXPECT_EQ(0,*combinatorialSize); // variables with consistent file types variables.clear(); measures.clear(); measures.push_back(NullMeasure()); openstudio::path rubyScriptPath = toPath(rubyLibDir()) / toPath("openstudio/runmanager/rubyscripts/PerturbObject.rb"); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::OSM, FileReferenceType::OSM)); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::OSM, FileReferenceType::OSM)); variables.push_back(MeasureGroup("Variable 1",measures)); measures.clear(); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::OSM, FileReferenceType::IDF)); variables.push_back(MeasureGroup("Variable 2",measures)); measures.clear(); measures.push_back(NullMeasure()); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::IDF, FileReferenceType::IDF)); variables.push_back(MeasureGroup("Variable 3",measures)); problem = Problem("Problem",variables,workflow); EXPECT_EQ(3,problem.numVariables()); EXPECT_EQ(6,problem.combinatorialSize(true).get()); // variables with inconistent file types variables.clear(); measures.clear(); measures.push_back(NullMeasure()); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::OSM, FileReferenceType::OSM)); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::OSM, FileReferenceType::OSM)); variables.push_back(MeasureGroup("Variable 1",measures)); measures.clear(); measures.push_back(NullMeasure()); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::IDF, FileReferenceType::IDF)); variables.push_back(MeasureGroup("Variable 2",measures)); EXPECT_THROW(Problem("Problem",variables,workflow),std::exception); // variables and non-null workflow with consistent file types variables.clear(); measures.clear(); measures.push_back(NullMeasure()); measures.push_back(RubyMeasure(rubyScriptPath, FileReferenceType::IDF, FileReferenceType::IDF)); variables.push_back(MeasureGroup("Variable 1",measures)); workflow = runmanager::Workflow(); workflow.addJob(openstudio::runmanager::JobType::EnergyPlus); problem = Problem("Problem",variables,workflow); problem.setDisplayName("Display Name"); problem.setDescription("long winded description"); EXPECT_EQ(1,problem.numVariables()); EXPECT_EQ(2,problem.combinatorialSize(true).get()); // deserialization Problem problemCopy(problem.uuid(), problem.versionUUID(), problem.name(), problem.displayName(), problem.description(), problem.workflow(), problem.responses()); EXPECT_FALSE(problem == problemCopy); // different impls EXPECT_TRUE(problem.uuid() == problemCopy.uuid()); EXPECT_TRUE(problem.versionUUID() == problemCopy.versionUUID()); EXPECT_EQ(problem.name(),problemCopy.name()); EXPECT_EQ(problem.displayName(),problemCopy.displayName()); EXPECT_EQ(problem.description(),problemCopy.description()); EXPECT_TRUE(problem.workflow() == problemCopy.workflow()); // variables and non-null workflow with inconsistent file types workflow = runmanager::Workflow(); workflow.addJob(openstudio::runmanager::JobType::ModelToIdf); workflow.addJob(openstudio::runmanager::JobType::EnergyPlus); EXPECT_THROW(Problem("Problem",variables,workflow),std::exception); }