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