7 changed files with 223 additions and 89 deletions
-
78src/storm/storage/dd/BisimulationDecomposition.cpp
-
33src/storm/storage/dd/BisimulationDecomposition.h
-
78src/storm/storage/dd/bisimulation/PartitionRefiner.cpp
-
1src/storm/storage/dd/bisimulation/Signature.h
-
72src/storm/storage/dd/bisimulation/SignatureComputer.cpp
-
37src/storm/storage/dd/bisimulation/SignatureComputer.h
-
13src/storm/storage/dd/bisimulation/Status.h
@ -0,0 +1,78 @@ |
|||||
|
#include "storm/storage/dd/bisimulation/PartitionRefiner.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace dd { |
||||
|
namespace bisimulation { |
||||
|
|
||||
|
template <storm::dd::DdType DdType, typename ValueType> |
||||
|
PartitionRefiner<DdType, ValueType>::PartitionRefiner(storm::models::symbolic::Model<DdType, ValueType> const& model, Partition<DdType, ValueType> const& initialStatePartition) : status(Status::Initialized), refinements(0), statePartition(initialStatePartition), signatureComputer(model), signatureRefiner(model.getManager(), statePartition.getBlockVariable(), model.getRowVariables()) { |
||||
|
// Intentionally left empty.
|
||||
|
} |
||||
|
|
||||
|
template <storm::dd::DdType DdType, typename ValueType> |
||||
|
bool PartitionRefiner<DdType, ValueType>::refine(bisimulation::SignatureMode const& mode) { |
||||
|
this->status = Status::InComputation; |
||||
|
|
||||
|
this->signatureComputer.setSignatureMode(mode); |
||||
|
auto start = std::chrono::high_resolution_clock::now(); |
||||
|
|
||||
|
std::chrono::milliseconds::rep signatureTime = 0; |
||||
|
std::chrono::milliseconds::rep refinementTime = 0; |
||||
|
|
||||
|
bool alreadyRefined = false; |
||||
|
uint64_t index = 0; |
||||
|
Partition<DdType, ValueType> newStatePartition; |
||||
|
auto signatureIterator = signatureComputer.compute(statePartition); |
||||
|
while (signatureIterator.hasNext() && !alreadyRefined) { |
||||
|
auto signatureStart = std::chrono::high_resolution_clock::now(); |
||||
|
auto signature = signatureIterator.next(); |
||||
|
auto signatureEnd = std::chrono::high_resolution_clock::now(); |
||||
|
totalSignatureTime += (signatureEnd - signatureStart); |
||||
|
STORM_LOG_DEBUG("Signature " << refinements << "[" << index << "] DD has " << signature.getSignatureAdd().getNodeCount() << " nodes."); |
||||
|
|
||||
|
auto refinementStart = std::chrono::high_resolution_clock::now(); |
||||
|
newStatePartition = signatureRefiner.refine(statePartition, signature); |
||||
|
auto refinementEnd = std::chrono::high_resolution_clock::now(); |
||||
|
totalRefinementTime += (refinementEnd - refinementStart); |
||||
|
|
||||
|
signatureTime += std::chrono::duration_cast<std::chrono::milliseconds>(signatureEnd - signatureStart).count(); |
||||
|
refinementTime = std::chrono::duration_cast<std::chrono::milliseconds>(refinementEnd - refinementStart).count(); |
||||
|
|
||||
|
// Potentially exit early in case we have refined the partition already.
|
||||
|
if (newStatePartition.getNumberOfBlocks() > statePartition.getNumberOfBlocks()) { |
||||
|
alreadyRefined = true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
auto totalTimeInRefinement = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count(); |
||||
|
++refinements; |
||||
|
STORM_LOG_DEBUG("Refinement " << refinements << " produced " << newStatePartition.getNumberOfBlocks() << " blocks and was completed in " << totalTimeInRefinement << "ms (signature: " << signatureTime << "ms, refinement: " << refinementTime << "ms)."); |
||||
|
|
||||
|
if (statePartition == newStatePartition) { |
||||
|
this->status = Status::FixedPoint; |
||||
|
return false; |
||||
|
} else { |
||||
|
this->statePartition = newStatePartition; |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
template <storm::dd::DdType DdType, typename ValueType> |
||||
|
Partition<DdType, ValueType> const& PartitionRefiner<DdType, ValueType>::getStatePartition() const { |
||||
|
return statePartition; |
||||
|
} |
||||
|
|
||||
|
template <storm::dd::DdType DdType, typename ValueType> |
||||
|
Status PartitionRefiner<DdType, ValueType>::getStatus() const { |
||||
|
return status; |
||||
|
} |
||||
|
|
||||
|
template class PartitionRefiner<storm::dd::DdType::CUDD, double>; |
||||
|
|
||||
|
template class PartitionRefiner<storm::dd::DdType::Sylvan, double>; |
||||
|
template class PartitionRefiner<storm::dd::DdType::Sylvan, storm::RationalNumber>; |
||||
|
template class PartitionRefiner<storm::dd::DdType::Sylvan, storm::RationalFunction>; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace dd { |
||||
|
namespace bisimulation { |
||||
|
|
||||
|
enum class Status { |
||||
|
Initialized, InComputation, FixedPoint |
||||
|
}; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue