145 std::vector<CompositionInformation> subinformation;
147 std::set<uint64_t> nonsilentSubActionIndices;
149 subinformation.push_back(boost::any_cast<CompositionInformation>(subcomposition->accept(*
this, data)));
150 nonsilentSubActionIndices.insert(subinformation.back().getNonSilentActionIndices().begin(), subinformation.back().getNonSilentActionIndices().end());
153 bool containsNonStandardParallelComposition =
false;
154 bool containsSubParallelComposition =
false;
156 for (
auto const& subinfo : subinformation) {
158 containsSubParallelComposition |= subinfo.containsParallelComposition();
164 std::set<uint64_t> effectiveSynchVectors;
166 effectiveSynchVectors.insert(synchVectorIndex);
170 std::set<uint64_t> nonSilentActionIndices;
171 for (uint_fast64_t infoIndex = 0; infoIndex < subinformation.size(); ++infoIndex) {
172 auto const& subinfo = subinformation[infoIndex];
174 std::set<uint64_t> enabledSynchVectors;
175 std::set<uint64_t> actionsInSynch;
179 for (
auto const& nonSilentActionIndex : subinfo.getNonSilentActionIndices()) {
180 std::string
const& nonSilentAction = indexToNameMap.at(nonSilentActionIndex);
181 if (synchVector.getInput(infoIndex) == nonSilentAction) {
182 enabledSynchVectors.insert(synchVectorIndex);
183 actionsInSynch.insert(nonSilentActionIndex);
187 enabledSynchVectors.insert(synchVectorIndex);
191 std::set_difference(subinfo.getNonSilentActionIndices().begin(), subinfo.getNonSilentActionIndices().end(), actionsInSynch.begin(),
192 actionsInSynch.end(), std::inserter(nonSilentActionIndices, nonSilentActionIndices.begin()));
194 std::set<uint64_t> newEffectiveSynchVectors;
195 std::set_intersection(effectiveSynchVectors.begin(), effectiveSynchVectors.end(), enabledSynchVectors.begin(), enabledSynchVectors.end(),
196 std::inserter(newEffectiveSynchVectors, newEffectiveSynchVectors.begin()));
197 effectiveSynchVectors = std::move(newEffectiveSynchVectors);
201 for (
auto const& synchVectorIndex : effectiveSynchVectors) {
204 nonSilentActionIndices.insert(addOrGetActionIndex(synchVector.getOutput()));
212 std::set<storm::jani::SynchronizationVector, storm::jani::SynchronizationVectorLexicographicalLess> synchVectorSet;
213 for (
auto synchVectorIndex : effectiveSynchVectors) {
218 std::set<storm::jani::SynchronizationVector, storm::jani::SynchronizationVectorLexicographicalLess> expectedSynchVectorSetUnderApprox;
219 std::set<storm::jani::SynchronizationVector, storm::jani::SynchronizationVectorLexicographicalLess> expectedSynchVectorSetOverApprox;
220 for (
auto actionIndex : nonsilentSubActionIndices) {
221 std::string
const& actionName = indexToNameMap.at(actionIndex);
222 std::vector<std::string> input;
223 uint64_t numberOfParticipatingAutomata = 0;
224 for (
auto const& subcomposition : subinformation) {
225 if (subcomposition.getNonSilentActionIndices().find(actionIndex) != subcomposition.getNonSilentActionIndices().end()) {
226 input.push_back(actionName);
227 ++numberOfParticipatingAutomata;
234 expectedSynchVectorSetOverApprox.insert(newSynchVector);
235 if (numberOfParticipatingAutomata > 1) {
236 expectedSynchVectorSetUnderApprox.insert(newSynchVector);
240 containsNonStandardParallelComposition |= !std::includes(expectedSynchVectorSetOverApprox.begin(), expectedSynchVectorSetOverApprox.end(),
243 containsNonStandardParallelComposition |= !std::includes(synchVectorSet.begin(), synchVectorSet.end(), expectedSynchVectorSetUnderApprox.begin(),