Browse Source
shortest paths generator skeleton
shortest paths generator skeleton
Former-commit-id:tempestpy_adaptionsc37fdbbec8
[formerly23dba537c7
] Former-commit-id:6eb54e64ad
tomjanson
9 years ago
committed by
Tom Janson
3 changed files with 189 additions and 14 deletions
@ -1,5 +1,64 @@ |
|||||
//
|
|
||||
// Created by Tom Janson on 15-1025.
|
|
||||
//
|
|
||||
|
|
||||
#include "shortestPaths.h"
|
#include "shortestPaths.h"
|
||||
|
#include "graph.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace utility { |
||||
|
namespace shortestPaths { |
||||
|
template <typename T> |
||||
|
ShortestPathsGenerator<T>::ShortestPathsGenerator(std::shared_ptr<models::sparse::Model<T>> model) : model(model) { |
||||
|
// FIXME: does this create a copy? I don't need one, so I should avoid that
|
||||
|
transitionMatrix = model->getTransitionMatrix(); |
||||
|
|
||||
|
// TODO: init various things we'll need later
|
||||
|
// - predecessors
|
||||
|
computePredecessors(); |
||||
|
// - Dijkstra (giving us SP-predecessors, SP-distances)
|
||||
|
performDijkstra(); |
||||
|
// - SP-successors
|
||||
|
computeSPSuccessors(); |
||||
|
// - shortest paths
|
||||
|
initializeShortestPaths(); |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
ShortestPathsGenerator<T>::~ShortestPathsGenerator() { |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
void ShortestPathsGenerator<T>::computePredecessors() { |
||||
|
graphPredecessors.resize(model->getNumberOfStates()); |
||||
|
|
||||
|
for (int i = 0; i < transitionMatrix.getRowCount(); i++) { |
||||
|
// what's the difference? TODO
|
||||
|
//auto foo = transitionMatrix.getRowGroupEntryCount(i);
|
||||
|
//auto bar = transitionMatrix.getRowGroupSize(i);
|
||||
|
|
||||
|
for (auto transition : transitionMatrix.getRowGroup(i)) { |
||||
|
graphPredecessors[transition.getColumn()].push_back(i); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
void ShortestPathsGenerator<T>::performDijkstra() { |
||||
|
auto result = storm::utility::graph::performDijkstra(*model, transitionMatrix, model->getInitialStates()); |
||||
|
shortestPathDistances = result.first; |
||||
|
shortestPathPredecessors = result.second; |
||||
|
// FIXME: fix bad predecessor result for initial states (either here, or by fixing the Dijkstra)
|
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
void ShortestPathsGenerator<T>::computeSPSuccessors() { |
||||
|
shortestPathSuccessors.resize(model->getNumberOfStates()); |
||||
|
|
||||
|
for (int i = 0; i < model->getNumberOfStates(); i++) { |
||||
|
state_t predecessor = shortestPathPredecessors[i]; |
||||
|
shortestPathSuccessors[predecessor].push_back(i); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
void ShortestPathsGenerator<T>::initializeShortestPaths() {} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -1,15 +1,62 @@ |
|||||
// |
|
||||
// Created by Tom Janson on 15-1025. |
|
||||
// |
|
||||
|
|
||||
#ifndef STORM_UTIL_SHORTESTPATHS_H_ |
#ifndef STORM_UTIL_SHORTESTPATHS_H_ |
||||
#define STORM_UTIL_SHORTESTPATHS_H_ |
#define STORM_UTIL_SHORTESTPATHS_H_ |
||||
|
|
||||
|
#include <vector> |
||||
|
#include <boost/optional/optional.hpp> |
||||
|
#include "src/models/sparse/Model.h" |
||||
|
#include "src/storage/sparse/StateType.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace utility { |
||||
|
namespace shortestPaths { |
||||
|
typedef storm::storage::sparse::state_type state_t; |
||||
|
typedef std::vector<state_t> state_list_t; |
||||
|
|
||||
|
template <typename T> |
||||
|
struct path { |
||||
|
boost::optional<state_t> tail; |
||||
|
unsigned int tail_k; |
||||
|
T distance; |
||||
|
}; |
||||
|
|
||||
|
template <typename T> |
||||
|
class ShortestPathsGenerator { |
||||
|
public: |
||||
|
// FIXME: this shared_ptr-passing business is probably a bad idea |
||||
|
ShortestPathsGenerator(std::shared_ptr<models::sparse::Model<T>> model); |
||||
|
~ShortestPathsGenerator(); |
||||
|
|
||||
|
private: |
||||
|
//storm::models::sparse::Model<T>* model; |
||||
|
std::shared_ptr<storm::models::sparse::Model<T>> model; |
||||
|
storm::storage::SparseMatrix<T> transitionMatrix; |
||||
|
|
||||
|
std::vector<state_list_t> graphPredecessors; |
||||
|
std::vector<state_t> shortestPathPredecessors; |
||||
|
std::vector<state_list_t> shortestPathSuccessors; |
||||
|
std::vector<T> shortestPathDistances; |
||||
|
|
||||
|
std::vector<std::vector<path<T>>> shortestPaths; |
||||
|
std::vector<std::set<path<T>>> shortestPathCandidates; |
||||
|
|
||||
|
/*! |
||||
|
* Computes list of predecessors for all nodes. |
||||
|
* Reachability is not considered; a predecessor is simply any node that has an edge leading to the |
||||
|
* node in question. |
||||
|
* |
||||
|
* @param model The model whose transitions will be examined |
||||
|
* @return A vector of predecessors for each node |
||||
|
*/ |
||||
|
void computePredecessors(); |
||||
|
|
||||
class shortestPathsUtil { |
|
||||
|
void performDijkstra(); |
||||
|
void computeSPSuccessors(); |
||||
|
void initializeShortestPaths(); |
||||
|
|
||||
}; |
|
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
#endif //STORM_UTIL_SHORTESTPATHS_H_ |
#endif //STORM_UTIL_SHORTESTPATHS_H_ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue