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;
33 for (Eigen::Index
i = 0;
i < dimension; ++
i) {
34 subMatrix.row(
i) = constraintMatrix.row(subset[
i]);
35 subVector(
i) = constraintVector(subset[
i]);
38 EigenVector point = subMatrix.fullPivLu().solve(subVector);
39 bool pointContained =
true;
40 for (Eigen::Index row = 0; row < constraintMatrix.rows(); ++row) {
41 if ((constraintMatrix.row(row) * point)(0) > constraintVector(row)) {
42 pointContained =
false;
48 auto hyperplaneIndices =
50 .insert(
typename std::unordered_map<
EigenVector, std::set<uint_fast64_t>>::value_type(std::move(point), std::set<uint_fast64_t>()))
52 if (generateRelevantHyperplanesAndVertexSets) {
53 hyperplaneIndices->second.insert(subset.begin(), subset.end());
59 if (generateRelevantHyperplanesAndVertexSets) {
61 std::vector<Eigen::Index> verticesOnHyperplaneCounter(constraintMatrix.rows(), 0);
62 for (
auto const& mapEntry : vertexCollector) {
63 for (
auto const& hyperplaneIndex : mapEntry.second) {
64 ++verticesOnHyperplaneCounter[hyperplaneIndex];
72 for (uint_fast64_t hyperplaneIndex = 0; hyperplaneIndex < verticesOnHyperplaneCounter.size(); ++hyperplaneIndex) {
73 if (verticesOnHyperplaneCounter[hyperplaneIndex] >= dimension) {
74 std::vector<uint_fast64_t> oldIndex;
75 oldIndex.push_back(hyperplaneIndex);
76 hyperplaneCollector.
insert(constraintMatrix.row(hyperplaneIndex), constraintVector(hyperplaneIndex), &oldIndex);
80 relevantMatrix = std::move(matrixVector.first);
81 relevantVector = std::move(matrixVector.second);
84 std::vector<uint_fast64_t> oldToNewIndexMapping(constraintMatrix.rows(), constraintMatrix.rows());
85 std::vector<std::vector<uint_fast64_t>> newToOldIndexMapping(hyperplaneCollector.
getIndexLists());
86 for (uint_fast64_t newIndex = 0; newIndex < newToOldIndexMapping.size(); ++newIndex) {
87 for (
auto const& oldIndex : newToOldIndexMapping[newIndex]) {
88 oldToNewIndexMapping[oldIndex] = newIndex;
93 std::vector<std::set<uint_fast64_t>> vertexSets(relevantMatrix.rows());
94 resultVertices.clear();
95 resultVertices.reserve(vertexCollector.size());
96 for (
auto const& mapEntry : vertexCollector) {
97 for (
auto const& oldHyperplaneIndex : mapEntry.second) {
99 if ((Eigen::Index)oldToNewIndexMapping[oldHyperplaneIndex] < relevantVector.rows()) {
100 vertexSets[oldToNewIndexMapping[oldHyperplaneIndex]].insert(resultVertices.size());
103 resultVertices.push_back(mapEntry.first);
105 this->vertexSets.clear();
106 this->vertexSets.reserve(vertexSets.size());
107 for (
auto const& vertexSet : vertexSets) {
108 this->vertexSets.emplace_back(vertexSet.begin(), vertexSet.end());
112 resultVertices.clear();
113 resultVertices.reserve(vertexCollector.size());
114 for (
auto const& mapEntry : vertexCollector) {
115 resultVertices.push_back(mapEntry.first);
117 this->vertexSets.clear();