@ -466,7 +466,7 @@ namespace storm {
spp : : sparse_hash_map < DdNode const * , ReuseWrapper > reuseBlocksCache ;
spp : : sparse_hash_map < DdNode const * , ReuseWrapper > reuseBlocksCache ;
} ;
} ;
TASK_DECL_5 ( BDD , refine_double , BDD , MTBDD , BDD , BDD , void * ) ;
TASK_DECL_5 ( BDD , refine_parallel , BDD , MTBDD , BDD , BDD , void * ) ;
template < storm : : dd : : DdType DdType >
template < storm : : dd : : DdType DdType >
class InternalSignatureRefinerBase ;
class InternalSignatureRefinerBase ;
@ -709,7 +709,7 @@ namespace storm {
std : : pair < BDD , BDD > refineParallel ( BDD partitionNode , MTBDD signatureNode , BDD nondeterminismVariablesNode , BDD nonBlockVariablesNode ) {
std : : pair < BDD , BDD > refineParallel ( BDD partitionNode , MTBDD signatureNode , BDD nondeterminismVariablesNode , BDD nonBlockVariablesNode ) {
LACE_ME ;
LACE_ME ;
return std : : make_pair ( CALL ( refine_double , partitionNode , signatureNode , nondeterminismVariablesNode , nonBlockVariablesNode , this ) , 0 ) ;
return std : : make_pair ( CALL ( refine_parallel , partitionNode , signatureNode , nondeterminismVariablesNode , nonBlockVariablesNode , this ) , 0 ) ;
}
}
std : : pair < BDD , BDD > refineSequential ( BDD partitionNode , MTBDD signatureNode , BDD nondeterminismVariablesNode , BDD nonBlockVariablesNode ) {
std : : pair < BDD , BDD > refineSequential ( BDD partitionNode , MTBDD signatureNode , BDD nondeterminismVariablesNode , BDD nonBlockVariablesNode ) {
@ -868,7 +868,7 @@ namespace storm {
} ;
} ;
TASK_IMPL_5 ( BDD , refine_double , BDD , partitionNode , MTBDD , signatureNode , BDD , nondeterminismVariablesNode , BDD , nonBlockVariablesNode , void * , refinerPtr )
TASK_IMPL_5 ( BDD , refine_parallel , BDD , partitionNode , MTBDD , signatureNode , BDD , nondeterminismVariablesNode , BDD , nonBlockVariablesNode , void * , refinerPtr )
{
{
auto & refiner = * static_cast < InternalSignatureRefinerBase < storm : : dd : : DdType : : Sylvan > * > ( refinerPtr ) ;
auto & refiner = * static_cast < InternalSignatureRefinerBase < storm : : dd : : DdType : : Sylvan > * > ( refinerPtr ) ;
std : : unique_lock < std : : mutex > lock ( refiner . mutex , std : : defer_lock ) ;
std : : unique_lock < std : : mutex > lock ( refiner . mutex , std : : defer_lock ) ;
@ -881,8 +881,12 @@ namespace storm {
STORM_LOG_ASSERT ( partitionNode ! = mtbdd_false , " Expected non-false node. " ) ;
STORM_LOG_ASSERT ( partitionNode ! = mtbdd_false , " Expected non-false node. " ) ;
// Check the cache whether we have seen the same node before.
BDD result ;
BDD result ;
if ( cache_get ( signatureNode | ( 256LL < < 42 ) , nonBlockVariablesNode , partitionNode | ( refiner . numberOfRefinements < < 40 ) , & result ) ) {
return result ;
}
if ( sylvan_isconst ( nonBlockVariablesNode ) ) {
if ( sylvan_isconst ( nonBlockVariablesNode ) ) {
// Get the lock so we can modify the signature cache.
// Get the lock so we can modify the signature cache.
lock . lock ( ) ;
lock . lock ( ) ;
@ -911,11 +915,10 @@ namespace storm {
result = refiner . encodeBlock ( refiner . nextFreeBlockIndex + + ) ;
result = refiner . encodeBlock ( refiner . nextFreeBlockIndex + + ) ;
refiner . signatureCacheSingle [ nodePair ] = result ;
refiner . signatureCacheSingle [ nodePair ] = result ;
lock . unlock ( ) ;
lock . unlock ( ) ;
return result ;
}
// Check the cache whether we have seen the same node before.
if ( cache_get ( signatureNode | ( 256LL < < 42 ) , nonBlockVariablesNode , partitionNode | ( refiner . numberOfRefinements < < 40 ) , & result ) ) {
// Store the result in the cache.
cache_put ( signatureNode | ( 256LL < < 42 ) , nonBlockVariablesNode , partitionNode | ( refiner . numberOfRefinements < < 40 ) , result ) ;
return result ;
return result ;
}
}
@ -966,15 +969,15 @@ namespace storm {
// If there are no more non-block variables remaining, make a recursive call to enter the base case.
// If there are no more non-block variables remaining, make a recursive call to enter the base case.
if ( sylvan_isconst ( nonBlockVariablesNode ) ) {
if ( sylvan_isconst ( nonBlockVariablesNode ) ) {
return CALL ( refine_double , partitionNode , signatureNode , nondeterminismVariablesNode , nonBlockVariablesNode , refinerPtr ) ;
return CALL ( refine_parallel , partitionNode , signatureNode , nondeterminismVariablesNode , nonBlockVariablesNode , refinerPtr ) ;
}
}
BDD nextNondeterminismVariables = isNondeterminismVariable ? sylvan_set_next ( nondeterminismVariablesNode ) : nondeterminismVariablesNode ;
BDD nextNondeterminismVariables = isNondeterminismVariable ? sylvan_set_next ( nondeterminismVariablesNode ) : nondeterminismVariablesNode ;
BDD nextNonBlockVariables = sylvan_set_next ( nonBlockVariablesNode ) ;
BDD nextNonBlockVariables = sylvan_set_next ( nonBlockVariablesNode ) ;
bdd_refs_spawn ( SPAWN ( refine_double , partitionThen , signatureThen , nextNondeterminismVariables , nextNonBlockVariables , refinerPtr ) ) ;
bdd_refs_spawn ( SPAWN ( refine_parallel , partitionElse , signatureElse , nextNondeterminismVariables , nextNonBlockVariables , refinerPtr ) ) ;
BDD else Result = bdd_refs_push ( CALL ( refine_double , partitionElse , signatureElse , nextNondeterminismVariables , nextNonBlockVariables , refinerPtr ) ) ;
BDD then Result = bdd_refs_sync ( SYNC ( refine_double ) ) ;
BDD then Result = bdd_refs_push ( CALL ( refine_parallel , partitionThen , signatureThen , nextNondeterminismVariables , nextNonBlockVariables , refinerPtr ) ) ;
BDD else Result = bdd_refs_sync ( SYNC ( refine_parallel ) ) ;
bdd_refs_pop ( 1 ) ;
bdd_refs_pop ( 1 ) ;
if ( thenResult = = elseResult ) {
if ( thenResult = = elseResult ) {