27 uint64_t maxdimension) {
28 std::shared_ptr<storm::expressions::ExpressionManager> expressionManager = std::make_shared<storm::expressions::ExpressionManager>();
29 std::vector<storm::storage::BitVector> supports;
30 std::vector<storm::expressions::Variable> weightVariables;
31 std::vector<storm::expressions::Expression> weightVariableExpressions;
33 for (uint64_t pointIndex = 0; pointIndex < input.size(); ++pointIndex) {
36 for (
auto const& entry : input[pointIndex]) {
37 supports.back().set(entry.first,
true);
40 weightVariables.push_back(expressionManager->declareRationalVariable(
"w_" + std::to_string(pointIndex)));
42 weightVariableExpressions.push_back(weightVariables.back().getExpression());
45 std::unique_ptr<storm::solver::SmtSolver> smtSolver = smtSolverFactory->create(*expressionManager);
46 for (
auto const& weightVariableExpr : weightVariableExpressions) {
48 smtSolver->add((weightVariableExpr >= expressionManager->rational(0.0)));
49 smtSolver->add(weightVariableExpr < expressionManager->rational(1.0));
61 for (uint64_t pointIndex = 0; pointIndex < input.size(); ++pointIndex) {
62#ifdef _DEBUG_REUCE_VERTEX_CLOUD
63 std::cout << pointIndex <<
" out of " << input.size() <<
'\n';
66 std::map<uint64_t, std::vector<storm::expressions::Expression>> dimensionTerms;
67 for (
auto const& entry : input[pointIndex]) {
68 dimensionTerms[entry.first] = {expressionManager->rational(-entry.second)};
70 for (uint64_t potentialSupport = 0; potentialSupport < input.size(); ++potentialSupport) {
71 if (pointIndex == potentialSupport) {
72 smtSolver->add(weightVariableExpressions[potentialSupport] == expressionManager->rational(0.0));
73 }
else if (potentialSupport < pointIndex && !vertices.
get(potentialSupport)) {
74 smtSolver->add(weightVariableExpressions[potentialSupport] == expressionManager->rational(0.0));
75 }
else if (supports[potentialSupport].isSubsetOf(supports[pointIndex])) {
76 for (
auto const& entry : input[potentialSupport]) {
77 dimensionTerms[entry.first].push_back(weightVariableExpressions[potentialSupport] * expressionManager->rational(entry.second));
80 smtSolver->add(weightVariableExpressions[potentialSupport] == expressionManager->rational(0.0));
83 for (
auto const& entry : dimensionTerms) {
88 auto result = smtSolver->check();
91#ifdef _DEBUG_REDUCE_VERTEX_CLOUD
92 if (input[pointIndex].size() == 2) {
93 std::cout <<
"point " <<
toString(input[pointIndex]) <<
" is a vertex:";
94 std::cout << smtSolver->getSmtLibString() <<
'\n';
97 vertices.
set(pointIndex,
true);
99#ifdef _DEBUG_REDUCE_VERTEX_CLOUD
101 std::cout <<
"point " <<
toString(input[pointIndex]) <<
" is a convex combination of ";
102 auto val = smtSolver->getModelAsValuation();
103 uint64_t varIndex = 0;
104 for (
auto const& wvar : weightVariables) {
106 std::cout <<
toString(input[varIndex]) <<
" (weight: " << val.getRationalValue(wvar) <<
")";
115 for (uint64_t remainingPoint = pointIndex + 1; remainingPoint < input.size(); ++remainingPoint) {
116 vertices.
set(remainingPoint);
118 return {vertices,
true};
121#ifdef _DEBUG_REDUCE_VERTEX_CLOUD
126 return {vertices,
false};