13 bool generateRelevantHyperplanesAndVertexSets) {
14 STORM_LOG_DEBUG(
"Invoked Hyperplane enumeration with " << constraintMatrix.rows() <<
" constraints.");
15 Eigen::Index dimension = constraintMatrix.cols();
18 resultVertices.clear();
19 relevantMatrix = constraintMatrix;
20 relevantVector = constraintVector;
24 std::unordered_map<EigenVector, std::set<uint_fast64_t>> vertexCollector;
32 for (Eigen::Index
i = 0;
i < dimension; ++
i) {
33 subMatrix.row(
i) = constraintMatrix.row(subset[
i]);
34 subVector(
i) = constraintVector(subset[
i]);
37 EigenVector point = subMatrix.fullPivLu().solve(subVector);
38 bool pointContained =
true;
39 for (Eigen::Index row = 0; row < constraintMatrix.rows(); ++row) {
40 if ((constraintMatrix.row(row) * point)(0) > constraintVector(row)) {
41 pointContained =
false;
47 auto hyperplaneIndices =
49 .insert(
typename std::unordered_map<
EigenVector, std::set<uint_fast64_t>>::value_type(std::move(point), std::set<uint_fast64_t>()))
51 if (generateRelevantHyperplanesAndVertexSets) {
52 hyperplaneIndices->second.insert(subset.begin(), subset.end());
58 if (generateRelevantHyperplanesAndVertexSets) {
60 std::vector<Eigen::Index> verticesOnHyperplaneCounter(constraintMatrix.rows(), 0);
61 for (
auto const& mapEntry : vertexCollector) {
62 for (
auto const& hyperplaneIndex : mapEntry.second) {
63 ++verticesOnHyperplaneCounter[hyperplaneIndex];
71 for (uint_fast64_t hyperplaneIndex = 0; hyperplaneIndex < verticesOnHyperplaneCounter.size(); ++hyperplaneIndex) {
72 if (verticesOnHyperplaneCounter[hyperplaneIndex] >= dimension) {
73 std::vector<uint_fast64_t> oldIndex;
74 oldIndex.push_back(hyperplaneIndex);
75 hyperplaneCollector.
insert(constraintMatrix.row(hyperplaneIndex), constraintVector(hyperplaneIndex), &oldIndex);
79 relevantMatrix = std::move(matrixVector.first);
80 relevantVector = std::move(matrixVector.second);
83 std::vector<uint_fast64_t> oldToNewIndexMapping(constraintMatrix.rows(), constraintMatrix.rows());
84 std::vector<std::vector<uint_fast64_t>> newToOldIndexMapping(hyperplaneCollector.
getIndexLists());
85 for (uint_fast64_t newIndex = 0; newIndex < newToOldIndexMapping.size(); ++newIndex) {
86 for (
auto const& oldIndex : newToOldIndexMapping[newIndex]) {
87 oldToNewIndexMapping[oldIndex] = newIndex;
92 std::vector<std::set<uint_fast64_t>> vertexSets(relevantMatrix.rows());
93 resultVertices.clear();
94 resultVertices.reserve(vertexCollector.size());
95 for (
auto const& mapEntry : vertexCollector) {
96 for (
auto const& oldHyperplaneIndex : mapEntry.second) {
98 if ((Eigen::Index)oldToNewIndexMapping[oldHyperplaneIndex] < relevantVector.rows()) {
99 vertexSets[oldToNewIndexMapping[oldHyperplaneIndex]].insert(resultVertices.size());
102 resultVertices.push_back(mapEntry.first);
104 this->vertexSets.clear();
105 this->vertexSets.reserve(vertexSets.size());
106 for (
auto const& vertexSet : vertexSets) {
107 this->vertexSets.emplace_back(vertexSet.begin(), vertexSet.end());
111 resultVertices.clear();
112 resultVertices.reserve(vertexCollector.size());
113 for (
auto const& mapEntry : vertexCollector) {
114 resultVertices.push_back(mapEntry.first);
116 this->vertexSets.clear();