You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
3.5 KiB
75 lines
3.5 KiB
#ifndef CUDA_KERNELS_GRAPH_H
|
|
#define CUDA_KERNELS_GRAPH_H
|
|
|
|
#include <set>
|
|
#include <limits>
|
|
|
|
#include "src/storage/sparse/StateType.h"
|
|
#include "src/models/AbstractDeterministicModel.h"
|
|
#include "src/models/AbstractNondeterministicModel.h"
|
|
#include "src/utility/constants.h"
|
|
#include "src/exceptions/InvalidArgumentException.h"
|
|
|
|
namespace stormcuda {
|
|
namespace graph {
|
|
void helloWorld();
|
|
template <typename T>
|
|
storm::storage::BitVector performProbGreater0(storm::storage::SparseMatrix<T> const& backwardTransitions, storm::storage::BitVector const& phiStates, storm::storage::BitVector const& psiStates, bool useStepBound = false, uint_fast64_t maximalSteps = 0) {
|
|
helloWorld();
|
|
// Prepare the resulting bit vector.
|
|
uint_fast64_t numberOfStates = phiStates.size();
|
|
storm::storage::BitVector statesWithProbabilityGreater0(numberOfStates);
|
|
|
|
// Add all psi states as the already satisfy the condition.
|
|
statesWithProbabilityGreater0 |= psiStates;
|
|
|
|
// Initialize the stack used for the DFS with the states.
|
|
std::vector<uint_fast64_t> stack(psiStates.begin(), psiStates.end());
|
|
|
|
// Initialize the stack for the step bound, if the number of steps is bounded.
|
|
std::vector<uint_fast64_t> stepStack;
|
|
std::vector<uint_fast64_t> remainingSteps;
|
|
if (useStepBound) {
|
|
stepStack.reserve(numberOfStates);
|
|
stepStack.insert(stepStack.begin(), psiStates.getNumberOfSetBits(), maximalSteps);
|
|
remainingSteps.resize(numberOfStates);
|
|
for (auto state : psiStates) {
|
|
remainingSteps[state] = maximalSteps;
|
|
}
|
|
}
|
|
|
|
// Perform the actual DFS.
|
|
uint_fast64_t currentState, currentStepBound;
|
|
while (!stack.empty()) {
|
|
currentState = stack.back();
|
|
stack.pop_back();
|
|
|
|
if (useStepBound) {
|
|
currentStepBound = stepStack.back();
|
|
stepStack.pop_back();
|
|
}
|
|
|
|
for (typename storm::storage::SparseMatrix<T>::const_iterator entryIt = backwardTransitions.begin(currentState), entryIte = backwardTransitions.end(currentState); entryIt != entryIte; ++entryIt) {
|
|
if (phiStates[entryIt->getColumn()] && (!statesWithProbabilityGreater0.get(entryIt->getColumn()) || (useStepBound && remainingSteps[entryIt->getColumn()] < currentStepBound - 1))) {
|
|
// If we don't have a bound on the number of steps to take, just add the state to the stack.
|
|
if (!useStepBound) {
|
|
statesWithProbabilityGreater0.set(entryIt->getColumn(), true);
|
|
stack.push_back(entryIt->getColumn());
|
|
} else if (currentStepBound > 0) {
|
|
// If there is at least one more step to go, we need to push the state and the new number of steps.
|
|
remainingSteps[entryIt->getColumn()] = currentStepBound - 1;
|
|
statesWithProbabilityGreater0.set(entryIt->getColumn(), true);
|
|
stack.push_back(entryIt->getColumn());
|
|
stepStack.push_back(currentStepBound - 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return result.
|
|
return statesWithProbabilityGreater0;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif /* CUDA_KERNELS_GRAPH_H */
|