std::vector<DataPoint> Analysis_Impl::getDataPoints(const std::string& tag) const { DataPointVector result; BOOST_FOREACH(const DataPoint& dataPoint,m_dataPoints) { if (dataPoint.isTag(tag)) { result.push_back(dataPoint); } } return result; }
std::vector<DataPoint> Analysis_Impl::failedDataPoints() const { DataPointVector result; BOOST_FOREACH(const DataPoint& dataPoint,m_dataPoints) { if (dataPoint.isComplete() && dataPoint.failed()) { result.push_back(dataPoint); } } return result; }
std::vector<DataPoint> Analysis_Impl::getDataPoints( const std::vector<QVariant>& variableValues) const { DataPointVector result; BOOST_FOREACH(const DataPoint& dataPoint, m_dataPoints) { if (dataPoint.matches(variableValues)) { result.push_back(dataPoint); } } return result; }
std::vector<DataPoint> Analysis_Impl::dataPointsNeedingDetails() const { DataPointVector result; BOOST_FOREACH(const DataPoint& dataPoint, m_dataPoints) { if (dataPoint.isComplete() && (dataPoint.runType() == DataPointRunType::CloudDetailed) && dataPoint.directory().empty()) { result.push_back(dataPoint); } } return result; }
boost::optional<DataPoint> Analysis_Impl::getDataPoint( const std::vector<Measure>& measures) const { OptionalDataPoint result; std::vector<QVariant> variableValues = problem().getVariableValues(measures); if (variableValues.size() == measures.size()) { // problem was able to match all measures DataPointVector intermediate = getDataPoints(variableValues); OS_ASSERT(intermediate.size() < 2u); if (intermediate.size() == 1u) { result = intermediate[0]; } } return result; }
boost::optional<DataPoint> Analysis_Impl::getDataPoint( const std::vector<DiscretePerturbation>& perturbations) const { OptionalDataPoint result; std::vector<QVariant> variableValues = problem().getVariableValues(perturbations); if (variableValues.size() == perturbations.size()) { // problem was able to match all perturbations DataPointVector intermediate = getDataPoints(variableValues); BOOST_ASSERT(intermediate.size() < 2u); if (intermediate.size() == 1u) { result = intermediate[0]; } } return result; }
bool Analysis_Impl::addDataPoint(const DataPoint& dataPoint) { if (m_dataPointsAreInvalid) { LOG(Info,"Current data points are invalid. Call removeAllDataPoints before adding new ones."); return false; } if (!(dataPoint.problem().uuid() == problem().uuid())) { LOG(Error,"Cannot add given DataPoint to Analysis '" << name() << "', because it is not associated with Problem '" << problem().name() << "'."); return false; } DataPointVector existingDataPoints = getDataPoints(dataPoint.variableValues()); if (existingDataPoints.size() > 0) { BOOST_ASSERT(existingDataPoints.size() == 1); // dataPoint must be fully specified to be valid LOG(Info,"DataPoint not added to Analysis '" << name() << "', because it already exists."); return false; } m_dataPoints.push_back(dataPoint); connectChild(m_dataPoints.back(),true); onChange(AnalysisObject_Impl::Benign); return true; }
boost::optional<DataPoint> DakotaAlgorithm_Impl::createNextDataPoint( Analysis& analysis,const DakotaParametersFile& params) { OS_ASSERT(analysis.algorithm().get() == getPublicObject<DakotaAlgorithm>()); // TODO: Update iteration counter. OptionalDataPoint result = analysis.problem().createDataPoint(params, getPublicObject<DakotaAlgorithm>()); if (result) { bool added = analysis.addDataPoint(*result); if (!added) { // get equivalent point already in analysis DataPointVector candidates = analysis.getDataPoints(result->variableValues()); OS_ASSERT(candidates.size() == 1u); result = candidates[0]; } std::stringstream ss; ss << name() << "_" << m_iter; result->addTag(ss.str()); } return result; }
TEST_F(AnalysisDriverFixture, DDACE_LatinHypercube_Continuous) { { // GET SIMPLE PROJECT SimpleProject project = getCleanSimpleProject("DDACE_LatinHypercube_Continuous"); Analysis analysis = project.analysis(); // SET PROBLEM Problem problem = retrieveProblem("Continuous",true,false); analysis.setProblem(problem); // DEFINE SEED Model model = model::exampleModel(); openstudio::path p = toPath("./example.osm"); model.save(p,true); FileReference seedModel(p); analysis.setSeed(seedModel); // CREATE ANALYSIS DDACEAlgorithmOptions algOptions(DDACEAlgorithmType::lhs); DDACEAlgorithm algorithm(algOptions); analysis.setAlgorithm(algorithm); // RUN ANALYSIS AnalysisDriver driver = project.analysisDriver(); AnalysisRunOptions runOptions = standardRunOptions(project.projectDir()); CurrentAnalysis currentAnalysis = driver.run(analysis,runOptions); EXPECT_TRUE(driver.waitForFinished()); boost::optional<runmanager::JobErrors> jobErrors = currentAnalysis.dakotaJobErrors(); ASSERT_TRUE(jobErrors); EXPECT_FALSE(jobErrors->errors().empty()); // require specification of number of samples EXPECT_TRUE(driver.currentAnalyses().empty()); Table summary = currentAnalysis.analysis().summaryTable(); EXPECT_EQ(1u,summary.nRows()); // no points project.clearAllResults(); algOptions.setSamples(4); EXPECT_EQ(4,analysis.algorithm()->cast<DDACEAlgorithm>().ddaceAlgorithmOptions().samples()); currentAnalysis = driver.run(analysis,runOptions); EXPECT_TRUE(driver.waitForFinished()); jobErrors = currentAnalysis.dakotaJobErrors(); ASSERT_TRUE(jobErrors); EXPECT_TRUE(jobErrors->errors().empty()); EXPECT_TRUE(driver.currentAnalyses().empty()); summary = currentAnalysis.analysis().summaryTable(); EXPECT_EQ(5u,summary.nRows()); summary.save(project.projectDir() / toPath("summary.csv")); BOOST_FOREACH(const DataPoint& dataPoint,analysis.dataPoints()) { EXPECT_TRUE(dataPoint.isComplete()); EXPECT_FALSE(dataPoint.failed()); // EXPECT_FALSE(dataPoint.responseValues().empty()); } ASSERT_TRUE(analysis.algorithm()); EXPECT_TRUE(analysis.algorithm()->isComplete()); EXPECT_FALSE(analysis.algorithm()->failed()); { AnalysisRecord analysisRecord = project.analysisRecord(); Analysis analysisCopy = analysisRecord.analysis(); ASSERT_TRUE(analysisCopy.algorithm()); EXPECT_TRUE(analysisCopy.algorithm()->isComplete()); EXPECT_FALSE(analysisCopy.algorithm()->failed()); } } LOG(Info,"Restart from existing project."); // Get existing project SimpleProject project = getSimpleProject("DDACE_LatinHypercube_Continuous"); EXPECT_FALSE(project.analysisIsLoaded()); // make sure starting fresh Analysis analysis = project.analysis(); EXPECT_FALSE(analysis.isDirty()); // Add custom data point std::vector<QVariant> values; values.push_back(0.0); values.push_back(0.8); values.push_back(int(0)); OptionalDataPoint dataPoint = analysis.problem().createDataPoint(values); ASSERT_TRUE(dataPoint); analysis.addDataPoint(*dataPoint); EXPECT_EQ(1u,analysis.dataPointsToQueue().size()); ASSERT_TRUE(analysis.algorithm()); EXPECT_TRUE(analysis.algorithm()->isComplete()); EXPECT_FALSE(analysis.algorithm()->failed()); EXPECT_TRUE(analysis.isDirty()); EXPECT_FALSE(analysis.resultsAreInvalid()); EXPECT_FALSE(analysis.dataPointsAreInvalid()); // get last modified time of a file in a completed data point to make sure nothing is re-run DataPointVector completePoints = analysis.completeDataPoints(); ASSERT_FALSE(completePoints.empty()); OptionalFileReference inputFileRef = completePoints[0].osmInputData(); ASSERT_TRUE(inputFileRef); QFileInfo inputFileInfo(toQString(inputFileRef->path())); QDateTime inputFileModifiedTestTime = inputFileInfo.lastModified(); EXPECT_EQ(1u,analysis.dataPointsToQueue().size()); AnalysisDriver driver = project.analysisDriver(); CurrentAnalysis currentAnalysis = driver.run( analysis, standardRunOptions(project.projectDir())); EXPECT_TRUE(driver.waitForFinished()); boost::optional<runmanager::JobErrors> jobErrors = currentAnalysis.dakotaJobErrors(); EXPECT_FALSE(jobErrors); // should not try to re-run DakotaAlgorithm EXPECT_TRUE(driver.currentAnalyses().empty()); EXPECT_TRUE(analysis.dataPointsToQueue().empty()); Table summary = currentAnalysis.analysis().summaryTable(); EXPECT_EQ(6u,summary.nRows()); summary.save(project.projectDir() / toPath("summary_post_restart.csv")); // RunManager should not re-run any data points EXPECT_EQ(inputFileModifiedTestTime,inputFileInfo.lastModified()); }
int DesignOfExperiments_Impl::createNextIteration(Analysis& analysis) { int result(0); // to make sure problem type check has already occurred. this is stated usage in header. OS_ASSERT(analysis.algorithm().get() == getPublicObject<DesignOfExperiments>()); // nothing else is supported yet DesignOfExperimentsOptions options = designOfExperimentsOptions(); OS_ASSERT(options.designType() == DesignOfExperimentsType::FullFactorial); if (isComplete()) { LOG(Info,"Algorithm is already marked as complete. Returning without creating new points."); return result; } if (options.maxIter() && options.maxIter().get() < 1) { LOG(Info,"Maximum iterations set to less than one. No DataPoints will be added to Analysis '" << analysis.name() << "', and the Algorithm will be marked complete."); markComplete(); return result; } OptionalInt mxSim = options.maxSims(); DataPointVector dataPoints = analysis.getDataPoints("DOE"); int totPoints = dataPoints.size(); if (mxSim && (totPoints >= *mxSim)) { LOG(Info,"Analysis '" << analysis.name() << "' already contains " << totPoints << " DataPoints added by the DesignOfExperiments algorithm, which meets or exceeds the " << "maximum number specified in this algorithm's options object, " << *mxSim << ". " << "No data points will be added and the Algorithm will be marked complete."); markComplete(); return result; } m_iter = 1; // determine all combinations std::vector< std::vector<QVariant> > variableValues; for (const Variable& variable : analysis.problem().variables()) { // variable must be DiscreteVariable, otherwise !isCompatibleProblemType(analysis.problem()) DiscreteVariable discreteVariable = variable.cast<DiscreteVariable>(); IntVector dvValues = discreteVariable.validValues(true); std::vector< std::vector<QVariant> > currentValues = variableValues; for (IntVector::const_iterator it = dvValues.begin(), itEnd = dvValues.end(); it != itEnd; ++it) { std::vector< std::vector<QVariant> > nextSet = currentValues; if (currentValues.empty()) { variableValues.push_back(std::vector<QVariant>(1u,QVariant(*it))); } else { for (std::vector<QVariant>& point : nextSet) { point.push_back(QVariant(*it)); } if (it == dvValues.begin()) { variableValues = nextSet; } else { variableValues.insert(variableValues.end(),nextSet.begin(),nextSet.end()); } } } } // create data points and add to analysis for (const std::vector<QVariant>& value : variableValues) { DataPoint dataPoint = analysis.problem().createDataPoint(value).get(); dataPoint.addTag("DOE"); bool added = analysis.addDataPoint(dataPoint); if (added) { ++result; ++totPoints; if (mxSim && (totPoints == mxSim.get())) { break; } } } if (result == 0) { LOG(Trace,"No new points were added, so marking this DesignOfExperiments complete."); markComplete(); } return result; }