TEST_F(AnalysisDriverFixture,RuntimeBehavior_StopAndRestartDakotaAnalysis) {

  // RETRIEVE PROBLEM
  Problem problem = retrieveProblem("SimpleHistogramBinUQ",true,false);

  // DEFINE SEED
  Model model = model::exampleModel();
  openstudio::path p = toPath("./example.osm");
  model.save(p,true);
  FileReference seedModel(p);

  // CREATE ANALYSIS
  SamplingAlgorithmOptions algOptions;
  algOptions.setSamples(10);
  Analysis analysis("Stop and Restart Dakota Analysis",
                    problem,
                    SamplingAlgorithm(algOptions),
                    seedModel);

  // RUN ANALYSIS
  if (!dakotaExePath().empty()) {
    ProjectDatabase database = getCleanDatabase("StopAndRestartDakotaAnalysis");
    AnalysisDriver analysisDriver(database);
    AnalysisRunOptions runOptions = standardRunOptions(analysisDriver.database().path().parent_path());
    StopWatcher watcher(analysisDriver);
    watcher.watch(analysis.uuid());
    CurrentAnalysis currentAnalysis = analysisDriver.run(analysis,runOptions);
    analysisDriver.waitForFinished();
    EXPECT_FALSE(analysisDriver.isRunning());

    // check conditions afterward
    boost::optional<runmanager::JobErrors> jobErrors = currentAnalysis.dakotaJobErrors();
    ASSERT_TRUE(jobErrors);
    EXPECT_FALSE(jobErrors->errors().empty());
    EXPECT_FALSE(currentAnalysis.analysis().dataPoints().empty());
    EXPECT_FALSE(currentAnalysis.analysis().dataPointsToQueue().empty());
    EXPECT_FALSE(currentAnalysis.analysis().completeDataPoints().empty());
    EXPECT_FALSE(currentAnalysis.analysis().successfulDataPoints().empty());
    EXPECT_TRUE(currentAnalysis.analysis().failedDataPoints().empty());
    EXPECT_FALSE(currentAnalysis.analysis().algorithm()->isComplete());
    EXPECT_FALSE(currentAnalysis.analysis().algorithm()->failed());
    EXPECT_EQ(0u,analysisDriver.currentAnalyses().size());
    LOG(Debug,"After initial stop, there are " << currentAnalysis.analysis().dataPoints().size()
        << " data points, of which " << currentAnalysis.analysis().completeDataPoints().size()
        << " are complete.");

    // try to restart from database contents
    Analysis analysis = AnalysisRecord::getAnalysisRecords(database)[0].analysis();
    ASSERT_TRUE(analysis.algorithm());
    EXPECT_FALSE(analysis.algorithm()->isComplete());
    EXPECT_FALSE(analysis.algorithm()->failed());
    currentAnalysis = analysisDriver.run(analysis,runOptions);
    analysisDriver.waitForFinished();
    EXPECT_EQ(10u,analysis.dataPoints().size());
    EXPECT_EQ(0u,analysis.dataPointsToQueue().size());
    EXPECT_EQ(10u,analysis.completeDataPoints().size());
    EXPECT_EQ(10u,analysis.successfulDataPoints().size());
    EXPECT_EQ(0u,analysis.failedDataPoints().size());
  }
}
  std::string SamplingAlgorithm_Impl::dakotaInFileDescription() const {

    SamplingAlgorithmOptions options = samplingAlgorithmOptions();
    
    std::stringstream ss;
    ss << "method," << std::endl;
    ss << "        sampling" << std::endl;
    if (boost::optional<SamplingAlgorithmSampleType> sampleType = options.sampleType()) {
      ss << "          sample_type = " << (*sampleType).valueName() << std::endl;
    }
    if (options.allVariables()) {
      ss << "          all_variables" << std::endl;
    }
    if (OptionalInt seed = options.seed()) {
      ss << "          seed = " << *seed << std::endl;
    }
    if (options.fixedSeed()) {
      ss << "          fixed_seed" << std::endl;
    }
    if (boost::optional<SamplingAlgorithmRNGType> rngType = options.rngType()) {
      ss << "          rng = " << (*rngType).valueName() << std::endl;
    }
    if (options.varianceBasedDecomp()) {
      ss << "          variance_based_decomp" << std::endl;
    }
    if (options.dropTolerance()) {
      ss << "          drop_tolerance" << std::endl;
    }
    ss << "          samples = " << options.samples() << std::endl;
    ss << std::endl;

    return ss.str();
  }
TEST_F(AnalysisFixture, SamplingAlgorithmOptions) {

    //Testing SamplingAlgorithmOptions:
    SamplingAlgorithmOptions test1;

    SamplingAlgorithmRNGType obj0(SamplingAlgorithmRNGType::rnum2);
    SamplingAlgorithmSampleType obj1(SamplingAlgorithmSampleType::random);
    test1.setRNGType(obj0);
    test1.setSampleType(obj1);
    EXPECT_EQ(test1.rngType(),obj0);
    EXPECT_EQ(test1.sampleType(),obj1);
    test1.clearRNGType();
    test1.clearSampleType();
    EXPECT_FALSE(test1.rngType());
    EXPECT_FALSE(test1.sampleType());

    test1.setSamples(20);
    test1.setAllVariables(true);
    test1.setVarianceBasedDecomp(true);
    test1.setDropTolerance(true);
    test1.setSeed(5);
    test1.setFixedSeed(true);
    EXPECT_EQ(test1.samples(),20);
    EXPECT_TRUE(test1.varianceBasedDecomp());
    EXPECT_TRUE(test1.allVariables());
    EXPECT_TRUE(test1.dropTolerance());
    EXPECT_EQ(test1.seed(),5);
    EXPECT_TRUE(test1.fixedSeed());
    test1.clearSeed();
    EXPECT_FALSE(test1.seed());

    //Testing SamplingAlgorithm:

    SamplingAlgorithmOptions testOptions;


    testOptions.setAllVariables(true);
    testOptions.setSamples(4);
    testOptions.setSeed(3);
    testOptions.setFixedSeed(true);
    testOptions.setRNGType(SamplingAlgorithmRNGType::mt19937);
    testOptions.setSampleType(SamplingAlgorithmSampleType::lhs);
    testOptions.setVarianceBasedDecomp(true);
    testOptions.setDropTolerance(true);

    SamplingAlgorithm testSamplingOptions(testOptions);

    std::string testSamplingOptionsStrDakotaInDescription = testSamplingOptions.dakotaInFileDescription();
    LOG(Debug,"Printing the DakotaInFileDescription for the Sampling Options Test" << std::endl <<
        testSamplingOptionsStrDakotaInDescription );
}
TEST_F(AnalysisDriverFixture,RuntimeBehavior_StopDakotaAnalysis) {
  // Tests for stopping time < 20s.

  // RETRIEVE PROBLEM
  Problem problem = retrieveProblem("SimpleHistogramBinUQ",true,false);

  // DEFINE SEED
  Model model = model::exampleModel();
  openstudio::path p = toPath("./example.osm");
  model.save(p,true);
  FileReference seedModel(p);

  // CREATE ANALYSIS
  SamplingAlgorithmOptions algOptions;
  algOptions.setSamples(100);
  Analysis analysis("Stop Dakota Analysis",
                    problem,
                    SamplingAlgorithm(algOptions),
                    seedModel);

  // RUN ANALYSIS
  if (!dakotaExePath().empty()) {
    ProjectDatabase database = getCleanDatabase("StopDakotaAnalysis");
    AnalysisDriver analysisDriver(database);
    AnalysisRunOptions runOptions = standardRunOptions(analysisDriver.database().path().parent_path());
    StopWatcher watcher(analysisDriver);
    watcher.watch(analysis.uuid());
    CurrentAnalysis currentAnalysis = analysisDriver.run(analysis,runOptions);
    analysisDriver.waitForFinished();
    EXPECT_FALSE(analysisDriver.isRunning());
    EXPECT_GE(watcher.nComplete(),watcher.stopNum());
    EXPECT_LE(watcher.stoppingTime(),openstudio::Time(0,0,0,20));

    // check conditions afterward
    boost::optional<runmanager::JobErrors> jobErrors = currentAnalysis.dakotaJobErrors();
    ASSERT_TRUE(jobErrors);
    EXPECT_FALSE(jobErrors->errors().empty());
    EXPECT_FALSE(currentAnalysis.analysis().dataPoints().empty());
    EXPECT_FALSE(currentAnalysis.analysis().algorithm()->isComplete());
    EXPECT_FALSE(currentAnalysis.analysis().algorithm()->failed());
    EXPECT_EQ(0u,analysisDriver.currentAnalyses().size());
  }
}