17namespace transformer {
19 bool keepStateValuations)
const {
20 auto data = transformTransitions(dtmc);
22 components.
stateLabeling = transformStateLabeling(dtmc, data);
24 components.
rewardModels.emplace(rewModel.first, transformRewardModel(dtmc, rewModel.second, data));
31 return std::make_shared<storm::models::sparse::Dtmc<RationalFunction>>(std::move(components.
transitionMatrix), std::move(components.
stateLabeling),
37 std::vector<storage::MatrixEntry<uint64_t, RationalFunction>>
row;
40typename BinaryDtmcTransformer::TransformationData BinaryDtmcTransformer::transformTransitions(
45 std::queue<StateWithRow> queue;
46 for (uint64_t state = 0; state < matrix.getRowCount(); ++state) {
47 std::vector<storage::MatrixEntry<uint64_t, RationalFunction>> diyRow;
48 for (
auto const& entry : matrix.getRow(state)) {
49 diyRow.push_back(entry);
56 uint64_t currAuxState = queue.size();
57 std::vector<uint64_t> origStates;
59 while (!queue.empty()) {
60 auto stateWithRow = std::move(queue.front());
63 std::set<RationalFunctionVariable> variablesInRow;
65 for (
auto const& entry : stateWithRow.row) {
66 for (
auto const& variable : entry.getValue().gatherVariables()) {
67 variablesInRow.emplace(variable);
71 if (variablesInRow.size() == 0) {
73 for (
auto const& entry : stateWithRow.row) {
74 builder.
addNextValue(currRow, entry.getColumn(), entry.getValue());
77 }
else if (variablesInRow.size() == 1) {
78 auto parameter = *variablesInRow.begin();
82 std::vector<storage::MatrixEntry<uint64_t, RationalFunction>> outgoing;
84 std::vector<storage::MatrixEntry<uint64_t, RationalFunction>> newStateLeft;
86 std::vector<storage::MatrixEntry<uint64_t, RationalFunction>> newStateRight;
91 for (
auto const& entry : stateWithRow.row) {
92 if (entry.getValue().isConstant()) {
93 outgoing.push_back(entry);
95 auto nominator = entry.getValue().nominator();
98 if (byP.remainder.isZero()) {
99 auto probability =
RationalFunction(carl::makePolynomial<Polynomial>(byP.quotient), denominator);
100 newStateLeft.push_back(storage::MatrixEntry<uint64_t, RationalFunction>(entry.getColumn(), probability));
101 sumOfLeftBranch += probability;
104 auto byOneMinusP =
RawPolynomial(nominator).divideBy(oneMinusParameter);
105 if (byOneMinusP.remainder.isZero()) {
106 auto probability =
RationalFunction(carl::makePolynomial<Polynomial>(byOneMinusP.quotient), denominator);
107 newStateRight.push_back(storage::MatrixEntry<uint64_t, RationalFunction>(entry.getColumn(), probability));
108 sumOfRightBranch += probability;
113 sumOfLeftBranch.simplify();
114 sumOfRightBranch.simplify();
115 for (
auto& entry : newStateLeft) {
116 entry.setValue(entry.getValue() / sumOfLeftBranch);
118 for (
auto& entry : newStateRight) {
119 entry.setValue(entry.getValue() / sumOfRightBranch);
122 queue.push(StateWithRow{currAuxState, newStateLeft});
123 outgoing.push_back(storage::MatrixEntry<uint64_t, RationalFunction>(
124 currAuxState, (sumOfLeftBranch)*
RationalFunction(carl::makePolynomial<Polynomial>(parameter))));
126 queue.push(StateWithRow{currAuxState, newStateRight});
127 outgoing.push_back(storage::MatrixEntry<uint64_t, RationalFunction>(
128 currAuxState, (sumOfRightBranch) * (utility::one<RationalFunction>() -
RationalFunction(carl::makePolynomial<Polynomial>(parameter)))));
131 for (
auto const& entry : outgoing) {
132 builder.
addNextValue(currRow, entry.getColumn(), entry.getValue());
138 origStates.push_back(stateWithRow.state);
140 TransformationData result;
141 result.simpleMatrix = builder.
build(currRow, currAuxState, currAuxState);
142 result.simpleStateToOriginalState = std::move(origStates);
147 TransformationData
const& data)
const {
149 for (
auto const& labelName : dtmc.getStateLabeling().getLabels()) {
151 newStates.
resize(data.simpleMatrix.getRowCount(),
false);
152 if (labelName !=
"init") {
153 for (uint64_t newState = dtmc.
getNumberOfStates(); newState < data.simpleMatrix.getRowCount(); ++newState) {
154 newStates.
set(newState, newStates[data.simpleStateToOriginalState[newState]]);
157 labeling.addLabel(labelName, std::move(newStates));
164 TransformationData
const& data)
const {
165 std::optional<std::vector<RationalFunction>> stateRewards, actionRewards;
169 stateRewards->resize(data.simpleMatrix.getRowCount(), storm::utility::zero<RationalFunction>());