Matthias Volk
4 years ago
No known key found for this signature in database
GPG Key ID: 83A57678F739FCD3
4 changed files with 257 additions and 1 deletions
-
2src/test/storm-dft/CMakeLists.txt
-
49src/test/storm-dft/simulator/DftSimulatorTest.cpp
-
188src/test/storm-dft/simulator/DftTraceGeneratorTest.cpp
-
19src/test/storm-dft/simulator/SamplingTest.cpp
@ -0,0 +1,49 @@ |
|||
#include "test/storm_gtest.h"
|
|||
#include "storm-config.h"
|
|||
|
|||
#include "storm-dft/api/storm-dft.h"
|
|||
#include "storm-dft/transformations/DftTransformator.h"
|
|||
#include "storm-dft/generator/DftNextStateGenerator.h"
|
|||
#include "storm-dft/simulator/DFTTraceSimulator.h"
|
|||
#include "storm-dft/storage/dft/SymmetricUnits.h"
|
|||
|
|||
|
|||
namespace { |
|||
|
|||
// Helper function
|
|||
double simulateDft(std::string const& file, double timebound, size_t noRuns) { |
|||
// Load, build and prepare DFT
|
|||
storm::transformations::dft::DftTransformator<double> dftTransformator = storm::transformations::dft::DftTransformator<double>(); |
|||
std::shared_ptr<storm::storage::DFT<double>> dft = dftTransformator.transformBinaryFDEPs(*(storm::api::loadDFTGalileoFile<double>(file))); |
|||
EXPECT_TRUE(storm::api::isWellFormed(*dft).first); |
|||
|
|||
// Set relevant events
|
|||
storm::utility::RelevantEvents relevantEvents = storm::api::computeRelevantEvents<double>(*dft, {}, {}, false); |
|||
dft->setRelevantEvents(relevantEvents); |
|||
|
|||
// Find symmetries
|
|||
std::map<size_t, std::vector<std::vector<size_t>>> emptySymmetry; |
|||
storm::storage::DFTIndependentSymmetries symmetries(emptySymmetry); |
|||
storm::storage::DFTStateGenerationInfo stateGenerationInfo(dft->buildStateGenerationInfo(symmetries)); |
|||
|
|||
// Init random number generator
|
|||
boost::mt19937 gen(5u); |
|||
storm::dft::simulator::DFTTraceSimulator<double> simulator(*dft, stateGenerationInfo, gen); |
|||
|
|||
size_t count = 0;; |
|||
bool res; |
|||
for (size_t i=0; i<noRuns; ++i) { |
|||
res = simulator.simulateCompleteTrace(timebound); |
|||
if (res) { |
|||
++count; |
|||
} |
|||
} |
|||
return (double) count / noRuns; |
|||
} |
|||
|
|||
TEST(DftSimulatorTest, And) { |
|||
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/and.dft", 2, 10000); |
|||
EXPECT_NEAR(result, 0.3995764009, 0.01); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,188 @@ |
|||
#include "test/storm_gtest.h"
|
|||
#include "storm-config.h"
|
|||
|
|||
#include "storm-dft/api/storm-dft.h"
|
|||
#include "storm-dft/transformations/DftTransformator.h"
|
|||
#include "storm-dft/generator/DftNextStateGenerator.h"
|
|||
#include "storm-dft/simulator/DFTTraceSimulator.h"
|
|||
#include "storm-dft/storage/dft/SymmetricUnits.h"
|
|||
#include "storm-dft/storage/dft/DFTIsomorphism.h"
|
|||
|
|||
#include "storm-parsers/api/storm-parsers.h"
|
|||
|
|||
namespace { |
|||
|
|||
// Configurations for DFT traces
|
|||
struct DftTracesConfig { |
|||
bool useDC; |
|||
bool useSR; |
|||
}; |
|||
|
|||
class NoOptimizationsConfig { |
|||
public: |
|||
typedef double ValueType; |
|||
|
|||
static DftTracesConfig createConfig() { |
|||
return DftTracesConfig{false, false}; |
|||
} |
|||
}; |
|||
|
|||
class DontCareConfig { |
|||
public: |
|||
typedef double ValueType; |
|||
|
|||
static DftTracesConfig createConfig() { |
|||
return DftTracesConfig{true, false}; |
|||
} |
|||
}; |
|||
|
|||
class SymmetryReductionConfig { |
|||
public: |
|||
typedef double ValueType; |
|||
|
|||
static DftTracesConfig createConfig() { |
|||
return DftTracesConfig{false, true}; |
|||
} |
|||
}; |
|||
|
|||
class AllOptimizationsConfig { |
|||
public: |
|||
typedef double ValueType; |
|||
|
|||
static DftTracesConfig createConfig() { |
|||
return DftTracesConfig{true, true}; |
|||
} |
|||
}; |
|||
|
|||
// General base class for testing of generating DFT traces.
|
|||
template<typename TestType> |
|||
class DftTraceGeneratorTest : public ::testing::Test { |
|||
public: |
|||
typedef typename TestType::ValueType ValueType; |
|||
|
|||
DftTraceGeneratorTest() : config(TestType::createConfig()) { |
|||
} |
|||
|
|||
DftTracesConfig const& getConfig() const { |
|||
return config; |
|||
} |
|||
|
|||
std::pair<std::shared_ptr<storm::storage::DFT<double>>, storm::storage::DFTStateGenerationInfo> prepareDFT(std::string const& file) { |
|||
// Load, build and prepare DFT
|
|||
storm::transformations::dft::DftTransformator<double> dftTransformator = storm::transformations::dft::DftTransformator<double>(); |
|||
std::shared_ptr<storm::storage::DFT<double>> dft = dftTransformator.transformBinaryFDEPs(*(storm::api::loadDFTGalileoFile<double>(file))); |
|||
EXPECT_TRUE(storm::api::isWellFormed(*dft).first); |
|||
|
|||
// Compute relevant events
|
|||
std::vector<std::string> relevantNames; |
|||
if (!config.useDC) { |
|||
relevantNames.push_back("all"); |
|||
} |
|||
storm::utility::RelevantEvents relevantEvents = storm::api::computeRelevantEvents<double>(*dft, {}, relevantNames, false); |
|||
dft->setRelevantEvents(relevantEvents); |
|||
|
|||
// Find symmetries
|
|||
std::map<size_t, std::vector<std::vector<size_t>>> emptySymmetry; |
|||
storm::storage::DFTIndependentSymmetries symmetries(emptySymmetry); |
|||
if (config.useSR) { |
|||
auto colouring = dft->colourDFT(); |
|||
symmetries = dft->findSymmetries(colouring); |
|||
} |
|||
EXPECT_EQ(config.useSR && config.useDC, !symmetries.sortedSymmetries.empty()); |
|||
storm::storage::DFTStateGenerationInfo stateGenerationInfo(dft->buildStateGenerationInfo(symmetries)); |
|||
return std::make_pair(dft, stateGenerationInfo); |
|||
} |
|||
|
|||
private: |
|||
DftTracesConfig config; |
|||
}; |
|||
|
|||
typedef ::testing::Types< |
|||
NoOptimizationsConfig, |
|||
DontCareConfig, |
|||
SymmetryReductionConfig, |
|||
AllOptimizationsConfig |
|||
> TestingTypes; |
|||
|
|||
TYPED_TEST_SUITE(DftTraceGeneratorTest, TestingTypes,); |
|||
|
|||
TYPED_TEST(DftTraceGeneratorTest, And) { |
|||
auto pair = this->prepareDFT(STORM_TEST_RESOURCES_DIR "/dft/and.dft"); |
|||
auto dft = pair.first; |
|||
storm::generator::DftNextStateGenerator<double> generator(*dft, pair.second); |
|||
|
|||
// Start with initial state
|
|||
auto state = generator.createInitialState(); |
|||
EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex())); |
|||
|
|||
bool changed = state->orderBySymmetry(); |
|||
EXPECT_FALSE(changed); |
|||
|
|||
// Let C fail
|
|||
auto iterFailable = state->getFailableElements().begin(); |
|||
ASSERT_NE(iterFailable, state->getFailableElements().end()); |
|||
++iterFailable; |
|||
ASSERT_NE(iterFailable, state->getFailableElements().end()); |
|||
|
|||
auto nextBEPair = iterFailable.getFailBE(*dft); |
|||
auto nextBE = nextBEPair.first; |
|||
auto triggerDep = nextBEPair.second; |
|||
ASSERT_TRUE(nextBE); |
|||
ASSERT_FALSE(triggerDep); |
|||
ASSERT_EQ(nextBE->name(), "C"); |
|||
state = generator.createSuccessorState(state, nextBE, triggerDep); |
|||
EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex())); |
|||
changed = state->orderBySymmetry(); |
|||
EXPECT_EQ(this->getConfig().useSR && this->getConfig().useDC, changed); |
|||
if (this->getConfig().useSR && this->getConfig().useDC) { |
|||
EXPECT_TRUE(state->hasFailed(0)); |
|||
} else { |
|||
EXPECT_TRUE(state->hasFailed(1)); |
|||
} |
|||
|
|||
// Let B fail
|
|||
iterFailable = state->getFailableElements().begin(); |
|||
ASSERT_NE(iterFailable, state->getFailableElements().end()); |
|||
|
|||
nextBEPair = iterFailable.getFailBE(*dft); |
|||
nextBE = nextBEPair.first; |
|||
triggerDep = nextBEPair.second; |
|||
ASSERT_TRUE(nextBE); |
|||
ASSERT_FALSE(triggerDep); |
|||
if (this->getConfig().useSR && this->getConfig().useDC){ |
|||
// TODO: Apply symmetry to failable elements as well
|
|||
return; |
|||
ASSERT_EQ(nextBE->name(), "C"); |
|||
} else { |
|||
ASSERT_EQ(nextBE->name(), "B"); |
|||
} |
|||
state = generator.createSuccessorState(state, nextBE, triggerDep); |
|||
changed = state->orderBySymmetry(); |
|||
EXPECT_FALSE(changed); |
|||
EXPECT_TRUE(state->hasFailed(dft->getTopLevelIndex())); |
|||
} |
|||
|
|||
TYPED_TEST(DftTraceGeneratorTest, RandomStepsAnd) { |
|||
auto pair = this->prepareDFT(STORM_TEST_RESOURCES_DIR "/dft/and.dft"); |
|||
auto dft = pair.first; |
|||
|
|||
// Init random number generator
|
|||
boost::mt19937 gen(5u); |
|||
storm::dft::simulator::DFTTraceSimulator<double> simulator(*dft, pair.second, gen); |
|||
|
|||
auto state = simulator.getCurrentState(); |
|||
EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex())); |
|||
|
|||
// First random step
|
|||
double timebound = simulator.randomStep(); |
|||
EXPECT_FLOAT_EQ(timebound, 0.522079); |
|||
state = simulator.getCurrentState(); |
|||
EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex())); |
|||
|
|||
timebound = simulator.randomStep(); |
|||
EXPECT_FLOAT_EQ(timebound, 0.9497214); |
|||
state = simulator.getCurrentState(); |
|||
EXPECT_TRUE(state->hasFailed(dft->getTopLevelIndex())); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,19 @@ |
|||
#include "test/storm_gtest.h"
|
|||
#include "storm-config.h"
|
|||
|
|||
#include <storm/utility/random.h>
|
|||
|
|||
namespace { |
|||
|
|||
TEST(SamplingTest, SampleExponential) { |
|||
boost::mt19937 gen(5u); |
|||
storm::utility::ExponentialDistributionGenerator dist(5); |
|||
|
|||
// Ensure that pseudo random numbers are the same on all machines
|
|||
double reference[] = {0.18241937154, 0.0522078772595, 0.0949721368604, 0.246869315378, 0.765000791199, 0.0177096648877, 0.225167598601, 0.23538530391, 1.01605360643, 0.138846355094}; |
|||
for (int i =0; i < 10; ++i) { |
|||
EXPECT_FLOAT_EQ(dist.random(gen), reference[i]); |
|||
} |
|||
} |
|||
|
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue